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: ' -
-
-
'
@@ -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' => '",
+ ];
+ }
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' => '",
+ ];
+
+ 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' => '",
];
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' => '",
+ ];
+ }
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' => '",
+ ];
+ }
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' => '",
+ ];
+ }
}
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' => '",
+ ];
+ }
}
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' => '",
];
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 }}
+
+
+
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