diff --git a/.travis.yml b/.travis.yml index 78706f18c..fa3909c8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,6 +65,35 @@ matrix: # @see https://github.com/acquia/orca/blob/master/docs/understanding-orca.md#continuous-integration - { env: ORCA_JOB=STATIC_CODE_ANALYSIS, name: "Static code analysis" } - { env: ORCA_JOB=STRICT_DEPRECATED_CODE_SCAN, name: "Strict deprecated code scan" } + - { env: ORCA_JOB=INTEGRATED_TEST_ON_OLDEST_SUPPORTED, if: type = cron, name: "Integrated test on oldest supported Drupal core version" } + - { env: ORCA_JOB=INTEGRATED_UPGRADE_TEST_FROM_PREVIOUS_MINOR, if: type = cron, name: "Integrated upgrade test from previous minor" } + - { env: ORCA_JOB=ISOLATED_TEST_ON_CURRENT ACMS_JOB=base_full, if: type = cron, name: "Isolated test on current Drupal core version" } + # To send PHPUnit test coverage data to Coveralls (coveralls.io), configure + # your GitHub repository according to the FAQ below and uncomment the + # following line. By default this job is allowed to fail (see below) so that + # the total build can be marked finished sooner, because it will have the + # same testing outcome as the above ISOLATED_TEST_ON_CURRENT but may take + # significantly longer. Note: this setting implies ORCA_COVERAGE_ENABLE, + # which need not be set separately. + # @see https://github.com/acquia/orca/blob/main/docs/faq.md#coveralls + # @see https://github.com/acquia/orca/blob/main/docs/advanced-usage.md#ORCA_COVERALLS_ENABLE + # @see https://github.com/acquia/orca/blob/main/docs/advanced-usage.md#ORCA_COVERAGE_ENABLE + # - { env: ORCA_JOB=ISOLATED_TEST_ON_CURRENT ORCA_COVERALLS_ENABLE=TRUE, name: "Isolated test on current Drupal core version with test coverage" } + # + # To generate test coverage data to send somewhere other than Coveralls, use + # the ORCA_COVERAGE_ENABLE variable instead. + # - { env: ORCA_JOB=ISOLATED_TEST_ON_CURRENT ORCA_COVERAGE_ENABLE=TRUE, name: "Isolated test on current Drupal core version with test coverage" } + - { env: ORCA_JOB=INTEGRATED_TEST_ON_CURRENT, if: type = cron, name: "Integrated test on current Drupal core version" } + - { env: ORCA_JOB=INTEGRATED_UPGRADE_TEST_TO_NEXT_MINOR, if: type = cron, name: "Integrated upgrade test to next minor Drupal core version" } + - { env: ORCA_JOB=INTEGRATED_UPGRADE_TEST_TO_NEXT_MINOR_DEV, if: type = cron, name: "Integrated upgrade test to next minor dev Drupal core version" } + - { env: ORCA_JOB=INTEGRATED_TEST_ON_CURRENT_DEV ACMS_JOB=base_full, if: type = cron, name: "Integrated test on current dev Drupal core version" } + - { env: ORCA_JOB=LOOSE_DEPRECATED_CODE_SCAN, if: type = cron, name: "Loose deprecated code scan" } + - { env: ORCA_JOB=STRICT_DEPRECATED_CODE_SCAN, if: type = cron, name: "Strict deprecated code scan" } + - { env: ORCA_JOB=DEPRECATED_CODE_SCAN_W_CONTRIB, if: type = cron, name: "Deprecated code scan w/ contrib" } + - { env: ORCA_JOB=ISOLATED_TEST_ON_NEXT_MINOR, if: type = cron, name: "Isolated test on next minor Drupal core version" } + - { env: ORCA_JOB=INTEGRATED_TEST_ON_NEXT_MINOR, if: type = cron, name: "Integrated test on next minor Drupal core version" } + - { env: ORCA_JOB=ISOLATED_TEST_ON_NEXT_MINOR_DEV, if: type = cron, name: "Isolated test on next minor dev Drupal core version" } + - { env: ORCA_JOB=INTEGRATED_TEST_ON_NEXT_MINOR_DEV, if: type = cron, name: "Integrated test on next minor dev Drupal core version" } # The following nine jobs are custom ACMS jobs based on the standard isolated # current dev test. # Exclude push group tests on this job to exclude low and medium risk tests. @@ -99,6 +128,8 @@ matrix: - env: ORCA_JOB=INTEGRATED_UPGRADE_TEST_TO_NEXT_MINOR_DEV - env: ORCA_JOB=LOOSE_DEPRECATED_CODE_SCAN - env: ORCA_JOB=DEPRECATED_CODE_SCAN_W_CONTRIB + - env: ORCA_JOB=INTEGRATED_TEST_ON_NEXT_MINOR + - env: ORCA_JOB=INTEGRATED_TEST_ON_CURRENT - env: ORCA_JOB=ISOLATED_TEST_ON_NEXT_MINOR_DEV - env: ORCA_JOB=INTEGRATED_TEST_ON_NEXT_MINOR_DEV - env: ORCA_JOB=ISOLATED_TEST_ON_NEXT_MAJOR_LATEST_MINOR_DEV @@ -139,3 +170,12 @@ after_failure: ../orca/bin/travis/after_failure.sh # Reserved for future use. after_script: ../orca/bin/travis/after_script.sh + +notifications: + slack: + rooms: + - secure: P7RpwdM8JKMCs6386SOy24nsh7jBYaZ/CLzKH1vRu1sVnAopRSlk98VoejGED4YzCq2V3+b84PNltjyOZlDdPutZMP2Fat4OU+e4Mt05Vlrbn470cjk0puzFBnuubAq2GwXcyAB6Eq9DEe6DARCdFSya6GsTjvf3+RVFIaiVDDG0PYYQrMlwQ/C/+JBmnP7FLfidL6vX2YDL6UbQpQGuqJ/hwliW2RVnMTM7gCpgNaY8rxRRBuKKPjzJt09hV+YNpvsnGab+t5DMWKzeNKWUl0wiVOWEv90CKyx9QIt4zJy8pAxXitDFz74z/cMZV/ELGaD20nl7hw88R3rTzK2V+5FRCZHcQvkCgiZbHayaF4ShquHZbzE8YH48sEORFaGnbfaY69sveLq4+74dpFdMHRj1cBRY1CGnN59JgtBTwZShlXbUZoYJGbebfBvlxt6A2IcSERiTGl0i64L1elAkN6854VPwWMDi+iLfgfJN/0jugsvAcCQi0DOV1DJzHdF+EbVhFAVFfivwHo3Ai7QSZN2Rs4ojE8sdWQOp83wjA493FATkCSvFcpyPqG9kX1nQuDf6SNHwVg4jdpePwp/okgm+WcCZPiCEE2jW4gu49Gx4m2Y3r2878b76cQn+K4DX/mP5vRu6vA50gAa1fMsL4Yo9v/VbtrbEPYEVmFUHdq0= + on_success: change + on_failure: always + # Limit to cron builds. + if: type = cron diff --git a/DEVELOPING.md b/DEVELOPING.md index 71addf253..6cfdb9b66 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -32,13 +32,18 @@ acli --version 7. Click the "Generate SSH key" button. When asked for a password, enter one that you can remember. When asked if you want to upload the SSH key to Acquia Cloud, say yes. Label your SSH key similarly to how you labeled the IDE, e.g. `phenaproxima_AcquiaCMS`, and upload it to Acquia Cloud. When prompted for the passphrase, enter the password you just created. 8. Run `cat ~/.ssh/id_rsa.pub`. Copy the SSH key and add it to your GitHub account. See https://docs.acquia.com/dev-studio/ide/start/#cloning-your-application-from-a-github-repository-to-your-ide for more information. Be sure to enable SSO for the newly added key, authorizing the Acquia organization. 9. In the Cloud IDE's terminal, clone the Acquia CMS Git repository: `git clone git@github.com:acquia/acquia_cms.git ~/project --branch develop` -10. Install all dependencies: +10. Enable the Intl extension. Intl is required to install Content Hub 8.x-2.21 and above & restart the PHP-FPM after making this change. +``` +echo "extension=intl.so" >> ../configs/php/custom.ini +supervisorctl restart php-fpm +``` +11. Install all dependencies: ``` cd project composer install ``` -11. Install Acquia CMS, as detailed in the "Installing Acquia CMS" section below. -12. In the "Open Drupal Site" menu, choose "Open site in a new tab" and ensure you can see the Drupal site, and log in with the username "admin" and password "admin". +12. Install Acquia CMS, as detailed in the "Installing Acquia CMS" section below. +13. In the "Open Drupal Site" menu, choose "Open site in a new tab" and ensure you can see the Drupal site, and log in with the username "admin" and password "admin". ### Installing Acquia CMS diff --git a/acms_split.sh b/acms_split.sh new file mode 100755 index 000000000..6df6d2e09 --- /dev/null +++ b/acms_split.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +# Color codes +GREEN="\033[1;32m" +YELLOW="\033[1;33m" +NOCOLOR="\033[0m" + +# Debug mode +set -e +set -x + +echo -e "${GREEN} Script Running on ${OSTYPE}${NOCOLOR}" + +# Sample usage: ./runsplit.sh +# Commit will be traversed/updated from source to destination repositary. + +# Dynamically setting current branch to checked out branch. +# For example if this script is run on branch, test then, +# commit will traverse from test branch of source repo to, +# test branch of destination repo. +CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` + +echo -e "${YELLOW} Script running for split on branch $CURRENT_BRANCH${NOCOLOR}" + +# Split method to run the commands for splitting/updating a split and pushing, +# any new commits. +# $1 is path of module, $2 is name of remote branch for the split. +function split() +{ + SHA1=`./splitsh-lite --prefix=$1` + git push $2 "$SHA1:refs/heads/$CURRENT_BRANCH" -f +} + +# Remote method, to add git remote for destination repositary. +# $1 is subrepo name and $2 is remote branch name. +function remote() +{ + git remote add $1 $2 || true +} + +# Pull current branch. +git pull origin $CURRENT_BRANCH + +# Adding remote for all split branches. +remote acquia_cms_article git@github.com:acquia/acquia_cms_article.git +remote acquia_cms_audio git@github.com:acquia/acquia_cms_audio.git +remote acquia_cms_common git@github.com:acquia/acquia_cms_common.git +remote acquia_cms_development git@github.com:acquia/acquia_cms_development.git +remote acquia_cms_document git@github.com:acquia/acquia_cms_document.git +remote acquia_cms_event git@github.com:acquia/acquia_cms_event.git +remote acquia_cms_image git@github.com:acquia/acquia_cms_image.git +remote acquia_cms_page git@github.com:acquia/acquia_cms_page.git +remote acquia_cms_person git@github.com:acquia/acquia_cms_person.git +remote acquia_cms_place git@github.com:acquia/acquia_cms_place.git +remote acquia_cms_search git@github.com:acquia/acquia_cms_search.git +remote acquia_cms_starter git@github.com:acquia/acquia_cms_starter.git +remote acquia_cms_support git@github.com:acquia/acquia_cms_support.git +remote acquia_cms_toolbar git@github.com:acquia/acquia_cms_toolbar.git +remote acquia_cms_tour git@github.com:acquia/acquia_cms_tour.git +remote acquia_cms_video git@github.com:acquia/acquia_cms_video.git + +# Calling split method for mapping remote branches to splits. +split 'modules/acquia_cms_article' acquia_cms_article +split 'modules/acquia_cms_audio' acquia_cms_audio +split 'modules/acquia_cms_common' acquia_cms_common +split 'modules/acquia_cms_development' acquia_cms_development +split 'modules/acquia_cms_document' acquia_cms_document +split 'modules/acquia_cms_event' acquia_cms_event +split 'modules/acquia_cms_image' acquia_cms_image +split 'modules/acquia_cms_page' acquia_cms_page +split 'modules/acquia_cms_person' acquia_cms_person +split 'modules/acquia_cms_place' acquia_cms_place +split 'modules/acquia_cms_search' acquia_cms_search +split 'modules/acquia_cms_starter' acquia_cms_starter +split 'modules/acquia_cms_support' acquia_cms_support +split 'modules/acquia_cms_toolbar' acquia_cms_toolbar +split 'modules/acquia_cms_tour' acquia_cms_tour +split 'modules/acquia_cms_video' acquia_cms_video + diff --git a/acquia_cms.info.yml b/acquia_cms.info.yml index ec72dc66b..d7bc80e83 100644 --- a/acquia_cms.info.yml +++ b/acquia_cms.info.yml @@ -29,6 +29,7 @@ install: - cohesion_style_guide - cohesion_style_helpers - cohesion_sync + - config_ignore - cohesion_templates - cohesion_website_settings - collapsiblock diff --git a/acquia_cms.profile b/acquia_cms.profile index 80d142639..a5b0476fc 100644 --- a/acquia_cms.profile +++ b/acquia_cms.profile @@ -26,30 +26,6 @@ function acquia_cms_form_user_login_form_alter(array &$form) { } } -/** - * Implements hook_form_FORM_ID_alter(). - */ -function acquia_cms_form_cohesion_account_settings_form_alter(array &$form) { - $config = Drupal::config('cohesion.settings'); - $cohesion_configured = $config->get('api_key') && $config->get('organization_key'); - // We should add submit handler, only if cohesion keys are not already set. - if (!$cohesion_configured) { - $form['#submit'][] = 'acquia_cms_cohesion_init'; - - // Here we are adding a separate submit handler to rebuild the cohesion - // styles. Now the reason why we are doing this is because the rebuild is - // expecting that all the entities of cohesion are in place but as the - // cohesion is getting build for the first time and - // acquia_cms_initialize_cohesion is responsible for importing the entities. - // So we cannot execute both the batch process in a single function, Hence - // to achieve the synchronous behaviour we have separated cohesion - // configuration import and cohesion style rebuild functionality into - // separate submit handlers. - // @see \Drupal\cohesion_website_settings\Controller\WebsiteSettingsController::batch - $form['#submit'][] = 'acquia_cms_rebuild_cohesion'; - } -} - /** * Implements hook_install_tasks_alter(). */ @@ -192,7 +168,11 @@ function acquia_cms_install_ui_kit(array $install_state) { /** @var \Drupal\acquia_cms\Facade\CohesionFacade $facade */ $facade = Drupal::classResolver(CohesionFacade::class); - $operations = ($install_state['interactive']) ? $facade->getAllOperations(TRUE) : $facade->getAllOperations(); + // Site studio will rebuild packages (fetch HTML/CSS via the API) by default + // on import. Passing this bool as TRUE will skip the rebuild, since we force + // a total rebuild at the end. This cuts install times approximately in half, + // especially via Drush. + $operations = $facade->getAllOperations(TRUE); $batch = ['operations' => $operations]; // Set batch along with drush backend process if site is being @@ -299,6 +279,34 @@ function acquia_cms_form_alter(array &$form, FormStateInterface $form_state, $fo $form['actions']['submit']['#ajax']['callback'] = 'alter_update_widget'; } } + // Trigger site studio config import and rebuild whenever user + // try to save site studio account settings or the site studio core + // form from tour dashboard page. + $allowed_form_ids = [ + 'cohesion_account_settings_form', + 'acquia_cms_site_studio_core_form', + 'acquia_cms_tour_installation_wizard', + ]; + if (in_array($form_id, $allowed_form_ids)) { + $config = Drupal::config('cohesion.settings'); + $cohesion_configured = $config->get('api_key') && $config->get('organization_key'); + // We should add submit handler, only if cohesion keys are not already set. + if (!$cohesion_configured) { + $form['#submit'][] = 'acquia_cms_cohesion_init'; + + // Here we are adding a separate submit handler to rebuild the cohesion + // styles. Now the reason why we are doing this is because the rebuild is + // expecting that all the entities of cohesion are in place but as the + // cohesion is getting build for the first time and + // acquia_cms_initialize_cohesion is responsible for importing the + // entities. So we cannot execute both the batch process in a single + // function, Hence to achieve the synchronous behaviour we have separated + // cohesion configuration import and cohesion style rebuild functionality + // into separate submit handlers. + // @see \Drupal\cohesion_website_settings\Controller\WebsiteSettingsController::batch + $form['#submit'][] = 'acquia_cms_rebuild_cohesion'; + } + } } /** diff --git a/composer.json b/composer.json index 27185600e..78d29a97e 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "drupal/acquia_contenthub": "^2.22", "drupal/acquia_lift": "^4.2", "drupal/acquia_purge": "^1", - "drupal/acquia_search": "^3.0", + "drupal/acquia_search": "^3.0.3", "drupal/acquia_telemetry-acquia_telemetry": "1.0-alpha5", "drupal/acsf": "^2", "drupal/address": "^1", @@ -34,8 +34,9 @@ "drupal/autologout": "^1", "drupal/checklistapi": "^2.0", "drupal/collapsiblock": "^3", + "drupal/config_ignore": "^2.3", "drupal/config_rewrite": "1.3", - "drupal/core": "~9.1.9", + "drupal/core": "^9.1.9", "drupal/default_content": "^2", "drupal/diff": "^1", "drupal/entity_clone": "1.0-beta4", @@ -173,6 +174,7 @@ "dashboard_owner return a string value and thus the hasPermission function throws an error": "https://www.drupal.org/files/issues/2020-05-04/user_load_moderation_dashboard_updated_with_DI_for_beta_version_3048782.patch" }, "drupal/password_policy": { + "Field field_last_password_reset is unknown": "https://www.drupal.org/files/issues/2020-07-03/2771129-114.patch", "Register account anonymously, does not validate constraint 'password_username'.": "https://www.drupal.org/files/issues/2020-09-24/password-username-validate--3161012-4.patch" }, "drupal/reroute_email": { diff --git a/composer.lock b/composer.lock index 9eb958bf6..c13bccc32 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6f4f9441007c5c32b462383a3c426bc9", + "content-hash": "3d017e26c3a774bbb4781f78c92491ad", "packages": [ { "name": "acquia/acsf-contenthub-console", @@ -811,16 +811,16 @@ }, { "name": "composer/semver", - "version": "3.2.4", + "version": "3.2.5", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464" + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", - "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464", + "url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", + "reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "shasum": "" }, "require": { @@ -872,7 +872,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.2.4" + "source": "https://github.com/composer/semver/tree/3.2.5" }, "funding": [ { @@ -888,7 +888,7 @@ "type": "tidelift" } ], - "time": "2020-11-13T08:59:24+00:00" + "time": "2021-05-24T12:41:47+00:00" }, { "name": "consolidation/annotated-command", @@ -1687,16 +1687,16 @@ }, { "name": "doctrine/annotations", - "version": "1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "03cb2123a67d4be806554fe670d0adc298199808" + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/03cb2123a67d4be806554fe670d0adc298199808", - "reference": "03cb2123a67d4be806554fe670d0adc298199808", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", "shasum": "" }, "require": { @@ -1709,7 +1709,7 @@ "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", "symfony/cache": "^4.4 || ^5.2" }, "type": "library", @@ -1753,9 +1753,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.0" + "source": "https://github.com/doctrine/annotations/tree/1.13.1" }, - "time": "2021-04-29T07:39:39+00:00" + "time": "2021-05-16T18:07:53+00:00" }, { "name": "doctrine/collections", @@ -2381,21 +2381,21 @@ }, { "name": "drupal/acquia_search", - "version": "3.0.1", + "version": "3.0.3", "source": { "type": "git", "url": "https://git.drupalcode.org/project/acquia_search.git", - "reference": "3.0.1" + "reference": "3.0.3" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/acquia_search-3.0.1.zip", - "reference": "3.0.1", - "shasum": "ebffd6dceb66eb8cba0e5e1e718f449826c1281c" + "url": "https://ftp.drupal.org/files/projects/acquia_search-3.0.3.zip", + "reference": "3.0.3", + "shasum": "e75a616f3305cc2021d81ff13478f10948c85d37" }, "require": { "drupal/core": "^8.9 || ^9", - "drupal/search_api_solr": "^4.1.10", + "drupal/search_api_solr": "^4.1.12", "http-interop/http-factory-guzzle": "^1.0", "php-http/guzzle6-adapter": "^2.0" }, @@ -2409,8 +2409,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "3.0.1", - "datestamp": "1614363710", + "version": "3.0.3", + "datestamp": "1623256507", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -3275,6 +3275,130 @@ "source": "https://git.drupalcode.org/project/collapsiblock" } }, + { + "name": "drupal/config_filter", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/config_filter.git", + "reference": "8.x-1.8" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/config_filter-8.x-1.8.zip", + "reference": "8.x-1.8", + "shasum": "5def5f97e79d6f5af6bb7007f012443475c90bfe" + }, + "require": { + "drupal/core": "^8 || ^9" + }, + "suggest": { + "drupal/config_split": "Split site configuration for different environments." + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.8", + "datestamp": "1603870062", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Fabian Bircher", + "homepage": "https://www.drupal.org/u/bircher", + "email": "opensource@fabianbircher.com", + "role": "Maintainer" + }, + { + "name": "Nuvole Web", + "homepage": "http://nuvole.org", + "email": "info@nuvole.org", + "role": "Maintainer" + }, + { + "name": "pescetti", + "homepage": "https://www.drupal.org/user/436244" + } + ], + "description": "Config Filter allows other modules to interact with a ConfigStorage through filter plugins.", + "homepage": "https://www.drupal.org/project/config_filter", + "keywords": [ + "Drupal", + "configuration", + "configuration management" + ], + "support": { + "source": "https://git.drupalcode.org/project/config_filter", + "issues": "https://www.drupal.org/project/issues/config_filter", + "slack": "https://drupal.slack.com/archives/C45342CDD" + } + }, + { + "name": "drupal/config_ignore", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/config_ignore.git", + "reference": "8.x-2.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/config_ignore-8.x-2.3.zip", + "reference": "8.x-2.3", + "shasum": "2e1f07a455275fb6637909921a8915646601fc00" + }, + "require": { + "drupal/config_filter": "^1 || ^2", + "drupal/core": "^8 || ^9" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-2.3", + "datestamp": "1608306489", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tommy Lynge Jørgensen", + "homepage": "https://www.drupal.org/u/tlyngej", + "email": "tlyngej@gmail.com", + "role": "Maintainer" + }, + { + "name": "Fabian Bircher", + "homepage": "https://www.drupal.org/u/bircher", + "role": "Maintainer" + }, + { + "name": "tlyngej", + "homepage": "https://www.drupal.org/user/413139" + } + ], + "description": "Ignore certain configuration during import.", + "homepage": "http://drupal.org/project/config_ignore", + "support": { + "source": "https://git.drupalcode.org/project/config_ignore", + "issues": "http://drupal.org/project/config_ignore", + "irc": "irc://irc.freenode.org/drupal-contribute" + } + }, { "name": "drupal/config_rewrite", "version": "1.3.0", @@ -3328,16 +3452,16 @@ }, { "name": "drupal/core", - "version": "9.1.9", + "version": "9.1.10", "source": { "type": "git", "url": "https://github.com/drupal/core.git", - "reference": "2c649d5807f08f8c7945d1c6ffb4bb21d5c7849a" + "reference": "7fa70eb78addcef8ad704edad9fa73337b8cdab5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/drupal/core/zipball/2c649d5807f08f8c7945d1c6ffb4bb21d5c7849a", - "reference": "2c649d5807f08f8c7945d1c6ffb4bb21d5c7849a", + "url": "https://api.github.com/repos/drupal/core/zipball/7fa70eb78addcef8ad704edad9fa73337b8cdab5", + "reference": "7fa70eb78addcef8ad704edad9fa73337b8cdab5", "shasum": "" }, "require": { @@ -3574,9 +3698,9 @@ ], "description": "Drupal is an open source content management platform powering millions of websites and applications.", "support": { - "source": "https://github.com/drupal/core/tree/9.1.9" + "source": "https://github.com/drupal/core/tree/9.1.10" }, - "time": "2021-05-25T09:18:28+00:00" + "time": "2021-06-04T17:28:30+00:00" }, { "name": "drupal/crop", @@ -3828,7 +3952,7 @@ "extra": { "drupal": { "version": "8.x-1.7", - "datestamp": "1619803733", + "datestamp": "1619803763", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -6377,17 +6501,17 @@ }, { "name": "drupal/search_api_solr", - "version": "4.1.11", + "version": "4.1.12", "source": { "type": "git", "url": "https://git.drupalcode.org/project/search_api_solr.git", - "reference": "4.1.11" + "reference": "4.1.12" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/search_api_solr-4.1.11.zip", - "reference": "4.1.11", - "shasum": "aa8b4cdb8255439e6808de7f5694f6a8a0ccdaac" + "url": "https://ftp.drupal.org/files/projects/search_api_solr-4.1.12.zip", + "reference": "4.1.12", + "shasum": "1f533d784b0609ca4b21a87bc012d1b100b12860" }, "require": { "consolidation/annotated-command": "^2.12|^4.1", @@ -6419,13 +6543,14 @@ "drupal/facets": "Provides facetted search.", "drupal/search_api_autocomplete": "Provides auto complete for search boxes.", "drupal/search_api_location": "Provides location searches.", + "drupal/search_api_solr_nlp": "Highly recommended! Provides Solr field types based on natural language processing (NLP).", "drupal/search_api_spellcheck": "Provides spell checking and 'Did You Mean?'." }, "type": "drupal-module", "extra": { "drupal": { - "version": "4.1.11", - "datestamp": "1612532147", + "version": "4.1.12", + "datestamp": "1622737539", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -8429,16 +8554,16 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.5.1", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "53df7b7cd66e0905e6133970a4b90392a7a08075" + "reference": "7d2034110ae18afe05050b796a3ee4b3fe177876" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/53df7b7cd66e0905e6133970a4b90392a7a08075", - "reference": "53df7b7cd66e0905e6133970a4b90392a7a08075", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/7d2034110ae18afe05050b796a3ee4b3fe177876", + "reference": "7d2034110ae18afe05050b796a3ee4b3fe177876", "shasum": "" }, "require": { @@ -8466,7 +8591,9 @@ "laminas/laminas-coding-standard": "~1.0.0", "php-http/psr7-integration-tests": "^1.1", "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.1" + "phpunit/phpunit": "^9.1", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3" }, "type": "library", "extra": { @@ -8525,7 +8652,7 @@ "type": "community_bridge" } ], - "time": "2021-04-13T19:39:11+00:00" + "time": "2021-05-18T14:41:54+00:00" }, { "name": "laminas/laminas-escaper", @@ -13160,16 +13287,16 @@ }, { "name": "symfony/console", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1ab187ac21d41d7d34a4f529091a1f5d0bb2924f" + "reference": "a62acecdf5b50e314a4f305cd01b5282126f3095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1ab187ac21d41d7d34a4f529091a1f5d0bb2924f", - "reference": "1ab187ac21d41d7d34a4f529091a1f5d0bb2924f", + "url": "https://api.github.com/repos/symfony/console/zipball/a62acecdf5b50e314a4f305cd01b5282126f3095", + "reference": "a62acecdf5b50e314a4f305cd01b5282126f3095", "shasum": "" }, "require": { @@ -13229,7 +13356,7 @@ "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v4.4.23" + "source": "https://github.com/symfony/console/tree/v4.4.25" }, "funding": [ { @@ -13245,20 +13372,20 @@ "type": "tidelift" } ], - "time": "2021-05-10T12:53:15+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/debug", - "version": "v4.4.22", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "45b2136377cca5f10af858968d6079a482bca473" + "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/45b2136377cca5f10af858968d6079a482bca473", - "reference": "45b2136377cca5f10af858968d6079a482bca473", + "url": "https://api.github.com/repos/symfony/debug/zipball/a8d2d5c94438548bff9f998ca874e202bb29d07f", + "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f", "shasum": "" }, "require": { @@ -13298,7 +13425,7 @@ "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.22" + "source": "https://github.com/symfony/debug/tree/v4.4.25" }, "funding": [ { @@ -13314,20 +13441,20 @@ "type": "tidelift" } ], - "time": "2021-04-02T07:50:12+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "c1d4b65852f22e19131dea626e236a8e07d64479" + "reference": "2ed2a0a6c960bf4e2e862ec77b2f2c558b83c64d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c1d4b65852f22e19131dea626e236a8e07d64479", - "reference": "c1d4b65852f22e19131dea626e236a8e07d64479", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2ed2a0a6c960bf4e2e862ec77b2f2c558b83c64d", + "reference": "2ed2a0a6c960bf4e2e862ec77b2f2c558b83c64d", "shasum": "" }, "require": { @@ -13383,7 +13510,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v4.4.23" + "source": "https://github.com/symfony/dependency-injection/tree/v4.4.25" }, "funding": [ { @@ -13399,7 +13526,7 @@ "type": "tidelift" } ], - "time": "2021-05-11T15:55:42+00:00" + "time": "2021-05-26T17:54:16+00:00" }, { "name": "symfony/deprecation-contracts", @@ -13470,16 +13597,16 @@ }, { "name": "symfony/error-handler", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "21d75bfbdfdd3581a7f97080deb98926987f14a7" + "reference": "310a756cec00d29d89a08518405aded046a54a8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/21d75bfbdfdd3581a7f97080deb98926987f14a7", - "reference": "21d75bfbdfdd3581a7f97080deb98926987f14a7", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/310a756cec00d29d89a08518405aded046a54a8b", + "reference": "310a756cec00d29d89a08518405aded046a54a8b", "shasum": "" }, "require": { @@ -13519,7 +13646,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v4.4.23" + "source": "https://github.com/symfony/error-handler/tree/v4.4.25" }, "funding": [ { @@ -13535,20 +13662,20 @@ "type": "tidelift" } ], - "time": "2021-05-02T20:47:26+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.20", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c" + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c352647244bd376bf7d31efbd5401f13f50dad0c", - "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/047773e7016e4fd45102cedf4bd2558ae0d0c32f", + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f", "shasum": "" }, "require": { @@ -13602,7 +13729,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.20" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.25" }, "funding": [ { @@ -13618,7 +13745,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T09:09:26+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -13763,16 +13890,16 @@ }, { "name": "symfony/finder", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "67b77716f517e3f864759232e1201e7aa2ab0e82" + "reference": "ed33314396d968a8936c95f5bd1b88bd3b3e94a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/67b77716f517e3f864759232e1201e7aa2ab0e82", - "reference": "67b77716f517e3f864759232e1201e7aa2ab0e82", + "url": "https://api.github.com/repos/symfony/finder/zipball/ed33314396d968a8936c95f5bd1b88bd3b3e94a3", + "reference": "ed33314396d968a8936c95f5bd1b88bd3b3e94a3", "shasum": "" }, "require": { @@ -13804,7 +13931,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v4.4.23" + "source": "https://github.com/symfony/finder/tree/v4.4.25" }, "funding": [ { @@ -13820,7 +13947,7 @@ "type": "tidelift" } ], - "time": "2021-05-09T09:13:09+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/http-client-contracts", @@ -13902,16 +14029,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "2ffb43bd6c589a274ee1e93a5fd6b7ef1577b9c5" + "reference": "0c79d5a65ace4fe66e49702658c024a419d2438b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2ffb43bd6c589a274ee1e93a5fd6b7ef1577b9c5", - "reference": "2ffb43bd6c589a274ee1e93a5fd6b7ef1577b9c5", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0c79d5a65ace4fe66e49702658c024a419d2438b", + "reference": "0c79d5a65ace4fe66e49702658c024a419d2438b", "shasum": "" }, "require": { @@ -13950,7 +14077,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v4.4.23" + "source": "https://github.com/symfony/http-foundation/tree/v4.4.25" }, "funding": [ { @@ -13966,20 +14093,20 @@ "type": "tidelift" } ], - "time": "2021-05-05T07:40:41+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "95bb42312503a212f4467529bac8735f01226ff9" + "reference": "3795165596fe81a52296b78c9aae938d434069cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/95bb42312503a212f4467529bac8735f01226ff9", - "reference": "95bb42312503a212f4467529bac8735f01226ff9", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3795165596fe81a52296b78c9aae938d434069cc", + "reference": "3795165596fe81a52296b78c9aae938d434069cc", "shasum": "" }, "require": { @@ -14054,7 +14181,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v4.4.23" + "source": "https://github.com/symfony/http-kernel/tree/v4.4.25" }, "funding": [ { @@ -14070,20 +14197,20 @@ "type": "tidelift" } ], - "time": "2021-05-12T13:13:32+00:00" + "time": "2021-06-01T07:12:08+00:00" }, { "name": "symfony/mime", - "version": "v5.2.7", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7af452bf51c46f18da00feb32e1ad36db9426515" + "reference": "ed710d297b181f6a7194d8172c9c2423d58e4852" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7af452bf51c46f18da00feb32e1ad36db9426515", - "reference": "7af452bf51c46f18da00feb32e1ad36db9426515", + "url": "https://api.github.com/repos/symfony/mime/zipball/ed710d297b181f6a7194d8172c9c2423d58e4852", + "reference": "ed710d297b181f6a7194d8172c9c2423d58e4852", "shasum": "" }, "require": { @@ -14137,7 +14264,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.2.7" + "source": "https://github.com/symfony/mime/tree/v5.3.0" }, "funding": [ { @@ -14153,20 +14280,20 @@ "type": "tidelift" } ], - "time": "2021-04-29T20:47:09+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -14178,7 +14305,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14216,7 +14343,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -14232,20 +14359,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342" + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/06fb361659649bcfd6a208a0f1fcaf4e827ad342", - "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", "shasum": "" }, "require": { @@ -14257,7 +14384,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14296,7 +14423,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" }, "funding": [ { @@ -14312,20 +14439,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -14339,7 +14466,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14383,7 +14510,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -14399,20 +14526,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -14424,7 +14551,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14467,7 +14594,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -14483,20 +14610,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", "shasum": "" }, "require": { @@ -14508,7 +14635,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14547,7 +14674,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" }, "funding": [ { @@ -14563,20 +14690,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -14585,7 +14712,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14623,7 +14750,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { @@ -14639,20 +14766,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -14661,7 +14788,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14702,7 +14829,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -14718,20 +14845,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", "shasum": "" }, "require": { @@ -14740,7 +14867,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -14785,7 +14912,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" }, "funding": [ { @@ -14801,20 +14928,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/process", - "version": "v4.4.22", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "f5481b22729d465acb1cea3455fc04ce84b0148b" + "reference": "cd61e6dd273975c6625316de9d141ebd197f93c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/f5481b22729d465acb1cea3455fc04ce84b0148b", - "reference": "f5481b22729d465acb1cea3455fc04ce84b0148b", + "url": "https://api.github.com/repos/symfony/process/zipball/cd61e6dd273975c6625316de9d141ebd197f93c9", + "reference": "cd61e6dd273975c6625316de9d141ebd197f93c9", "shasum": "" }, "require": { @@ -14846,7 +14973,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.22" + "source": "https://github.com/symfony/process/tree/v4.4.25" }, "funding": [ { @@ -14862,7 +14989,7 @@ "type": "tidelift" } ], - "time": "2021-04-07T16:22:29+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -14954,16 +15081,16 @@ }, { "name": "symfony/routing", - "version": "v4.4.22", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "049e7c5c41f98511959668791b4adc0898a821b3" + "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/049e7c5c41f98511959668791b4adc0898a821b3", - "reference": "049e7c5c41f98511959668791b4adc0898a821b3", + "url": "https://api.github.com/repos/symfony/routing/zipball/3a3c2f197ad0846ac6413225fc78868ba1c61434", + "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434", "shasum": "" }, "require": { @@ -15022,7 +15149,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v4.4.22" + "source": "https://github.com/symfony/routing/tree/v4.4.25" }, "funding": [ { @@ -15038,20 +15165,20 @@ "type": "tidelift" } ], - "time": "2021-04-11T12:59:39+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/serializer", - "version": "v4.4.22", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "9db284ce4b1194797ad2ac6ad5406c5b416a9bb4" + "reference": "6db3eb4f1bb437cd3730f52353ba4b568acaddf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/9db284ce4b1194797ad2ac6ad5406c5b416a9bb4", - "reference": "9db284ce4b1194797ad2ac6ad5406c5b416a9bb4", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6db3eb4f1bb437cd3730f52353ba4b568acaddf5", + "reference": "6db3eb4f1bb437cd3730f52353ba4b568acaddf5", "shasum": "" }, "require": { @@ -15068,7 +15195,6 @@ }, "require-dev": { "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^3.4|^4.0|^5.0", "symfony/config": "^3.4|^4.0|^5.0", @@ -15082,8 +15208,7 @@ "symfony/yaml": "^3.4|^4.0|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "doctrine/annotations": "For using the annotation mapping.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", @@ -15117,7 +15242,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v4.4.22" + "source": "https://github.com/symfony/serializer/tree/v4.4.25" }, "funding": [ { @@ -15133,7 +15258,7 @@ "type": "tidelift" } ], - "time": "2021-04-13T06:32:41+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/service-contracts", @@ -15216,16 +15341,16 @@ }, { "name": "symfony/translation", - "version": "v4.4.23", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "ff6e63c7b5de874464642969968f61f8dc649ac3" + "reference": "dfe132c5c6d89f90ce7f961742cc532e9ca16dd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/ff6e63c7b5de874464642969968f61f8dc649ac3", - "reference": "ff6e63c7b5de874464642969968f61f8dc649ac3", + "url": "https://api.github.com/repos/symfony/translation/zipball/dfe132c5c6d89f90ce7f961742cc532e9ca16dd4", + "reference": "dfe132c5c6d89f90ce7f961742cc532e9ca16dd4", "shasum": "" }, "require": { @@ -15284,7 +15409,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v4.4.23" + "source": "https://github.com/symfony/translation/tree/v4.4.25" }, "funding": [ { @@ -15300,7 +15425,7 @@ "type": "tidelift" } ], - "time": "2021-04-28T06:59:52+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/translation-contracts", @@ -15382,16 +15507,16 @@ }, { "name": "symfony/validator", - "version": "v4.4.22", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "65525b93ebc48c2992271f435e1391bbb049367a" + "reference": "29c14955e8b2e7351aaa11553cb36d4a689b7b11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/65525b93ebc48c2992271f435e1391bbb049367a", - "reference": "65525b93ebc48c2992271f435e1391bbb049367a", + "url": "https://api.github.com/repos/symfony/validator/zipball/29c14955e8b2e7351aaa11553cb36d4a689b7b11", + "reference": "29c14955e8b2e7351aaa11553cb36d4a689b7b11", "shasum": "" }, "require": { @@ -15411,7 +15536,7 @@ }, "require-dev": { "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", + "doctrine/cache": "^1.0|^2.0", "egulias/email-validator": "^2.1.10|^3", "symfony/cache": "^3.4|^4.0|^5.0", "symfony/config": "^3.4|^4.0|^5.0", @@ -15467,7 +15592,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v4.4.22" + "source": "https://github.com/symfony/validator/tree/v4.4.25" }, "funding": [ { @@ -15483,20 +15608,20 @@ "type": "tidelift" } ], - "time": "2021-04-14T09:41:13+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.8", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d693200a73fae179d27f8f1b16b4faf3e8569eba" + "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d693200a73fae179d27f8f1b16b4faf3e8569eba", - "reference": "d693200a73fae179d27f8f1b16b4faf3e8569eba", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1d3953e627fe4b5f6df503f356b6545ada6351f3", + "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3", "shasum": "" }, "require": { @@ -15555,7 +15680,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.8" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.0" }, "funding": [ { @@ -15571,7 +15696,7 @@ "type": "tidelift" } ], - "time": "2021-05-07T13:42:21+00:00" + "time": "2021-05-27T12:28:50+00:00" }, { "name": "symfony/var-exporter", @@ -15648,16 +15773,16 @@ }, { "name": "symfony/yaml", - "version": "v4.4.22", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "1c2fd24147961525eaefb65b11987cab75adab59" + "reference": "81cdac5536925c1c4b7b50aabc9ff6330b9eb5fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/1c2fd24147961525eaefb65b11987cab75adab59", - "reference": "1c2fd24147961525eaefb65b11987cab75adab59", + "url": "https://api.github.com/repos/symfony/yaml/zipball/81cdac5536925c1c4b7b50aabc9ff6330b9eb5fc", + "reference": "81cdac5536925c1c4b7b50aabc9ff6330b9eb5fc", "shasum": "" }, "require": { @@ -15699,7 +15824,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.22" + "source": "https://github.com/symfony/yaml/tree/v4.4.25" }, "funding": [ { @@ -15715,7 +15840,7 @@ "type": "tidelift" } ], - "time": "2021-04-23T12:09:37+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "theseer/tokenizer", @@ -15769,16 +15894,16 @@ }, { "name": "twig/twig", - "version": "v2.14.5", + "version": "v2.14.6", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "c9dd15b3a80725bc4919730fae462bddcc960820" + "reference": "27e5cf2b05e3744accf39d4c68a3235d9966d260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/c9dd15b3a80725bc4919730fae462bddcc960820", - "reference": "c9dd15b3a80725bc4919730fae462bddcc960820", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/27e5cf2b05e3744accf39d4c68a3235d9966d260", + "reference": "27e5cf2b05e3744accf39d4c68a3235d9966d260", "shasum": "" }, "require": { @@ -15832,7 +15957,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.14.5" + "source": "https://github.com/twigphp/Twig/tree/v2.14.6" }, "funding": [ { @@ -15844,7 +15969,7 @@ "type": "tidelift" } ], - "time": "2021-05-12T08:02:35+00:00" + "time": "2021-05-16T12:12:47+00:00" }, { "name": "typhonius/acquia-php-sdk-v2", diff --git a/config/dx8/cohesion_component.cpt_image_media.yml_ b/config/dx8/cohesion_component.cpt_image_media.yml_ index 133b64f6b..bc797f54e 100644 --- a/config/dx8/cohesion_component.cpt_image_media.yml_ +++ b/config/dx8/cohesion_component.cpt_image_media.yml_ @@ -7,9 +7,9 @@ dependencies: { } id: cpt_image_media label: Image - json_values: '{"canvas":[{"type":"container","uid":"container","title":"Container","status":{"collapsed":false},"uuid":"b4e9645c-2a63-4804-aa28-33d2168d66a0","parentUid":"root","isContainer":true,"children":[{"type":"item","uid":"entity-browser","title":"Entity browser","status":{"collapsed":true},"uuid":"df850b4f-18d9-49c6-8819-f850c29f151f","parentUid":"container","isContainer":false,"children":[]}]}],"componentForm":[{"type":"form-container","uid":"form-tab-container","title":"Tab container","parentIndex":"form-layout","status":{"collapsed":false},"options":{"formBuilder":true},"parentUid":"root","uuid":"73e40bac-3ec7-4ca9-bd3a-9d576851df3d","isContainer":true,"children":[{"type":"form-container","uid":"form-tab-item","title":"Tab item","parentIndex":"form-layout","status":{"collapsed":true,"collapsedParents":[]},"options":{"formBuilder":true},"parentUid":"form-tab-container","uuid":"bdfc5eac-47b3-4406-9aff-d126d6fa9dca","isContainer":true,"children":[{"type":"form-container","uid":"form-section","title":"Field group","parentIndex":"form-layout","status":{"collapsed":true,"collapsedParents":["bdfc5eac-47b3-4406-9aff-d126d6fa9dca"]},"options":{"formBuilder":true},"parentUid":"form-tab-item","uuid":"8e8703f9-58f0-4a8c-aa20-59b6a5b61305","isContainer":true,"children":[{"type":"form-field","uid":"form-entity-browser","title":"Entity browser","status":{"collapsed":false,"collapsedParents":["8e8703f9-58f0-4a8c-aa20-59b6a5b61305"]},"parentUid":"form-section","uuid":"408a3712-f751-45c4-9e23-a8f66babb11b","isContainer":false,"children":[]},{"type":"form-field","uid":"form-select","title":"Select","status":{"collapsed":false,"collapsedParents":["8e8703f9-58f0-4a8c-aa20-59b6a5b61305"]},"uuid":"3737bce5-fe1c-4fec-a46d-7e505446081e","parentUid":"form-section","isContainer":false,"children":[]}]}]},{"type":"form-container","uid":"form-tab-item","title":"Tab item","status":{"collapsed":true,"collapsedParents":[]},"options":{"formBuilder":true},"uuid":"da80e521-4b72-4b06-84a3-b91d5ef88cda","parentUid":"form-tab-container","isContainer":true,"children":[{"type":"form-container","uid":"form-section","title":"Field group","status":{"collapsed":true,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"options":{"formBuilder":true},"uuid":"d0a0d3ce-9e49-468e-a0b2-350b80eb63df","parentUid":"form-tab-item","isContainer":true,"children":[{"type":"form-field","uid":"form-select","title":"Select","translate":false,"status":{"collapsed":false,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"uuid":"435844da-58e5-4af0-ae71-76cee28e79b8","parentUid":"form-section","isContainer":false,"children":[]}]},{"type":"form-container","uid":"form-section","title":"Field group","status":{"collapsed":true,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"options":{"formBuilder":true},"uuid":"c04a4db6-5cdd-4945-bc87-127a54da4903","parentUid":"form-tab-item","isContainer":true,"children":[{"type":"form-field","uid":"form-select","title":"Select","status":{"collapsed":false,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"uuid":"14a92358-62f1-4a02-b339-d021cdc2f6d7","parentUid":"form-section","isContainer":false,"children":[]}]}]},{"type":"form-container","uid":"form-tab-item","title":"Tab item","parentIndex":"form-layout","status":{"collapsed":true,"collapsedParents":[]},"options":{"formBuilder":true},"parentUid":"form-tab-container","uuid":"9a54d8b3-4c3c-4846-a069-509e238f6925","isContainer":true,"children":[{"type":"form-help","uid":"form-helptext","title":"Help text","parentIndex":"form-help","status":{"collapsed":false,"collapsedParents":["9a54d8b3-4c3c-4846-a069-509e238f6925"]},"uuid":"efd0bb6a-edf3-4491-ba31-5d0778a0c261","parentUid":"form-tab-item","isContainer":false,"children":[]}]}]}],"mapper":{"b4e9645c-2a63-4804-aa28-33d2168d66a0":{"settings":{"formDefinition":[{"formKey":"container-settings","children":[{"formKey":"container-width","breakpoints":[],"activeFields":[{"name":"width","active":true}]},{"formKey":"common-link-animation","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"linkAnimation","active":true},{"name":"animationType","active":true},{"name":"animationScope","active":true},{"name":"animationParent","active":true},{"name":"animationTarget","active":true},{"name":"animationScale","active":true},{"name":"animationDirection","active":true},{"name":"animationDirection","active":true},{"name":"animationDirection","active":true},{"name":"animationDistance","active":true},{"name":"animationPieces","active":true},{"name":"animationOrigin","active":true},{"name":"animationFoldHeight","active":true},{"name":"animationHorizontalFirst","active":true},{"name":"animationIterations","active":true},{"name":"animationEasing","active":true},{"name":"animationDuration","active":true}]},{"formKey":"common-link-modifier","breakpoints":[],"activeFields":[{"name":"modifier","active":true},{"name":"modifierType","active":true},{"name":"interactionScope","active":true},{"name":"interactionParent","active":true},{"name":"interactionTarget","active":true},{"name":"modifierName","active":true}]},{"formKey":"container-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]},"styles":{"formDefinition":[],"selectorType":"topLevel","items":[{"title":".image-object-fit-cover","type":"container","items":[{"title":"article","type":"container","items":[{"title":"picture","type":"container","items":[{"title":"img","type":"container","items":[],"form":null,"selectorType":"child","model":"img","uuid":"797e5e4e-9376-485e-9d4a-b8a0f997af69","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"height","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"min-height","active":false},{"name":"max-height","active":false},{"name":"height","active":true}]},{"formKey":"width","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"min-width","active":false},{"name":"max-width","active":false},{"name":"width","active":true}]}]},{"formKey":"custom-css","children":[{"formKey":"css-property-and-css-value","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"custom-css","active":true},{"name":"customCssProperty","active":true},{"name":"customCss","active":true}]}]}]}],"form":null,"selectorType":"child","model":"picture","uuid":"b814e6b7-03ec-4624-b7df-b434fa28cfa8","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"display","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"display","active":true},{"name":"visibility","active":false},{"name":"overflow","active":false},{"name":"overflow-x","active":false},{"name":"overflow-y","active":false}]},{"formKey":"flex-container","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-direction","active":true},{"name":"flex-wrap","active":false},{"name":"justify-content","active":false},{"name":"justify-content-safety","active":true},{"name":"align-content","active":false},{"name":"align-content-safety","active":true},{"name":"align-items","active":false},{"name":"align-items-safety","active":true}]},{"formKey":"flex-item","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-basis","active":false},{"name":"order","active":false},{"name":"flex-grow","active":true},{"name":"flex-shrink","active":false},{"name":"align-self","active":false},{"name":"align-self-safety","active":true}]}]}]}],"form":null,"selectorType":"child","model":"article","uuid":"a8f1a641-cb84-4683-a330-acc1d068d2b9","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"display","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"display","active":true},{"name":"visibility","active":false},{"name":"overflow","active":false},{"name":"overflow-x","active":false},{"name":"overflow-y","active":false}]},{"formKey":"flex-container","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-direction","active":true},{"name":"flex-wrap","active":false},{"name":"justify-content","active":false},{"name":"justify-content-safety","active":true},{"name":"align-content","active":false},{"name":"align-content-safety","active":true},{"name":"align-items","active":false},{"name":"align-items-safety","active":true}]},{"formKey":"flex-item","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-basis","active":false},{"name":"order","active":false},{"name":"flex-grow","active":true},{"name":"flex-shrink","active":false},{"name":"align-self","active":false},{"name":"align-self-safety","active":true}]}]}]}],"form":null,"selectorType":"modifier","model":".image-object-fit-cover","uuid":"392b27ac-f603-4c4a-a70f-2f7166b8dedd","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"display","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"display","active":true},{"name":"visibility","active":false},{"name":"overflow","active":false},{"name":"overflow-x","active":false},{"name":"overflow-y","active":false}]},{"formKey":"flex-container","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-direction","active":true},{"name":"flex-wrap","active":false},{"name":"justify-content","active":false},{"name":"justify-content-safety","active":true},{"name":"align-content","active":false},{"name":"align-content-safety","active":true},{"name":"align-items","active":false},{"name":"align-items-safety","active":true}]},{"formKey":"flex-item","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-basis","active":false},{"name":"order","active":false},{"name":"flex-grow","active":true},{"name":"flex-shrink","active":false},{"name":"align-self","active":false},{"name":"align-self-safety","active":true}]}]}]}],"form":null}},"df850b4f-18d9-49c6-8819-f850c29f151f":{"settings":{"formDefinition":[{"formKey":"entity-browser-settings","children":[{"formKey":"entity-browser","breakpoints":[],"activeFields":[{"name":"entity","active":true},{"name":"entityViewMode","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"b4e9645c-2a63-4804-aa28-33d2168d66a0":{"settings":{"title":"Container","width":"fluid","customStyle":[{"customStyle":"[field.14a92358-62f1-4a02-b339-d021cdc2f6d7]"},{"customStyle":"[field.435844da-58e5-4af0-ae71-76cee28e79b8]"}],"settings":{"width":"fluid","customStyle":[{"customStyle":""}]}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"container"},"392b27ac-f603-4c4a-a70f-2f7166b8dedd":{"settings":{"element":"","class":".image-object-fit-cover","combinator":"","pseudo":""},"styles":{"xl":{"display":{"value":"flex"},"flex-container":{"flex-direction":{"value":"column"}},"flex-item":{"flex-grow":{"value":"1"}}}}},"a8f1a641-cb84-4683-a330-acc1d068d2b9":{"settings":{"element":"article","class":"","combinator":"","pseudo":""},"styles":{"xl":{"display":{"value":"flex"},"flex-container":{"flex-direction":{"value":"column"}},"flex-item":{"flex-grow":{"value":"1"}}}}},"797e5e4e-9376-485e-9d4a-b8a0f997af69":{"settings":{"element":"img","class":"","combinator":"","pseudo":""},"styles":{"xl":{"custom-css":[{"customCssProperty":{"value":"object-fit"},"customCss":{"value":"cover"}}],"height":{"value":"100%"},"width":{"value":"auto"}}}},"b814e6b7-03ec-4624-b7df-b434fa28cfa8":{"settings":{"element":"picture","class":"","combinator":"","pseudo":""},"styles":{"xl":{"display":{"value":"flex"},"flex-container":{"flex-direction":{"value":"column"}},"flex-item":{"flex-grow":{"value":"1"}}}}}}},"df850b4f-18d9-49c6-8819-f850c29f151f":{"settings":{"title":"Entity browser","entity":"[field.408a3712-f751-45c4-9e23-a8f66babb11b]","entityViewMode":"[field.3737bce5-fe1c-4fec-a46d-7e505446081e]"},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"entity-browser"}}},"73e40bac-3ec7-4ca9-bd3a-9d576851df3d":{"settings":{"type":"cohTabContainer","title":"Tab container","responsiveMode":true}},"bdfc5eac-47b3-4406-9aff-d126d6fa9dca":{"settings":{"type":"cohTabItem","title":"Content","breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"8e8703f9-58f0-4a8c-aa20-59b6a5b61305":{"settings":{"title":"Image","type":"cohSection","hideRowHeading":0,"columnCount":"coh-component-field-group-1-col","breakpoints":false,"propertiesMenu":false,"disableScrollbar":true,"disableEllipsisMenu":true,"isOpen":true,"removePadding":0,"breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"408a3712-f751-45c4-9e23-a8f66babb11b":{"settings":{"title":"Image media","type":"cohEntityBrowser","showConfig":false,"hideRowHeading":true,"schema":{"type":"object"},"machineName":"image-media","options":{"entityBrowserTypeDisabled":true,"entityTypeDisabled":true,"entityBrowserType":"media_library","entityType":"media","bundles":{"image":true},"entityBrowserBundlesDisabled":true},"entityBrowserTypeTooltipPlacement":"auto right","entityTypeTooltipPlacement":"auto right","entityBrowserTooltipPlacement":"auto right"},"contextVisibility":{"condition":"ALL"},"model":{"value":{"entity":{"entityType":"media"}}}},"3737bce5-fe1c-4fec-a46d-7e505446081e":{"settings":{"title":"Image size","type":"cohSelect","selectType":"custom","schema":{"type":"string"},"machineName":"image-size","tooltipPlacement":"auto top-left","tooltipText":"","options":[{"label":"Large (W1360)","value":"media.large"},{"label":"Large landscape (1360x980)","value":"media.large_landscape"},{"label":"Medium (W768)","value":"media.medium"},{"label":"Medium landscape (768x512)","value":"media.medium_landscape"},{"label":"Small (W568)","value":"media.small"},{"label":"Small landscape (568x352)","value":"media.small_lanscape"}]},"contextVisibility":{"condition":"ALL"},"model":{"value":"media.large"}},"da80e521-4b72-4b06-84a3-b91d5ef88cda":{"settings":{"title":"Layout and style","type":"cohTabItem","breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"d0a0d3ce-9e49-468e-a0b2-350b80eb63df":{"settings":{"title":"Height","type":"cohSection","hideRowHeading":0,"removePadding":0,"columnCount":"coh-component-field-group-1-col","breakpointIcon":"","breakpoints":false,"propertiesMenu":false,"disableScrollbar":true,"disableEllipsisMenu":true,"isOpen":true},"contextVisibility":{"condition":"ALL"}},"435844da-58e5-4af0-ae71-76cee28e79b8":{"settings":{"title":"Image size behavior","type":"cohSelect","selectType":"custom","schema":{"type":"string"},"options":[{"label":"Natural size of image","value":""},{"label":"Fill space available","value":"image-object-fit-cover"}],"machineName":"height","tooltipPlacement":"auto top-left","tooltipText":"Fill space available - Image will cover space available and maybe cropped."},"contextVisibility":{"condition":"ALL"},"model":{"value":""}},"c04a4db6-5cdd-4945-bc87-127a54da4903":{"settings":{"title":"Space below","type":"cohSection","hideRowHeading":0,"removePadding":0,"columnCount":"coh-component-field-group-1-col","breakpointIcon":"","breakpoints":false,"propertiesMenu":false,"disableScrollbar":true,"disableEllipsisMenu":true,"isOpen":true},"contextVisibility":{"condition":"ALL"}},"14a92358-62f1-4a02-b339-d021cdc2f6d7":{"settings":{"title":"Add space below","type":"cohSelect","selectType":"custom","schema":{"type":"string"},"options":[{"label":"None","value":""},{"label":"Add space below image","value":"coh-style-margin-bottom-small"}],"machineName":"add-space-below","tooltipPlacement":"auto right"},"contextVisibility":{"condition":"ALL"},"model":{"value":"coh-style-margin-bottom-small"}},"9a54d8b3-4c3c-4846-a069-509e238f6925":{"settings":{"type":"cohTabItem","title":"Help","breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"efd0bb6a-edf3-4491-ba31-5d0778a0c261":{"settings":{"title":"Help text","type":"cohHelpText","options":{"helpText":"# Using the Image component\n- Use the image component to add an image to a layout.\n- The image component is best placed within a Layout or other containing component.\n\n# Image\n- **Image -** Upload and image. This field is required.\n- **Image size -** Set the size and aspect ratio of the image to be displayed on a desktop screen. Tablet and mobile sized screens are accommodated automatically. Sizes that only specify a width will retain the aspect ratio of the original image. Sizes that specify a width and height will resize and crop the image where required.\n\n# Layout\n- ** Image size behavior -** Set the image height to fill the space available. The image maybe cropped. \n- **Space below image** - Add a space (margin) below the image. This is required if a space is desirable when adding this component above another component within the same parent layout component.","showClose":false,"helpType":"coh-help-text--help"}},"contextVisibility":{"condition":"ALL"},"model":{}}},"previewModel":{"8e8703f9-58f0-4a8c-aa20-59b6a5b61305":{},"3737bce5-fe1c-4fec-a46d-7e505446081e":{},"efd0bb6a-edf3-4491-ba31-5d0778a0c261":{},"14a92358-62f1-4a02-b339-d021cdc2f6d7":{},"da80e521-4b72-4b06-84a3-b91d5ef88cda":{},"c04a4db6-5cdd-4945-bc87-127a54da4903":{},"d0a0d3ce-9e49-468e-a0b2-350b80eb63df":{},"435844da-58e5-4af0-ae71-76cee28e79b8":{},"408a3712-f751-45c4-9e23-a8f66babb11b":{},"df850b4f-18d9-49c6-8819-f850c29f151f":{"settings":{"entity":{"entityBrowserType":"media_library","entityType":"media","entity":{"entityType":"media"},"bundles":{"image":true}}}},"b4e9645c-2a63-4804-aa28-33d2168d66a0":{"settings":{"customStyle":[{"customStyle":""},{"customStyle":""}]}}},"variableFields":{"8e8703f9-58f0-4a8c-aa20-59b6a5b61305":[],"3737bce5-fe1c-4fec-a46d-7e505446081e":[],"efd0bb6a-edf3-4491-ba31-5d0778a0c261":[],"14a92358-62f1-4a02-b339-d021cdc2f6d7":[],"da80e521-4b72-4b06-84a3-b91d5ef88cda":[],"c04a4db6-5cdd-4945-bc87-127a54da4903":[],"d0a0d3ce-9e49-468e-a0b2-350b80eb63df":[],"435844da-58e5-4af0-ae71-76cee28e79b8":[],"408a3712-f751-45c4-9e23-a8f66babb11b":[],"df850b4f-18d9-49c6-8819-f850c29f151f":["settings.entity","settings.entityViewMode"],"b4e9645c-2a63-4804-aa28-33d2168d66a0":["settings.customStyle.0.customStyle","settings.customStyle.1.customStyle"]},"meta":{"fieldHistory":[{"uuid":"14a92358-62f1-4a02-b339-d021cdc2f6d7","type":"form-select","machineName":"add-space-below"},{"uuid":"435844da-58e5-4af0-ae71-76cee28e79b8","type":"form-select","machineName":"height"},{"uuid":"3737bce5-fe1c-4fec-a46d-7e505446081e","type":"form-select","machineName":"image-size"},{"uuid":"408a3712-f751-45c4-9e23-a8f66babb11b","type":"form-entity-browser","machineName":"image-media"},{"uuid":"cb7f30de-57ac-47e5-a231-9f9c2ee76c88","type":"form-input","machineName":"alt-tag"},{"uuid":"5b2cb1c7-d3bd-4f8a-bb8d-5965cc1634b5","type":"form-image","machineName":"image"},{"uuid":"e698a2ef-9b38-4c0c-acbd-ffb160383618","type":"form-entity-browser","machineName":"media"},{"uuid":"b67f405c-f18e-4644-b9c2-ad929927b479","type":"form-image","machineName":"image-uploader"},{"uuid":"a4e91bf7-5153-4a1d-a6ab-6af21fa519fd","type":"form-input","machineName":"caption-optional"},{"uuid":"a1ebeaca-4e4e-4ca2-afc8-57d52d67eb7c","type":"form-select","machineName":"caption-color"}]}}' + json_values: '{"canvas":[{"type":"container","uid":"container","title":"Container","status":{"collapsed":false},"uuid":"b4e9645c-2a63-4804-aa28-33d2168d66a0","parentUid":"root","isContainer":true,"children":[{"type":"item","uid":"entity-browser","title":"Entity browser","status":{"collapsed":true},"uuid":"df850b4f-18d9-49c6-8819-f850c29f151f","parentUid":"container","isContainer":false,"children":[]}]}],"componentForm":[{"type":"form-container","uid":"form-tab-container","title":"Tab container","parentIndex":"form-layout","status":{"collapsed":false},"options":{"formBuilder":true},"parentUid":"root","uuid":"73e40bac-3ec7-4ca9-bd3a-9d576851df3d","isContainer":true,"children":[{"type":"form-container","uid":"form-tab-item","title":"Tab item","parentIndex":"form-layout","status":{"collapsed":false,"collapsedParents":[]},"options":{"formBuilder":true},"parentUid":"form-tab-container","uuid":"bdfc5eac-47b3-4406-9aff-d126d6fa9dca","isContainer":true,"children":[{"type":"form-container","uid":"form-section","title":"Field group","parentIndex":"form-layout","status":{"collapsed":false,"collapsedParents":[]},"options":{"formBuilder":true},"parentUid":"form-tab-item","uuid":"8e8703f9-58f0-4a8c-aa20-59b6a5b61305","isContainer":true,"children":[{"type":"form-field","uid":"form-entity-browser","title":"Entity browser","status":{"collapsed":false,"collapsedParents":[]},"parentUid":"form-section","uuid":"408a3712-f751-45c4-9e23-a8f66babb11b","isContainer":false,"children":[]},{"type":"form-field","uid":"form-select","title":"Select","status":{"collapsed":false,"collapsedParents":[]},"uuid":"3737bce5-fe1c-4fec-a46d-7e505446081e","parentUid":"form-section","isContainer":false,"children":[]}]}]},{"type":"form-container","uid":"form-tab-item","title":"Tab item","status":{"collapsed":true,"collapsedParents":[]},"options":{"formBuilder":true},"uuid":"da80e521-4b72-4b06-84a3-b91d5ef88cda","parentUid":"form-tab-container","isContainer":true,"children":[{"type":"form-container","uid":"form-section","title":"Field group","status":{"collapsed":true,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"options":{"formBuilder":true},"uuid":"d0a0d3ce-9e49-468e-a0b2-350b80eb63df","parentUid":"form-tab-item","isContainer":true,"children":[{"type":"form-field","uid":"form-select","title":"Select","translate":false,"status":{"collapsed":false,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"uuid":"435844da-58e5-4af0-ae71-76cee28e79b8","parentUid":"form-section","isContainer":false,"children":[]}]},{"type":"form-container","uid":"form-section","title":"Field group","status":{"collapsed":true,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"options":{"formBuilder":true},"uuid":"c04a4db6-5cdd-4945-bc87-127a54da4903","parentUid":"form-tab-item","isContainer":true,"children":[{"type":"form-field","uid":"form-select","title":"Select","status":{"collapsed":false,"collapsedParents":["da80e521-4b72-4b06-84a3-b91d5ef88cda"]},"uuid":"14a92358-62f1-4a02-b339-d021cdc2f6d7","parentUid":"form-section","isContainer":false,"children":[]}]}]},{"type":"form-container","uid":"form-tab-item","title":"Tab item","parentIndex":"form-layout","status":{"collapsed":true,"collapsedParents":[]},"options":{"formBuilder":true},"parentUid":"form-tab-container","uuid":"9a54d8b3-4c3c-4846-a069-509e238f6925","isContainer":true,"children":[{"type":"form-help","uid":"form-helptext","title":"Help text","parentIndex":"form-help","status":{"collapsed":false,"collapsedParents":["9a54d8b3-4c3c-4846-a069-509e238f6925"]},"uuid":"efd0bb6a-edf3-4491-ba31-5d0778a0c261","parentUid":"form-tab-item","isContainer":false,"children":[]}]}]}],"mapper":{"b4e9645c-2a63-4804-aa28-33d2168d66a0":{"settings":{"formDefinition":[{"formKey":"container-settings","children":[{"formKey":"container-width","breakpoints":[],"activeFields":[{"name":"width","active":true}]},{"formKey":"common-link-animation","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"linkAnimation","active":true},{"name":"animationType","active":true},{"name":"animationScope","active":true},{"name":"animationParent","active":true},{"name":"animationTarget","active":true},{"name":"animationScale","active":true},{"name":"animationDirection","active":true},{"name":"animationDirection","active":true},{"name":"animationDirection","active":true},{"name":"animationDistance","active":true},{"name":"animationPieces","active":true},{"name":"animationOrigin","active":true},{"name":"animationFoldHeight","active":true},{"name":"animationHorizontalFirst","active":true},{"name":"animationIterations","active":true},{"name":"animationEasing","active":true},{"name":"animationDuration","active":true}]},{"formKey":"common-link-modifier","breakpoints":[],"activeFields":[{"name":"modifier","active":true},{"name":"modifierType","active":true},{"name":"interactionScope","active":true},{"name":"interactionParent","active":true},{"name":"interactionTarget","active":true},{"name":"modifierName","active":true}]},{"formKey":"container-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]},"styles":{"formDefinition":[],"selectorType":"topLevel","items":[{"title":".image-object-fit-cover","type":"container","items":[{"title":"article","type":"container","items":[{"title":"picture","type":"container","items":[{"title":"img","type":"container","items":[],"form":null,"selectorType":"child","model":"img","uuid":"797e5e4e-9376-485e-9d4a-b8a0f997af69","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"height","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"min-height","active":false},{"name":"max-height","active":false},{"name":"height","active":true}]},{"formKey":"width","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"min-width","active":false},{"name":"max-width","active":false},{"name":"width","active":true}]}]},{"formKey":"custom-css","children":[{"formKey":"css-property-and-css-value","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"custom-css","active":true},{"name":"customCssProperty","active":true},{"name":"customCss","active":true}]}]}]}],"form":null,"selectorType":"child","model":"picture","uuid":"b814e6b7-03ec-4624-b7df-b434fa28cfa8","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"display","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"display","active":true},{"name":"visibility","active":false},{"name":"overflow","active":false},{"name":"overflow-x","active":false},{"name":"overflow-y","active":false}]},{"formKey":"flex-container","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-direction","active":true},{"name":"flex-wrap","active":false},{"name":"justify-content","active":false},{"name":"justify-content-safety","active":true},{"name":"align-content","active":false},{"name":"align-content-safety","active":true},{"name":"align-items","active":false},{"name":"align-items-safety","active":true}]},{"formKey":"flex-item","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-basis","active":false},{"name":"order","active":false},{"name":"flex-grow","active":true},{"name":"flex-shrink","active":false},{"name":"align-self","active":false},{"name":"align-self-safety","active":true}]}]}]}],"form":null,"selectorType":"child","model":"article","uuid":"a8f1a641-cb84-4683-a330-acc1d068d2b9","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"display","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"display","active":true},{"name":"visibility","active":false},{"name":"overflow","active":false},{"name":"overflow-x","active":false},{"name":"overflow-y","active":false}]},{"formKey":"flex-container","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-direction","active":true},{"name":"flex-wrap","active":false},{"name":"justify-content","active":false},{"name":"justify-content-safety","active":true},{"name":"align-content","active":false},{"name":"align-content-safety","active":true},{"name":"align-items","active":false},{"name":"align-items-safety","active":true}]},{"formKey":"flex-item","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-basis","active":false},{"name":"order","active":false},{"name":"flex-grow","active":true},{"name":"flex-shrink","active":false},{"name":"align-self","active":false},{"name":"align-self-safety","active":true}]}]}]}],"form":null,"selectorType":"modifier","model":".image-object-fit-cover","uuid":"392b27ac-f603-4c4a-a70f-2f7166b8dedd","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"display","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"display","active":true},{"name":"visibility","active":false},{"name":"overflow","active":false},{"name":"overflow-x","active":false},{"name":"overflow-y","active":false}]},{"formKey":"flex-container","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-direction","active":true},{"name":"flex-wrap","active":false},{"name":"justify-content","active":false},{"name":"justify-content-safety","active":true},{"name":"align-content","active":false},{"name":"align-content-safety","active":true},{"name":"align-items","active":false},{"name":"align-items-safety","active":true}]},{"formKey":"flex-item","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"flex-basis","active":false},{"name":"order","active":false},{"name":"flex-grow","active":true},{"name":"flex-shrink","active":false},{"name":"align-self","active":false},{"name":"align-self-safety","active":true}]}]}]}],"form":null}},"df850b4f-18d9-49c6-8819-f850c29f151f":{"settings":{"formDefinition":[{"formKey":"entity-browser-settings","children":[{"formKey":"entity-browser","breakpoints":[],"activeFields":[{"name":"entity","active":true},{"name":"entityViewMode","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"b4e9645c-2a63-4804-aa28-33d2168d66a0":{"settings":{"title":"Container","width":"fluid","customStyle":[{"customStyle":"[field.14a92358-62f1-4a02-b339-d021cdc2f6d7]"},{"customStyle":"[field.435844da-58e5-4af0-ae71-76cee28e79b8]"}],"settings":{"width":"fluid","customStyle":[{"customStyle":""}]}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"container"},"392b27ac-f603-4c4a-a70f-2f7166b8dedd":{"settings":{"element":"","class":".image-object-fit-cover","combinator":"","pseudo":""},"styles":{"xl":{"display":{"value":"flex"},"flex-container":{"flex-direction":{"value":"column"}},"flex-item":{"flex-grow":{"value":"1"}}}}},"a8f1a641-cb84-4683-a330-acc1d068d2b9":{"settings":{"element":"article","class":"","combinator":"","pseudo":""},"styles":{"xl":{"display":{"value":"flex"},"flex-container":{"flex-direction":{"value":"column"}},"flex-item":{"flex-grow":{"value":"1"}}}}},"797e5e4e-9376-485e-9d4a-b8a0f997af69":{"settings":{"element":"img","class":"","combinator":"","pseudo":""},"styles":{"xl":{"custom-css":[{"customCssProperty":{"value":"object-fit"},"customCss":{"value":"cover"}}],"height":{"value":"100%"},"width":{"value":"auto"}}}},"b814e6b7-03ec-4624-b7df-b434fa28cfa8":{"settings":{"element":"picture","class":"","combinator":"","pseudo":""},"styles":{"xl":{"display":{"value":"flex"},"flex-container":{"flex-direction":{"value":"column"}},"flex-item":{"flex-grow":{"value":"1"}}}}}}},"df850b4f-18d9-49c6-8819-f850c29f151f":{"settings":{"title":"Entity browser","entity":"[field.408a3712-f751-45c4-9e23-a8f66babb11b]","entityViewMode":"[field.3737bce5-fe1c-4fec-a46d-7e505446081e]"},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"entity-browser"}}},"73e40bac-3ec7-4ca9-bd3a-9d576851df3d":{"settings":{"type":"cohTabContainer","title":"Tab container","responsiveMode":true}},"bdfc5eac-47b3-4406-9aff-d126d6fa9dca":{"settings":{"type":"cohTabItem","title":"Content","breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"8e8703f9-58f0-4a8c-aa20-59b6a5b61305":{"settings":{"title":"Image","type":"cohSection","hideRowHeading":0,"columnCount":"coh-component-field-group-1-col","breakpoints":false,"propertiesMenu":false,"disableScrollbar":true,"disableEllipsisMenu":true,"isOpen":true,"removePadding":0,"breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"408a3712-f751-45c4-9e23-a8f66babb11b":{"settings":{"title":"Image media","type":"cohEntityBrowser","showConfig":false,"hideRowHeading":true,"schema":{"type":"object"},"machineName":"image-media","options":{"entityBrowserTypeDisabled":true,"entityTypeDisabled":true,"entityBrowserType":"media_library","entityType":"media","bundles":{"image":true},"entityBrowserBundlesDisabled":true},"entityBrowserTypeTooltipPlacement":"auto right","entityTypeTooltipPlacement":"auto right","entityBrowserTooltipPlacement":"auto right"},"contextVisibility":{"condition":"ALL"},"model":{"value":{"entity":{"entityType":"media"}}}},"3737bce5-fe1c-4fec-a46d-7e505446081e":{"settings":{"title":"Image size","type":"cohSelect","selectType":"custom","schema":{"type":"string"},"machineName":"image-size","tooltipPlacement":"auto top-left","tooltipText":"","options":[{"label":"Large (W1360)","value":"media.large"},{"label":"Large landscape (1360x980)","value":"media.large_landscape"},{"label":"Medium (W768)","value":"media.medium"},{"label":"Medium landscape (768x512)","value":"media.medium_landscape"},{"label":"Small (W568)","value":"media.small"},{"label":"Small landscape (568x352)","value":"media.small_landscape"}]},"contextVisibility":{"condition":"ALL"},"model":{"value":"media.large"}},"da80e521-4b72-4b06-84a3-b91d5ef88cda":{"settings":{"title":"Layout and style","type":"cohTabItem","breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"d0a0d3ce-9e49-468e-a0b2-350b80eb63df":{"settings":{"title":"Height","type":"cohSection","hideRowHeading":0,"removePadding":0,"columnCount":"coh-component-field-group-1-col","breakpointIcon":"","breakpoints":false,"propertiesMenu":false,"disableScrollbar":true,"disableEllipsisMenu":true,"isOpen":true},"contextVisibility":{"condition":"ALL"}},"435844da-58e5-4af0-ae71-76cee28e79b8":{"settings":{"title":"Image size behavior","type":"cohSelect","selectType":"custom","schema":{"type":"string"},"options":[{"label":"Natural size of image","value":""},{"label":"Fill space available","value":"image-object-fit-cover"}],"machineName":"height","tooltipPlacement":"auto top-left","tooltipText":"Fill space available - Image will cover space available and maybe cropped."},"contextVisibility":{"condition":"ALL"},"model":{"value":""}},"c04a4db6-5cdd-4945-bc87-127a54da4903":{"settings":{"title":"Space below","type":"cohSection","hideRowHeading":0,"removePadding":0,"columnCount":"coh-component-field-group-1-col","breakpointIcon":"","breakpoints":false,"propertiesMenu":false,"disableScrollbar":true,"disableEllipsisMenu":true,"isOpen":true},"contextVisibility":{"condition":"ALL"}},"14a92358-62f1-4a02-b339-d021cdc2f6d7":{"settings":{"title":"Add space below","type":"cohSelect","selectType":"custom","schema":{"type":"string"},"options":[{"label":"None","value":""},{"label":"Add space below image","value":"coh-style-margin-bottom-small"}],"machineName":"add-space-below","tooltipPlacement":"auto right"},"contextVisibility":{"condition":"ALL"},"model":{"value":"coh-style-margin-bottom-small"}},"9a54d8b3-4c3c-4846-a069-509e238f6925":{"settings":{"type":"cohTabItem","title":"Help","breakpointIcon":""},"contextVisibility":{"condition":"ALL"}},"efd0bb6a-edf3-4491-ba31-5d0778a0c261":{"settings":{"title":"Help text","type":"cohHelpText","options":{"helpText":"# Using the Image component\n- Use the image component to add an image to a layout.\n- The image component is best placed within a Layout or other containing component.\n\n# Image\n- **Image -** Upload and image. This field is required.\n- **Image size -** Set the size and aspect ratio of the image to be displayed on a desktop screen. Tablet and mobile sized screens are accommodated automatically. Sizes that only specify a width will retain the aspect ratio of the original image. Sizes that specify a width and height will resize and crop the image where required.\n\n# Layout\n- ** Image size behavior -** Set the image height to fill the space available. The image maybe cropped. \n- **Space below image** - Add a space (margin) below the image. This is required if a space is desirable when adding this component above another component within the same parent layout component.","showClose":false,"helpType":"coh-help-text--help"}},"contextVisibility":{"condition":"ALL"},"model":{}}},"previewModel":{"8e8703f9-58f0-4a8c-aa20-59b6a5b61305":{},"3737bce5-fe1c-4fec-a46d-7e505446081e":{},"efd0bb6a-edf3-4491-ba31-5d0778a0c261":{},"14a92358-62f1-4a02-b339-d021cdc2f6d7":{},"da80e521-4b72-4b06-84a3-b91d5ef88cda":{},"c04a4db6-5cdd-4945-bc87-127a54da4903":{},"d0a0d3ce-9e49-468e-a0b2-350b80eb63df":{},"435844da-58e5-4af0-ae71-76cee28e79b8":{},"408a3712-f751-45c4-9e23-a8f66babb11b":{},"df850b4f-18d9-49c6-8819-f850c29f151f":{"settings":{"entity":{"entityBrowserType":"media_library","entityType":"media","entity":{"entityType":"media"},"bundles":{"image":true}}}},"b4e9645c-2a63-4804-aa28-33d2168d66a0":{"settings":{"customStyle":[{"customStyle":""},{"customStyle":""}]}}},"variableFields":{"8e8703f9-58f0-4a8c-aa20-59b6a5b61305":[],"3737bce5-fe1c-4fec-a46d-7e505446081e":[],"efd0bb6a-edf3-4491-ba31-5d0778a0c261":[],"14a92358-62f1-4a02-b339-d021cdc2f6d7":[],"da80e521-4b72-4b06-84a3-b91d5ef88cda":[],"c04a4db6-5cdd-4945-bc87-127a54da4903":[],"d0a0d3ce-9e49-468e-a0b2-350b80eb63df":[],"435844da-58e5-4af0-ae71-76cee28e79b8":[],"408a3712-f751-45c4-9e23-a8f66babb11b":[],"df850b4f-18d9-49c6-8819-f850c29f151f":["settings.entity","settings.entityViewMode"],"b4e9645c-2a63-4804-aa28-33d2168d66a0":["settings.customStyle.0.customStyle","settings.customStyle.1.customStyle"]},"meta":{"fieldHistory":[{"uuid":"14a92358-62f1-4a02-b339-d021cdc2f6d7","type":"form-select","machineName":"add-space-below"},{"uuid":"435844da-58e5-4af0-ae71-76cee28e79b8","type":"form-select","machineName":"height"},{"uuid":"3737bce5-fe1c-4fec-a46d-7e505446081e","type":"form-select","machineName":"image-size"},{"uuid":"408a3712-f751-45c4-9e23-a8f66babb11b","type":"form-entity-browser","machineName":"image-media"},{"uuid":"cb7f30de-57ac-47e5-a231-9f9c2ee76c88","type":"form-input","machineName":"alt-tag"},{"uuid":"5b2cb1c7-d3bd-4f8a-bb8d-5965cc1634b5","type":"form-image","machineName":"image"},{"uuid":"e698a2ef-9b38-4c0c-acbd-ffb160383618","type":"form-entity-browser","machineName":"media"},{"uuid":"b67f405c-f18e-4644-b9c2-ad929927b479","type":"form-image","machineName":"image-uploader"},{"uuid":"a4e91bf7-5153-4a1d-a6ab-6af21fa519fd","type":"form-input","machineName":"caption-optional"},{"uuid":"a1ebeaca-4e4e-4ca2-afc8-57d52d67eb7c","type":"form-select","machineName":"caption-color"}]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 locked: false modified: true selectable: true diff --git a/config/install/image.style.coh_large_landscape.yml b/config/install/image.style.coh_large_landscape.yml index 73a85907c..3f3623af3 100644 --- a/config/install/image.style.coh_large_landscape.yml +++ b/config/install/image.style.coh_large_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_large_landscape label: 'Large landscape (1024x683)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + 39fc4c54-ae2c-4de4-a02a-d06d882da247: + uuid: 39fc4c54-ae2c-4de4-a02a-d06d882da247 + id: focal_point_scale_and_crop weight: 1 data: width: 1024 height: 683 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_large_super_landscape.yml b/config/install/image.style.coh_large_super_landscape.yml index 6c0b2b73a..54cc87693 100644 --- a/config/install/image.style.coh_large_super_landscape.yml +++ b/config/install/image.style.coh_large_super_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_large_super_landscape label: 'Large super landscape (1024x480)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + 8bbe9d4d-cd43-44e9-a209-457a4caaeee4: + uuid: 8bbe9d4d-cd43-44e9-a209-457a4caaeee4 + id: focal_point_scale_and_crop weight: 1 data: width: 1024 height: 480 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_medium_landscape.yml b/config/install/image.style.coh_medium_landscape.yml index 68ac01b00..0a7f42ebd 100644 --- a/config/install/image.style.coh_medium_landscape.yml +++ b/config/install/image.style.coh_medium_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_medium_landscape label: 'Medium landscape (768x512)' effects: - 823dd069-3fea-44d7-a594-104ad44a4fba: - uuid: 823dd069-3fea-44d7-a594-104ad44a4fba - id: image_scale_and_crop + 87cf2dba-d703-4f1e-ab98-3f21eb92ecd2: + uuid: 87cf2dba-d703-4f1e-ab98-3f21eb92ecd2 + id: focal_point_scale_and_crop weight: 1 data: width: 768 height: 512 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_medium_super_landscape.yml b/config/install/image.style.coh_medium_super_landscape.yml index 7d3cf8546..5786f1cf5 100644 --- a/config/install/image.style.coh_medium_super_landscape.yml +++ b/config/install/image.style.coh_medium_super_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_medium_super_landscape label: 'Medium super landscape (768x360)' effects: - 823dd069-3fea-44d7-a594-104ad44a4fba: - uuid: 823dd069-3fea-44d7-a594-104ad44a4fba - id: image_scale_and_crop + a7be10be-726c-4b2a-8025-9a9b7dd85a00: + uuid: a7be10be-726c-4b2a-8025-9a9b7dd85a00 + id: focal_point_scale_and_crop weight: 1 data: width: 768 height: 360 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_small_landscape.yml b/config/install/image.style.coh_small_landscape.yml index 3f93f24b0..72059720a 100644 --- a/config/install/image.style.coh_small_landscape.yml +++ b/config/install/image.style.coh_small_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_small_landscape label: 'Small landscape (568x352)' effects: - 8081d8c5-76e6-480e-8fea-1c3daaa64b23: - uuid: 8081d8c5-76e6-480e-8fea-1c3daaa64b23 - id: image_scale_and_crop + d8e910fc-dc0e-4a7d-bc21-a3be9cb7a560: + uuid: d8e910fc-dc0e-4a7d-bc21-a3be9cb7a560 + id: focal_point_scale_and_crop weight: 1 data: width: 568 height: 352 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_small_square.yml b/config/install/image.style.coh_small_square.yml index 43c6dfe54..e922a5d4d 100644 --- a/config/install/image.style.coh_small_square.yml +++ b/config/install/image.style.coh_small_square.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_small_square label: 'Small square (568x568)' effects: - 9b59a7b4-40a6-4a5c-b8ef-b6b46640465e: - uuid: 9b59a7b4-40a6-4a5c-b8ef-b6b46640465e - id: image_scale_and_crop + 34322c52-b7f4-4755-bd49-62d4bb2b8e08: + uuid: 34322c52-b7f4-4755-bd49-62d4bb2b8e08 + id: focal_point_scale_and_crop weight: 1 data: width: 568 height: 568 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_x_large_landscape.yml b/config/install/image.style.coh_x_large_landscape.yml index c30e87c9f..cf550d908 100644 --- a/config/install/image.style.coh_x_large_landscape.yml +++ b/config/install/image.style.coh_x_large_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_x_large_landscape label: 'X Large landscape (1360x908)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + ff9be98a-6552-4ae0-8687-8bf8e4dc61ef: + uuid: ff9be98a-6552-4ae0-8687-8bf8e4dc61ef + id: focal_point_scale_and_crop weight: 1 data: width: 1360 height: 908 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_x_large_super_landscape.yml b/config/install/image.style.coh_x_large_super_landscape.yml index 980dc53e5..1c936160e 100644 --- a/config/install/image.style.coh_x_large_super_landscape.yml +++ b/config/install/image.style.coh_x_large_super_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_x_large_super_landscape label: 'X Large super landscape (1360x640)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + b2c98208-726a-44f9-99de-2624f33ac6bd: + uuid: b2c98208-726a-44f9-99de-2624f33ac6bd + id: focal_point_scale_and_crop weight: 1 data: width: 1360 height: 640 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_xx_large_landscape.yml b/config/install/image.style.coh_xx_large_landscape.yml index 59d48d4af..78b2d3dfe 100644 --- a/config/install/image.style.coh_xx_large_landscape.yml +++ b/config/install/image.style.coh_xx_large_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_xx_large_landscape label: 'XX Large landscape (1600x1067)' effects: - 9af59107-7d25-4a0a-97e9-6e2c4c1855b7: - uuid: 9af59107-7d25-4a0a-97e9-6e2c4c1855b7 - id: image_scale_and_crop + 4fc6f472-7800-4b98-a94d-0e29a3996610: + uuid: 4fc6f472-7800-4b98-a94d-0e29a3996610 + id: focal_point_scale_and_crop weight: 1 data: width: 1600 height: 1067 - anchor: center-center + crop_type: focal_point diff --git a/config/install/image.style.coh_xx_small_landscape.yml b/config/install/image.style.coh_xx_small_landscape.yml index c9bb03ed3..f4d11640e 100644 --- a/config/install/image.style.coh_xx_small_landscape.yml +++ b/config/install/image.style.coh_xx_small_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_xx_small_landscape label: 'XX Small landscape (160x120)' effects: - 0410655e-6d68-4687-b13e-b30b5d4093b1: - uuid: 0410655e-6d68-4687-b13e-b30b5d4093b1 - id: image_scale_and_crop + 9846c8a0-70c1-4f9b-ae0a-53411f2a6c52: + uuid: 9846c8a0-70c1-4f9b-ae0a-53411f2a6c52 + id: focal_point_scale_and_crop weight: 1 data: width: 160 height: 120 - anchor: center-center + crop_type: focal_point diff --git a/config/optional/config_ignore.settings.yml b/config/optional/config_ignore.settings.yml new file mode 100644 index 000000000..a498ef67c --- /dev/null +++ b/config/optional/config_ignore.settings.yml @@ -0,0 +1,4 @@ +ignored_config_entities: + - 'language.entity.*' + - 'media.type.image:uuid' + - 'crop.type.focal_point:uuid' diff --git a/install-acms b/install-acms index 13f0672b3..53a3ca8e5 100755 --- a/install-acms +++ b/install-acms @@ -17,6 +17,13 @@ validate_email () { } printf "${CYAN}### Welcome to Acquia CMS! ###${NC}\n" +COMPOSER=$(composer -V) +VERSION="Composer version 1" +printf "${CYAN}Composer version:${NC} $COMPOSER\n" +if grep -q "$VERSION" <<< "$COMPOSER"; then + printf "${YELLOW}This script requires Composer version 2 or later. Go here for instructions to install: https://getcomposer.org${NC}\n"; + exit 0; +fi printf "Please enter the username for your administrator account [${GREEN}admin${NC}]: " DEFAULT_NAME="admin" read ADMIN_NAME diff --git a/modules/acquia_cms_article/acquia_cms_article.info.yml b/modules/acquia_cms_article/acquia_cms_article.info.yml index f81e1d4a6..cf023b758 100644 --- a/modules/acquia_cms_article/acquia_cms_article.info.yml +++ b/modules/acquia_cms_article/acquia_cms_article.info.yml @@ -1,4 +1,4 @@ -name: "Article" +name: "Acquia CMS Article" package: "Acquia CMS" description: "Provides an Article content type and related configuration." type: module diff --git a/modules/acquia_cms_article/config/optional/block.block.articles_article_type.yml b/modules/acquia_cms_article/config/optional/block.block.articles_article_type.yml index c92ed8828..4539f1f1a 100644 --- a/modules/acquia_cms_article/config/optional/block.block.articles_article_type.yml +++ b/modules/acquia_cms_article/config/optional/block.block.articles_article_type.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.articles_article_type module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: articles_article_type theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:articles_article_type' label: 'Article Type' provider: facets - label_display: '0' + label_display: visible block_id: articles_article_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_article/config/optional/block.block.articles_category.yml b/modules/acquia_cms_article/config/optional/block.block.articles_category.yml index 5b61d4efc..db98eb085 100644 --- a/modules/acquia_cms_article/config/optional/block.block.articles_category.yml +++ b/modules/acquia_cms_article/config/optional/block.block.articles_category.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.articles_category module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: articles_category theme: cohesion_theme region: dx8_hidden @@ -18,8 +22,8 @@ settings: id: 'facet_block:articles_category' label: Category provider: facets - label_display: '0' - block_id: articles_categories + label_display: visible + block_id: articles_category visibility: cohesion_master_template: id: cohesion_master_template diff --git a/modules/acquia_cms_article/config/optional/block.block.search_article_type.yml b/modules/acquia_cms_article/config/optional/block.block.search_article_type.yml index 01f9d72c2..ec7f0a999 100644 --- a/modules/acquia_cms_article/config/optional/block.block.search_article_type.yml +++ b/modules/acquia_cms_article/config/optional/block.block.search_article_type.yml @@ -4,9 +4,14 @@ dependencies: config: - facets.facet.search_article_type module: + - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: search_article_type theme: cohesion_theme region: dx8_hidden @@ -17,7 +22,7 @@ settings: id: 'facet_block:search_article_type' label: 'Article Type' provider: facets - label_display: '0' + label_display: visible block_id: search_article_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_audio/acquia_cms_audio.info.yml b/modules/acquia_cms_audio/acquia_cms_audio.info.yml index 17c0f7ee7..99b85386d 100644 --- a/modules/acquia_cms_audio/acquia_cms_audio.info.yml +++ b/modules/acquia_cms_audio/acquia_cms_audio.info.yml @@ -1,4 +1,4 @@ -name: "Audio" +name: "Acquia CMS Audio" package: "Acquia CMS" description: "Provides an Audio media type and related configuration." type: module diff --git a/modules/acquia_cms_common/acquia_cms_common.info.yml b/modules/acquia_cms_common/acquia_cms_common.info.yml index 5a7e62a19..d4355e85b 100644 --- a/modules/acquia_cms_common/acquia_cms_common.info.yml +++ b/modules/acquia_cms_common/acquia_cms_common.info.yml @@ -1,4 +1,4 @@ -name: "Common Functionality" +name: "Acquia CMS Common" package: "Acquia CMS" description: "Handles shared functionality for Acquia CMS." type: module @@ -19,3 +19,4 @@ dependencies: - drupal:metatag - drupal:simple_sitemap - drupal:smart_trim + - drupal:focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_large_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_large_landscape.yml index 73a85907c..3f3623af3 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_large_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_large_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_large_landscape label: 'Large landscape (1024x683)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + 39fc4c54-ae2c-4de4-a02a-d06d882da247: + uuid: 39fc4c54-ae2c-4de4-a02a-d06d882da247 + id: focal_point_scale_and_crop weight: 1 data: width: 1024 height: 683 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_large_super_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_large_super_landscape.yml index 6c0b2b73a..54cc87693 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_large_super_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_large_super_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_large_super_landscape label: 'Large super landscape (1024x480)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + 8bbe9d4d-cd43-44e9-a209-457a4caaeee4: + uuid: 8bbe9d4d-cd43-44e9-a209-457a4caaeee4 + id: focal_point_scale_and_crop weight: 1 data: width: 1024 height: 480 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_medium_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_medium_landscape.yml index 68ac01b00..0a7f42ebd 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_medium_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_medium_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_medium_landscape label: 'Medium landscape (768x512)' effects: - 823dd069-3fea-44d7-a594-104ad44a4fba: - uuid: 823dd069-3fea-44d7-a594-104ad44a4fba - id: image_scale_and_crop + 87cf2dba-d703-4f1e-ab98-3f21eb92ecd2: + uuid: 87cf2dba-d703-4f1e-ab98-3f21eb92ecd2 + id: focal_point_scale_and_crop weight: 1 data: width: 768 height: 512 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_medium_super_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_medium_super_landscape.yml index 7d3cf8546..5786f1cf5 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_medium_super_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_medium_super_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_medium_super_landscape label: 'Medium super landscape (768x360)' effects: - 823dd069-3fea-44d7-a594-104ad44a4fba: - uuid: 823dd069-3fea-44d7-a594-104ad44a4fba - id: image_scale_and_crop + a7be10be-726c-4b2a-8025-9a9b7dd85a00: + uuid: a7be10be-726c-4b2a-8025-9a9b7dd85a00 + id: focal_point_scale_and_crop weight: 1 data: width: 768 height: 360 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_small_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_small_landscape.yml index 3f93f24b0..72059720a 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_small_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_small_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_small_landscape label: 'Small landscape (568x352)' effects: - 8081d8c5-76e6-480e-8fea-1c3daaa64b23: - uuid: 8081d8c5-76e6-480e-8fea-1c3daaa64b23 - id: image_scale_and_crop + d8e910fc-dc0e-4a7d-bc21-a3be9cb7a560: + uuid: d8e910fc-dc0e-4a7d-bc21-a3be9cb7a560 + id: focal_point_scale_and_crop weight: 1 data: width: 568 height: 352 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_small_square.yml b/modules/acquia_cms_common/config/install/image.style.coh_small_square.yml index 43c6dfe54..e922a5d4d 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_small_square.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_small_square.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_small_square label: 'Small square (568x568)' effects: - 9b59a7b4-40a6-4a5c-b8ef-b6b46640465e: - uuid: 9b59a7b4-40a6-4a5c-b8ef-b6b46640465e - id: image_scale_and_crop + 34322c52-b7f4-4755-bd49-62d4bb2b8e08: + uuid: 34322c52-b7f4-4755-bd49-62d4bb2b8e08 + id: focal_point_scale_and_crop weight: 1 data: width: 568 height: 568 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_x_large_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_x_large_landscape.yml index c30e87c9f..cf550d908 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_x_large_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_x_large_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_x_large_landscape label: 'X Large landscape (1360x908)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + ff9be98a-6552-4ae0-8687-8bf8e4dc61ef: + uuid: ff9be98a-6552-4ae0-8687-8bf8e4dc61ef + id: focal_point_scale_and_crop weight: 1 data: width: 1360 height: 908 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_x_large_super_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_x_large_super_landscape.yml index 980dc53e5..1c936160e 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_x_large_super_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_x_large_super_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_x_large_super_landscape label: 'X Large super landscape (1360x640)' effects: - e9089c93-176a-4841-8fcf-5b7e5e859ab0: - uuid: e9089c93-176a-4841-8fcf-5b7e5e859ab0 - id: image_scale_and_crop + b2c98208-726a-44f9-99de-2624f33ac6bd: + uuid: b2c98208-726a-44f9-99de-2624f33ac6bd + id: focal_point_scale_and_crop weight: 1 data: width: 1360 height: 640 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_xx_large_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_xx_large_landscape.yml index 59d48d4af..78b2d3dfe 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_xx_large_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_xx_large_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_xx_large_landscape label: 'XX Large landscape (1600x1067)' effects: - 9af59107-7d25-4a0a-97e9-6e2c4c1855b7: - uuid: 9af59107-7d25-4a0a-97e9-6e2c4c1855b7 - id: image_scale_and_crop + 4fc6f472-7800-4b98-a94d-0e29a3996610: + uuid: 4fc6f472-7800-4b98-a94d-0e29a3996610 + id: focal_point_scale_and_crop weight: 1 data: width: 1600 height: 1067 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/install/image.style.coh_xx_small_landscape.yml b/modules/acquia_cms_common/config/install/image.style.coh_xx_small_landscape.yml index c9bb03ed3..f4d11640e 100644 --- a/modules/acquia_cms_common/config/install/image.style.coh_xx_small_landscape.yml +++ b/modules/acquia_cms_common/config/install/image.style.coh_xx_small_landscape.yml @@ -1,14 +1,16 @@ langcode: en status: true -dependencies: { } +dependencies: + module: + - focal_point name: coh_xx_small_landscape label: 'XX Small landscape (160x120)' effects: - 0410655e-6d68-4687-b13e-b30b5d4093b1: - uuid: 0410655e-6d68-4687-b13e-b30b5d4093b1 - id: image_scale_and_crop + 9846c8a0-70c1-4f9b-ae0a-53411f2a6c52: + uuid: 9846c8a0-70c1-4f9b-ae0a-53411f2a6c52 + id: focal_point_scale_and_crop weight: 1 data: width: 160 height: 120 - anchor: center-center + crop_type: focal_point diff --git a/modules/acquia_cms_common/config/optional/block.block.search_category.yml b/modules/acquia_cms_common/config/optional/block.block.search_category.yml index d650c5b8c..e4133cb98 100644 --- a/modules/acquia_cms_common/config/optional/block.block.search_category.yml +++ b/modules/acquia_cms_common/config/optional/block.block.search_category.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.search_category module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: search_category theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:search_category' label: Category provider: facets - label_display: '0' + label_display: visible block_id: search_category visibility: cohesion_master_template: diff --git a/modules/acquia_cms_common/config/optional/block.block.search_content_type.yml b/modules/acquia_cms_common/config/optional/block.block.search_content_type.yml index 347c21674..bf97edc15 100644 --- a/modules/acquia_cms_common/config/optional/block.block.search_content_type.yml +++ b/modules/acquia_cms_common/config/optional/block.block.search_content_type.yml @@ -4,9 +4,14 @@ dependencies: config: - facets.facet.search_content_type module: + - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: search_content_type theme: cohesion_theme region: dx8_hidden @@ -17,7 +22,7 @@ settings: id: 'facet_block:search_content_type' label: 'Content Type' provider: facets - label_display: '0' + label_display: visible block_id: search_content_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_common/config/optional/filter.format.filtered_html.yml b/modules/acquia_cms_common/config/optional/filter.format.filtered_html.yml index 3c7a5ebc4..80ac38dea 100644 --- a/modules/acquia_cms_common/config/optional/filter.format.filtered_html.yml +++ b/modules/acquia_cms_common/config/optional/filter.format.filtered_html.yml @@ -22,14 +22,14 @@ filters: id: filter_url provider: filterclear status: true - weight: -47 + weight: -46 settings: filter_url_length: 72 filter_html: id: filter_html provider: filter status: true - weight: -49 + weight: -45 # Manually added the

tags for alignment buttons per https://www.drupal.org/project/drupal/issues/2649546. settings: allowed_html: '

    1. ' @@ -39,7 +39,7 @@ filters: id: media_embed provider: media status: true - weight: -50 + weight: -43 settings: default_view_mode: embedded allowed_media_types: { } @@ -48,41 +48,41 @@ filters: id: black_list_html_tags provider: cohesion status: false - weight: -45 + weight: -41 settings: { } editor_file_reference: id: editor_file_reference provider: editor status: false - weight: -44 + weight: -50 settings: { } filter_htmlcorrector: id: filter_htmlcorrector provider: filter status: false - weight: -40 + weight: -44 settings: { } filter_align: id: filter_align provider: filter status: false - weight: -43 + weight: -49 settings: { } filter_caption: id: filter_caption provider: filter status: false - weight: -42 + weight: -47 settings: { } filter_html_escape: id: filter_html_escape provider: filter status: false - weight: -46 + weight: -42 settings: { } filter_html_image_secure: id: filter_html_image_secure provider: filter status: false - weight: -41 + weight: -40 settings: { } diff --git a/modules/acquia_cms_common/src/Commands/AcmsConfigImportCommands.php b/modules/acquia_cms_common/src/Commands/AcmsConfigImportCommands.php index a78b227d4..8db3b07e9 100644 --- a/modules/acquia_cms_common/src/Commands/AcmsConfigImportCommands.php +++ b/modules/acquia_cms_common/src/Commands/AcmsConfigImportCommands.php @@ -4,6 +4,7 @@ use Consolidation\AnnotatedCommand\CommandData; use Consolidation\AnnotatedCommand\CommandError; +use Consolidation\AnnotatedCommand\CommandResult; use Drupal\acquia_cms\Facade\CohesionFacade; use Drupal\acquia_cms_common\Services\AcmsUtilityService; use Drupal\Component\Serialization\Yaml; @@ -78,7 +79,7 @@ final class AcmsConfigImportCommands extends DrushCommands { * * @var \Drupal\Core\DependencyInjection\ClassResolver */ - protected $classResolver; + protected $cohesionFacade; /** * The acquia cms utility service. @@ -160,7 +161,7 @@ public function __construct( $this->configImportCommands = $configImportCommands; $this->stringTranslation = $stringTranslation; $this->moduleHandler = $moduleHandler; - $this->classResolver = $classResolver; + $this->cohesionFacade = $classResolver->getInstanceFromDefinition(CohesionFacade::class); $this->acmsUtilityService = $acmsUtilityService; } @@ -175,8 +176,6 @@ public function __construct( * @param array $options * The options array. * - * @throws \Drush\Exceptions\UserAbortException - * * @option scope * The scope for particular package to be imported. * @option delete-list @@ -185,9 +184,11 @@ public function __construct( * @aliases acr * @usage acms:config-reset * Reset the configuration to the default. - * @usage acms:config-reset acquia_cms_article acquia_cms_common --scope=all + * @usage acms:config-reset acquia_cms_article acquia_cms_person --scope=all * --delete-list=search_api.index.acquia_search_index * Reset the configuration to the default. + * + * @throws \Drush\Exceptions\UserAbortException */ public function resetConfigurations(array $package, array $options = [ 'scope' => NULL, @@ -197,39 +198,60 @@ public function resetConfigurations(array $package, array $options = [ "This should be used with extreme caution and can lead to unexpected behavior on your site if not well tested.", "Do not run this in production until you've tested it in a safe, non-public environment first.", ]); + // Reset the configurations for given packages aka modules + // package, scope & delete-list are being added in validate command. + $this->doImport($package, $options['scope'], $options['delete-list']); + } + + /** + * Get package from user input if not provided already. + * + * @return array + * The package from user input. + * + * @throws \Drush\Exceptions\UserAbortException + */ + private function getPackagesFromUserInput(): array { // Lets get input from user if not provided package with command. - if (empty($package)) { - $acms_modules = $this->getAcmsModules(); - $question_string = 'Choose a module that needs a configuration reset. Separate multiple choices with commas, e.g. "1,2,4".'; - $question = $this->createMultipleChoiceOptions($question_string, $acms_modules); - $types = $this->io()->askQuestion($question); - if (in_array('Cancel', $types)) { - throw new UserAbortException(); - } - elseif (in_array('All', $types)) { - $package = $acms_modules; - } - else { - $package = $types; - } - // Lets ask for scope if not already provided. - if (!$options['scope']) { - $scope = $this->io()->choice(dt('Choose a scope.'), self::ALLOWED_SCOPE, NULL); - $options['scope'] = self::ALLOWED_SCOPE[$scope]; - } - elseif ($options['scope'] && !in_array($options['scope'], self::ALLOWED_SCOPE)) { - throw new \InvalidArgumentException('Invalid scope, allowed values are [config, site-studio, all]'); - } - if (!$options['delete-list']) { - $options['delete-list'] = []; + $acms_modules = $this->filterModuleForConfig(); + $question_string = 'Choose a module that needs a configuration reset. Separate multiple choices with commas, e.g. "1,2,4".'; + $question = $this->createMultipleChoiceOptions($question_string, $acms_modules); + $types = $this->io()->askQuestion($question); + if (in_array('Cancel', $types)) { + throw new UserAbortException(); + } + elseif (in_array('All', $types)) { + $package = $acms_modules; + } + else { + $package = $types; + } + return $package; + } + + /** + * Filter out those modules which do not have config to import from the list. + * + * @return array + * The list of module which has configurations. + */ + private function filterModuleForConfig(): array { + $acms_modules = $this->getAcmsModules(); + $acms_filtered_modules = []; + foreach ($acms_modules as $module) { + $dir = drupal_get_path('module', $module); + $install = "$dir/config/install"; + $optional = "$dir/config/optional"; + if (is_dir($install) || is_dir($optional)) { + $acms_filtered_modules[] = $module; } } - // Lets import the configurations. - $this->doImport($package, $options['scope'], $options['delete-list']); + + return $acms_filtered_modules; } /** - * Get lists of module only. + * Get list of Acquia CMS modules. * * @return array * Array of acms modules. @@ -259,7 +281,7 @@ private function getAcmsModules(): array { * @return \Symfony\Component\Console\Question\ChoiceQuestion * The ChoiceQuestion */ - private function createMultipleChoiceOptions(string $question_string, array $choice_options, $default = NULL) { + private function createMultipleChoiceOptions(string $question_string, array $choice_options, $default = NULL): ChoiceQuestion { $choices = array_merge(['Cancel'], $choice_options); array_push($choices, 'All'); $question = new ChoiceQuestion(dt($question_string), $choices, $default); @@ -278,6 +300,7 @@ private function createMultipleChoiceOptions(string $question_string, array $cho * The list of config files to be deleted during import. * * @throws \Drush\Exceptions\UserAbortException + * @throws \Exception */ private function doImport(array $package, string $scope, array $delete_list) { $config_files = $ss_config_files = []; @@ -285,22 +308,53 @@ private function doImport(array $package, string $scope, array $delete_list) { foreach ($package as $module) { $config_files = array_merge($config_files, $this->getConfigFiles($module)); } - // Let validate delete list against given scope of configurations. + // Validate delete list against given scope of configurations. if (!$this->validDeleteList($config_files, $delete_list)) { throw new \Exception("The file specified in --delete-list option is invalid."); } $this->importPartialConfig($config_files, $delete_list); } - // Import the site studio configurations. + // Build site studio packages. if (in_array($scope, ['site-studio', 'all'])) { - // Show big warning if site-studio is in scope. - $this->io()->warning("This can have unintended side effects for existing pages built using previous versions of components, it might literally break them, and should be tested in a non-production environment first."); foreach ($package as $module) { $ss_config_files = array_merge($ss_config_files, $this->getSiteStudioPackage($module)); } - $this->importSiteStudioPackage($ss_config_files); + // Confirm the site studio changes before import. + if ($this->buildSiteStudioChangeList($ss_config_files)) { + if (!$this->io()->confirm(dt('Import these site studio configuration changes?'))) { + throw new UserAbortException(); + } + // Import the site studio configurations. + $this->importSiteStudioPackage($ss_config_files); + } + else { + $this->io()->success('No site studio package to import.'); + } + } + } + + /** + * Show change list for site studio packages. + * + * @param array $ss_config_files + * Array of configurations file. + * + * @return bool + * The package status. + */ + private function buildSiteStudioChangeList(array $ss_config_files): bool { + if (empty($ss_config_files)) { + return FALSE; } + $rows = []; + foreach ($ss_config_files as $name) { + $rows[] = [$name]; + } + // Show warning if site-studio is in scope. + $this->io()->warning("This can have unintended side effects for existing pages built using previous versions of components, it might literally break them, and should be tested in a non-production environment first."); + $this->io()->table(['Configuration'], $rows); + return TRUE; } /** @@ -392,16 +446,11 @@ private function getSiteStudioPackage(string $module): array { * @throws \Exception */ private function importSiteStudioPackage(array $packages) { - $cohesion_facade = $this->classResolver->getInstanceFromDefinition(CohesionFacade::class); $operations = []; foreach ($packages as $package) { - $operations = array_merge($operations, $cohesion_facade->importPackage($package, TRUE)); + $operations = array_merge($operations, $this->cohesionFacade->importPackage($package)); } - $batch = [ - 'title' => $this->stringTranslation->translate('Importing configuration.'), - 'operations' => $operations, - 'finished' => '\Drupal\acquia_cms\Facade\CohesionFacade::batchFinishedCallback', - ]; + $batch = ['operations' => $operations]; batch_set($batch); drush_backend_batch_process(); } @@ -415,6 +464,7 @@ private function importSiteStudioPackage(array $packages) { * The list of configurations to be deleted before import. * * @throws \Drush\Exceptions\UserAbortException + * @throws \Exception */ private function importPartialConfig(array $config_files, array $delete_list) { // Determine $source_storage in partial case. @@ -422,6 +472,14 @@ private function importPartialConfig(array $config_files, array $delete_list) { $replacement_storage = new StorageReplaceDataWrapper($active_storage); foreach ($config_files as $name => $data) { + // We should not re-import cohesion settings, + // it will override the site studio credentials which + // will break the whole site. Also re-importing + // search_api.index.content will have unexpected error since + // we have modified it using facade to add index field. + if ($name === 'cohesion.settings' || $name === 'search_api.index.content') { + continue; + } $replacement_storage->replaceData($name, $data); } $source_storage = $replacement_storage; @@ -452,7 +510,7 @@ private function importPartialConfig(array $config_files, array $delete_list) { } $table = ConfigCommands::configChangesTable($change_list, $this->output()); $table->render(); - + $this->io()->warning("Any overridden configurations will be reverted back with the one listed above which may result in unexpected behaviour."); if (!$this->io()->confirm(dt('Import these configuration changes?'))) { throw new UserAbortException(); } @@ -463,12 +521,14 @@ private function importPartialConfig(array $config_files, array $delete_list) { * Hook validate for acms config reset command. * * @hook validate acms:config-reset + * + * @throws \Drush\Exceptions\UserAbortException */ public function validateConfigResetCommand(CommandData $commandData) { // Since we are running config import with partial option // Lets check config module is enabled or not. if (!$this->moduleHandler->moduleExists('config')) { - $messages[] = 'Config module is not enabled, please enable it.'; + return new CommandError('Config module is not enabled, please enable it.'); } $messages = []; @@ -476,11 +536,12 @@ public function validateConfigResetCommand(CommandData $commandData) { $scope = $commandData->input()->getOption('scope'); $delete_list = $commandData->input()->getOption('delete-list'); $package = $commandData->input()->getArgument('package'); + if (isset($scope) && !in_array($scope, self::ALLOWED_SCOPE)) { $messages[] = 'Invalid scope, allowed values are [config, site-studio, all]'; } if ($package && !$this->hasValidPackage($package)) { - $messages[] = 'Given packages are not valid, try providing a list of ACMS modules ex: acquia_cms_article'; + $messages[] = 'Given packages are not valid, try providing a list of ACMS modules separated by space ex: acquia_cms_article acquia_cms_place'; } // In case of --delete-list option. if ($delete_list) { @@ -492,11 +553,23 @@ public function validateConfigResetCommand(CommandData $commandData) { $commandData->input()->setOption('delete-list', $delete_list_array); } } - + else { + $commandData->input()->setOption('delete-list', []); + } // In case of -y lets check user has provided all the required arguments. if (!$isInteractive && (!$package || !$scope)) { $messages[] = 'In order to use -y option, please provide a package and scope variable.'; } + // Get packages from user input. + if ($isInteractive && empty($messages) && !$package) { + $package = $this->getPackagesFromUserInput(); + $commandData->input()->setArgument('package', $package); + } + // Get scope from user input. + if ($isInteractive && empty($messages) && !$scope) { + $scope = $this->io()->choice(dt('Choose a scope.'), self::ALLOWED_SCOPE, NULL); + $commandData->input()->setOption('scope', self::ALLOWED_SCOPE[$scope]); + } if ($messages) { return new CommandError(implode(' ', $messages)); } @@ -544,4 +617,19 @@ private function hasValidPackage(array $packages): bool { return TRUE; } + /** + * Execute site studio rebuild after Acquia CMS config reset. + * + * @hook post-command acms:config-reset + */ + public function acmsConfigResetPostCommand($result, CommandData $commandData) { + $scope = $commandData->input()->getOption('scope'); + if (in_array($scope, ['site-studio', 'all'])) { + $this->say(dt('Rebuilding all entities.')); + $result = $this->acmsUtilityService->rebuildSiteStudio(); + $this->yell('Finished rebuilding.'); + return is_array($result) && isset(array_shift($result)['error']) ? CommandResult::exitCode(self::EXIT_FAILURE) : CommandResult::exitCode(self::EXIT_SUCCESS); + } + } + } diff --git a/modules/acquia_cms_common/src/Services/AcmsUtilityService.php b/modules/acquia_cms_common/src/Services/AcmsUtilityService.php index ca3532313..9c08baaea 100644 --- a/modules/acquia_cms_common/src/Services/AcmsUtilityService.php +++ b/modules/acquia_cms_common/src/Services/AcmsUtilityService.php @@ -2,6 +2,7 @@ namespace Drupal\acquia_cms_common\Services; +use Drupal\cohesion\Drush\DX8CommandHelpers; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Extension\ModuleHandlerInterface; @@ -47,6 +48,26 @@ public function getAcquiaCmsProfileModuleList(): array { }, ARRAY_FILTER_USE_KEY); } + /** + * Trigger site studio rebuild on demand. + */ + public function rebuildSiteStudio() { + // Forcefully clear the cache after site is installed otherwise site + // studio fails to rebuild. + drupal_flush_all_caches(); + // Below code ensures that drush batch process doesn't hang. Unset all the + // earlier created batches so that drush_backend_batch_process() can run + // without being stuck. + // @see https://github.com/drush-ops/drush/issues/3773 for the issue. + $batch = &batch_get(); + $batch = NULL; + unset($batch); + return DX8CommandHelpers::rebuild([ + 'verbose' => '', + 'no-cache-clear' => FALSE, + ]); + } + /** * Validates an array of config data that contains dependency information. * diff --git a/modules/acquia_cms_document/acquia_cms_document.info.yml b/modules/acquia_cms_document/acquia_cms_document.info.yml index 9d7f8456c..8e9eb173a 100644 --- a/modules/acquia_cms_document/acquia_cms_document.info.yml +++ b/modules/acquia_cms_document/acquia_cms_document.info.yml @@ -1,4 +1,4 @@ -name: "Document" +name: "Acquia CMS Document" package: "Acquia CMS" description: "Provides a Document media type and related configuration." type: module diff --git a/modules/acquia_cms_event/acquia_cms_event.info.yml b/modules/acquia_cms_event/acquia_cms_event.info.yml index 30b92f7ac..75d454ed1 100644 --- a/modules/acquia_cms_event/acquia_cms_event.info.yml +++ b/modules/acquia_cms_event/acquia_cms_event.info.yml @@ -1,4 +1,4 @@ -name: Event +name: "Acquia CMS Event" package: 'Acquia CMS' description: 'Provides an Event content type and related configuration.' type: module diff --git a/modules/acquia_cms_event/config/optional/block.block.events_category.yml b/modules/acquia_cms_event/config/optional/block.block.events_category.yml index b8c7c0545..7066dcce6 100644 --- a/modules/acquia_cms_event/config/optional/block.block.events_category.yml +++ b/modules/acquia_cms_event/config/optional/block.block.events_category.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.events_category module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: events_category theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:events_category' label: Category provider: facets - label_display: '0' + label_display: visible block_id: events_category visibility: cohesion_master_template: diff --git a/modules/acquia_cms_event/config/optional/block.block.events_event_type.yml b/modules/acquia_cms_event/config/optional/block.block.events_event_type.yml index a85bb5cbe..fb642c667 100644 --- a/modules/acquia_cms_event/config/optional/block.block.events_event_type.yml +++ b/modules/acquia_cms_event/config/optional/block.block.events_event_type.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.events_event_type module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: events_event_type theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:events_event_type' label: 'Event Type' provider: facets - label_display: '0' + label_display: visible block_id: events_event_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_event/config/optional/block.block.search_event_type.yml b/modules/acquia_cms_event/config/optional/block.block.search_event_type.yml index e33083298..eb210426c 100644 --- a/modules/acquia_cms_event/config/optional/block.block.search_event_type.yml +++ b/modules/acquia_cms_event/config/optional/block.block.search_event_type.yml @@ -4,9 +4,14 @@ dependencies: config: - facets.facet.search_event_type module: + - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: search_event_type theme: cohesion_theme region: dx8_hidden @@ -17,7 +22,7 @@ settings: id: 'facet_block:search_event_type' label: 'Event Type' provider: facets - label_display: '0' + label_display: visible block_id: search_event_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_image/acquia_cms_image.info.yml b/modules/acquia_cms_image/acquia_cms_image.info.yml index 2d8b978d3..a26814eb6 100644 --- a/modules/acquia_cms_image/acquia_cms_image.info.yml +++ b/modules/acquia_cms_image/acquia_cms_image.info.yml @@ -1,4 +1,4 @@ -name: "Image" +name: "Acquia CMS Image" package: "Acquia CMS" description: "Provides an Image media type and related configuration." type: module diff --git a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large.yml_ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large.yml_ index b5461c799..f523aaba3 100644 --- a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large.yml_ +++ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 9a888cde-4293-4463-b2be-bd43b668e297 + uuid: 073b645a-3369-4b42-9932-e9fd57409551 langcode: en status: true dependencies: { } id: media_image_large label: 'Large (Media, Image)' - json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"c3415a05-c7d5-45e8-8329-0e3739664d36","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"c3415a05-c7d5-45e8-8329-0e3739664d36":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"sm"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"c3415a05-c7d5-45e8-8329-0e3739664d36":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_x_large","image":"[media:image:entity:path]"}],"displaySize":"coh-image-responsive"},"sm":{"pictureImagesArray":[{"imageStyle":"coh_medium"}],"displaySize":"coh-image-responsive"},"xs":{},"ps":{"pictureImagesArray":[{"imageStyle":"coh_small"}],"displaySize":"coh-image-responsive"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"c3415a05-c7d5-45e8-8329-0e3739664d36":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"c3415a05-c7d5-45e8-8329-0e3739664d36":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"c3415a05-c7d5-45e8-8329-0e3739664d36","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"c3415a05-c7d5-45e8-8329-0e3739664d36":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"sm"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"c3415a05-c7d5-45e8-8329-0e3739664d36":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_x_large","image":"[media:image:entity:path]"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"sm":{"pictureImagesArray":[{"imageStyle":"coh_medium"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"xs":{},"ps":{"pictureImagesArray":[{"imageStyle":"coh_small"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"c3415a05-c7d5-45e8-8329-0e3739664d36":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"c3415a05-c7d5-45e8-8329-0e3739664d36":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large_landscape.yml_ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large_landscape.yml_ index da3cb123e..67db74c50 100644 --- a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large_landscape.yml_ +++ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_large_landscape.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 2798c885-0785-4612-b019-13f5ceb59199 + uuid: fb719017-84c2-4640-8c57-35707d1edd2e langcode: en status: true dependencies: { } id: media_image_large_landscape label: 'Large landscape (Media, Image)' - json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"06bbc6dc-e45f-46b3-a104-6a7189104e25","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"sm"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_x_large_landscape","image":"[media:image:entity:path]"}],"displaySize":"coh-image-responsive"},"sm":{"pictureImagesArray":[{"imageStyle":"coh_medium_landscape"}],"displaySize":"coh-image-responsive"},"xs":[],"ps":{"pictureImagesArray":[{"imageStyle":"coh_small_landscape"}],"displaySize":"coh-image-responsive"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"06bbc6dc-e45f-46b3-a104-6a7189104e25","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"sm"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_x_large_landscape","image":"[media:image:entity:path]"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"sm":{"pictureImagesArray":[{"imageStyle":"coh_medium_landscape"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"xs":[],"ps":{"pictureImagesArray":[{"imageStyle":"coh_small_landscape"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"06bbc6dc-e45f-46b3-a104-6a7189104e25":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium.yml_ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium.yml_ index 0c5941a64..2ebe7cf1b 100644 --- a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium.yml_ +++ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 48c25aba-8dc5-4272-a74b-0d893959887a + uuid: 6cb57760-64fc-42bf-a39d-bbbc7c0e6b40 langcode: en status: true dependencies: { } id: media_image_medium label: 'Medium (Media, Image)' - json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"47b28977-a4ed-4034-bf3c-f96c37d6a715","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_medium","image":"[media:image:entity:path]"}],"displaySize":"coh-image-responsive"},"xs":[],"ps":{"pictureImagesArray":[{"imageStyle":"coh_small"}],"displaySize":"coh-image-responsive"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"47b28977-a4ed-4034-bf3c-f96c37d6a715","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_medium","image":"[media:image:entity:path]"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"xs":[],"ps":{"pictureImagesArray":[{"imageStyle":"coh_small"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"47b28977-a4ed-4034-bf3c-f96c37d6a715":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium_landscape.yml_ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium_landscape.yml_ index e51f192c6..b1bb832b5 100644 --- a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium_landscape.yml_ +++ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_medium_landscape.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 255322a3-1656-47ed-8291-1bfd0612e102 + uuid: e6f246b4-10f6-453a-b757-9a7819d8334c langcode: en status: true dependencies: { } id: media_image_medium_landscape label: 'Medium landscape (Media, Image)' - json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"408c4abb-b515-4b8c-a0d1-9a91716b9cc0","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_medium_landscape","image":"[media:image:entity:path]"}],"displaySize":"coh-image-responsive"},"xs":[],"ps":{"pictureImagesArray":[{"imageStyle":"coh_small_landscape"}],"displaySize":"coh-image-responsive"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"408c4abb-b515-4b8c-a0d1-9a91716b9cc0","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"},{"name":"ps"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_medium_landscape","image":"[media:image:entity:path]"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"xs":[],"ps":{"pictureImagesArray":[{"imageStyle":"coh_small_landscape"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"}},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"408c4abb-b515-4b8c-a0d1-9a91716b9cc0":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small.yml_ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small.yml_ index 6766c8470..98cc84687 100644 --- a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small.yml_ +++ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 1e55c70a-3089-42ce-a4ec-913bbdb8780f + uuid: d9eeb40d-a023-4f9a-bc8d-a56a82745965 langcode: en status: true dependencies: { } id: media_image_small label: 'Small (Media, Image)' - json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"f6fc7655-75ea-4e49-a2c7-810271355c85","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"f6fc7655-75ea-4e49-a2c7-810271355c85":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"f6fc7655-75ea-4e49-a2c7-810271355c85":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_small","image":"[media:image:entity:path]"}],"displaySize":"coh-image-responsive"},"xs":[]},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"f6fc7655-75ea-4e49-a2c7-810271355c85":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"f6fc7655-75ea-4e49-a2c7-810271355c85":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"f6fc7655-75ea-4e49-a2c7-810271355c85","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"f6fc7655-75ea-4e49-a2c7-810271355c85":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"f6fc7655-75ea-4e49-a2c7-810271355c85":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_small","image":"[media:image:entity:path]"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"xs":[]},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"f6fc7655-75ea-4e49-a2c7-810271355c85":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"f6fc7655-75ea-4e49-a2c7-810271355c85":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small_landscape.yml_ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small_landscape.yml_ index 3f688f470..976b552bf 100644 --- a/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small_landscape.yml_ +++ b/modules/acquia_cms_image/config/dx8/cohesion_content_templates.media_image_small_landscape.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 93efc442-143a-43bf-bc25-acfcde6f8e3c + uuid: 911a5bb0-49b3-40ee-adb4-1a5e09fa2a78 langcode: en status: true dependencies: { } id: media_image_small_landscape label: 'Small landscape (Media, Image)' - json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"202064cf-c234-44da-ad59-abc3321fdd80","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"202064cf-c234-44da-ad59-abc3321fdd80":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"202064cf-c234-44da-ad59-abc3321fdd80":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_small_landscape","image":"[media:image:entity:path]"}],"displaySize":"coh-image-responsive"},"xs":[]},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"202064cf-c234-44da-ad59-abc3321fdd80":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"202064cf-c234-44da-ad59-abc3321fdd80":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"item","uid":"picture","title":"Picture","selected":false,"status":{"collapsed":true,"isopen":false},"uuid":"202064cf-c234-44da-ad59-abc3321fdd80","parentUid":"root","isContainer":false,"children":[]}],"mapper":{"202064cf-c234-44da-ad59-abc3321fdd80":{"settings":{"formDefinition":[{"formKey":"picture-settings","children":[{"formKey":"picture-info","breakpoints":[],"activeFields":[{"name":"title","active":true},{"name":"alt","active":true},{"name":"lazyload","active":true}]},{"formKey":"picture-images","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"displaySize","active":true},{"name":"imageAlignment","active":true},{"name":"pictureImagesArray","active":true},{"name":"image","active":true},{"name":"imageStyle","active":true}]},{"formKey":"picture-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]}}},"model":{"202064cf-c234-44da-ad59-abc3321fdd80":{"settings":{"title":"Picture","customStyle":[{"customStyle":""}],"styles":{"xl":{"pictureImagesArray":[{"imageStyle":"coh_small_landscape","image":"[media:image:entity:path]"}],"displaySize":"coh-image","imageAlignment":"coh-image-align-centre"},"xs":[]},"lazyload":false,"settings":{"lazyload":false,"styles":{"xl":{"displaySize":"coh-image-responsive","pictureImagesArray":[{"imageStyle":""}]}},"customStyle":[{"customStyle":""}]},"attributes":{"alt":"[media:image:alt]","title":"[media:image:title]"}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"picture"}}}},"previewModel":{"202064cf-c234-44da-ad59-abc3321fdd80":{"settings":{"styles":{"xl":{"pictureImagesArray":[{"image":""}]}}}}},"variableFields":{"202064cf-c234-44da-ad59-abc3321fdd80":["settings.styles.xl.pictureImagesArray.0.image","settings.attributes.alt","settings.attributes.title"]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_image/config/install/core.entity_view_display.media.image.default.yml b/modules/acquia_cms_image/config/install/core.entity_view_display.media.image.default.yml index 8d1a85d8b..226988e89 100644 --- a/modules/acquia_cms_image/config/install/core.entity_view_display.media.image.default.yml +++ b/modules/acquia_cms_image/config/install/core.entity_view_display.media.image.default.yml @@ -1,3 +1,4 @@ +uuid: 7aae5706-2b63-487e-b74f-a00e04e1ad26 langcode: en status: true dependencies: @@ -14,16 +15,6 @@ targetEntityType: media bundle: image mode: default content: - created: - label: hidden - type: timestamp - weight: 1 - region: content - settings: - date_format: medium - custom_date_format: '' - timezone: '' - third_party_settings: { } thumbnail: type: image weight: 2 @@ -33,17 +24,12 @@ content: image_style: coh_small_square image_link: '' third_party_settings: { } - uid: - label: hidden - type: author - weight: 0 - region: content - settings: { } - third_party_settings: { } hidden: + created: true field_categories: true field_tags: true image: true langcode: true name: true search_api_excerpt: true + uid: true diff --git a/modules/acquia_cms_page/acquia_cms_page.info.yml b/modules/acquia_cms_page/acquia_cms_page.info.yml index 39e3eee49..4706345e8 100644 --- a/modules/acquia_cms_page/acquia_cms_page.info.yml +++ b/modules/acquia_cms_page/acquia_cms_page.info.yml @@ -1,4 +1,4 @@ -name: "Page" +name: "Acquia CMS Page" package: "Acquia CMS" description: "Provides an unstructured Page content type and related configuration." type: module diff --git a/modules/acquia_cms_person/acquia_cms_person.info.yml b/modules/acquia_cms_person/acquia_cms_person.info.yml index ff7bc289f..e2e2cc0c0 100644 --- a/modules/acquia_cms_person/acquia_cms_person.info.yml +++ b/modules/acquia_cms_person/acquia_cms_person.info.yml @@ -1,4 +1,4 @@ -name: Person +name: "Acquia CMS Person" package: 'Acquia CMS' description: 'Provides a Person content type, a structured data representation of people associated with a website or organization.' type: module diff --git a/modules/acquia_cms_person/config/optional/block.block.people_category.yml b/modules/acquia_cms_person/config/optional/block.block.people_category.yml index 02ac13c44..39ab1bb07 100644 --- a/modules/acquia_cms_person/config/optional/block.block.people_category.yml +++ b/modules/acquia_cms_person/config/optional/block.block.people_category.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.people_category module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: people_category theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:people_category' label: Category provider: facets - label_display: '0' + label_display: visible block_id: people_category visibility: cohesion_master_template: diff --git a/modules/acquia_cms_person/config/optional/block.block.people_person_type.yml b/modules/acquia_cms_person/config/optional/block.block.people_person_type.yml index 5635a3038..2044f69a8 100644 --- a/modules/acquia_cms_person/config/optional/block.block.people_person_type.yml +++ b/modules/acquia_cms_person/config/optional/block.block.people_person_type.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.people_person_type module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: people_person_type theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:people_person_type' label: 'Person Type' provider: facets - label_display: '0' + label_display: visible block_id: people_person_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_person/config/optional/block.block.search_person_type.yml b/modules/acquia_cms_person/config/optional/block.block.search_person_type.yml index 7fa66d4ab..f660df9fe 100644 --- a/modules/acquia_cms_person/config/optional/block.block.search_person_type.yml +++ b/modules/acquia_cms_person/config/optional/block.block.search_person_type.yml @@ -4,9 +4,14 @@ dependencies: config: - facets.facet.search_person_type module: + - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: search_person_type theme: cohesion_theme region: dx8_hidden @@ -17,7 +22,7 @@ settings: id: 'facet_block:search_person_type' label: 'Person Type' provider: facets - label_display: '0' + label_display: visible block_id: search_person_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_place/acquia_cms_place.info.yml b/modules/acquia_cms_place/acquia_cms_place.info.yml index c63e84119..dd44b058b 100644 --- a/modules/acquia_cms_place/acquia_cms_place.info.yml +++ b/modules/acquia_cms_place/acquia_cms_place.info.yml @@ -1,4 +1,4 @@ -name: Place +name: "Acquia CMS Place" package: 'Acquia CMS' description: 'Provides a Place content type and related configuration.' type: module diff --git a/modules/acquia_cms_place/config/optional/block.block.places_category.yml b/modules/acquia_cms_place/config/optional/block.block.places_category.yml index 7d49003f1..f736c2dc1 100644 --- a/modules/acquia_cms_place/config/optional/block.block.places_category.yml +++ b/modules/acquia_cms_place/config/optional/block.block.places_category.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.places_category module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: places_category theme: cohesion_theme region: dx8_hidden @@ -18,8 +22,8 @@ settings: id: 'facet_block:places_category' label: Category provider: facets - label_display: '0' - block_id: places_categories + label_display: visible + block_id: places_category visibility: cohesion_master_template: id: cohesion_master_template diff --git a/modules/acquia_cms_place/config/optional/block.block.places_place_type.yml b/modules/acquia_cms_place/config/optional/block.block.places_place_type.yml index 8eeb5a1b6..2116286b4 100644 --- a/modules/acquia_cms_place/config/optional/block.block.places_place_type.yml +++ b/modules/acquia_cms_place/config/optional/block.block.places_place_type.yml @@ -5,9 +5,13 @@ dependencies: - facets.facet.places_place_type module: - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: places_place_type theme: cohesion_theme region: dx8_hidden @@ -18,7 +22,7 @@ settings: id: 'facet_block:places_place_type' label: 'Place Type' provider: facets - label_display: '0' + label_display: visible block_id: places_place_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_place/config/optional/block.block.search_place_type.yml b/modules/acquia_cms_place/config/optional/block.block.search_place_type.yml index 645cf3e21..1a6c86009 100644 --- a/modules/acquia_cms_place/config/optional/block.block.search_place_type.yml +++ b/modules/acquia_cms_place/config/optional/block.block.search_place_type.yml @@ -4,9 +4,14 @@ dependencies: config: - facets.facet.search_place_type module: + - cohesion + - collapsiblock - facets theme: - cohesion_theme +third_party_settings: + collapsiblock: + collapse_action: '2' id: search_place_type theme: cohesion_theme region: dx8_hidden @@ -17,7 +22,7 @@ settings: id: 'facet_block:search_place_type' label: 'Place Type' provider: facets - label_display: '0' + label_display: visible block_id: search_place_type visibility: cohesion_master_template: diff --git a/modules/acquia_cms_search/acquia_cms_search.info.yml b/modules/acquia_cms_search/acquia_cms_search.info.yml index f5babf4d6..7cbba0ece 100644 --- a/modules/acquia_cms_search/acquia_cms_search.info.yml +++ b/modules/acquia_cms_search/acquia_cms_search.info.yml @@ -1,4 +1,4 @@ -name: "Search" +name: "Acquia CMS Search" package: "Acquia CMS" description: "Provides powerful search capabilities to the site" type: module diff --git a/modules/acquia_cms_search/tests/src/Functional/AcquiaSearchFormIntegrationTest.php b/modules/acquia_cms_search/tests/src/Functional/AcquiaSearchFormIntegrationTest.php index 6246b6462..33a27f41c 100644 --- a/modules/acquia_cms_search/tests/src/Functional/AcquiaSearchFormIntegrationTest.php +++ b/modules/acquia_cms_search/tests/src/Functional/AcquiaSearchFormIntegrationTest.php @@ -52,40 +52,37 @@ class AcquiaSearchFormIntegrationTest extends BrowserTestBase { * Tests administrative integration with Acquia Search Solr. */ public function testAcquiaSearchFormIntegration() { - $this->assertSame('database', Index::load('content')->getServerId()); - - $index = Index::load('acquia_search_index'); - $this->assertTrue($index->status()); - $this->assertSame('acquia_search_server', $index->getServerId()); - - $this->assertTrue(View::load('acquia_search')->status()); - + $assert_session = $this->assertSession(); $account = $this->drupalCreateUser([ 'administer site configuration', 'administer search_api', 'access acquia cms tour dashboard', ]); $this->drupalLogin($account); + // Visit the tour page. $this->drupalGet('/admin/tour/dashboard'); + $assert_session->statusCodeEquals(200); - $page = $this->getSession()->getPage(); - $page->fillField('Acquia Subscription identifier', 'ABCD-12345'); - $page->fillField('Acquia Connector key', $this->randomString()); - $page->fillField('Acquia Application UUID', $this->container->get('uuid')->generate()); - $page->pressButton('edit-submit--3'); + $container = $assert_session->elementExists('css', '.acquia-cms-search-form'); + // Assert that save button is present on form. + $assert_session->buttonExists('Save'); + // Assert that the expected fields show up. + $assert_session->fieldExists('Acquia Subscription identifier'); + $assert_session->fieldExists('Acquia Connector key'); + $assert_session->fieldExists('Acquia Application UUID'); + + // Save Fields. + $container->fillField('Acquia Subscription identifier', 'ABCD-12345'); + $container->fillField('Acquia Connector key', $this->randomString()); + $container->fillField('Acquia Application UUID', $this->container->get('uuid')->generate()); + $container->pressButton('Save'); - $assert_session = $this->assertSession(); - $assert_session->statusCodeEquals(200); $assert_session->pageTextContains('The configuration options have been saved.'); - // Our index should be using the Solr server, whereas the one that ships - // with Acquia Search Solr should be disabled, along with any views that are - // using it. - $this->assertSame('acquia_search_server', Index::load('content')->getServerId()); - $index = Index::load('acquia_search_index'); - $this->assertFalse($index->status()); - $this->assertNull($index->getServerId()); - $this->assertFalse(View::load('acquia_search')->status()); + // Our index should be using the database server. + $this->assertSame('database', Index::load('content')->getServerId()); + // The search view of acquia search should be enabled. + $this->assertTrue(View::load('search')->status()); } } diff --git a/modules/acquia_cms_starter/content/node/0098ef73-f5d3-4b91-b376-62e01d6892b3.yml b/modules/acquia_cms_starter/content/node/0098ef73-f5d3-4b91-b376-62e01d6892b3.yml index 262759a92..314c9bc16 100644 --- a/modules/acquia_cms_starter/content/node/0098ef73-f5d3-4b91-b376-62e01d6892b3.yml +++ b/modules/acquia_cms_starter/content/node/0098ef73-f5d3-4b91-b376-62e01d6892b3.yml @@ -24,7 +24,7 @@ default: value: 'Article nine medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538040 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/0ff5fe80-f6d5-471e-a922-990b4037c9e7.yml b/modules/acquia_cms_starter/content/node/0ff5fe80-f6d5-471e-a922-990b4037c9e7.yml index 38a702125..c4d207ad9 100644 --- a/modules/acquia_cms_starter/content/node/0ff5fe80-f6d5-471e-a922-990b4037c9e7.yml +++ b/modules/acquia_cms_starter/content/node/0ff5fe80-f6d5-471e-a922-990b4037c9e7.yml @@ -23,7 +23,7 @@ default: value: 'Article four medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538039 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/167cb9be-e752-419e-a4cc-060abce792a0.yml b/modules/acquia_cms_starter/content/node/167cb9be-e752-419e-a4cc-060abce792a0.yml index 82cfaec72..9a5f248ad 100644 --- a/modules/acquia_cms_starter/content/node/167cb9be-e752-419e-a4cc-060abce792a0.yml +++ b/modules/acquia_cms_starter/content/node/167cb9be-e752-419e-a4cc-060abce792a0.yml @@ -23,7 +23,7 @@ default: value: 'Article two medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538045 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/1fc224b3-849d-43fc-b0c1-cd4d6e1e3fbb.yml b/modules/acquia_cms_starter/content/node/1fc224b3-849d-43fc-b0c1-cd4d6e1e3fbb.yml index 46fe042d4..3e69b7bc5 100644 --- a/modules/acquia_cms_starter/content/node/1fc224b3-849d-43fc-b0c1-cd4d6e1e3fbb.yml +++ b/modules/acquia_cms_starter/content/node/1fc224b3-849d-43fc-b0c1-cd4d6e1e3fbb.yml @@ -24,7 +24,7 @@ default: value: 'Article eight medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538050 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/2de584f5-f689-400e-b137-4744f2a1f68f.yml b/modules/acquia_cms_starter/content/node/2de584f5-f689-400e-b137-4744f2a1f68f.yml index 4502fd6fb..37e387fd0 100644 --- a/modules/acquia_cms_starter/content/node/2de584f5-f689-400e-b137-4744f2a1f68f.yml +++ b/modules/acquia_cms_starter/content/node/2de584f5-f689-400e-b137-4744f2a1f68f.yml @@ -24,7 +24,7 @@ default: value: 'Article twelve medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538041 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/6543ad81-8fdb-4852-b842-e665aa1788b6.yml b/modules/acquia_cms_starter/content/node/6543ad81-8fdb-4852-b842-e665aa1788b6.yml index ae5a2d35a..e4037a93d 100644 --- a/modules/acquia_cms_starter/content/node/6543ad81-8fdb-4852-b842-e665aa1788b6.yml +++ b/modules/acquia_cms_starter/content/node/6543ad81-8fdb-4852-b842-e665aa1788b6.yml @@ -23,7 +23,7 @@ default: value: 'Article three medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538047 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/8aef96ff-8e68-4d88-b6bd-28ff8a227eb3.yml b/modules/acquia_cms_starter/content/node/8aef96ff-8e68-4d88-b6bd-28ff8a227eb3.yml index a635ad460..bb9cdf9a1 100644 --- a/modules/acquia_cms_starter/content/node/8aef96ff-8e68-4d88-b6bd-28ff8a227eb3.yml +++ b/modules/acquia_cms_starter/content/node/8aef96ff-8e68-4d88-b6bd-28ff8a227eb3.yml @@ -23,7 +23,7 @@ default: value: 'Article eight medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538046 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/8ca3c322-4b7f-43d0-a37d-d883ef9b7e5b.yml b/modules/acquia_cms_starter/content/node/8ca3c322-4b7f-43d0-a37d-d883ef9b7e5b.yml index 34ba3a91a..f82c3da40 100644 --- a/modules/acquia_cms_starter/content/node/8ca3c322-4b7f-43d0-a37d-d883ef9b7e5b.yml +++ b/modules/acquia_cms_starter/content/node/8ca3c322-4b7f-43d0-a37d-d883ef9b7e5b.yml @@ -23,7 +23,7 @@ default: value: 'Article seven medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538038 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/922a4cef-f334-4e0b-87f8-7b31da9393bc.yml b/modules/acquia_cms_starter/content/node/922a4cef-f334-4e0b-87f8-7b31da9393bc.yml index a5c8bb71f..2c988916a 100644 --- a/modules/acquia_cms_starter/content/node/922a4cef-f334-4e0b-87f8-7b31da9393bc.yml +++ b/modules/acquia_cms_starter/content/node/922a4cef-f334-4e0b-87f8-7b31da9393bc.yml @@ -23,7 +23,7 @@ default: value: 'Article five medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538043 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/96b0a01f-6d06-46ef-959c-8d96343c88a8.yml b/modules/acquia_cms_starter/content/node/96b0a01f-6d06-46ef-959c-8d96343c88a8.yml index baf63d7a7..e94d9b805 100644 --- a/modules/acquia_cms_starter/content/node/96b0a01f-6d06-46ef-959c-8d96343c88a8.yml +++ b/modules/acquia_cms_starter/content/node/96b0a01f-6d06-46ef-959c-8d96343c88a8.yml @@ -23,7 +23,7 @@ default: value: 'Article one long length wrapping placeholder heading.' created: - - value: 1612538036 + value: 1612538037 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/a0fc7bd8-f7dd-4468-bc77-d154c374c686.yml b/modules/acquia_cms_starter/content/node/a0fc7bd8-f7dd-4468-bc77-d154c374c686.yml index e2fa52369..880ad7068 100644 --- a/modules/acquia_cms_starter/content/node/a0fc7bd8-f7dd-4468-bc77-d154c374c686.yml +++ b/modules/acquia_cms_starter/content/node/a0fc7bd8-f7dd-4468-bc77-d154c374c686.yml @@ -24,7 +24,7 @@ default: value: 'Article eleven medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538051 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/a1eafd08-eaec-4f57-be82-e93c81be9d62.yml b/modules/acquia_cms_starter/content/node/a1eafd08-eaec-4f57-be82-e93c81be9d62.yml index 94fbeb5ed..f46402aac 100644 --- a/modules/acquia_cms_starter/content/node/a1eafd08-eaec-4f57-be82-e93c81be9d62.yml +++ b/modules/acquia_cms_starter/content/node/a1eafd08-eaec-4f57-be82-e93c81be9d62.yml @@ -23,7 +23,7 @@ default: value: 'Article six medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538049 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/af87f256-f648-48d5-be0d-7e0e0616331a.yml b/modules/acquia_cms_starter/content/node/af87f256-f648-48d5-be0d-7e0e0616331a.yml index 5ec8ecc20..c82e7e4cf 100644 --- a/modules/acquia_cms_starter/content/node/af87f256-f648-48d5-be0d-7e0e0616331a.yml +++ b/modules/acquia_cms_starter/content/node/af87f256-f648-48d5-be0d-7e0e0616331a.yml @@ -24,7 +24,7 @@ default: value: 'Article thirteen medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538048 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/e213202d-56f1-4e72-862c-e55d9ca19afe.yml b/modules/acquia_cms_starter/content/node/e213202d-56f1-4e72-862c-e55d9ca19afe.yml index e0ec87b6d..9f99e24df 100644 --- a/modules/acquia_cms_starter/content/node/e213202d-56f1-4e72-862c-e55d9ca19afe.yml +++ b/modules/acquia_cms_starter/content/node/e213202d-56f1-4e72-862c-e55d9ca19afe.yml @@ -24,7 +24,7 @@ default: value: 'Article fourteen medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538044 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/f01ed833-ec04-41d9-967c-45b04c6e3b12.yml b/modules/acquia_cms_starter/content/node/f01ed833-ec04-41d9-967c-45b04c6e3b12.yml index 9a5ca3b94..08a754e23 100644 --- a/modules/acquia_cms_starter/content/node/f01ed833-ec04-41d9-967c-45b04c6e3b12.yml +++ b/modules/acquia_cms_starter/content/node/f01ed833-ec04-41d9-967c-45b04c6e3b12.yml @@ -24,7 +24,7 @@ default: value: 'Article ten medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538052 promote: - value: true diff --git a/modules/acquia_cms_starter/content/node/f4b3eb8e-234a-4788-9ba7-6e8838b362d2.yml b/modules/acquia_cms_starter/content/node/f4b3eb8e-234a-4788-9ba7-6e8838b362d2.yml index da33e8743..331041ae6 100644 --- a/modules/acquia_cms_starter/content/node/f4b3eb8e-234a-4788-9ba7-6e8838b362d2.yml +++ b/modules/acquia_cms_starter/content/node/f4b3eb8e-234a-4788-9ba7-6e8838b362d2.yml @@ -24,7 +24,7 @@ default: value: 'Article eight medium length placeholder heading.' created: - - value: 1612538036 + value: 1612538042 promote: - value: true diff --git a/modules/acquia_cms_toolbar/acquia_cms_toolbar.info.yml b/modules/acquia_cms_toolbar/acquia_cms_toolbar.info.yml index a38ff8e8a..6f0958b15 100644 --- a/modules/acquia_cms_toolbar/acquia_cms_toolbar.info.yml +++ b/modules/acquia_cms_toolbar/acquia_cms_toolbar.info.yml @@ -1,4 +1,4 @@ -name: "Toolbar" +name: "Acquia CMS Toolbar" core_version_requirement: ^9 description: "Acquia CMS styling brought to admin toolbar." package: "Acquia CMS" diff --git a/modules/acquia_cms_tour/acquia_cms_tour.info.yml b/modules/acquia_cms_tour/acquia_cms_tour.info.yml index 8d63ba529..485d164aa 100644 --- a/modules/acquia_cms_tour/acquia_cms_tour.info.yml +++ b/modules/acquia_cms_tour/acquia_cms_tour.info.yml @@ -1,4 +1,4 @@ -name: "Acquia Tour" +name: "Acquia CMS Tour" package: "Acquia CMS" description: "Provides a tour page for Acquia CMS." type: module diff --git a/modules/acquia_cms_tour/acquia_cms_tour.libraries.yml b/modules/acquia_cms_tour/acquia_cms_tour.libraries.yml index b10dae817..660eaac28 100644 --- a/modules/acquia_cms_tour/acquia_cms_tour.libraries.yml +++ b/modules/acquia_cms_tour/acquia_cms_tour.libraries.yml @@ -1,4 +1,17 @@ -styling: +acquia_cms_tour: css: theme: css/acquia_cms_tour.css: {} + +acquia_cms_tour_dashboard: + css: + theme: + css/acquia_cms_tour_dashboard.css: { } + css/acquia_cms_installation_wizard.css: { } + js: + js/acquia_cms_tour_dashboard.js: {} + dependencies: + - core/jquery #Just to be safe + - core/drupal.dialog.ajax #Required for dialogs + - core/jquery.form #If you also want to use Ajax for form operations + - core/drupalSettings #for drupalSettings diff --git a/modules/acquia_cms_tour/acquia_cms_tour.module b/modules/acquia_cms_tour/acquia_cms_tour.module index b0f998683..ace4fc79c 100644 --- a/modules/acquia_cms_tour/acquia_cms_tour.module +++ b/modules/acquia_cms_tour/acquia_cms_tour.module @@ -29,43 +29,25 @@ function acquia_cms_tour_theme() { 'acquia_cms_tour' => [ 'variables' => [], ], - 'acquia_cms_tour_dashboard_disabled' => [ - 'variables' => [ - 'section' => [], - ], - ], 'acquia_cms_tour_checklist_form' => [ 'render element' => 'form', ], + 'acquia_cms_tour_title_markup' => [ + 'variables' => [ + 'module_name' => NULL, + 'current_step' => NULL, + ], + ], ]; } /** - * Remove checklist form state when module is uninstalled. + * Remove configuration form state when module is uninstalled. * * Implements hook_modules_uninstalled(). */ function acquia_cms_tour_modules_uninstalled(array $modules) { - $checklist_forms = [ - 'acquia_csm_tool_checklist_form', - 'google_api_checklist_form', - ]; - - // When a checklist-form has a module entry checked, it stores its checked - // state and when that particular module is unistalled- state data should - // remove its entry. Installing the module again shall have unchecked entry - // in concerned checklist form. - foreach ($checklist_forms as $form_id) { - $config_state = \Drupal::state()->get('acquia_cms_tour.' . $form_id); - - // Ignore checklist-forms with empty state data. - if (!isset($config_state) || !is_array($config_state)) { - continue; - } - - // Unset module being uninstalled entry from the checklist-form. - $config_state = array_diff_key($config_state, array_flip($modules)); - \Drupal::state()->set('acquia_cms_tour.' . $form_id, $config_state); + foreach ($modules as $module) { + \Drupal::state()->delete('acms_' . $module . '_configured'); } - } diff --git a/modules/acquia_cms_tour/acquia_cms_tour.routing.yml b/modules/acquia_cms_tour/acquia_cms_tour.routing.yml index 7465eb556..329622850 100644 --- a/modules/acquia_cms_tour/acquia_cms_tour.routing.yml +++ b/modules/acquia_cms_tour/acquia_cms_tour.routing.yml @@ -12,3 +12,19 @@ acquia_cms_tour.enabled_modules: _title: 'CMS Dashboard' requirements: _permission: 'access acquia cms tour dashboard' + +acquia_cms_tour.welcome_modal_form: + path: '/admin/tour/dashboard/welcome-modal-form' + defaults: + _title: 'Modal Form' + _controller: '\Drupal\acquia_cms_tour\Controller\WelcomeModalController::openModalForm' + requirements: + _permission: 'access acquia cms tour dashboard' + +acquia_cms_tour.installation_wizard: + path: '/acquia-cms-tour/installation-wizard' + defaults: + _title: 'Acquia CMS Installation wizard' + _form: 'Drupal\acquia_cms_tour\Form\InstallationWizardForm' + requirements: + _permission: 'access content' diff --git a/modules/acquia_cms_tour/assets/images/check.svg b/modules/acquia_cms_tour/assets/images/check.svg new file mode 100644 index 000000000..0cb8ce80a --- /dev/null +++ b/modules/acquia_cms_tour/assets/images/check.svg @@ -0,0 +1,4 @@ + + + + diff --git a/modules/acquia_cms_tour/css/acquia_cms_installation_wizard.css b/modules/acquia_cms_tour/css/acquia_cms_installation_wizard.css new file mode 100644 index 000000000..deb965405 --- /dev/null +++ b/modules/acquia_cms_tour/css/acquia_cms_installation_wizard.css @@ -0,0 +1,164 @@ +.acms-installation-wizard { + padding-top: 0; + padding-bottom: 0; +} +.acms-installation-wizard .ui-dialog-titlebar .ui-dialog-titlebar-close { + top: 24%; +} +.acms-installation-wizard .ui-dialog-titlebar .ui-dialog-title { + display: inline-block; + margin-top: 61px; + font-size: 32px; + line-height: 1.3; + color: #232429; +} +.acms-installation-wizard .ui-widget-header.ui-dialog-titlebar { + height: 125px; + background-color: #fff; + padding-left: 48px; +} +.acms-installation-wizard .messages-list { + margin: 0; +} +.acms-installation-wizard #drupal-modal { + padding-left: 0; + padding-bottom: 0; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard { + display: flex; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .form-checkbox { + background-color: #003cc5; + border-color: #003cc5; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar { + flex: 1 1 34%; + font-size: 16px; + line-height: 1.5; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar ol { + margin-left: 0; + padding-left: 0; + list-style-type: none; + counter-reset: qa; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar .item { + padding: 16px 0; + align-items: center; + display: flex; + margin-left: 0; + padding-left: 48px; + margin-bottom: 0; + counter-increment: qa; + color: #232429; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar li:before { + content: counter(qa); + padding-right: 10px; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar .step-complete { + color: #919297; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar .step-complete::after { + content: ""; + display: inline-block; + width: 16px; + height: 16px; + background: url(../assets/images/check.svg); + margin-left: 10px; + background-repeat: no-repeat; + background-size: 16px 16px; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .tour-sidebar .current-step { + background-color: #e6ecf8; + border-top-right-radius: 30px; + border-bottom-right-radius: 30px; + color: #003cc5; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .fieldset.form-wrapper { + flex: 1 1 65%; + margin-top: 0; + border: 0; + box-shadow: none; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .fieldset .fieldset__wrapper { + margin-top: 0; + margin-left: 48px; + margin-right: 26px; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .fieldset .fieldset__wrapper .dashboard-fields-wrapper { + font-size: 14px; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .title-wrapper .step-title { + font-size: 28px; + font-weight: bold; +} +.acms-installation-wizard .acquia-cms-tour-installation-wizard .title-wrapper .req-markup { + font-size: 14px; + font-weight: normal; +} +.acms-installation-wizard .red-astrick { + color: red; +} +.ui-dialog.acms-installation-wizard .ui-widget-content.ui-dialog-buttonpane { + background: #fff; +} +.acms-installation-wizard .ui-dialog-buttonset { + width: 60%; + float: right; + display: block; + text-align: right; + margin-left: 0; + background: #fff; + padding-bottom: 16px; +} +acms-installation-wizard .ui-dialog-buttonset button { + background-color: #fff; + color: #55565b; +} +.acms-installation-wizard .ui-dialog-buttonset button:first-child:not(.skip-button) { + float: left; + background-color: #fff; + border: 2px solid #003cc5 !important; + box-shadow: none; + color: #003cc5; +} +.acms-installation-wizard .ui-dialog-buttonset button:last-child { + background-color: #003cc5; + color: #fff; +} +.acms-installation-wizard .ui-dialog-buttonset button:last-child:hover { + background-color: #00339a; +} +.acms-installation-wizard .ui-dialog-buttonset button.skip-button { + float: none; + background: none; + color: #55565b; + border: none; + box-shadow: none; + padding-left: 8px; + padding-right: 8px; + margin-right: 6px; +} +.acms-installation-wizard .ui-dialog-buttonset button.skip-button:hover { + background-color: #f0f5fd; + color: #0036b1; +} + +@media screen and (max-width: 767px) { + .acms-installation-wizard .acquia-cms-tour-installation-wizard { + flex-direction: column; + } + .acms-installation-wizard .ui-dialog-titlebar .ui-dialog-title { + margin-top: 20px; + font-size: 25px; + } + .acms-installation-wizard .ui-dialog-buttonpane .ui-dialog-buttonset { + width: 100%; + justify-content: center; + margin: auto; + } + .acms-installation-wizard .ui-dialog-buttonset button:first-child:not(.skip-button) { + float: none; + } +} diff --git a/modules/acquia_cms_tour/css/acquia_cms_tour.css b/modules/acquia_cms_tour/css/acquia_cms_tour.css index d05033582..2fb28f9e2 100644 --- a/modules/acquia_cms_tour/css/acquia_cms_tour.css +++ b/modules/acquia_cms_tour/css/acquia_cms_tour.css @@ -109,3 +109,20 @@ a:-webkit-any-link { width: 100%; } } + +.tour-checklist, +form > .fieldset { + margin-bottom: 28px; + box-shadow: none; +} +.tour-checklist .progress__track { + border: 1px #bbbec5 solid; + height: .5em; + margin-bottom: 20px; +} +.tour-checklist .progress__bar { + background: #28a9e0; + border: 1px #28a9e0 solid; + height: .5em; + min-width: 8px; +} diff --git a/modules/acquia_cms_tour/css/acquia_cms_tour_dashboard.css b/modules/acquia_cms_tour/css/acquia_cms_tour_dashboard.css new file mode 100644 index 000000000..6c3a8e257 --- /dev/null +++ b/modules/acquia_cms_tour/css/acquia_cms_tour_dashboard.css @@ -0,0 +1,137 @@ +.tour-dashboard { + text-align: center; +} +.tour-dashboard p { + padding-top: 30px; + padding-bottom: 30px; +} +.acms-welcome-modal.ui-dialog .ui-dialog-titlebar { + padding: 0; + color: #fff; + background: #fff; +} +.acms-welcome-modal .ui-dialog-buttonset { + justify-content: center !important; + margin: 0 !important; + background: #fff; +} +.acms-welcome-modal .button--primary { + background: #003cc5; +} +.setup-manually.button { + display: block; + margin: 1rem 0.75rem 1rem 0; + background-color: #fff; +} +.setup-manually.button:not(:focus) { + box-shadow: none; +} +.setup-manually.button:hover { + background: #fff; +} +.acms-welcome-modal .form-actions { + flex-direction: column; + align-items: center; +} +.acms-welcome-modal .form-actions .button { + margin-top: 0; + margin-bottom: 5px; +} +.acms-dashboard-form-wrapper { + margin-top: 50px; +} +.acms-dashboard-form-wrapper .claro-details__summary::before { + right: 0.75rem; + left: unset; +} +.acms-dashboard-form-wrapper .dashboard-check-icon { + height: 23px; + width: 22px; + background-image: url(../assets/images/check.svg); + display: inline-block; + float: right; + right: 100px; + position: absolute; + margin-top: 14px; + z-index: 1; +} +.acms-dashboard-form-wrapper .details-wrapper { + display: flex; +} +.dashboard-fields-wrapper { + width: 90%; + margin-right: 10px; +} +.dashboard-buttons-wrapper { + display: flex; + flex-direction: column; +} +.dashboard-buttons-wrapper a { + margin-left: 2px; +} +.dashboard-buttons-wrapper .tooltip { + position: absolute; + visibility: hidden; + width: 200px; + background-color: black; + color: white; + text-align: center; + border-radius: 6px; + padding: 5px 0; + z-index: 1; +} +.tool-tip__icon:hover + .tooltip { + visibility: visible; + right: 4%; + margin-top: 25px; +} +.dashboard-buttons-wrapper .tool-tip__icon { + background: #27b1f0; + border-radius: 10px; + cursor: pointer; + display: inline-block; + height: 20px; + line-height: 1.3em; + text-align: center; + width: 20px; + margin-left: 5px; + color: white; +} +.acms-dashboard-form-wrapper .claro-details__summary[aria-expanded='true'] { + border-bottom: 1px solid #808080; +} +.acms-dashboard-form-wrapper .js-form-wrapper { + border: 1px solid #808080; +} +.acms-dashboard-form-wrapper .button, +.button--primary { + background-color: white; + border: 1px solid #808080!important; + margin-top: 0; + color: #222330; +} +.acms-dashboard-form-wrapper .button--primary:hover { + background-color: #c2c3ca; + color: #222330; +} +.section-top { + display: flex; + align-items: center; + margin-bottom: 30px; +} +.section-top .help-text { + width: 80%; +} +.section-top .wizard { + position: absolute; + right: 2.75rem; +} + +@media screen and (max-width: 767px) { + .section-top { + flex-direction: column; + } + .section-top .wizard { + position: inherit; + } +} diff --git a/modules/acquia_cms_tour/js/acquia_cms_tour_dashboard.js b/modules/acquia_cms_tour/js/acquia_cms_tour_dashboard.js new file mode 100644 index 000000000..2fd0694d7 --- /dev/null +++ b/modules/acquia_cms_tour/js/acquia_cms_tour_dashboard.js @@ -0,0 +1,19 @@ + +/** + * @file + * Contains client-side support code for Acquia CMS's dashboard page. + */ + +(function ($, Drupal) { + // Override the throbber icon. + Drupal.theme.ajaxProgressThrobber = function () { return ""; }; + Drupal.behaviors.acquiaCmsDashboardDialog = { + attach: function (context, settings) { + $('.acms-dashboard-form-wrapper', context).once('acquiaCmsDashboardDialog').each(function () { + if (settings.show_wizard_modal && !settings.wizard_completed){ + $('.acms-dashboard-modal-form').click(); + } + }); + } + } +})(jQuery, Drupal); diff --git a/modules/acquia_cms_tour/src/Controller/DashboardController.php b/modules/acquia_cms_tour/src/Controller/DashboardController.php index a144befd3..9ae0e0e72 100644 --- a/modules/acquia_cms_tour/src/Controller/DashboardController.php +++ b/modules/acquia_cms_tour/src/Controller/DashboardController.php @@ -3,14 +3,19 @@ namespace Drupal\acquia_cms_tour\Controller; use Drupal\acquia_cms_tour\Form\AcquiaConnectorForm; -use Drupal\acquia_cms_tour\Form\AcquiaGoogleMapsAPIForm; +use Drupal\acquia_cms_tour\Form\AcquiaGoogleMapsApiDashboardForm; use Drupal\acquia_cms_tour\Form\AcquiaSearchForm; use Drupal\acquia_cms_tour\Form\AcquiaTelemetryForm; use Drupal\acquia_cms_tour\Form\GoogleAnalyticsForm; use Drupal\acquia_cms_tour\Form\GoogleTagManagerForm; use Drupal\acquia_cms_tour\Form\RecaptchaForm; use Drupal\acquia_cms_tour\Form\SiteStudioCoreForm; +use Drupal\Component\Serialization\Json; use Drupal\Core\Controller\ControllerBase; +use Drupal\Core\DependencyInjection\ClassResolverInterface; +use Drupal\Core\State\StateInterface; +use Drupal\Core\Url; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Defines a route controller providing a simple tour dashboard of Acquia CMS. @@ -22,51 +27,175 @@ */ final class DashboardController extends ControllerBase { + /** + * The class resolver. + * + * @var \Drupal\Core\DependencyInjection\ClassResolverInterface + */ + protected $classResolver; + + /** + * The module handler. + * + * @var \Drupal\Core\Extension\ModuleHandlerInterface + */ + protected $moduleHandler; + + /** + * The state interface. + * + * @var \Drupal\Core\State\StateInterface + */ + protected $state; + /** * The sub-controllers to invoke in order to build the tour page. * * @var array */ private const SECTIONS = [ - 'acquia_telemetry' => AcquiaTelemetryForm::class, - 'acquia_google_maps_api' => AcquiaGoogleMapsAPIForm::class, - 'acquia_search_form' => AcquiaSearchForm::class, + 'site_studio_core_form' => SiteStudioCoreForm::class, + 'acquia_connector_form' => AcquiaConnectorForm::class, + 'acquia_search' => AcquiaSearchForm::class, 'google_analytics_form' => GoogleAnalyticsForm::class, - 'google_tag_manager_form' => GoogleTagManagerForm::class, + 'acquia_google_maps_api' => AcquiaGoogleMapsApiDashboardForm::class, 'recaptcha_form' => RecaptchaForm::class, - 'acquia_connector_form' => AcquiaConnectorForm::class, - 'site_studio_core_form' => SiteStudioCoreForm::class, + 'google_tag_manager_form' => GoogleTagManagerForm::class, + 'acquia_telemetry' => AcquiaTelemetryForm::class, ]; + /** + * Constructs a new ProgressBarForm. + * + * @param \Drupal\Core\State\StateInterface $state + * The state service. + * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver + * The class resolver. + */ + public function __construct(StateInterface $state, ClassResolverInterface $class_resolver) { + $this->state = $state; + $this->classResolver = $class_resolver; + } + /** * Invokes a sub-controller and returns its output. * - * @param string $key - * The key. * @param string $controller_class * The class name. * * @return mixed * The markup/output of the sub-controller. */ - private function getSectionOutput(string $key, string $controller_class) { + private function getSectionOutput(string $controller_class) { if (is_a($controller_class, 'Drupal\Core\Form\FormInterface', TRUE)) { return $this->formBuilder()->getForm($controller_class); } } + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('state'), + $container->get('class_resolver') + ); + } + /** * Returns a renderable array for a tour dashboard page. */ public function content() { $build = []; + $build['wrapper'] = [ + '#type' => 'container', + '#attributes' => [ + 'class' => ['acms-dashboard-form-wrapper'], + ], + ]; + $form = []; + $form['#theme'] = 'acquia_cms_tour_checklist_form'; + $form['#attached']['library'][] = 'acquia_cms_tour/styling'; + $form['#tree'] = TRUE; + // Set initial state of the checklist progress. + $form['check_count'] = [ + '#type' => 'value', + '#value' => 0, + ]; + $form['check_total'] = [ + '#type' => 'value', + '#value' => 0, + ]; + $form['show_progress'] = [ + '#type' => 'value', + '#value' => TRUE, + ]; + $total = 0; + $completed = 0; + + $show_welcome_dialog = $this->state->get('show_welcome_modal', TRUE); + $show_wizard_modal = $this->state->get('show_wizard_modal', TRUE); + $wizard_completed = $this->state->get('wizard_completed', FALSE); + $link_url = Url::fromRoute('acquia_cms_tour.welcome_modal_form'); + if (!$show_welcome_dialog) { + $link_url = Url::fromRoute('acquia_cms_tour.installation_wizard'); + } + $link_url->setOptions([ + 'attributes' => [ + 'class' => [ + 'use-ajax', + 'button', + 'button--secondary', + 'button--small', + 'acms-dashboard-modal-form', + ], + 'data-dialog-type' => 'modal', + 'data-dialog-options' => Json::encode([ + 'width' => 912, + 'dialogClass' => 'acms-installation-wizard', + ]), + ], + ]); + $form['help_text'] = [ + '#type' => 'markup', + '#markup' => $this->t("ACMS organizes its features into individual components called modules. + The configuration dashboard/wizard setup will help you setup the pre-requisties. + Please note, not all modules in ACMS are required by default, and some optional modules + are left disabled on install. A checklist is provided to help you keep track of the tasks + needed to complete configuration."), + ]; + $form['modal_link'] = [ + '#type' => 'link', + '#title' => 'Wizard set-up', + '#url' => $link_url, + ]; // Delegate building each section to sub-controllers, in order to keep all // extension-specific logic cleanly encapsulated. foreach (static::SECTIONS as $key => $controller) { - $build[$key] = $this->getSectionOutput($key, $controller); + $instance_definition = $this->classResolver->getInstanceFromDefinition($controller); + if ($instance_definition->isModuleEnabled()) { + $total++; + $build['wrapper'][$key] = $this->getSectionOutput($controller); + if ($instance_definition->getConfigurationState()) { + $completed++; + } + } } + $form['check_total']['#value'] = $total; + $form['check_count']['#value'] = $completed; + array_unshift($build, $form); + // Attach acquia_cms_tour_dashboard library. + $build['#attached'] = [ + 'library' => [ + 'acquia_cms_tour/acquia_cms_tour_dashboard', + ], + 'drupalSettings' => [ + 'show_wizard_modal' => $show_wizard_modal, + 'wizard_completed' => $wizard_completed, + ], + ]; return $build; } diff --git a/modules/acquia_cms_tour/src/Controller/TourController.php b/modules/acquia_cms_tour/src/Controller/TourController.php index 667a0f65b..2beec522a 100644 --- a/modules/acquia_cms_tour/src/Controller/TourController.php +++ b/modules/acquia_cms_tour/src/Controller/TourController.php @@ -22,7 +22,7 @@ public function build() { '#theme' => 'acquia_cms_tour', '#attached' => [ 'library' => [ - 'acquia_cms_tour/styling', + 'acquia_cms_tour/acquia_cms_tour', ], ], ]; diff --git a/modules/acquia_cms_tour/src/Controller/WelcomeModalController.php b/modules/acquia_cms_tour/src/Controller/WelcomeModalController.php new file mode 100644 index 000000000..ce758d654 --- /dev/null +++ b/modules/acquia_cms_tour/src/Controller/WelcomeModalController.php @@ -0,0 +1,65 @@ +formBuilder = $formBuilder; + } + + /** + * {@inheritdoc} + * + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + * The Drupal service container. + * + * @return static + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('form_builder') + ); + } + + /** + * Callback for opening the welcome modal form. + */ + public function openModalForm() { + $response = new AjaxResponse(); + + // Get the modal form using the form builder. + $modal_form = $this->formBuilder->getForm('Drupal\acquia_cms_tour\Form\WelcomeModalForm'); + $modal_options = [ + 'dialogClass' => 'acms-welcome-modal', + 'width' => 500, + ]; + // Add an AJAX command to open a modal dialog with the form as the content. + $response->addCommand(new OpenModalDialogCommand('', $modal_form, $modal_options)); + + return $response; + } + +} diff --git a/modules/acquia_cms_tour/src/Form/AcquiaCMSDashboardBase.php b/modules/acquia_cms_tour/src/Form/AcquiaCMSDashboardBase.php new file mode 100644 index 000000000..d16e6d7e7 --- /dev/null +++ b/modules/acquia_cms_tour/src/Form/AcquiaCMSDashboardBase.php @@ -0,0 +1,134 @@ +state = $state; + $this->module_handler = $module_handler; + $this->linkGenerator = $link_generator; + $this->infoParser = $info_parser; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('state'), + $container->get('module_handler'), + $container->get('link_generator'), + $container->get('info_parser') + ); + } + + /** + * {@inheritdoc} + */ + public function isModuleEnabled() { + if ($this->module_handler->moduleExists($this->module)) { + return TRUE; + } + } + + /** + * {@inheritdoc} + */ + public function getModule() { + return $this->module; + } + + /** + * Get human readable module name. + */ + public function getModuleName() { + return $this->module_handler->getName($this->module); + } + + /** + * {@inheritdoc} + */ + public function getConfigurationState() { + $state = $this->state->get($this->getStateName(), FALSE); + if (!$state && $this->checkMinConfiguration()) { + $state = TRUE; + $this->setConfigurationState(); + } + return $state; + } + + /** + * {@inheritdoc} + */ + public function getStateName() { + return 'acms_' . $this->module . '_configured'; + } + + /** + * {@inheritdoc} + */ + public function setConfigurationState($status = TRUE) { + $this->state->set($this->getStateName(), $status); + } + + /** + * Check if the minimum require configuration are already in place or not. + * + * @return bool + * Returns the state of min required configurations. + */ + abstract public function checkMinConfiguration(); + +} diff --git a/modules/acquia_cms_tour/src/Form/AcquiaConnectorForm.php b/modules/acquia_cms_tour/src/Form/AcquiaConnectorForm.php index 8ffc13821..d7eab5f09 100644 --- a/modules/acquia_cms_tour/src/Form/AcquiaConnectorForm.php +++ b/modules/acquia_cms_tour/src/Form/AcquiaConnectorForm.php @@ -2,79 +2,20 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\InfoParserInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; -use Drupal\Core\State\StateInterface; use Drupal\Core\Url; -use Drupal\Core\Utility\LinkGeneratorInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to configure Acquia Connector. */ -final class AcquiaConnectorForm extends ConfigFormBase { +final class AcquiaConnectorForm extends AcquiaCMSDashboardBase { /** - * The state service. + * Provides module name. * - * @var \Drupal\Core\State\StateInterface + * @var string */ - protected $state; - - - /** - * The module handler. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - - /** - * The link generator. - * - * @var \Drupal\Core\Utility\LinkGeneratorInterface - */ - protected $linkGenerator; - - /** - * The info file parser. - * - * @var \Drupal\Core\Extension\InfoParserInterface - */ - protected $infoParser; - - /** - * Constructs a new AcquiaConnectorForm. - * - * @param \Drupal\Core\State\StateInterface $state - * The state service. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler service. - * @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator - * The link generator. - * @param \Drupal\Core\Extension\InfoParserInterface $info_parser - * The info file parser. - */ - public function __construct(StateInterface $state, ModuleHandlerInterface $module_handler, LinkGeneratorInterface $link_generator, InfoParserInterface $info_parser) { - $this->state = $state; - $this->module_handler = $module_handler; - $this->linkGenerator = $link_generator; - $this->infoParser = $info_parser; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('state'), - $container->get('module_handler'), - $container->get('link_generator'), - $container->get('info_parser'), - ); - } + protected $module = 'acquia_connector'; /** * {@inheritdoc} @@ -95,36 +36,64 @@ protected function getEditableConfigNames() { */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#tree'] = FALSE; - $module = 'acquia_connector'; - if ($this->module_handler->moduleExists($module)) { + $module = $this->module; + $configured = $this->getConfigurationState(); + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } + if ($this->isModuleEnabled()) { $module_path = $this->module_handler->getModule($module)->getPathname(); $module_info = $this->infoParser->parse($module_path); - $form['acquia_connector'] = [ - '#type' => 'fieldset', + $form[$module] = [ + '#type' => 'details', '#title' => $module_info['name'], - '#description' => $module_info['description'], - '#open' => TRUE, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['acquia_connector']['site_name'] = [ + $form[$module]['site_name'] = [ '#type' => 'textfield', '#title' => $this->t('Name'), '#maxlength' => 255, + '#disabled' => TRUE, '#required' => TRUE, '#default_value' => $this->state->get('spi.site_name'), + '#prefix' => '

      ' . $module_info['description'], + '#suffix' => "
      ", ]; - $form['acquia_connector']['actions']['submit'] = [ + + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', - '#button_type' => 'primary', + '#prefix' => '
      ', ]; - $form['acquia_connector']['actions']['advanced'] = [ - '#markup' => $this->linkGenerator->generate( - 'Advanced', - Url::fromRoute($module_info['configure']) - ), - '#prefix' => '', - '#suffix' => "", + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], ]; + if (isset($module_info['configure'])) { + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', + '#markup' => $this->linkGenerator->generate( + 'Advanced', + Url::fromRoute($module_info['configure']) + ), + '#suffix' => '
      ', + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", + ]; + } return $form; } @@ -136,7 +105,24 @@ public function buildForm(array $form, FormStateInterface $form_state) { public function submitForm(array &$form, FormStateInterface $form_state) { $acquia_connector_site_name = $form_state->getValue(['site_name']); $this->state->set('spi.site_name', $acquia_connector_site_name); + // Set configuration state for dashboard. + $this->setConfigurationState(); $this->messenger()->addStatus('The configuration options have been saved.'); } + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $site_name = $this->state->get('spi.site_name'); + return ($site_name) ? TRUE : FALSE; + } + } diff --git a/modules/acquia_cms_tour/src/Form/AcquiaDashboardInterface.php b/modules/acquia_cms_tour/src/Form/AcquiaDashboardInterface.php new file mode 100644 index 000000000..2bbbc95f1 --- /dev/null +++ b/modules/acquia_cms_tour/src/Form/AcquiaDashboardInterface.php @@ -0,0 +1,36 @@ +get('configuration'); $maps_api_key = $configuration['apiKey']; } + $form['acquia_google_maps_api'] = [ + 'maps_api_key' => [ + '#type' => 'textfield', + '#title' => $this->t('Maps API key'), + '#description' => $this->t('Enter your Google Maps API Key to automatically generate maps for Place content in Acquia CMS.'), + '#default_value' => $maps_api_key, + '#required' => TRUE, + ], '#type' => 'fieldset', '#open' => TRUE, '#title' => $this->t('Google Maps'), ]; - $form['acquia_google_maps_api']['maps_api_key'] = [ - '#type' => 'textfield', - '#required' => TRUE, - '#title' => $this->t('Maps API key'), - '#description' => $this->t('Enter your Google Maps API Key to automatically generate maps for Place content in Acquia CMS.'), - '#default_value' => $maps_api_key, - '#required' => TRUE, - ]; + $form['acquia_google_maps_api']['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), diff --git a/modules/acquia_cms_tour/src/Form/AcquiaGoogleMapsApiDashboardForm.php b/modules/acquia_cms_tour/src/Form/AcquiaGoogleMapsApiDashboardForm.php new file mode 100644 index 000000000..03eab1a06 --- /dev/null +++ b/modules/acquia_cms_tour/src/Form/AcquiaGoogleMapsApiDashboardForm.php @@ -0,0 +1,194 @@ +get('entity_type.manager'); + if ($entity_type_manager->hasDefinition('geocoder_provider')) { + $instance->geocoderProviderStorage = $entity_type_manager->getStorage('geocoder_provider'); + } + return $instance; + } + + /** + * {@inheritdoc} + */ + public function getFormId() { + return 'acquia_google_maps_api_form'; + } + + /** + * {@inheritdoc} + */ + protected function getEditableConfigNames() { + return ['cohesion.settings']; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state) { + // Text input for Google Maps. ACMS can use the Gmaps API in two totally + // different features (Site Studio and Place nodes). Site Studio is always + // enabled in ACMS, but Place may not. + $module = $this->module; + if ($this->isModuleEnabled()) { + $module_path = $this->module_handler->getModule($module)->getPathname(); + $module_info = $this->infoParser->parse($module_path); + $maps_api_key = $this->config('cohesion.settings') + ->get('google_map_api_key'); + $provider = $this->loadProvider(); + if ($provider) { + $configuration = $provider->get('configuration'); + $maps_api_key = $configuration['apiKey']; + } + + $configured = $this->getConfigurationState(); + + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } + $form[$module] = [ + '#type' => 'details', + '#title' => $module_info['name'], + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ]; + $form[$module]['acquia_google_maps_api'] = [ + 'maps_api_key' => [ + '#type' => 'textfield', + '#required' => TRUE, + '#title' => $this->t('Maps API key'), + '#placeholder' => '1234abcd', + '#description' => $this->t('Enter your Google Maps API Key to automatically generate maps for Place content in Acquia CMS.'), + '#default_value' => $maps_api_key, + '#prefix' => '
      ' . $module_info['description'], + '#suffix' => "
      ", + ], + ]; + $form[$module]['actions']['submit'] = [ + '#type' => 'submit', + '#value' => 'Save', + '#prefix' => '
      ', + ]; + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], + ]; + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', + '#markup' => $this->linkGenerator->generate( + 'Advanced', + Url::fromRoute('entity.geocoder_provider.collection') + ), + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", + ]; + + return $form; + } + } + + /** + * Loads the Geocoder provider for Google Maps, if it exists. + * + * @return \Drupal\geocoder\GeocoderProviderInterface|null + * The Geocoder provider entity, or NULL if it does not exist. + */ + private function loadProvider() : ?GeocoderProviderInterface { + if ($this->geocoderProviderStorage) { + return $this->geocoderProviderStorage->load('googlemaps'); + } + return NULL; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $maps_api_key = $form_state->getValue('maps_api_key'); + + // Configure Google Maps API Key for both Site Studio and + // Geocoder module. + $this->config('cohesion.settings') + ->set('google_map_api_key', $maps_api_key) + ->save(TRUE); + + $provider = $this->loadProvider(); + if ($provider) { + $configuration = $provider->get('configuration'); + $configuration['apiKey'] = $maps_api_key; + $provider->set('configuration', $configuration); + $this->geocoderProviderStorage->save($provider); + } + + $this->setConfigurationState(); + + $this->messenger()->addStatus('The Google Maps API key has been set.'); + } + + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $maps_api_key = $this->config('cohesion.settings')->get('google_map_api_key'); + $provider = $this->loadProvider(); + if ($provider) { + $configuration = $provider->get('configuration'); + $maps_api_key = $configuration['apiKey']; + } + + return !empty($maps_api_key); + } + +} diff --git a/modules/acquia_cms_tour/src/Form/AcquiaSearchForm.php b/modules/acquia_cms_tour/src/Form/AcquiaSearchForm.php index ccad1e89e..d54bb0aac 100644 --- a/modules/acquia_cms_tour/src/Form/AcquiaSearchForm.php +++ b/modules/acquia_cms_tour/src/Form/AcquiaSearchForm.php @@ -2,84 +2,26 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\InfoParserInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; -use Drupal\Core\State\StateInterface; use Drupal\Core\Url; -use Drupal\Core\Utility\LinkGeneratorInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to configure Acquia Solr Search module. */ -final class AcquiaSearchForm extends ConfigFormBase { +final class AcquiaSearchForm extends AcquiaCMSDashboardBase { /** - * The state service. + * Provides module name. * - * @var \Drupal\Core\State\StateInterface + * @var string */ - protected $state; - - /** - * The module handler. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - - /** - * The link generator. - * - * @var \Drupal\Core\Utility\LinkGeneratorInterface - */ - protected $linkGenerator; - - /** - * The info file parser. - * - * @var \Drupal\Core\Extension\InfoParserInterface - */ - protected $infoParser; - - /** - * Constructs a new AcquiaSearchForm. - * - * @param \Drupal\Core\State\StateInterface $state - * The state service. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler service. - * @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator - * The link generator. - * @param \Drupal\Core\Extension\InfoParserInterface $info_parser - * The info file parser. - */ - public function __construct(StateInterface $state, ModuleHandlerInterface $module_handler, LinkGeneratorInterface $link_generator, InfoParserInterface $info_parser) { - $this->state = $state; - $this->module_handler = $module_handler; - $this->linkGenerator = $link_generator; - $this->infoParser = $info_parser; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('state'), - $container->get('module_handler'), - $container->get('link_generator'), - $container->get('info_parser') - ); - } + protected $module = 'acquia_search'; /** * {@inheritdoc} */ public function getFormId() { - return 'acquia_cms_solr_search_form'; + return 'acquia_cms_search_form'; } /** @@ -96,54 +38,79 @@ protected function getEditableConfigNames() { */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#tree'] = FALSE; - $module = 'acquia_search'; - if ($this->module_handler->moduleExists($module)) { + $module = $this->module; + if ($this->isModuleEnabled()) { $module_path = $this->module_handler->getModule($module)->getPathname(); $module_info = $this->infoParser->parse($module_path); - $form['acquia_search'] = [ - '#type' => 'fieldset', + $configured = $this->getConfigurationState(); + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } + $form[$module] = [ + '#type' => 'details', '#title' => $module_info['name'], - '#description' => $module_info['description'], - '#open' => TRUE, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['acquia_search']['identifier'] = [ + $form[$module]['identifier'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Acquia Subscription identifier'), '#default_value' => $this->state->get('acquia_search.identifier'), '#description' => $this->t('Obtain this from the "Product Keys" section of the Acquia Cloud UI. Example: ABCD-12345'), + '#prefix' => '
      ' . $module_info['description'], ]; - $form['acquia_search']['api_key'] = [ + $form[$module]['api_key'] = [ '#type' => 'password', '#title' => $this->t('Acquia Connector key'), '#description' => $this->t('Obtain this from the "Product Keys" section of the Acquia Cloud UI.'), ]; - $form['acquia_search']['api_host'] = [ + $form[$module]['api_host'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Acquia Search API hostname'), '#default_value' => $this->config('acquia_search.settings')->get('api_host'), '#description' => $this->t('API endpoint domain or URL. Default value is "https://api.sr-prod02.acquia.com".'), ]; - $form['acquia_search']['uuid'] = [ + $form[$module]['uuid'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Acquia Application UUID'), '#default_value' => $this->state->get('acquia_search.uuid'), '#description' => $this->t('Obtain this from the "Product Keys" section of the Acquia Cloud UI.'), + '#suffix' => "
      ", ]; - $form['acquia_search']['actions']['submit'] = [ + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', '#button_type' => 'primary', + '#prefix' => '
      ', ]; - $form['acquia_search']['actions']['advanced'] = [ + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], + ]; + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', '#markup' => $this->linkGenerator->generate( 'Advanced', Url::fromRoute('entity.search_api_server.edit_form', ['search_api_server' => 'acquia_search_server']) ), - '#prefix' => '', - '#suffix' => "", + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", ]; return $form; } @@ -161,7 +128,26 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $this->state->set('acquia_search.identifier', $solr_identifier); $this->state->set('acquia_search.api_key', $solr_api_key); $this->state->set('acquia_search.uuid', $solr_api_uuid); + $this->setConfigurationState(); $this->messenger()->addStatus('The configuration options have been saved.'); } + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $api_host = $this->config('acquia_search.settings')->get('api_host'); + $solr_identifier = $this->state->get('acquia_search.identifier'); + $api_key = $this->state->get('acquia_search.api_key'); + $uuid = $this->state->get('acquia_search.uuid'); + return !empty($api_host) && !empty($uuid) && !empty($api_key) && !empty($solr_identifier); + } + } diff --git a/modules/acquia_cms_tour/src/Form/AcquiaTelemetryForm.php b/modules/acquia_cms_tour/src/Form/AcquiaTelemetryForm.php index 40497da18..df82942f3 100644 --- a/modules/acquia_cms_tour/src/Form/AcquiaTelemetryForm.php +++ b/modules/acquia_cms_tour/src/Form/AcquiaTelemetryForm.php @@ -2,16 +2,14 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Extension\ModuleInstallerInterface; -use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Url; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to toggle the Acquia Telemetry module. */ -final class AcquiaTelemetryForm extends FormBase { +final class AcquiaTelemetryForm extends AcquiaCMSDashboardBase { /** * The module installer. @@ -21,64 +19,98 @@ final class AcquiaTelemetryForm extends FormBase { private $moduleInstaller; /** - * The module handler. + * Provides module name. * - * @var \Drupal\Core\Extension\ModuleHandlerInterface + * @var string */ - private $moduleHandler; + protected $module = 'acquia_telemetry'; /** - * AcquiaTelemetryForm constructor. - * - * @param \Drupal\Core\Extension\ModuleInstallerInterface $module_installer - * The module installer. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler. + * {@inheritdoc} */ - public function __construct(ModuleInstallerInterface $module_installer, ModuleHandlerInterface $module_handler) { - $this->moduleInstaller = $module_installer; - $this->moduleHandler = $module_handler; + public static function create(ContainerInterface $container) { + $instance = parent::create($container); + + $module_installer = $container->get('module_installer'); + $instance->moduleInstaller = $module_installer; + + return $instance; } /** * {@inheritdoc} */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('module_installer'), - $container->get('module_handler') - ); + public function getFormId() { + return 'acquia_cms_telemetry_form'; } /** * {@inheritdoc} */ - public function getFormId() { - return 'acquia_cms_telemetry_form'; + protected function getEditableConfigNames() { + return [ + 'acquia_telemetry.settings', + ]; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { - // Checkbox for Acquia Telemetry. - $form['acquia_telemetry'] = [ - '#type' => 'fieldset', - '#open' => TRUE, - '#title' => $this->t('Acquia Telemetry'), + $form['#tree'] = FALSE; + $module = $this->module; + $module_path = $this->module_handler->getModule($module)->getPathname(); + $module_info = $this->infoParser->parse($module_path); + if ($this->getConfigurationState()) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } + $form[$module] = [ + '#type' => 'details', + '#title' => $module_info['name'], + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['acquia_telemetry']['opt_in'] = [ + $form[$module]['opt_in'] = [ '#type' => 'checkbox', '#title' => $this->t('Send anonymous data about Acquia product usage'), - '#default_value' => $this->moduleHandler->moduleExists('acquia_telemetry'), + '#default_value' => $this->isModuleEnabled() ? 1 : 0, '#description' => $this->t('This module intends to collect anonymous data about Acquia product usage. No private information will be gathered. Data will not be used for marketing or sold to any third party. This is an opt-in module and can be disabled at any time by uninstalling the acquia_telemetry module by your site administrator.'), + '#prefix' => '
      ', + '#suffix' => "
      ", ]; - $form['acquia_telemetry']['actions']['submit'] = [ + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', - '#button_type' => 'primary', + '#prefix' => '
      ', ]; - + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], + ]; + if (isset($module_info['configure'])) { + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', + '#markup' => $this->linkGenerator->generate( + 'Advanced', + Url::fromRoute($module_info['configure']) + ), + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", + ]; + } return $form; } @@ -91,12 +123,28 @@ public function submitForm(array &$form, FormStateInterface $form_state) { if ($acquia_telemetry_opt_in) { $this->moduleInstaller->install(['acquia_telemetry']); + $this->setConfigurationState(); $this->messenger()->addStatus('You have opted into Acquia Telemetry. Thank you for helping improve Acquia products.'); } else { $this->moduleInstaller->uninstall(['acquia_telemetry']); + $this->setConfigurationState(FALSE); $this->messenger()->addStatus('You have successfully opted out of Acquia Telemetry. Anonymous usage information will no longer be collected.'); } } + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + return $this->isModuleEnabled(); + } + } diff --git a/modules/acquia_cms_tour/src/Form/GoogleAnalyticsForm.php b/modules/acquia_cms_tour/src/Form/GoogleAnalyticsForm.php index 0043e68ec..d1fdc19ed 100644 --- a/modules/acquia_cms_tour/src/Form/GoogleAnalyticsForm.php +++ b/modules/acquia_cms_tour/src/Form/GoogleAnalyticsForm.php @@ -2,66 +2,20 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\InfoParserInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; -use Drupal\Core\Utility\LinkGeneratorInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to configure the Google Analytics module. */ -final class GoogleAnalyticsForm extends ConfigFormBase { +final class GoogleAnalyticsForm extends AcquiaCMSDashboardBase { /** - * The module handler. + * Provides module name. * - * @var \Drupal\Core\Extension\ModuleHandlerInterface + * @var string */ - protected $moduleHandler; - - /** - * The link generator. - * - * @var \Drupal\Core\Utility\LinkGeneratorInterface - */ - protected $linkGenerator; - - /** - * The info file parser. - * - * @var \Drupal\Core\Extension\InfoParserInterface - */ - protected $infoParser; - - /** - * Constructs a new GoogleAnalyticsForm. - * - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler service. - * @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator - * The link generator. - * @param \Drupal\Core\Extension\InfoParserInterface $info_parser - * The info file parser. - */ - public function __construct(ModuleHandlerInterface $module_handler, LinkGeneratorInterface $link_generator, InfoParserInterface $info_parser) { - $this->module_handler = $module_handler; - $this->linkGenerator = $link_generator; - $this->infoParser = $info_parser; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('module_handler'), - $container->get('link_generator'), - $container->get('info_parser'), - ); - } + protected $module = 'google_analytics'; /** * {@inheritdoc} @@ -84,35 +38,64 @@ protected function getEditableConfigNames() { */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#tree'] = FALSE; - $module = 'google_analytics'; - if ($this->module_handler->moduleExists($module)) { + $module = $this->module; + if ($this->isModuleEnabled()) { + $configured = $this->getConfigurationState(); + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } + $module_path = $this->module_handler->getModule($module)->getPathname(); $module_info = $this->infoParser->parse($module_path); - $form['google_analytics'] = [ - '#type' => 'fieldset', + $form[$module] = [ + '#type' => 'details', '#title' => $module_info['name'], - '#description' => $module_info['description'], - '#open' => TRUE, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['google_analytics']['web_property_id'] = [ + + $form[$module]['web_property_id'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Web Property ID'), + '#placeholder' => 'UA-', '#default_value' => $this->config('google_analytics.settings')->get('account'), + '#prefix' => '
      ' . $module_info['description'], + '#suffix' => "
      ", ]; - $form['google_analytics']['actions']['submit'] = [ + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', - '#button_type' => 'primary', + '#prefix' => '
      ', ]; - $form['google_analytics']['actions']['advanced'] = [ - '#markup' => $this->linkGenerator->generate( - 'Advanced', - Url::fromRoute($module_info['configure']) - ), - '#prefix' => '', - '#suffix' => "", + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], ]; + if (isset($module_info['configure'])) { + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', + '#markup' => $this->linkGenerator->generate( + 'Advanced', + Url::fromRoute($module_info['configure']) + ), + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", + ]; + } return $form; } } @@ -123,7 +106,26 @@ public function buildForm(array $form, FormStateInterface $form_state) { public function submitForm(array &$form, FormStateInterface $form_state) { $property_id = $form_state->getValue(['web_property_id']); $this->config('google_analytics.settings')->set('account', $property_id)->save(); + $this->state->set('google_analytics_progress', TRUE); $this->messenger()->addStatus('The configuration options have been saved.'); + + // Update state. + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $account = $this->config('google_analytics.settings')->get('account'); + return $account ? TRUE : FALSE; } } diff --git a/modules/acquia_cms_tour/src/Form/GoogleTagManagerForm.php b/modules/acquia_cms_tour/src/Form/GoogleTagManagerForm.php index 402c93485..723c2943b 100644 --- a/modules/acquia_cms_tour/src/Form/GoogleTagManagerForm.php +++ b/modules/acquia_cms_tour/src/Form/GoogleTagManagerForm.php @@ -2,66 +2,20 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\InfoParserInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; -use Drupal\Core\Utility\LinkGeneratorInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to configure Google Tag Manager module. */ -final class GoogleTagManagerForm extends ConfigFormBase { +final class GoogleTagManagerForm extends AcquiaCMSDashboardBase { /** - * The module handler. + * Provides module name. * - * @var \Drupal\Core\Extension\ModuleHandlerInterface + * @var string */ - protected $moduleHandler; - - /** - * The link generator. - * - * @var \Drupal\Core\Utility\LinkGeneratorInterface - */ - protected $linkGenerator; - - /** - * The info file parser. - * - * @var \Drupal\Core\Extension\InfoParserInterface - */ - protected $infoParser; - - /** - * Constructs a new GoogleTagManagerForm. - * - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler service. - * @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator - * The link generator. - * @param \Drupal\Core\Extension\InfoParserInterface $info_parser - * The info file parser. - */ - public function __construct(ModuleHandlerInterface $module_handler, LinkGeneratorInterface $link_generator, InfoParserInterface $info_parser) { - $this->module_handler = $module_handler; - $this->linkGenerator = $link_generator; - $this->infoParser = $info_parser; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('module_handler'), - $container->get('link_generator'), - $container->get('info_parser'), - ); - } + protected $module = 'google_tag'; /** * {@inheritdoc} @@ -84,36 +38,62 @@ protected function getEditableConfigNames() { */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#tree'] = FALSE; - $module = 'google_tag'; - if ($this->module_handler->moduleExists($module)) { + $module = $this->module; + if ($this->isModuleEnabled()) { + $configured = $this->getConfigurationState(); + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } $module_path = $this->module_handler->getModule($module)->getPathname(); $module_info = $this->infoParser->parse($module_path); - $form['google_tag'] = [ - '#type' => 'fieldset', + $form[$module] = [ + '#type' => 'details', '#title' => $module_info['name'], - '#description' => $module_info['description'], - '#open' => TRUE, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['google_tag']['snippet_parent_uri'] = [ + $form[$module]['snippet_parent_uri'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Snippet parent URI'), '#attributes' => ['placeholder' => $this->t('public:/')], '#default_value' => $this->config('google_tag.settings')->get('uri'), + '#prefix' => '
      ' . $module_info['description'], + '#suffix' => "
      ", ]; - $form['google_tag']['actions']['submit'] = [ + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', - '#button_type' => 'primary', + '#prefix' => '
      ', ]; - $form['google_tag']['actions']['advanced'] = [ - '#markup' => $this->linkGenerator->generate( - 'Advanced', - Url::fromRoute($module_info['configure']) - ), - '#prefix' => '', - '#suffix' => "", + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], ]; + if (isset($module_info['configure'])) { + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', + '#markup' => $this->linkGenerator->generate( + 'Advanced', + Url::fromRoute($module_info['configure']) + ), + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", + ]; + } } return $form; } @@ -124,7 +104,23 @@ public function buildForm(array $form, FormStateInterface $form_state) { public function submitForm(array &$form, FormStateInterface $form_state) { $snippet_parent_uri = $form_state->getValue(['snippet_parent_uri']); $this->config('google_tag.settings')->set('uri', $snippet_parent_uri)->save(); + $this->setConfigurationState(); $this->messenger()->addStatus('The configuration options have been saved.'); } + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $uri = $this->config('google_tag.settings')->get('uri'); + return $uri ? TRUE : FALSE; + } + } diff --git a/modules/acquia_cms_tour/src/Form/InstallationWizardForm.php b/modules/acquia_cms_tour/src/Form/InstallationWizardForm.php new file mode 100644 index 000000000..76bfbfef6 --- /dev/null +++ b/modules/acquia_cms_tour/src/Form/InstallationWizardForm.php @@ -0,0 +1,516 @@ + AcquiaTelemetryForm::class, + 'geocoder' => AcquiaGoogleMapsApiDashboardForm::class, + 'acquia_search' => AcquiaSearchForm::class, + 'google_analytics' => GoogleAnalyticsForm::class, + 'google_tag' => GoogleTagManagerForm::class, + 'recaptcha' => RecaptchaForm::class, + 'acquia_connector' => AcquiaConnectorForm::class, + 'cohesion' => SiteStudioCoreForm::class, + ]; + + /** + * All steps of the multistep form. + * + * @var array + */ + protected $steps; + + /** + * All steps of the multistep form. + * + * @var bool + */ + protected $useAjax = TRUE; + + /** + * The rendered array renderer. + * + * @var array + */ + protected $renderer; + + /** + * Current step. + * + * @var int + */ + protected $currentStep; + + /** + * The class resolver. + * + * @var \Drupal\Core\DependencyInjection\ClassResolverInterface + */ + protected $classResolver; + + /** + * The state interface. + * + * @var \Drupal\Core\State\StateInterface + */ + protected $state; + + /** + * {@inheritdoc} + */ + public function getFormId() { + return 'acquia_cms_tour_installation_wizard'; + } + + /** + * Constructs a new InstallationWizardForm. + * + * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver + * The class resolver. + * @param \Drupal\Core\Render\Renderer $renderer + * The renderer service. + * @param \Drupal\Core\State\StateInterface $state + * The state interface. + */ + public function __construct(ClassResolverInterface $class_resolver, Renderer $renderer, StateInterface $state) { + $this->classResolver = $class_resolver; + $this->renderer = $renderer; + $this->state = $state; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('class_resolver'), + $container->get('renderer'), + $container->get('state') + ); + } + + /** + * Returns wrapper for the form. + */ + public function getFormWrapper() { + $form_id = $this->getFormId(); + if ($this->useAjax) { + $form_id = 'ajax_' . $form_id; + } + return str_replace('_', '-', $form_id); + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state) { + + if (is_null($this->currentStep)) { + // Initialize multistep form. + $this->initMultistepForm($form, $form_state); + // If the user resumes the wizard later, lets take them + // to the appropriate config form. + $current_wizard_step = $this->state->get('current_wizard_step', NULL); + if ($current_wizard_step && $current_wizard_step != 'completed') { + $this->setCurrentStep($current_wizard_step); + } + } + + // Generate side nav in wizard. + $form['nav-item'] = [ + '#theme' => 'item_list', + '#list_type' => 'ol', + '#items' => $this->getItemList(), + '#wrapper_attributes' => ['class' => 'tour-sidebar'], + ]; + $form = $this->stepForm($form, $form_state); + $form['#prefix'] = '
      '; + $form['#suffix'] = '
      '; + + $actions = $this->actionsElement($form, $form_state); + if (!empty($actions)) { + $form['actions'] = $actions; + } + + $form['#attached']['library'][] = 'core/drupal.dialog.ajax'; + + return $form; + } + + /** + * Returns the actions form element for the specific step. + */ + protected function actionsElement(array $form, FormStateInterface $form_state) { + $element = $this->stepActions($form, $form_state); + + if (isset($element['submit'])) { + // Give the primary submit button a #button_type of primary. + $element['submit']['#button_type'] = 'primary'; + } + + $count = 0; + foreach (Element::children($element) as $action) { + $element[$action] += [ + '#weight' => ++$count * 5, + ]; + // Lets remove ajax call for last step. + if ($this->useAjax && $action != 'submit' && !$this->isCurrentStepLast()) { + $element[$action] += [ + '#ajax' => [ + 'wrapper' => $this->getFormWrapper(), + ], + ]; + } + // Lets add ajax call for back button on last step. + if ($this->useAjax && $action == 'back' && $this->isCurrentStepLast()) { + $element[$action] += [ + '#ajax' => [ + 'wrapper' => $this->getFormWrapper(), + ], + ]; + } + } + + if (!empty($element)) { + $element['#type'] = 'actions'; + } + + return $element; + } + + /** + * Returns an array of supported actions for the specific step form. + */ + protected function stepActions(array $form, FormStateInterface $form_state) { + // Do not show 'back' button on the first step. + if (!$this->isCurrentStepFirst()) { + $actions['back'] = [ + '#type' => 'submit', + '#value' => $this->t('< Back'), + '#limit_validation_errors' => [], + '#submit' => ['::previousStepSubmit'], + ]; + } + + // Show skip this step button. + $actions['skip'] = [ + '#type' => 'submit', + '#value' => $this->t("Skip this step"), + '#limit_validation_errors' => [], + '#attributes' => [ + 'class' => ['skip-button'], + ], + '#submit' => ['::skipStepSubmit'], + ]; + + // Do not show 'next' button on the last step. + if (!$this->isCurrentStepLast()) { + $actions['next'] = [ + '#type' => 'submit', + '#value' => $this->t('Next >'), + '#submit' => ['::nextStepSubmit'], + ]; + } + + // Show submit button on the last step. + if ($this->isCurrentStepLast()) { + $actions['submit'] = [ + '#type' => 'submit', + '#value' => $this->t("Complete"), + ]; + } + return $actions; + } + + /** + * {@inheritdoc} + */ + public function previousStepSubmit(array &$form, FormStateInterface $form_state) { + $this->copyFormValuesToStorage($form, $form_state); + $this->currentStep -= 1; + $form_state->setRebuild(TRUE); + } + + /** + * {@inheritdoc} + */ + public function nextStepSubmit(array &$form, FormStateInterface $form_state) { + $this->copyFormValuesToStorage($form, $form_state); + + // Call submitForm of corresponding form. + $formController = $this->getCurrentFormController()['formController']; + $this->classResolver->getInstanceFromDefinition($formController)->submitForm($form, $form_state); + + $this->currentStep += 1; + $this->state->set('current_wizard_step', $this->currentStep); + $form_state->setRebuild(TRUE); + } + + /** + * Skip the current state and mark it as completed. + */ + public function skipStepSubmit(array &$form, FormStateInterface $form_state) { + // Call default submitForm in case of last step. + if ($this->isCurrentStepLast()) { + $this->submitForm($form, $form_state); + } + else { + // Call ignoreConfig of corresponding form. + $formController = $this->getCurrentFormController()['formController']; + $this->classResolver->getInstanceFromDefinition($formController)->ignoreConfig($form, $form_state); + + $this->currentStep += 1; + $this->state->set('current_wizard_step', $this->currentStep); + $form_state->setRebuild(TRUE); + $form_state->clearErrors(); + } + } + + /** + * Checks if the current step is the first step. + */ + protected function isCurrentStepFirst(): bool { + return $this->currentStep == 0; + } + + /** + * Checks if the current step is the last step. + */ + protected function isCurrentStepLast(): bool { + return $this->currentStep == $this->amountSteps(); + } + + /** + * Returns an amount of the all steps. + */ + protected function amountSteps(): int { + return count($this->steps) - 1; + } + + /** + * Returns current step. + */ + protected function getCurrentStep(): int { + return $this->currentStep; + } + + /** + * Set current step. + * + * @param int $step + * The step to set. + */ + protected function setCurrentStep(int $step) { + $this->currentStep = $step; + } + + /** + * Copies field values to storage of the class. + * + * @param array $form + * A nested array of form elements comprising the form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + */ + protected function copyFormValuesToStorage(array $form, FormStateInterface $form_state) { + $form_state->cleanValues(); + $values = $form_state->getValues(); + + foreach ($values as $field_name => $value) { + // If field is already stored in storage + // check if it was changed, if so rewrite value. + if ((isset($this->storage[$field_name]) && $this->storage[$field_name] != $value) || !isset($this->storage[$field_name])) { + $this->storage[$field_name] = $value; + } + } + } + + /** + * Gets the value of the specific field from storage of the class. + * + * @param string $field_name + * A name of the field. + * @param mixed $empty_value + * The value which will be returned if $field_name is not stored in storage. + * + * @return mixed + * A field value. + */ + protected function getFieldValueFromStorage(string $field_name, $empty_value = NULL) { + if (isset($this->storage[$field_name])) { + return $this->storage[$field_name]; + } + else { + return $empty_value; + } + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $formController = $this->getCurrentFormController()['formController']; + $this->classResolver->getInstanceFromDefinition($formController)->submitForm($form, $form_state); + $this->state->set('wizard_completed', TRUE); + $this->state->set('current_wizard_step', 'completed'); + $this->messenger()->addStatus($this->t('The configuration options have been saved.')); + $form_state->setRedirect('acquia_cms_tour.enabled_modules'); + } + + /** + * Initialize multistep form. + * + * @param array $form + * An associative array containing the structure of the form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + */ + protected function initMultistepForm(array $form, FormStateInterface $form_state) { + $this->currentStep = 0; + $this->steps = $this->getSteps(); + $this->storage = []; + } + + /** + * Steps for the multistep form. + * + * The class FormMultistepBase provide two steps, + * considering that the multi step form must consists minimum + * from two steps. In class the callbacks of the steps are an + * abstract methods, which means required to implemantation in child class. + * If you need more then two steps inherit and implement this method + * in your child class like it done in example module and implement + * the callbacks defined in this method. + * + * @return array + * An array of elements (steps), where key of element is + * a numeric representation of the step and value is a callback + * which will be called to return a $form by the numeric represantation. + */ + public function getSteps() { + $steps = []; + foreach (static::SECTIONS as $controller) { + $isModuleEnabled = $this->classResolver->getInstanceFromDefinition($controller)->isModuleEnabled(); + if ($isModuleEnabled) { + $steps[] = $controller; + } + } + return $steps; + } + + /** + * The form for the specific step. + * + * @param array $form + * An associative array containing the structure of the form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + * + * @return array + * The render array defining the elements of the form. + * + * @throws \Exception + */ + public function stepForm(array &$form, FormStateInterface $form_state) { + $helper = $this->getCurrentFormController(); + $formController = $helper['formController']; + $key = $helper['moduleName']; + $formControllerDefinition = $this->classResolver->getInstanceFromDefinition($formController); + $module_title = $formControllerDefinition->getModuleName(); + $form = $formControllerDefinition->buildForm($form, $form_state); + $form[$key]['title_markup'] = [ + '#type' => 'markup', + '#markup' => $this->getTitleMarkup($module_title, ($this->currentStep) + 1), + '#weight' => -1, + ]; + // Change details to fieldset for all form. + $form[$key]['#type'] = 'fieldset'; + unset($form[$key]['actions']); + unset($form[$key]['#title']); + return $form; + } + + /** + * Helper method for sidebar nav item list. + * + * @return string + * The render array defining the markup of the sidebar. + * + * @throws \Exception + */ + protected function getItemList(): array { + $items = []; + $steps = $this->getSteps(); + foreach ($steps as $key => $controller) { + $instance_definition = $this->classResolver->getInstanceFromDefinition($controller); + $module_machine_name = $instance_definition->getmodule(); + $module_title = $instance_definition->getModuleName(); + $sr_no = $key + 1; + if ($sr_no < ($this->currentStep) + 1) { + $current_class = ['item', 'step-complete']; + } + elseif ($sr_no == ($this->currentStep) + 1) { + $current_class = ['item', 'current-step']; + } + else { + $current_class = ['item']; + } + $items[$module_machine_name] = [ + '#wrapper_attributes' => [ + 'class' => $current_class, + ], + '#children' => $module_title, + ]; + } + return $items; + } + + /** + * Helper method for adding title markup. + * + * @param string $module_title + * The module human readable name. + * @param int $current_step + * The forms current step. + * + * @return string + * The rendered array defining the markup of the title. + * + * @throws \Exception + */ + public function getTitleMarkup(string $module_title, int $current_step): string { + $title_markup = [ + '#theme' => 'acquia_cms_tour_title_markup', + '#module_name' => $module_title, + '#current_step' => $current_step, + ]; + return $this->renderer->render($title_markup); + } + + /** + * Helper to get current formController based on step. + * + * @return array + * The array of module name & Form class object. + */ + private function getCurrentFormController() { + $formController = $this->steps[$this->currentStep]; + $sections = \array_flip(self::SECTIONS); + $key = $sections[$formController]; + return ['moduleName' => $key, 'formController' => $formController]; + } + +} diff --git a/modules/acquia_cms_tour/src/Form/RecaptchaForm.php b/modules/acquia_cms_tour/src/Form/RecaptchaForm.php index 26e30cd68..450fdf9a8 100644 --- a/modules/acquia_cms_tour/src/Form/RecaptchaForm.php +++ b/modules/acquia_cms_tour/src/Form/RecaptchaForm.php @@ -2,67 +2,20 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\InfoParserInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; -use Drupal\Core\Utility\LinkGeneratorInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to configure the Recaptcha module. */ -final class RecaptchaForm extends ConfigFormBase { - - - /** - * The module handler. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - - /** - * The link generator. - * - * @var \Drupal\Core\Utility\LinkGeneratorInterface - */ - protected $linkGenerator; - - /** - * The info file parser. - * - * @var \Drupal\Core\Extension\InfoParserInterface - */ - protected $infoParser; +final class RecaptchaForm extends AcquiaCMSDashboardBase { /** - * Constructs a new RecaptchaForm. + * Provides module name. * - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler service. - * @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator - * The link generator. - * @param \Drupal\Core\Extension\InfoParserInterface $info_parser - * The info file parser. + * @var string */ - public function __construct(ModuleHandlerInterface $module_handler, LinkGeneratorInterface $link_generator, InfoParserInterface $info_parser) { - $this->module_handler = $module_handler; - $this->linkGenerator = $link_generator; - $this->infoParser = $info_parser; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('module_handler'), - $container->get('link_generator'), - $container->get('info_parser'), - ); - } + protected $module = 'recaptcha'; /** * {@inheritdoc} @@ -85,41 +38,70 @@ protected function getEditableConfigNames() { */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#tree'] = FALSE; - $module = 'recaptcha'; - if ($this->module_handler->moduleExists($module)) { + $module = $this->module; + if ($this->isModuleEnabled()) { + $configured = $this->getConfigurationState(); + + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } $module_path = $this->module_handler->getModule($module)->getPathname(); $module_info = $this->infoParser->parse($module_path); - $form['recaptcha'] = [ - '#type' => 'fieldset', + $form[$module] = [ + '#type' => 'details', '#title' => $module_info['name'], - '#description' => $module_info['description'], - '#open' => TRUE, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['recaptcha']['site_key'] = [ + $form[$module]['site_key'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Site key'), + '#placeholder' => '1234abcd', '#default_value' => $this->config('recaptcha.settings')->get('site_key'), + '#prefix' => '
      ' . $module_info['description'], ]; - $form['recaptcha']['secret_key'] = [ + $form[$module]['secret_key'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Secret key'), + '#placeholder' => '1234abcd', '#default_value' => $this->config('recaptcha.settings')->get('secret_key'), + '#suffix' => "
      ", ]; - $form['recaptcha']['actions']['submit'] = [ + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', - '#button_type' => 'primary', + '#prefix' => '
      ', ]; - $form['recaptcha']['actions']['advanced'] = [ - '#markup' => $this->linkGenerator->generate( - 'Advanced', - Url::fromRoute($module_info['configure']) - ), - '#prefix' => '', - '#suffix' => "", + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], ]; + if (isset($module_info['configure'])) { + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', + '#markup' => $this->linkGenerator->generate( + 'Advanced', + Url::fromRoute($module_info['configure']) + ), + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", + ]; + } } return $form; } @@ -132,7 +114,24 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $recaptcha_secret_key = $form_state->getValue(['secret_key']); $this->config('recaptcha.settings')->set('site_key', $recaptcha_site_key)->save(); $this->config('recaptcha.settings')->set('secret_key', $recaptcha_secret_key)->save(); + $this->setConfigurationState(); $this->messenger()->addStatus('The configuration options have been saved.'); } + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $site_key = $this->config('recaptcha.settings')->get('site_key'); + $secret_key = $this->config('recaptcha.settings')->get('secret_key'); + return $site_key && $secret_key; + } + } diff --git a/modules/acquia_cms_tour/src/Form/SiteStudioCoreForm.php b/modules/acquia_cms_tour/src/Form/SiteStudioCoreForm.php index e74c078e7..26fbc3c49 100644 --- a/modules/acquia_cms_tour/src/Form/SiteStudioCoreForm.php +++ b/modules/acquia_cms_tour/src/Form/SiteStudioCoreForm.php @@ -2,66 +2,20 @@ namespace Drupal\acquia_cms_tour\Form; -use Drupal\Core\Extension\InfoParserInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; -use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; -use Drupal\Core\Utility\LinkGeneratorInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; /** * Provides a form to configure SiteStudioCore. */ -final class SiteStudioCoreForm extends ConfigFormBase { +final class SiteStudioCoreForm extends AcquiaCMSDashboardBase { /** - * The module handler. + * Provides module name. * - * @var \Drupal\Core\Extension\ModuleHandlerInterface + * @var string */ - protected $moduleHandler; - - /** - * The link generator. - * - * @var \Drupal\Core\Utility\LinkGeneratorInterface - */ - protected $linkGenerator; - - /** - * The info file parser. - * - * @var \Drupal\Core\Extension\InfoParserInterface - */ - protected $infoParser; - - /** - * Constructs a new SiteStudioCoreForm. - * - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler service. - * @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator - * The link generator. - * @param \Drupal\Core\Extension\InfoParserInterface $info_parser - * The info file parser. - */ - public function __construct(ModuleHandlerInterface $module_handler, LinkGeneratorInterface $link_generator, InfoParserInterface $info_parser) { - $this->module_handler = $module_handler; - $this->linkGenerator = $link_generator; - $this->infoParser = $info_parser; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('module_handler'), - $container->get('link_generator'), - $container->get('info_parser') - ); - } + protected $module = 'cohesion'; /** * {@inheritdoc} @@ -84,40 +38,68 @@ protected function getEditableConfigNames() { */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#tree'] = FALSE; - $module = 'cohesion'; - if ($this->module_handler->moduleExists($module)) { + $module = $this->module; + if ($this->isModuleEnabled()) { $module_path = $this->module_handler->getModule($module)->getPathname(); $module_info = $this->infoParser->parse($module_path); - $form['cohesion'] = [ - '#type' => 'fieldset', + + $configured = $this->getConfigurationState(); + if ($configured) { + $form['check_icon'] = [ + '#prefix' => '', + '#suffix' => "", + ]; + } + $form[$module] = [ + '#type' => 'details', '#title' => $module_info['name'], - '#description' => $module_info['description'], - '#open' => TRUE, + '#collapsible' => TRUE, + '#collapsed' => TRUE, ]; - $form['cohesion']['api_key'] = [ + $form[$module]['api_key'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('API key'), + '#placeholder' => '1234abcd', '#default_value' => $this->config('cohesion.settings')->get('api_key'), + '#prefix' => '
      ' . $module_info['description'], ]; - $form['cohesion']['agency_key'] = [ + $form[$module]['agency_key'] = [ '#type' => 'textfield', '#required' => TRUE, '#title' => $this->t('Agency key'), + '#placeholder' => '1234abcd', '#default_value' => $this->config('cohesion.settings')->get('organization_key'), + '#suffix' => "
      ", ]; - $form['cohesion']['actions']['submit'] = [ + $form[$module]['actions']['submit'] = [ '#type' => 'submit', '#value' => 'Save', '#button_type' => 'primary', + '#prefix' => '
      ', ]; - $form['cohesion']['actions']['advanced'] = [ + $form[$module]['actions']['ignore'] = [ + '#type' => 'submit', + '#value' => 'Ignore', + '#limit_validation_errors' => [], + '#submit' => ['::ignoreConfig'], + ]; + $form[$module]['actions']['advanced'] = [ + '#prefix' => '
      ', '#markup' => $this->linkGenerator->generate( - 'Advanced', - Url::fromRoute('cohesion.configuration.account_settings') + 'Advanced', + Url::fromRoute('cohesion.configuration.account_settings') ), - '#prefix' => '', - '#suffix' => "", + '#suffix' => "
      ", + ]; + $form[$module]['actions']['advanced']['information'] = [ + '#prefix' => 'i', + '#suffix' => "", + ]; + $form[$module]['actions']['advanced']['tooltip-text'] = [ + '#prefix' => '', + '#markup' => $this->t("Opens Advance Configuration in new tab"), + '#suffix' => "
      ", ]; return $form; @@ -130,9 +112,28 @@ public function buildForm(array $form, FormStateInterface $form_state) { public function submitForm(array &$form, FormStateInterface $form_state) { $cohesion_api_key = $form_state->getValue(['api_key']); $cohesion_agency_key = $form_state->getValue(['agency_key']); - $this->configFactory->getEditable('cohesion.settings')->set('api_key', $cohesion_api_key)->save(); - $this->configFactory->getEditable('cohesion.settings')->set('organization_key', $cohesion_agency_key)->save(); + if ($cohesion_api_key && $cohesion_agency_key) { + $this->config('cohesion.settings')->set('api_key', $cohesion_api_key)->save(); + $this->config('cohesion.settings')->set('organization_key', $cohesion_agency_key)->save(); + } + $this->setConfigurationState(); $this->messenger()->addStatus('The configuration options have been saved.'); } + /** + * {@inheritdoc} + */ + public function ignoreConfig(array &$form, FormStateInterface $form_state) { + $this->setConfigurationState(); + } + + /** + * {@inheritdoc} + */ + public function checkMinConfiguration() { + $api_key = $this->config('cohesion.settings')->get('api_key'); + $agency_key = $this->config('cohesion.settings')->get('organization_key'); + return $api_key && $agency_key; + } + } diff --git a/modules/acquia_cms_tour/src/Form/WelcomeModalForm.php b/modules/acquia_cms_tour/src/Form/WelcomeModalForm.php new file mode 100644 index 000000000..9b8fc669e --- /dev/null +++ b/modules/acquia_cms_tour/src/Form/WelcomeModalForm.php @@ -0,0 +1,119 @@ +state = $state; + } + + /** + * {@inheritdoc} + * + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + * The Drupal service container. + * + * @return static + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('state') + ); + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) { + $acms_logo = drupal_get_path('profile', 'acquia_cms') . '/acquia_cms.png'; + $form['tour-dashboard'] = [ + '#type' => 'container', + '#attributes' => [ + 'class' => [ + 'tour-dashboard', + ], + ], + ]; + $form['tour-dashboard']['logo'] = [ + '#type' => 'markup', + '#markup' => '', + ]; + $form['tour-dashboard']['title'] = [ + '#type' => 'markup', + '#markup' => '

      ' . $this->t('Welcome to Acquia CMS') . '

      ', + ]; + $form['tour-dashboard']['message'] = [ + '#type' => 'markup', + '#markup' => '

      ' . $this->t("We've created an easy step by step installation wizard to guide you through the necessary configurations") . '

      ', + ]; + $form['tour-dashboard']['actions'] = ['#type' => 'actions']; + $form['tour-dashboard']['actions']['open_wizard'] = [ + '#type' => 'submit', + '#value' => $this->t('Get Started with Wizard'), + '#attributes' => [ + 'class' => [ + 'button button--primary', + ], + ], + '#submit' => ['::submitOpenWizard'], + ]; + $form['tour-dashboard']['actions']['cancel'] = [ + '#type' => 'submit', + '#value' => $this->t('Setup Manually'), + '#attributes' => [ + 'class' => [ + 'setup-manually', + ], + ], + ]; + $form['#attached']['library'][] = 'core/drupal.dialog.ajax'; + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitOpenWizard(array &$form, FormStateInterface $form_state) { + $this->state->set('show_welcome_modal', FALSE); + $form_state->setRedirect('acquia_cms_tour.enabled_modules'); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $this->state->set('show_wizard_modal', FALSE); + $this->state->set('show_welcome_modal', FALSE); + $form_state->setRedirect('acquia_cms_tour.enabled_modules'); + } + +} diff --git a/modules/acquia_cms_tour/templates/acquia-cms-tour-checklist-form.html.twig b/modules/acquia_cms_tour/templates/acquia-cms-tour-checklist-form.html.twig new file mode 100644 index 000000000..7693d59c9 --- /dev/null +++ b/modules/acquia_cms_tour/templates/acquia-cms-tour-checklist-form.html.twig @@ -0,0 +1,43 @@ +{#/** +* @file +* Default theme implementation for config checklist form. +*/ +#} +{{ form.form_build_id }} +{{ form.form_token }} +{{ form.form_id }} + +{% set progress = (form.check_count['#value'] ? (form.check_count['#value'] * 100)/form.check_total['#value'] : 0)|round %} + +
      +
      {{ form.help_text }}
      +
      {{ form.modal_link }}
      +
      + +
      + {% if form.show_progress %} +
      +
      +
      + {% endif %} + +
      +
      +
      +
      {{ form.checklist_heading }}
      +
      {{ form.checklist_description }}
      +
      +
      + +
      + {% for key, item in form.items %} + {% if item.check %} +
      +
      {{ item.check }}
      +
      {{ item.link }}
      +
      + {% endif %} + {% endfor %} +
      +
      +
      diff --git a/modules/acquia_cms_tour/templates/acquia-cms-tour-title-markup.html.twig b/modules/acquia_cms_tour/templates/acquia-cms-tour-title-markup.html.twig new file mode 100644 index 000000000..ac8117a93 --- /dev/null +++ b/modules/acquia_cms_tour/templates/acquia-cms-tour-title-markup.html.twig @@ -0,0 +1,13 @@ +{#/** +* @file +* Default theme implementation for installation wizard title markup. +*/ +#} +
      +
      + {{ current_step }}. Configure {{ module_name }} +
      +
      Fields marked + * are required +
      +
      diff --git a/modules/acquia_cms_tour/tests/src/Functional/AcquiaConnectorTest.php b/modules/acquia_cms_tour/tests/src/Functional/AcquiaConnectorTest.php index 0fb8f17b9..3cd144d18 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/AcquiaConnectorTest.php +++ b/modules/acquia_cms_tour/tests/src/Functional/AcquiaConnectorTest.php @@ -52,21 +52,10 @@ public function testAcquiaConnector() { // Visit the tour page. $this->drupalGet('/admin/tour/dashboard'); $assert_session->statusCodeEquals(200); - $container = $assert_session->elementExists('css', '.acquia-cms-connector-form'); // Assert that the expected fields show up. $assert_session->fieldExists('Name'); // Assert that save and advanced buttons are present on form. $assert_session->buttonExists('Save'); - $assert_session->elementExists('css', '.advanced-button'); - // Save site name. - $dummy_name = 'dev'; - $container->fillField('edit-site-name', $dummy_name); - $container->pressButton('Save'); - $assert_session->pageTextContains('The configuration options have been saved.'); - // Test that the config values we expect are set correctly. - $state = $this->container->get('state'); - $connector_site_name = $state->get('spi.site_name'); - $this->assertSame($connector_site_name, $dummy_name); } } diff --git a/modules/acquia_cms_tour/tests/src/Functional/AcquiaGoogleMapsTest.php b/modules/acquia_cms_tour/tests/src/Functional/AcquiaGoogleMapsTest.php index 6b4524eb2..f4eadac42 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/AcquiaGoogleMapsTest.php +++ b/modules/acquia_cms_tour/tests/src/Functional/AcquiaGoogleMapsTest.php @@ -55,7 +55,7 @@ public function testAcquiaGoogleMaps() { $this->drupalGet('/admin/tour/dashboard'); $assert_session->statusCodeEquals(200); - $container = $assert_session->elementExists('css', '[data-drupal-selector="edit-acquia-google-maps-api"]'); + $container = $assert_session->elementExists('css', '[data-drupal-selector="edit-geocoder"]'); // API key should be blank to start. $assert_session->fieldValueEquals('maps_api_key', '', $container); $container->pressButton('Save'); diff --git a/modules/acquia_cms_tour/tests/src/Functional/AcquiaSearchTest.php b/modules/acquia_cms_tour/tests/src/Functional/AcquiaSearchTest.php index c184cf221..f2b7add0f 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/AcquiaSearchTest.php +++ b/modules/acquia_cms_tour/tests/src/Functional/AcquiaSearchTest.php @@ -53,10 +53,9 @@ public function testAcquiaSearch() { // Visit the tour page. $this->drupalGet('/admin/tour/dashboard'); $assert_session->statusCodeEquals(200); - $container = $assert_session->elementExists('css', '.acquia-cms-solr-search-form'); + $container = $assert_session->elementExists('css', '.acquia-cms-search-form'); // Assert that save and advanced buttons are present on form. $assert_session->buttonExists('Save'); - $assert_session->elementExists('css', '.advanced-button'); // Assert that the expected fields show up. $assert_session->fieldExists('Acquia Subscription identifier'); $assert_session->fieldExists('Acquia Search API hostname'); diff --git a/modules/acquia_cms_tour/tests/src/Functional/AcquiaTelemetryTest.php b/modules/acquia_cms_tour/tests/src/Functional/AcquiaTelemetryTest.php index cbd0372f1..71aab8f09 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/AcquiaTelemetryTest.php +++ b/modules/acquia_cms_tour/tests/src/Functional/AcquiaTelemetryTest.php @@ -23,6 +23,7 @@ class AcquiaTelemetryTest extends BrowserTestBase { */ protected static $modules = [ 'acquia_cms_tour', + 'acquia_telemetry', ]; /** @@ -40,9 +41,6 @@ public function testAcquiaTelemetry() { // Visit the tour page. $this->drupalGet('/admin/tour/dashboard'); $assert_session->statusCodeEquals(200); - - // Initially the checkbox should be turned off. - $assert_session->checkboxNotChecked('Send anonymous data about Acquia product usage'); // Ensure we can enable the Acquia Telemetry module. $page->checkField('Send anonymous data about Acquia product usage'); $page->pressButton('Save'); diff --git a/modules/acquia_cms_tour/tests/src/Functional/GoogleAnalyticsTest.php b/modules/acquia_cms_tour/tests/src/Functional/GoogleAnalyticsTest.php index a2aeaebbe..dccffa6e4 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/GoogleAnalyticsTest.php +++ b/modules/acquia_cms_tour/tests/src/Functional/GoogleAnalyticsTest.php @@ -55,7 +55,6 @@ public function testGoogleAnalytics() { $container = $assert_session->elementExists('css', '.acquia-cms-google-analytics-form'); // Assert that save and advanced buttons are present on form. $assert_session->buttonExists('Save'); - $assert_session->elementExists('css', '.advanced-button'); // Assert that the expected fields show up. $assert_session->fieldExists('Web Property ID'); // Save Web Property ID. diff --git a/modules/acquia_cms_tour/tests/src/Functional/GoogleTagManager.php b/modules/acquia_cms_tour/tests/src/Functional/GoogleTagManager.php index 3174d0cf7..3420376e1 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/GoogleTagManager.php +++ b/modules/acquia_cms_tour/tests/src/Functional/GoogleTagManager.php @@ -55,7 +55,6 @@ public function testGoogleTagManager() { $container = $assert_session->elementExists('css', '.acquia-cms-google-tag-manager-form'); // Assert that save and advanced buttons are present on form. $assert_session->buttonExists('Save'); - $assert_session->elementExists('css', '.advanced-button'); // Assert that the expected fields show up. $assert_session->fieldExists('Snippet parent URI'); // Save Snippet parent URI. diff --git a/modules/acquia_cms_tour/tests/src/Functional/RecaptchaTest.php b/modules/acquia_cms_tour/tests/src/Functional/RecaptchaTest.php index 0772b2171..d6a9d45fa 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/RecaptchaTest.php +++ b/modules/acquia_cms_tour/tests/src/Functional/RecaptchaTest.php @@ -55,7 +55,6 @@ public function testRecaptcha() { $container = $assert_session->elementExists('css', '.acquia-cms-recaptcha-form'); // Assert that save and advanced buttons are present on form. $assert_session->buttonExists('Save'); - $assert_session->elementExists('css', '.advanced-button'); // Assert that the expected fields show up. $assert_session->fieldExists('Site key'); $assert_session->fieldExists('Secret key'); diff --git a/modules/acquia_cms_tour/tests/src/Functional/SiteStudioCore.php b/modules/acquia_cms_tour/tests/src/Functional/SiteStudioCore.php index 52723a07f..978a7bf67 100644 --- a/modules/acquia_cms_tour/tests/src/Functional/SiteStudioCore.php +++ b/modules/acquia_cms_tour/tests/src/Functional/SiteStudioCore.php @@ -55,7 +55,6 @@ public function testSiteStudioCore() { $container = $assert_session->elementExists('css', '.acquia-cms-site-studio-core-form'); // Assert that save and advanced buttons are present on form. $assert_session->buttonExists('Save'); - $assert_session->elementExists('css', '.advanced-button'); // Assert that the expected fields show up. $assert_session->fieldExists('API key'); $assert_session->fieldExists('Agency key'); diff --git a/modules/acquia_cms_video/acquia_cms_video.info.yml b/modules/acquia_cms_video/acquia_cms_video.info.yml index 26cad4abf..72fc89630 100644 --- a/modules/acquia_cms_video/acquia_cms_video.info.yml +++ b/modules/acquia_cms_video/acquia_cms_video.info.yml @@ -1,4 +1,4 @@ -name: "Video" +name: "Acquia CMS Video" package: "Acquia CMS" description: "Provides a Video media type and related configuration." type: module diff --git a/modules/acquia_cms_video/config/dx8/cohesion_content_templates.media_video_embedded.yml_ b/modules/acquia_cms_video/config/dx8/cohesion_content_templates.media_video_embedded.yml_ index 1fedbd88a..6120ac59d 100644 --- a/modules/acquia_cms_video/config/dx8/cohesion_content_templates.media_video_embedded.yml_ +++ b/modules/acquia_cms_video/config/dx8/cohesion_content_templates.media_video_embedded.yml_ @@ -1,15 +1,15 @@ - type: cohesion_content_templates export: - uuid: 0f6c397d-52c3-4349-a9ab-8df27743b55c + uuid: 54e65e6c-2250-4dd6-9a79-1c27de5390c9 langcode: en status: true dependencies: { } id: media_video_embedded label: 'Embedded (Media, Video)' - json_values: '{"canvas":[{"type":"item","uid":"video","title":"Video","selected":false,"status":{"collapsed":true,"isopen":false},"parentUid":"root","uuid":"42e754bd-fbc7-4211-bf13-a47968968719","isContainer":false,"children":[]}],"mapper":{"42e754bd-fbc7-4211-bf13-a47968968719":{"settings":{"formDefinition":[{"formKey":"video-settings","children":[{"formKey":"video","breakpoints":[],"activeFields":[{"name":"videoUrl","active":true}]},{"formKey":"video-poster","breakpoints":[],"activeFields":[{"name":"videoPoster","active":true},{"name":"videoPosterStyle","active":true},{"name":"videoPosterPaused","active":true},{"name":"videoPosterEnd","active":true}]},{"formKey":"video-behaviour","breakpoints":[],"activeFields":[{"name":"videoPreload","active":true},{"name":"videoAutoplay","active":true},{"name":"videoLoop","active":true},{"name":"videoMute","active":true},{"name":"videoRewind","active":true},{"name":"videoClickPlaypause","active":true},{"name":"videoPauseOthers","active":true},{"name":"videoPlayOnHover","active":true}]},{"formKey":"video-controls","breakpoints":[],"activeFields":[{"name":"videoShowControls","active":true},{"name":"videoShowControlsLoad","active":true},{"name":"videoShowControlsPause","active":true},{"name":"videoShowPlayCenter","active":true},{"name":"videoShowPlayPause","active":true},{"name":"videoShowCurrent","active":true},{"name":"videoShowProgress","active":true},{"name":"videoShowDuration","active":true},{"name":"videoShowVolume","active":true},{"name":"videoShowFullscreen","active":true}]},{"formKey":"video-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]},"styles":{"formDefinition":[{"formKey":"layout","children":[{"formKey":"margin","breakpoints":[{"name":"xl"},{"name":"md"}],"activeFields":[{"name":"margin-equal","active":false},{"name":"margin-top","active":false},{"name":"margin-bottom","active":true},{"name":"margin-left","active":false},{"name":"margin-right","active":false},{"name":"margin-block-start","active":false},{"name":"margin-block-end","active":false},{"name":"margin-inline-start","active":false},{"name":"margin-inline-end","active":false}]}]}],"selectorType":"topLevel","items":[],"form":null}}},"model":{"42e754bd-fbc7-4211-bf13-a47968968719":{"settings":{"title":"Video","customStyle":[{"customStyle":""}],"videoAutoplay":false,"videoLoop":false,"videoMute":false,"videoRewind":true,"videoClickPlaypause":true,"videoPauseOthers":true,"videoPlayOnHover":false,"videoShowControls":false,"videoShowControlsLoad":true,"videoShowControlsPause":true,"videoShowPlayCenter":true,"videoShowPlayPause":true,"videoShowCurrent":true,"videoShowProgress":true,"videoShowDuration":true,"videoShowVolume":true,"videoShowFullscreen":true,"settings":{"videoPreload":"none","videoAutoplay":false,"videoLoop":false,"videoMute":false,"videoRewind":true,"videoClickPlaypause":true,"videoPauseOthers":true,"videoPlayOnHover":false,"videoShowControls":false,"videoShowControlsLoad":true,"videoShowControlsPause":true,"videoShowPlayCenter":true,"videoShowPlayPause":true,"videoShowCurrent":true,"videoShowProgress":true,"videoShowDuration":true,"videoShowVolume":true,"videoShowFullscreen":true,"customStyle":[{"customStyle":""}]},"videoPreload":"none","videoUrl":"[media:field_media_oembed_video:value]"},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"media"},"styles":{"xl":{"margin":{"margin-bottom":{"value":"32"}}},"md":{"margin":{"margin-bottom":{"value":"24"}}}}}}},"previewModel":{"42e754bd-fbc7-4211-bf13-a47968968719":{}},"variableFields":{"42e754bd-fbc7-4211-bf13-a47968968719":["settings.videoUrl"]},"meta":{"fieldHistory":[]}}' + json_values: '{"canvas":[{"type":"container","uid":"container","title":"Container","status":{"collapsed":false},"uuid":"e1ab801c-d119-4e89-988f-2d4994019fd0","parentUid":"root","isContainer":true,"children":[{"type":"container","uid":"drupal-field","title":"Field","status":{"collapsed":false},"uuid":"2ca5debb-309e-4947-9cc5-6f14d38210d0","parentUid":"container","isContainer":true,"children":[]}]}],"mapper":{"e1ab801c-d119-4e89-988f-2d4994019fd0":{"settings":{"formDefinition":[{"formKey":"container-settings","children":[{"formKey":"container-width","breakpoints":[],"activeFields":[{"name":"width","active":true}]},{"formKey":"common-link-animation","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"linkAnimation","active":true},{"name":"animationType","active":true},{"name":"animationScope","active":true},{"name":"animationParent","active":true},{"name":"animationTarget","active":true},{"name":"animationScale","active":true},{"name":"animationDirection","active":true},{"name":"animationDirection","active":true},{"name":"animationDirection","active":true},{"name":"animationDistance","active":true},{"name":"animationPieces","active":true},{"name":"animationOrigin","active":true},{"name":"animationFoldHeight","active":true},{"name":"animationHorizontalFirst","active":true},{"name":"animationIterations","active":true},{"name":"animationEasing","active":true},{"name":"animationDuration","active":true}]},{"formKey":"common-link-modifier","breakpoints":[],"activeFields":[{"name":"modifier","active":true},{"name":"modifierType","active":true},{"name":"interactionScope","active":true},{"name":"interactionParent","active":true},{"name":"interactionTarget","active":true},{"name":"modifierName","active":true}]},{"formKey":"container-style","breakpoints":[],"activeFields":[{"name":"customStyle","active":true},{"name":"customStyle","active":true}]}]},{"formKey":"common-admin","children":[{"formKey":"common-comments","breakpoints":[],"activeFields":[{"name":"comments","active":true}]}]}],"selectorType":"topLevel","form":null,"items":[]},"styles":{"formDefinition":[{"formKey":"layout","children":[{"formKey":"position","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"position","active":true},{"name":"top","active":true},{"name":"bottom","active":true},{"name":"left","active":true},{"name":"right","active":true},{"name":"z-index","active":true}]},{"formKey":"padding","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"padding-equal","active":false},{"name":"padding-top","active":false},{"name":"padding-bottom","active":false},{"name":"padding-left","active":false},{"name":"padding-right","active":false},{"name":"padding-block-start","active":false},{"name":"padding-block-end","active":false},{"name":"padding-inline-start","active":false},{"name":"padding-inline-end","active":false}]}]}],"selectorType":"topLevel","items":[{"title":"iframe","type":"container","items":[],"form":null,"selectorType":"child","model":"iframe","uuid":"6679c1f7-72ff-4bbf-929c-2297b57c91ea","allowedTypes":["child","pseudo","modifier"],"formDefinition":[{"formKey":"layout","children":[{"formKey":"height","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"min-height","active":false},{"name":"max-height","active":false},{"name":"height","active":true}]},{"formKey":"width","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"min-width","active":false},{"name":"max-width","active":false},{"name":"width","active":true}]},{"formKey":"position","breakpoints":[{"name":"xl"}],"activeFields":[{"name":"position","active":true},{"name":"top","active":true},{"name":"bottom","active":true},{"name":"left","active":true},{"name":"right","active":true},{"name":"z-index","active":true}]}]}]}],"form":null}},"2ca5debb-309e-4947-9cc5-6f14d38210d0":[]},"model":{"e1ab801c-d119-4e89-988f-2d4994019fd0":{"settings":{"title":"Container - iframe responsive styles","width":"fluid","customStyle":[{"customStyle":"coh-style-margin-bottom-small"}],"settings":{"width":"fluid","customStyle":[{"customStyle":""}]},"admin":{"comments":"This container makes the video iframe responsive in a 16:9 format."}},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"container"},"styles":{"xl":{"position":{"value":"relative"}}},"6679c1f7-72ff-4bbf-929c-2297b57c91ea":{"settings":{"element":"iframe","class":"","combinator":"","pseudo":""},"styles":{"xl":{"height":{"value":"250px"},"width":{"value":"250px"},"position":{},"top":{"value":""},"bottom":{"value":""},"left":{"value":""},"right":{"value":""}}}}}},"2ca5debb-309e-4947-9cc5-6f14d38210d0":{"settings":{"title":"Field - Remote video URL","settings":{"drupalField":""},"drupalField":"content.field_media_oembed_video"},"context-visibility":{"contextVisibility":{"condition":"ALL"}},"styles":{"settings":{"element":"drupal-field"}}}},"previewModel":{"e1ab801c-d119-4e89-988f-2d4994019fd0":[],"2ca5debb-309e-4947-9cc5-6f14d38210d0":[]},"variableFields":{"e1ab801c-d119-4e89-988f-2d4994019fd0":[],"2ca5debb-309e-4947-9cc5-6f14d38210d0":[]},"meta":{"fieldHistory":[]}}' json_mapper: '{}' - last_entity_update: entityupdate_0029 + last_entity_update: entityupdate_0030 modified: true selectable: false custom: false diff --git a/modules/acquia_cms_video/config/optional/core.entity_view_display.media.video.default.yml b/modules/acquia_cms_video/config/optional/core.entity_view_display.media.video.default.yml index b75e53ae4..f91f9a969 100644 --- a/modules/acquia_cms_video/config/optional/core.entity_view_display.media.video.default.yml +++ b/modules/acquia_cms_video/config/optional/core.entity_view_display.media.video.default.yml @@ -5,7 +5,7 @@ dependencies: - field.field.media.video.field_categories - field.field.media.video.field_media_oembed_video - field.field.media.video.field_tags - - image.style.card + - image.style.thumbnail - media.type.video module: - image @@ -18,7 +18,7 @@ content: created: label: hidden type: timestamp - weight: 1 + weight: 0 region: content settings: date_format: medium @@ -27,12 +27,12 @@ content: third_party_settings: { } thumbnail: type: image - weight: 2 - region: content + weight: 5 label: hidden settings: - image_style: card + image_style: thumbnail image_link: '' + region: content third_party_settings: { } uid: label: hidden diff --git a/patches/d9-acms-settings.patch b/patches/d9-acms-settings.patch index e3e1330cf..988bf65f2 100644 --- a/patches/d9-acms-settings.patch +++ b/patches/d9-acms-settings.patch @@ -27,7 +27,10 @@ if (AcquiaDrupalEnvironmentDetector::isAhEnv()) { ], ]; $databases = array_merge_recursive($databases, $default_settings); - acquia_hosting_db_choose_active(); + // Only call this function on the cloud, not on a local environment. + if (function_exists('acquia_hosting_db_choose_active')) { + acquia_hosting_db_choose_active(); + } } } diff --git a/splitsh-lite b/splitsh-lite new file mode 100755 index 000000000..71a4d896d Binary files /dev/null and b/splitsh-lite differ diff --git a/src/Commands/SiteInstallCommands.php b/src/Commands/SiteInstallCommands.php index 3d75a70a1..20389a661 100644 --- a/src/Commands/SiteInstallCommands.php +++ b/src/Commands/SiteInstallCommands.php @@ -4,7 +4,6 @@ use Consolidation\AnnotatedCommand\CommandData; use Consolidation\AnnotatedCommand\CommandResult; -use Drupal\cohesion\Drush\DX8CommandHelpers; /** * Rebuild site studio when site is installed via drush. @@ -16,25 +15,13 @@ class SiteInstallCommands extends DrushCommands { * * @hook post-command site-install */ - public function postCommand($result, CommandData $commandData) { + public function siteInstallPostCommand($result, CommandData $commandData) { $arguments = $commandData->arguments(); $moduleHandler = \Drupal::service('module_handler'); if (isset($arguments['profile'][0]) && $arguments['profile'][0] == 'acquia_cms' && $moduleHandler->moduleExists('cohesion')) { - // Forcefully clear the cache after site is installed otherwise site - // studio fails to rebuild. - drupal_flush_all_caches(); - // Below code ensures that drush batch process doesn't hang. Unset all the - // earlier created batches so that drush_backend_batch_process() can run - // without being stuck. - // @see https://github.com/drush-ops/drush/issues/3773 for the issue. - $batch = &batch_get(); - $batch = NULL; - unset($batch); $this->say(dt('Rebuilding all entities.')); - $result = DX8CommandHelpers::rebuild([]); - // Output results. + $result = \Drupal::service('acquia_cms_common.utility')->rebuildSiteStudio(); $this->yell('Finished rebuilding.'); - // Status code. return is_array($result) && isset(array_shift($result)['error']) ? CommandResult::exitCode(self::EXIT_FAILURE) : CommandResult::exitCode(self::EXIT_SUCCESS); } } diff --git a/tests/acms-files-starter.tar.gz b/tests/acms-files-starter.tar.gz index 736b2d3ff..37076b080 100644 Binary files a/tests/acms-files-starter.tar.gz and b/tests/acms-files-starter.tar.gz differ diff --git a/tests/acms-files.tar.gz b/tests/acms-files.tar.gz index ee9c634b9..b6982f2fa 100644 Binary files a/tests/acms-files.tar.gz and b/tests/acms-files.tar.gz differ diff --git a/tests/acms-starter.sql.gz b/tests/acms-starter.sql.gz index 1f2863637..f8811bca0 100644 Binary files a/tests/acms-starter.sql.gz and b/tests/acms-starter.sql.gz differ diff --git a/tests/acms.sql.gz b/tests/acms.sql.gz index 049729d21..f9a06e6ab 100644 Binary files a/tests/acms.sql.gz and b/tests/acms.sql.gz differ diff --git a/tests/backstop/backstop.json b/tests/backstop/backstop.json index 346c9c217..d1bfbef3e 100644 --- a/tests/backstop/backstop.json +++ b/tests/backstop/backstop.json @@ -156,7 +156,7 @@ { "label": "ACMS Event (Starter)", "cookiePath": "backstop_data/engine_scripts/cookies.json", - "url": "http://127.0.0.1:8080/event/webinar/2021/05/past-event-five-medium-length-placeholder-heading", + "url": "http://127.0.0.1:8080/event/webinar/2021/07/past-event-five-medium-length-placeholder-heading", "referenceUrl": "", "readyEvent": "", "readySelector": "", diff --git a/tests/packages_alter.yml b/tests/packages_alter.yml index 938f27f8a..8bf991d39 100644 --- a/tests/packages_alter.yml +++ b/tests/packages_alter.yml @@ -8,3 +8,5 @@ drupal/cog: ~ # Do not install Lightning modules explictly excluded by ACMS. drupal/lightning_layout: ~ drupal/lightning_page: ~ +drupal/lightning_search: ~ +drupal/lightning_media: ~ diff --git a/tests/src/ExistingSiteJavascript/SearchTest.php b/tests/src/ExistingSiteJavascript/SearchTest.php index 1e64f7d72..8e8fb99f1 100644 --- a/tests/src/ExistingSiteJavascript/SearchTest.php +++ b/tests/src/ExistingSiteJavascript/SearchTest.php @@ -34,6 +34,7 @@ class SearchTest extends ExistingSiteSelenium2DriverTestBase { */ protected function setUp(): void { parent::setUp(); + $this->getDriverInstance()->resizeWindow(1920, 800); $node_types = NodeType::loadMultiple(); // Create some published and unpublished nodes to assert that the search // respects the published status of content. @@ -80,7 +81,6 @@ public function testSearch() { $account->addRole('content_administrator'); $account->save(); $this->drupalLogin($account); - $node_types = NodeType::loadMultiple(); $this->drupalGet('/search'); @@ -90,7 +90,14 @@ public function testSearch() { $assert_session->waitForElementVisible('css', '.coh-style-facet-accordion'); $facets = $assert_session->elementExists('css', '.coh-style-facet-accordion'); - $this->assertFacetLinkExists($facets); + + // Get the container which holds the facets, and assert that, initially, + // the content type facet is visible but none of the dependent facets are. + $this->assertTrue($this->assertLinkExists('Content Type', $facets)->isVisible()); + $this->assertFalse($this->assertLinkExists('Article Type', $facets)->isVisible()); + $this->assertFalse($this->assertLinkExists('Event Type', $facets)->isVisible()); + $this->assertFalse($this->assertLinkExists('Person Type', $facets)->isVisible()); + $this->assertFalse($this->assertLinkExists('Place Type', $facets)->isVisible()); foreach ($node_types as $node_type_id => $type) { // Clear all selected facets. @@ -105,18 +112,26 @@ public function testSearch() { $this->assertLinkNotExists('Test unpublished ' . $node_type_label); // Activate the facet for this content type. - // @todo Revisit this assertion. + $this->assertLinkExists($node_type_label . ' (1)', $facets)->click(); + $this->assertLinkExists('Test published ' . $node_type_label); $this->assertLinkNotExists('Test unpublished ' . $node_type_label); // Pages have no facets. if ($node_type_id !== 'page') { + // Open the accordion item for the "type" taxonomy of this content type. + // @todo This is commented out because, at the moment, the facets are + // expanded by default. If we change them to be collapsed by default, we + // can uncomment this line. + // $this->assertLinkExists("$node_type_label Type", $facets)->click(); // Check if term facet is working properly. - // @todo Revisit this assertion. + $assert_session->elementExists('css', '.coh-style-facet-accordion')->clickLink($node_type_label . ' Music (1)'); + // Assert that the clear filter is present. + $assert_session->linkExists('Clear filter(s)'); // Check if node of the selected term is shown. $this->assertLinkExists('Test published ' . $node_type_label); $this->assertLinkNotExists('Test unpublished ' . $node_type_label); - $this->assertSession()->linkNotExists($node_type_label . ' Rocks (1)'); + $assert_session->linkNotExists($node_type_label . ' Rocks (1)'); } } } @@ -217,12 +232,13 @@ public function testFallback() { */ private function assertFacetLinkExists(ElementInterface $facets = NULL) { // Get the container which holds the facets, and assert that, initially, the - // content type facet is not visible but none of the dependent facets are. + // Test that none of the dependent facets are visible for fallback. $this->assertFalse($this->assertLinkExists('Content Type', $facets)->isVisible()); $this->assertFalse($this->assertLinkExists('Article Type', $facets)->isVisible()); $this->assertFalse($this->assertLinkExists('Event Type', $facets)->isVisible()); $this->assertFalse($this->assertLinkExists('Person Type', $facets)->isVisible()); $this->assertFalse($this->assertLinkExists('Place Type', $facets)->isVisible()); + $this->assertLinksExistInOrder(); } /** diff --git a/tests/travis/install.sh b/tests/travis/install.sh index 6182d9102..337bddae2 100755 --- a/tests/travis/install.sh +++ b/tests/travis/install.sh @@ -14,8 +14,8 @@ cd "$(dirname "$0")" # Reuse ORCA's own includes. source ../../../orca/bin/travis/_includes.sh -# If running our custom jobs, initialize the fixture. Otherwise, use Orca's -# installation script. +# If running our custom jobs or isolated test jobs, initialize the fixture. +# Otherwise, use Orca's installation script. if [[ "$ACMS_JOB" == "base" ]] || [[ "$ACMS_JOB" == "starter" ]]; then orca debug:packages CURRENT_DEV orca fixture:init --force --sut=acquia/acquia_cms --sut-only --core=CURRENT_DEV --dev --profile=acquia_cms --no-sqlite --no-site-install @@ -23,7 +23,7 @@ elif [[ "$ACMS_JOB" == "base_full" ]] || [[ "$ACMS_JOB" == "starter_full" ]]; th orca debug:packages CURRENT_DEV orca fixture:init --force --sut=acquia/acquia_cms --sut-only --core=CURRENT_DEV --dev --profile=acquia_cms --no-sqlite else - # Run ORCA's standard installation script. +# Run ORCA's standard installation script. ../../../orca/bin/travis/install.sh fi @@ -35,7 +35,7 @@ printenv | grep ACMS_ | sort cd $ORCA_FIXTURE_DIR # Rebuild cohesion after install. -if [[ "$ACMS_JOB" == "base_full" ]] || [[ "$ACMS_JOB" == "starter_full" ]]; then +if [[ "$ACMS_JOB" != "base" ]] && [[ "$ACMS_JOB" != "starter" ]] && [[ "$ORCA_JOB" != "LOOSE_DEPRECATED_CODE_SCAN" ]] && [[ "$ORCA_JOB" != "DEPRECATED_CODE_SCAN_W_CONTRIB" ]]; then drush cohesion:rebuild -y fi