diff --git a/.circleci/RoboFile.php b/.circleci/RoboFile.php index 795697ea0b..c30cbf07f3 100644 --- a/.circleci/RoboFile.php +++ b/.circleci/RoboFile.php @@ -76,10 +76,37 @@ public function jobGenerateCoverageReport() { * @return \Robo\Result * The result tof the collection of tasks. */ - public function jobRunBehatTests() { + public function jobRunBehatTestsFirst() { + $all_sites = $this->getSites(); + $sites = array_slice($all_sites, 0, count($all_sites) / 2); + return $this->runBehatTest($sites); + } + + /** + * Command to run behat tests. + * + * @return \Robo\Result + * The result tof the collection of tasks. + */ + public function jobRunBehatTestsSecond() { + $all_sites = $this->getSites(); + $sites = array_slice($all_sites, count($all_sites) / 2); + return $this->runBehatTest($sites); + } + + /** + * Run behat tests on the given sites. + * + * @param array $sites + * Array of site machine names. + * + * @return \Robo\Result + * Tasks collection. + */ + protected function runBehatTest(array $sites) { $collection = $this->collectionBuilder(); $collection->addTaskList($this->setupSite()); - foreach ($this->getSites() as $site) { + foreach ($sites as $site) { $collection->addTaskList($this->syncAcquia($site)); $collection->addTaskList($this->runUpdatePath(TRUE)); $collection->addTaskList($this->runBehatTests(['global', $site])); diff --git a/.circleci/config.yml b/.circleci/config.yml index 9605cc3d0b..d5686cdc96 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -47,7 +47,7 @@ save_cache: &save_cache #Jobs ### Job to run the update path and Behat tests. -behat_tests: &behat_tests +behat_tests_first: &behat_tests_first <<: *defaults steps: - *add_ssh @@ -57,7 +57,25 @@ behat_tests: &behat_tests - restore_cache: *restore_cache - run: name: Run Behat tests - command: robo job:run-behat-tests + command: robo job:run-behat-tests-first + - save_cache: *save_cache + - store_test_results: + path: /var/www/html/artifacts/behat + - store_artifacts: + path: /var/www/html/artifacts + +### Job to run the update path and Behat tests. +behat_tests_second: &behat_tests_second + <<: *defaults + steps: + - *add_ssh + - *add_known_hosts + - checkout + - *copy_robo + - restore_cache: *restore_cache + - run: + name: Run Behat tests + command: robo job:run-behat-tests-second - save_cache: *save_cache - store_test_results: path: /var/www/html/artifacts/behat @@ -97,10 +115,12 @@ code_coverage: &code_coverage # Declare all of the jobs we should run. version: 2 jobs: + run-behat-tests-first: + <<: *behat_tests_first + run-behat-tests-second: + <<: *behat_tests_second run-functional-unit-tests: <<: *functional_unit_tests - run-behat-tests: - <<: *behat_tests run-code-coverage: <<: *code_coverage @@ -109,6 +129,7 @@ workflows: version: 2 test_and_lint: jobs: + - run-behat-tests-first + - run-behat-tests-second - run-functional-unit-tests - - run-behat-tests - run-code-coverage diff --git a/.codeclimate.yml b/.codeclimate.yml index ec06a6d7ac..5b86123ba1 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -8,6 +8,9 @@ checks: method-lines: config: threshold: 40 + method-count: + config: + threshold: 25 plugins: # https://docs.codeclimate.com/docs/eslint diff --git a/blt/blt.yml b/blt/blt.yml index 807324bff7..fd48ef855a 100644 --- a/blt/blt.yml +++ b/blt/blt.yml @@ -22,16 +22,16 @@ drush: modules: local: enable: [dblog, devel, devel_debug_log, devel_generate, seckit, views_ui, config_import_de] - uninstall: [acquia_connector, purge, simplesamlphp_auth, shield, config_readonly, config_ignore] + uninstall: [acquia_connector, purge, simplesamlphp_auth, shield, config_readonly, hs_bugherd] ci: enable: [hs_config_readonly, hs_bugherd] uninstall: [purge, acquia_connector, shield, simplesamlphp_auth] dev: enable: [acquia_connector, shield, config_import_de] - uninstall: [config_readonly, bugherdapi, config_ignore] + uninstall: [config_readonly, hs_bugherd] test: enable: [acquia_connector, shield] - uninstall: [config_readonly, bugherdapi] + uninstall: [config_readonly, hs_bugherd] prod: enable: [acquia_connector, hs_config_readonly, hs_bugherd] uninstall: [shield] @@ -41,6 +41,8 @@ multisites: - mrc - francestanford - swshumsci_sandbox + - symsys + - mathematics simplesamlphp: true command-hooks: post-deploy-build: diff --git a/blt/src/Commands/HumsciCommand.php b/blt/src/Commands/HumsciCommand.php index 5f2445bb40..5ad641ef41 100644 --- a/blt/src/Commands/HumsciCommand.php +++ b/blt/src/Commands/HumsciCommand.php @@ -3,6 +3,7 @@ namespace Acquia\Blt\Custom\Commands; use Acquia\Blt\Robo\Commands\Artifact\AcHooksCommand; +use Drupal\Core\Serialization\Yaml; /** * Defines commands in the "humsci" namespace. @@ -75,32 +76,6 @@ public function sync($options = [ } } - /** - * Ask a question to the user. - * - * @param string $question - * The question to ask. - * @param string $default - * Default value. - * @param bool $required - * If a response is required. - * - * @return string - * Response to the question. - */ - protected function askQuestion($question, $default = '', $required = FALSE) { - if ($default) { - $response = $this->askDefault($question, $default); - } - else { - $response = $this->ask($question); - } - if ($required && !$response) { - return $this->askQuestion($question, $default, $required); - } - return $response; - } - /** * Get the database name of the multisite. * @@ -273,4 +248,41 @@ public function updateAutoloader() { shell_exec("cd $root && composer dump-autoload"); } + /** + * Create a new subtheme from the base subtheme. + * + * @command humsci:create-subtheme + */ + public function createSubtheme() { + $new_theme_name = $this->askQuestion('New Theme Name?', '', TRUE); + $new_machine_name = $this->askQuestion('New Machine Name?', preg_replace("/[^a-z]/", '_', strtolower($new_theme_name)), TRUE); + $new_machine_name = preg_replace("/[^a-z]/", '_', strtolower($new_machine_name)); + + $base_subtheme = $this->getConfigValue('docroot') . '/themes/humsci/su_humsci_subtheme'; + $new_subtheme = $this->getConfigValue('docroot') . '/themes/humsci/' . $new_machine_name; + + if (file_exists($new_subtheme)) { + $this->yell('Subtheme already exists'); + return; + } + + $this->taskCopyDir([$base_subtheme => $new_subtheme])->run(); + + foreach ($this->rglob("$new_subtheme/*") as $file) { + if (strpos($file, 'su_humsci_subtheme') !== FALSE) { + $new_file = str_replace('su_humsci_subtheme', $new_machine_name, $file); + $this->taskFilesystemStack()->rename($file, $new_file)->run(); + } + } + + $info = Yaml::decode(file_get_contents("$new_subtheme/$new_machine_name.info.yml")); + $info['name'] = $new_theme_name; + $info['libraries'] = ["$new_machine_name/base"]; + $info['component-libraries'] = [ + $new_machine_name => $info['component-libraries']['su_humsci_subtheme'], + ]; + unset($info['hidden']); + file_put_contents("$new_subtheme/$new_machine_name.info.yml", Yaml::encode($info)); + } + } diff --git a/blt/src/Commands/HumsciConfigCommand.php b/blt/src/Commands/HumsciConfigCommand.php index dc89e583a5..32eb982b3e 100644 --- a/blt/src/Commands/HumsciConfigCommand.php +++ b/blt/src/Commands/HumsciConfigCommand.php @@ -115,7 +115,7 @@ protected function importConfigSplit($task, $cm_core_key, $partial = FALSE) { $task->drush("pm-enable")->arg('config_split'); // Local environments we don't want all the custom site created configs. - if (($this->getConfigValue('environment') == 'local' || $this->getConfigValue('environment') == 'dev') && !$partial) { + if (($this->getConfigValue('environment') == 'local') && !$partial) { $task->drush("config-import")->arg($cm_core_key); // Runs a second import to ensure splits are // both defined and imported. diff --git a/blt/src/Commands/HumsciServerCommand.php b/blt/src/Commands/HumsciServerCommand.php index c4aa9a4f56..7f17652074 100644 --- a/blt/src/Commands/HumsciServerCommand.php +++ b/blt/src/Commands/HumsciServerCommand.php @@ -11,6 +11,8 @@ */ class HumsciServerCommand extends AcHooksCommand { + use HumsciTrait; + protected $apiEndpoint = 'https://cloudapi.acquia.com/v1'; /** @@ -146,6 +148,8 @@ public function humsciLetsEncryptAdd($environment = 'dev', $options = ['domains' $domains = array_merge($domains, $options['domains']); $domains = array_merge($domains, $this->getDomains()); + $domains = array_unique($domains); + $this->removeDomains($domains); $primary_domain = array_shift($domains); asort($domains); @@ -183,6 +187,28 @@ protected function getDomains() { return $domains; } + /** + * Ask the user if there are any domains on the current cert to be removed. + * + * @param array $existing_domains + * Array of current domains. + * + * @return array + * Array of remaining domains. + */ + protected function removeDomains(array &$existing_domains) { + $domains = []; + $choices = array_merge(['Done'], $existing_domains); + while ($remove_domain = $this->askChoice('Would you like to remove a domain?', $choices)) { + if ($remove_domain == 'Done') { + break; + } + unset($existing_domains[array_search($remove_domain, $existing_domains)]); + $choices = array_merge(['Done'], $existing_domains); + } + return $domains; + } + /** * Get LetsEncrypt certificate file contents. * diff --git a/blt/src/Commands/HumsciTrait.php b/blt/src/Commands/HumsciTrait.php index 990728da4f..054a9a569f 100644 --- a/blt/src/Commands/HumsciTrait.php +++ b/blt/src/Commands/HumsciTrait.php @@ -32,4 +32,30 @@ protected function rglob($pattern, $flags = 0) { return $files; } + /** + * Ask a question to the user. + * + * @param string $question + * The question to ask. + * @param string $default + * Default value. + * @param bool $required + * If a response is required. + * + * @return string + * Response to the question. + */ + protected function askQuestion($question, $default = '', $required = FALSE) { + if ($default) { + $response = $this->askDefault($question, $default); + } + else { + $response = $this->ask($question); + } + if ($required && !$response) { + return $this->askQuestion($question, $default, $required); + } + return $response; + } + } diff --git a/composer.json b/composer.json index 615c2aca00..3bee77b2c1 100644 --- a/composer.json +++ b/composer.json @@ -143,7 +143,7 @@ "drupal/viewfield": "^3.0@alpha", "drupal/views_block_filter_block": "^1.0@beta", "drupal/views_infinite_scroll": "^1.5", - "drupal/views_taxonomy_term_name_depth": "^3.3", + "drupal/views_taxonomy_term_name_depth": "6.x-dev", "drupal/webform": "~5.0-beta18", "drupal/xmlsitemap": "dev-1.x", "drupal/yearonly": "^1.3", @@ -233,6 +233,9 @@ "https://www.drupal.org/project/drupal/issues/564106": "https://www.drupal.org/files/issues/2018-06-27/views-more-link-token-replacement_564106_171.patch", "Simplify Field Samples": "patches/contrib/core-simplify-samples.patch" }, + "drupal/config_ignore": { + "https://www.drupal.org/project/config_ignore/issues/2857247": "https://www.drupal.org/files/issues/2018-04-19/support-for-export-2857247-18.patch" + }, "drupal/menu_block": { "https://www.drupal.org/project/menu_block/issues/2756675": "https://www.drupal.org/files/issues/2018-05-10/menu_block-follow-2756675-50.patch", "https://www.drupal.org/project/menu_block/issues/2809699": "https://www.drupal.org/files/issues/2018-05-07/menu_block-label_configuration-2809699-77.patch" diff --git a/composer.lock b/composer.lock index 44b0d9cfac..5abe12cbba 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": "d4be068734b1994c10a9cb991a64abbd", + "content-hash": "967fb66ee0eb0bd89e5765c454aaa46e", "packages": [ { "name": "acquia/blt", @@ -12,12 +12,12 @@ "source": { "type": "git", "url": "https://github.com/acquia/blt.git", - "reference": "556c65b7f9031b4eb772a267b5d35a328e9a4ce0" + "reference": "2ea1d68981585d31d58c335acb27a36e32b47c51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/acquia/blt/zipball/556c65b7f9031b4eb772a267b5d35a328e9a4ce0", - "reference": "556c65b7f9031b4eb772a267b5d35a328e9a4ce0", + "url": "https://api.github.com/repos/acquia/blt/zipball/2ea1d68981585d31d58c335acb27a36e32b47c51", + "reference": "2ea1d68981585d31d58c335acb27a36e32b47c51", "shasum": "" }, "require": { @@ -38,7 +38,7 @@ "grasmash/yaml-expander": "^1.2.0", "oomphinc/composer-installers-extender": "^1.1", "php": ">=5.6", - "phpunit/phpunit": "^4.8|^5.7|^6.5", + "phpunit/phpunit": "^4.8|^6.5", "squizlabs/php_codesniffer": "^2.7", "symfony/console": "^3.4.0", "symfony/twig-bridge": "^3.3", @@ -94,7 +94,7 @@ "template", "testing" ], - "time": "2018-09-15T14:32:09+00:00" + "time": "2018-10-09T14:56:31+00:00" }, { "name": "acquia/http-hmac-php", @@ -308,19 +308,20 @@ }, { "name": "chi-teck/drupal-code-generator", - "version": "1.26.2", + "version": "1.27.0", "source": { "type": "git", "url": "https://github.com/Chi-teck/drupal-code-generator.git", - "reference": "1f80a46a4d820690ef3374001f8304878b73a549" + "reference": "a839bc89d385087d8a7a96a9c1c4bd470ffb627e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Chi-teck/drupal-code-generator/zipball/1f80a46a4d820690ef3374001f8304878b73a549", - "reference": "1f80a46a4d820690ef3374001f8304878b73a549", + "url": "https://api.github.com/repos/Chi-teck/drupal-code-generator/zipball/a839bc89d385087d8a7a96a9c1c4bd470ffb627e", + "reference": "a839bc89d385087d8a7a96a9c1c4bd470ffb627e", "shasum": "" }, "require": { + "ext-json": "*", "php": ">=5.5.9", "symfony/console": "~2.7|^3", "symfony/filesystem": "~2.7|^3", @@ -348,7 +349,7 @@ "GPL-2.0-or-later" ], "description": "Drupal code generator", - "time": "2018-09-26T04:06:26+00:00" + "time": "2018-10-11T08:05:59+00:00" }, { "name": "commerceguys/addressing", @@ -3189,6 +3190,9 @@ "status": "covered", "message": "Covered by Drupal's security advisory policy" } + }, + "patches_applied": { + "https://www.drupal.org/project/config_ignore/issues/2857247": "https://www.drupal.org/files/issues/2018-04-19/support-for-export-2857247-18.patch" } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -5225,17 +5229,17 @@ }, { "name": "drupal/fontawesome", - "version": "2.6.0", + "version": "2.7.0", "source": { "type": "git", "url": "https://git.drupal.org/project/fontawesome", - "reference": "8.x-2.6" + "reference": "8.x-2.7" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/fontawesome-8.x-2.6.zip", - "reference": "8.x-2.6", - "shasum": "9b5a60eb1c51d596836652fbee68876104d0a96c" + "url": "https://ftp.drupal.org/files/projects/fontawesome-8.x-2.7.zip", + "reference": "8.x-2.7", + "shasum": "87ae29ff6f8e69a9e252184d851d97e7ace32ceb" }, "require": { "drupal/core": "~8.0" @@ -5246,8 +5250,8 @@ "dev-2.x": "2.x-dev" }, "drupal": { - "version": "8.x-2.6", - "datestamp": "1535484781", + "version": "8.x-2.7", + "datestamp": "1539031080", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -7828,17 +7832,11 @@ }, { "name": "drupal/views_taxonomy_term_name_depth", - "version": "3.3.0", + "version": "dev-6.x", "source": { "type": "git", "url": "https://git.drupal.org/project/views_taxonomy_term_name_depth", - "reference": "8.x-3.3" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/views_taxonomy_term_name_depth-8.x-3.3.zip", - "reference": "8.x-3.3", - "shasum": "a3e2464e87d3cb788211cce31945ba8155522b42" + "reference": "d48267d93809b526a1b9a41ae0f09fc42d572e3d" }, "require": { "drupal/core": "~8.0" @@ -7846,14 +7844,14 @@ "type": "drupal-module", "extra": { "branch-alias": { - "dev-3.x": "3.x-dev" + "dev-6.x": "6.x-dev" }, "drupal": { - "version": "8.x-3.3", - "datestamp": "1516708985", + "version": "8.x-6.x-dev", + "datestamp": "1531928921", "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" + "status": "not-covered", + "message": "Dev releases are not covered by Drupal security advisories." } }, "patches_applied": { @@ -7878,21 +7876,22 @@ "homepage": "https://www.drupal.org/project/views_taxonomy_term_name_depth", "support": { "source": "http://cgit.drupalcode.org/views_taxonomy_term_name_depth" - } + }, + "time": "2018-07-18T15:42:03+00:00" }, { "name": "drupal/webform", - "version": "5.0.0-rc21", + "version": "5.0.0-rc22", "source": { "type": "git", "url": "https://git.drupal.org/project/webform", - "reference": "8.x-5.0-rc21" + "reference": "8.x-5.0-rc22" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/webform-8.x-5.0-rc21.zip", - "reference": "8.x-5.0-rc21", - "shasum": "d9b778bc13784d2fd6a651d7deb471791af6ba5e" + "url": "https://ftp.drupal.org/files/projects/webform-8.x-5.0-rc22.zip", + "reference": "8.x-5.0-rc22", + "shasum": "1027a7444bafc779b6b8a114915ccb4403db51b0" }, "require": { "drupal/core": "*" @@ -7912,8 +7911,8 @@ "dev-5.x": "5.x-dev" }, "drupal": { - "version": "8.x-5.0-rc21", - "datestamp": "1536405484", + "version": "8.x-5.0-rc22", + "datestamp": "1538482685", "security-coverage": { "status": "not-covered", "message": "RC releases are not covered by Drupal security advisories." @@ -7988,13 +7987,14 @@ "source": { "type": "git", "url": "https://git.drupal.org/project/xmlsitemap", - "reference": "c7f483129f2649c11f923ce4b417f4bdab2dee87" + "reference": "3cab415d3b78dc915e511addf831ace0bc414965" }, "require": { - "drupal/core": "~8.0" + "drupal/core": "~8.0", + "ext-xmlwriter": "*" }, "require-dev": { - "drupal/robotstxt": "*" + "drupal/robotstxt": "^1.0" }, "type": "drupal-module", "extra": { @@ -8002,8 +8002,8 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-alpha2+67-dev", - "datestamp": "1537990380", + "version": "8.x-1.0-alpha3+2-dev", + "datestamp": "1539287280", "security-coverage": { "status": "not-covered", "message": "Dev releases are not covered by Drupal security advisories." @@ -8052,12 +8052,13 @@ "homepage": "https://www.drupal.org/user/1835276" } ], - "description": "Creates an XML sitemap conforming to the sitemaps.org protocol.", + "description": "Creates XML sitemaps for the site", "homepage": "https://www.drupal.org/project/xmlsitemap", "support": { - "source": "http://cgit.drupalcode.org/xmlsitemap" + "source": "http://cgit.drupalcode.org/xmlsitemap", + "issues": "http://drupal.org/project/issues/xmlsitemap" }, - "time": "2018-09-27T19:39:54+00:00" + "time": "2018-10-11T20:07:23+00:00" }, { "name": "drupal/yearonly", @@ -8916,32 +8917,32 @@ }, { "name": "jakub-onderka/php-console-color", - "version": "0.1", + "version": "v0.2", "source": { "type": "git", "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", - "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", - "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": ">=5.4.0" }, "require-dev": { "jakub-onderka/php-code-style": "1.0", - "jakub-onderka/php-parallel-lint": "0.*", + "jakub-onderka/php-parallel-lint": "1.0", "jakub-onderka/php-var-dump-check": "0.*", - "phpunit/phpunit": "3.7.*", + "phpunit/phpunit": "~4.3", "squizlabs/php_codesniffer": "1.*" }, "type": "library", "autoload": { - "psr-0": { - "JakubOnderka\\PhpConsoleColor": "src/" + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -8951,11 +8952,10 @@ "authors": [ { "name": "Jakub Onderka", - "email": "jakub.onderka@gmail.com", - "homepage": "http://www.acci.cz" + "email": "jakub.onderka@gmail.com" } ], - "time": "2014-04-08T15:00:19+00:00" + "time": "2018-09-29T17:23:10+00:00" }, { "name": "jakub-onderka/php-console-highlighter", @@ -10266,24 +10266,22 @@ }, { "name": "robrichards/xmlseclibs", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/robrichards/xmlseclibs.git", - "reference": "d937712f70f93a584eb0299ccd87dc6374003781" + "reference": "1f4de0c0d121922aafd8c62c2a9f5e528830cf38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/d937712f70f93a584eb0299ccd87dc6374003781", - "reference": "d937712f70f93a584eb0299ccd87dc6374003781", + "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/1f4de0c0d121922aafd8c62c2a9f5e528830cf38", + "reference": "1f4de0c0d121922aafd8c62c2a9f5e528830cf38", "shasum": "" }, "require": { + "ext-openssl": "*", "php": ">= 5.4" }, - "suggest": { - "ext-openssl": "OpenSSL extension" - }, "type": "library", "autoload": { "psr-4": { @@ -10302,7 +10300,7 @@ "xml", "xmldsig" ], - "time": "2017-08-31T09:27:07+00:00" + "time": "2018-09-27T13:24:13+00:00" }, { "name": "sarciszewski/php-future", @@ -11221,12 +11219,12 @@ "source": { "type": "git", "url": "https://github.com/SU-SWS/stanford_media.git", - "reference": "fe76544055919c56dcd191b603b0ad6bd5fdd4a6" + "reference": "487504f6741c1327fc81ebface134a99f60bcc1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SU-SWS/stanford_media/zipball/fe76544055919c56dcd191b603b0ad6bd5fdd4a6", - "reference": "fe76544055919c56dcd191b603b0ad6bd5fdd4a6", + "url": "https://api.github.com/repos/SU-SWS/stanford_media/zipball/487504f6741c1327fc81ebface134a99f60bcc1d", + "reference": "487504f6741c1327fc81ebface134a99f60bcc1d", "shasum": "" }, "require": { @@ -11249,7 +11247,7 @@ ], "description": "Stanford Media module for Drupal 8 Media management", "homepage": "https://github.com/SU-SWS/stanford_media", - "time": "2018-08-30T21:46:27+00:00" + "time": "2018-10-09T23:53:42+00:00" }, { "name": "symfony-cmf/routing", @@ -11312,16 +11310,16 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "31db283fc86d3143e7ff87e922177b457d909c30" + "reference": "f31333bdff54c7595f834d510a6d2325573ddb36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/31db283fc86d3143e7ff87e922177b457d909c30", - "reference": "31db283fc86d3143e7ff87e922177b457d909c30", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/f31333bdff54c7595f834d510a6d2325573ddb36", + "reference": "f31333bdff54c7595f834d510a6d2325573ddb36", "shasum": "" }, "require": { @@ -11364,20 +11362,20 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/config", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7b08223b7f6abd859651c56bcabf900d1627d085" + "reference": "e5389132dc6320682de3643091121c048ff796b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7b08223b7f6abd859651c56bcabf900d1627d085", - "reference": "7b08223b7f6abd859651c56bcabf900d1627d085", + "url": "https://api.github.com/repos/symfony/config/zipball/e5389132dc6320682de3643091121c048ff796b3", + "reference": "e5389132dc6320682de3643091121c048ff796b3", "shasum": "" }, "require": { @@ -11428,20 +11426,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-09-08T13:15:14+00:00" }, { "name": "symfony/console", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73" + "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6b217594552b9323bcdcfc14f8a0ce126e84cd73", - "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73", + "url": "https://api.github.com/repos/symfony/console/zipball/3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b", + "reference": "3b2b415d4c48fbefca7dc742aa0a0171bfae4e0b", "shasum": "" }, "require": { @@ -11497,20 +11495,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "symfony/debug", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "c4625e75341e4fb309ce0c049cbf7fb84b8897cd" + "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/c4625e75341e4fb309ce0c049cbf7fb84b8897cd", - "reference": "c4625e75341e4fb309ce0c049cbf7fb84b8897cd", + "url": "https://api.github.com/repos/symfony/debug/zipball/0a612e9dfbd2ccce03eb174365f31ecdca930ff6", + "reference": "0a612e9dfbd2ccce03eb174365f31ecdca930ff6", "shasum": "" }, "require": { @@ -11553,20 +11551,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-08-03T10:42:44+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "09d7df7bf06c1393b6afc85875993cbdbdf897a0" + "reference": "aea20fef4e92396928b5db175788b90234c0270d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/09d7df7bf06c1393b6afc85875993cbdbdf897a0", - "reference": "09d7df7bf06c1393b6afc85875993cbdbdf897a0", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/aea20fef4e92396928b5db175788b90234c0270d", + "reference": "aea20fef4e92396928b5db175788b90234c0270d", "shasum": "" }, "require": { @@ -11624,11 +11622,11 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-08-08T11:42:34+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -11691,16 +11689,16 @@ }, { "name": "symfony/filesystem", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "285ce5005cb01a0aeaa5b0cf590bd0cc40bb631c" + "reference": "d69930fc337d767607267d57c20a7403d0a822a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/285ce5005cb01a0aeaa5b0cf590bd0cc40bb631c", - "reference": "285ce5005cb01a0aeaa5b0cf590bd0cc40bb631c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d69930fc337d767607267d57c20a7403d0a822a4", + "reference": "d69930fc337d767607267d57c20a7403d0a822a4", "shasum": "" }, "require": { @@ -11737,20 +11735,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-08-10T07:29:05+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/finder", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a" + "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8a84fcb207451df0013b2c74cbbf1b62d47b999a", - "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a", + "url": "https://api.github.com/repos/symfony/finder/zipball/54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d", "shasum": "" }, "require": { @@ -11786,20 +11784,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-10-03T08:46:40+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "2fb33cb6eefe6e790e4023f7c534a9e4214252fc" + "reference": "3a4498236ade473c52b92d509303e5fd1b211ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2fb33cb6eefe6e790e4023f7c534a9e4214252fc", - "reference": "2fb33cb6eefe6e790e4023f7c534a9e4214252fc", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3a4498236ade473c52b92d509303e5fd1b211ab1", + "reference": "3a4498236ade473c52b92d509303e5fd1b211ab1", "shasum": "" }, "require": { @@ -11840,20 +11838,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-08-27T17:45:33+00:00" + "time": "2018-10-03T08:48:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "2819693b25f480966cbfa13b651abccfed4871ca" + "reference": "a0944a9a1d8845da724236cde9a310964acadb1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2819693b25f480966cbfa13b651abccfed4871ca", - "reference": "2819693b25f480966cbfa13b651abccfed4871ca", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a0944a9a1d8845da724236cde9a310964acadb1c", + "reference": "a0944a9a1d8845da724236cde9a310964acadb1c", "shasum": "" }, "require": { @@ -11929,7 +11927,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-08-28T06:06:12+00:00" + "time": "2018-10-03T12:03:34+00:00" }, { "name": "symfony/polyfill-ctype", @@ -12168,16 +12166,16 @@ }, { "name": "symfony/process", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4d6b125d5293cbceedc2aa10f2c71617e76262e7" + "reference": "1dc2977afa7d70f90f3fefbcd84152813558910e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4d6b125d5293cbceedc2aa10f2c71617e76262e7", - "reference": "4d6b125d5293cbceedc2aa10f2c71617e76262e7", + "url": "https://api.github.com/repos/symfony/process/zipball/1dc2977afa7d70f90f3fefbcd84152813558910e", + "reference": "1dc2977afa7d70f90f3fefbcd84152813558910e", "shasum": "" }, "require": { @@ -12213,7 +12211,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-08-03T10:42:44+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -12278,16 +12276,16 @@ }, { "name": "symfony/routing", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911" + "reference": "585f6e2d740393d546978769dd56e496a6233e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e20f4bb79502c3c0db86d572f7683a30d4143911", - "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911", + "url": "https://api.github.com/repos/symfony/routing/zipball/585f6e2d740393d546978769dd56e496a6233e0b", + "reference": "585f6e2d740393d546978769dd56e496a6233e0b", "shasum": "" }, "require": { @@ -12351,20 +12349,20 @@ "uri", "url" ], - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/serializer", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "40031683816470610af87c2d03ea86d1cf0f0104" + "reference": "8bc00ef47a428bfebc4641f29d158e7c56137fcb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/40031683816470610af87c2d03ea86d1cf0f0104", - "reference": "40031683816470610af87c2d03ea86d1cf0f0104", + "url": "https://api.github.com/repos/symfony/serializer/zipball/8bc00ef47a428bfebc4641f29d158e7c56137fcb", + "reference": "8bc00ef47a428bfebc4641f29d158e7c56137fcb", "shasum": "" }, "require": { @@ -12430,20 +12428,20 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:58:24+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/translation", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "9749930bfc825139aadd2d28461ddbaed6577862" + "reference": "94bc3a79008e6640defedf5e14eb3b4f20048352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/9749930bfc825139aadd2d28461ddbaed6577862", - "reference": "9749930bfc825139aadd2d28461ddbaed6577862", + "url": "https://api.github.com/repos/symfony/translation/zipball/94bc3a79008e6640defedf5e14eb3b4f20048352", + "reference": "94bc3a79008e6640defedf5e14eb3b4f20048352", "shasum": "" }, "require": { @@ -12498,20 +12496,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "symfony/twig-bridge", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "5d9401bc36c5a8006901e990b6884f5990c87920" + "reference": "8a852d57a609982043a50987adfcdd3e8ccc76f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5d9401bc36c5a8006901e990b6884f5990c87920", - "reference": "5d9401bc36c5a8006901e990b6884f5990c87920", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/8a852d57a609982043a50987adfcdd3e8ccc76f9", + "reference": "8a852d57a609982043a50987adfcdd3e8ccc76f9", "shasum": "" }, "require": { @@ -12528,7 +12526,7 @@ "symfony/dependency-injection": "~2.8|~3.0|~4.0", "symfony/expression-language": "~2.8|~3.0|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "^3.4.13|~4.0.13|^4.1.2", + "symfony/form": "^3.4.16|^4.1.5", "symfony/http-foundation": "^3.3.11|~4.0", "symfony/http-kernel": "~3.2|~4.0", "symfony/polyfill-intl-icu": "~1.0", @@ -12588,20 +12586,20 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-09-18T17:03:56+00:00" }, { "name": "symfony/validator", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "5a9ca502663e32aed3302b00121f978d70a09ab9" + "reference": "9f8dbf0dceb03815c3160a279bf8cf4f8018a1c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/5a9ca502663e32aed3302b00121f978d70a09ab9", - "reference": "5a9ca502663e32aed3302b00121f978d70a09ab9", + "url": "https://api.github.com/repos/symfony/validator/zipball/9f8dbf0dceb03815c3160a279bf8cf4f8018a1c5", + "reference": "9f8dbf0dceb03815c3160a279bf8cf4f8018a1c5", "shasum": "" }, "require": { @@ -12673,20 +12671,20 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2018-08-07T09:33:53+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "symfony/var-dumper", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "f62a394bd3de96f2f5e8f4c7d685035897fb3cb3" + "reference": "ff8ac19e97e5c7c3979236b584719a1190f84181" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f62a394bd3de96f2f5e8f4c7d685035897fb3cb3", - "reference": "f62a394bd3de96f2f5e8f4c7d685035897fb3cb3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ff8ac19e97e5c7c3979236b584719a1190f84181", + "reference": "ff8ac19e97e5c7c3979236b584719a1190f84181", "shasum": "" }, "require": { @@ -12742,20 +12740,20 @@ "debug", "dump" ], - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "c2f4812ead9f847cb69e90917ca7502e6892d6b8" + "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c2f4812ead9f847cb69e90917ca7502e6892d6b8", - "reference": "c2f4812ead9f847cb69e90917ca7502e6892d6b8", + "url": "https://api.github.com/repos/symfony/yaml/zipball/640b6c27fed4066d64b64d5903a86043f4a4de7f", + "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f", "shasum": "" }, "require": { @@ -12801,7 +12799,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-08-10T07:34:36+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "theseer/tokenizer", @@ -15799,7 +15797,7 @@ }, { "name": "symfony/browser-kit", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", @@ -15856,16 +15854,16 @@ }, { "name": "symfony/cache", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "b8440ff4635c6631aca21a09ab72e0b7e3a6cb7a" + "reference": "05ce0ddc8bc1ffe592105398fc2c725cb3080a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/b8440ff4635c6631aca21a09ab72e0b7e3a6cb7a", - "reference": "b8440ff4635c6631aca21a09ab72e0b7e3a6cb7a", + "url": "https://api.github.com/repos/symfony/cache/zipball/05ce0ddc8bc1ffe592105398fc2c725cb3080a38", + "reference": "05ce0ddc8bc1ffe592105398fc2c725cb3080a38", "shasum": "" }, "require": { @@ -15921,20 +15919,20 @@ "caching", "psr6" ], - "time": "2018-08-27T09:36:56+00:00" + "time": "2018-09-30T03:38:13+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "edda5a6155000ff8c3a3f85ee5c421af93cca416" + "reference": "3503415d4aafabc31cd08c3a4ebac7f43fde8feb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/edda5a6155000ff8c3a3f85ee5c421af93cca416", - "reference": "edda5a6155000ff8c3a3f85ee5c421af93cca416", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3503415d4aafabc31cd08c3a4ebac7f43fde8feb", + "reference": "3503415d4aafabc31cd08c3a4ebac7f43fde8feb", "shasum": "" }, "require": { @@ -15974,20 +15972,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-07-26T09:06:28+00:00" + "time": "2018-10-02T16:33:53+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "452bfc854b60134438e3824b159b0d24a5892331" + "reference": "c705bee03ade5b47c087807dd9ffaaec8dda2722" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/452bfc854b60134438e3824b159b0d24a5892331", - "reference": "452bfc854b60134438e3824b159b0d24a5892331", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c705bee03ade5b47c087807dd9ffaaec8dda2722", + "reference": "c705bee03ade5b47c087807dd9ffaaec8dda2722", "shasum": "" }, "require": { @@ -16031,11 +16029,11 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2018-07-26T10:03:52+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "symfony/expression-language", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", @@ -16085,16 +16083,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v4.1.4", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "d5f433034543bbe3b0dfa2f34e6cc85bf839846f" + "reference": "2474c5d4a5e3431fee2f6f0dddde9d34983d9ceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/d5f433034543bbe3b0dfa2f34e6cc85bf839846f", - "reference": "d5f433034543bbe3b0dfa2f34e6cc85bf839846f", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2474c5d4a5e3431fee2f6f0dddde9d34983d9ceb", + "reference": "2474c5d4a5e3431fee2f6f0dddde9d34983d9ceb", "shasum": "" }, "require": { @@ -16147,20 +16145,20 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2018-08-27T17:47:02+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/stopwatch", - "version": "v3.4.15", + "version": "v3.4.17", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "deda2765e8dab2fc38492e926ea690f2a681f59d" + "reference": "05e52a39de52ba690aebaed462b2bc8a9649f0a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/deda2765e8dab2fc38492e926ea690f2a681f59d", - "reference": "deda2765e8dab2fc38492e926ea690f2a681f59d", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/05e52a39de52ba690aebaed462b2bc8a9649f0a4", + "reference": "05e52a39de52ba690aebaed462b2bc8a9649f0a4", "shasum": "" }, "require": { @@ -16196,7 +16194,7 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2018-07-26T10:03:52+00:00" + "time": "2018-10-02T12:28:39+00:00" }, { "name": "textalk/websocket", @@ -16279,6 +16277,7 @@ "drupal/ui_patterns": 5, "drupal/viewfield": 15, "drupal/views_block_filter_block": 10, + "drupal/views_taxonomy_term_name_depth": 20, "drupal/xmlsitemap": 20, "drush/drush": 20, "su-sws/nobots": 20, diff --git a/config/archaeology/bugherdapi.settings.yml b/config/archaeology/bugherdapi.settings.yml deleted file mode 100644 index d27366d805..0000000000 --- a/config/archaeology/bugherdapi.settings.yml +++ /dev/null @@ -1,16 +0,0 @@ -dependencies: - config: - - key.key.bugherd_api_key -project_key: lg5tp4ieu5uuxi19eanj5a -disable_on_admin: 0 -api_key: bugherd_api_key -jira_project: ARCH -project_id: '144496' -status_map: - backlog: '10301' - todo: '10901' - doing: '3' - done: '10801' - closed: '5,6,10000,10002' -_core: - default_config_hash: at0oXAcX1yzJqjUuDnySiImZzF3g14RSYlMlaTPnfA0 diff --git a/config/archaeology/config_split.config_split.archaeology.yml b/config/archaeology/config_split.config_split.archaeology.yml index 32e1f077bf..877602198f 100644 --- a/config/archaeology/config_split.config_split.archaeology.yml +++ b/config/archaeology/config_split.config_split.archaeology.yml @@ -10,9 +10,11 @@ module: { } theme: { } blacklist: - config_split.config_split.archaeology - - 'menu_position.menu_position_rule.*' graylist: - - '*' + - migrate_plus.migration.hs_events_image_importer + - su_humsci_theme.settings + - migrate_plus.migration.hs_events_importer + - 'menu_position.menu_position_rule.*' graylist_dependents: false graylist_skip_equal: true weight: 10 diff --git a/config/archaeology/system.site.yml b/config/archaeology/system.site.yml deleted file mode 100644 index 67d5b902f5..0000000000 --- a/config/archaeology/system.site.yml +++ /dev/null @@ -1,14 +0,0 @@ -uuid: df7ecefc-c0c2-490f-ab5b-35211eba5be4 -name: 'Archaeology Center' -mail: pookmish@stanford.edu -slogan: 'School of Humanities & Sciences' -page: - 403: '' - 404: '' - front: /node/36 -admin_compact_mode: false -weight_select_max: 100 -langcode: en -default_langcode: en -_core: - default_config_hash: yIkT6J-_K6qcEfo4ttMoLrwre-hS49g92otsRf4Hl14 diff --git a/config/default/bugherdapi.settings.yml b/config/default/bugherdapi.settings.yml index 67102ae97e..a0be10c124 100644 --- a/config/default/bugherdapi.settings.yml +++ b/config/default/bugherdapi.settings.yml @@ -1,16 +1,4 @@ -dependencies: - config: - - key.key.bugherd_api_key project_key: mukcpzcqeud9mq9husfaqa -disable_on_admin: 0 -api_key: bugherd_api_key -jira_project: HSD8 -project_id: '146572' -status_map: - backlog: '10301' - todo: '10901' - doing: '3' - done: '10801' - closed: '5,6,10000,10002' +disable_on_admin: false _core: default_config_hash: at0oXAcX1yzJqjUuDnySiImZzF3g14RSYlMlaTPnfA0 diff --git a/config/envs/prod/config_ignore.settings.yml b/config/default/config_ignore.settings.yml similarity index 59% rename from config/envs/prod/config_ignore.settings.yml rename to config/default/config_ignore.settings.yml index fc62c58f1e..ba27c6b543 100644 --- a/config/envs/prod/config_ignore.settings.yml +++ b/config/default/config_ignore.settings.yml @@ -2,10 +2,17 @@ ignored_config_entities: - 'core.entity_view_display.node.hs_*.default' - 'core.entity_form_display.node.hs_*' - 'menu_position.menu_position_rule.*' - - 'google_analytics.settings' + - google_analytics.settings - 'user.role.*:permissions' - 'config_split.config_split.not_live:status' - 'views.view.hs_*:status' + - 'system.theme:default' + - 'core.extension:theme' - system.site + - 'block.block.*' + - '~block.block.su_humsci_theme*' + - '~block.block.su_humsci_admin*' + - '~block.block.seven*' + - 'bugherdapi.settings:project_key' _core: default_config_hash: UVH1aJ4b44UM-VdPVN7hNNuuVqfReJxwfVeDQH1Hvsk diff --git a/config/default/config_split.config_split.ci.yml b/config/default/config_split.config_split.ci.yml index 894dcc855d..912bea6fb8 100644 --- a/config/default/config_split.config_split.ci.yml +++ b/config/default/config_split.config_split.ci.yml @@ -7,12 +7,14 @@ label: Ci description: 'CircleCi Environment' folder: ../config/envs/ci module: + hs_bugherd: 0 hs_config_readonly: 0 config_readonly: 0 - config_ignore: 0 theme: { } blacklist: - - config_ignore.settings + - rest.resource.hs_bugherd_resource + - rest.resource.hs_bugherd_resource_bugherd + - rest.resource.hs_bugherd_resource_jira graylist: { } graylist_dependents: true graylist_skip_equal: true diff --git a/config/default/config_split.config_split.local.yml b/config/default/config_split.config_split.local.yml index b086633d30..4cd6df017c 100644 --- a/config/default/config_split.config_split.local.yml +++ b/config/default/config_split.config_split.local.yml @@ -16,7 +16,8 @@ module: config_import_de: 0 theme: { } blacklist: { } -graylist: { } +graylist: + - config_ignore.settings graylist_dependents: true graylist_skip_equal: true weight: 0 diff --git a/config/default/config_split.config_split.prod.yml b/config/default/config_split.config_split.prod.yml index 735219b58a..c657ffec20 100644 --- a/config/default/config_split.config_split.prod.yml +++ b/config/default/config_split.config_split.prod.yml @@ -10,9 +10,9 @@ module: acquia_connector: 0 acquia_purge: 0 simplesamlphp_auth: 0 + hs_bugherd: 0 hs_config_readonly: 0 config_readonly: 0 - config_ignore: 0 purge: 0 purge_drush: 0 purge_processor_cron: 0 @@ -21,9 +21,11 @@ module: purge_ui: 0 theme: { } blacklist: + - rest.resource.hs_bugherd_resource + - rest.resource.hs_bugherd_resource_bugherd + - rest.resource.hs_bugherd_resource_jira - acquia_connector.settings - simplesamlphp_auth.settings - - config_ignore.settings - google_analytics.settings - purge.logger_channels - purge.plugins @@ -31,6 +33,7 @@ blacklist: graylist: - field_ui.settings - system.performance + - hs_config_prefix.settings graylist_dependents: true graylist_skip_equal: true weight: 0 diff --git a/config/default/config_split.config_split.stage.yml b/config/default/config_split.config_split.stage.yml index 93c7415092..0b35cbfb21 100644 --- a/config/default/config_split.config_split.stage.yml +++ b/config/default/config_split.config_split.stage.yml @@ -11,7 +11,6 @@ module: acquia_connector: 0 acquia_purge: 0 simplesamlphp_auth: 0 - config_ignore: 0 nobots: 0 purge: 0 purge_drush: 0 @@ -23,7 +22,6 @@ theme: { } blacklist: - acquia_connector.settings - simplesamlphp_auth.settings - - config_ignore.settings - purge.logger_channels - purge.plugins - purge_queuer_coretags.settings diff --git a/config/default/core.entity_form_display.node.hs_news.default.yml b/config/default/core.entity_form_display.node.hs_news.default.yml index 3e0167322c..7567008821 100644 --- a/config/default/core.entity_form_display.node.hs_news.default.yml +++ b/config/default/core.entity_form_display.node.hs_news.default.yml @@ -5,7 +5,6 @@ dependencies: config: - entity_browser.browser.image_browser - field.field.node.hs_news.body - - field.field.node.hs_news.field_hs_news_byline - field.field.node.hs_news.field_hs_news_categories - field.field.node.hs_news.field_hs_news_date - field.field.node.hs_news.field_hs_news_image @@ -37,14 +36,6 @@ content: region: content settings: { } third_party_settings: { } - field_hs_news_byline: - type: string_textfield - weight: 1 - region: content - settings: - size: 60 - placeholder: '' - third_party_settings: { } field_hs_news_categories: type: entity_reference_autocomplete weight: 6 diff --git a/config/default/core.entity_form_display.node.hs_person.default.yml b/config/default/core.entity_form_display.node.hs_person.default.yml index 7cd9728f7c..90b6c37389 100644 --- a/config/default/core.entity_form_display.node.hs_person.default.yml +++ b/config/default/core.entity_form_display.node.hs_person.default.yml @@ -8,14 +8,14 @@ dependencies: - field.field.node.hs_person.field_hs_person_affiliation - field.field.node.hs_person.field_hs_person_education - field.field.node.hs_person.field_hs_person_email - - field.field.node.hs_person.field_hs_person_faculty_interest + - field.field.node.hs_person.field_hs_person_external_profile - field.field.node.hs_person.field_hs_person_faculty_status - field.field.node.hs_person.field_hs_person_first_name - field.field.node.hs_person.field_hs_person_image + - field.field.node.hs_person.field_hs_person_interests - field.field.node.hs_person.field_hs_person_last_name - field.field.node.hs_person.field_hs_person_links - field.field.node.hs_person.field_hs_person_mail - - field.field.node.hs_person.field_hs_person_mail_code - field.field.node.hs_person.field_hs_person_middle_name - field.field.node.hs_person.field_hs_person_office - field.field.node.hs_person.field_hs_person_office_hours @@ -24,7 +24,7 @@ dependencies: - field.field.node.hs_person.field_hs_person_student_cohort - field.field.node.hs_person.field_hs_person_student_dissert - field.field.node.hs_person.field_hs_person_student_grad - - field.field.node.hs_person.field_hs_person_student_study + - field.field.node.hs_person.field_hs_person_student_type - field.field.node.hs_person.field_hs_person_telephone - field.field.node.hs_person.field_hs_person_title - node.type.hs_person @@ -63,7 +63,6 @@ third_party_settings: - field_hs_person_telephone - field_hs_person_office - field_hs_person_office_hours - - field_hs_person_mail_code - field_hs_person_mail parent_name: group_tabs weight: 3 @@ -98,6 +97,8 @@ third_party_settings: - field_hs_person_education - field_hs_person_links - field_hs_person_research + - field_hs_person_interests + - field_hs_person_external_profile parent_name: group_tabs weight: 2 format_type: tab @@ -111,7 +112,6 @@ third_party_settings: group_faculty_info: children: - field_hs_person_faculty_status - - field_hs_person_faculty_interest parent_name: group_tabs weight: 4 format_type: tab @@ -124,8 +124,8 @@ third_party_settings: label: 'Faculty Info' group_student_info: children: + - field_hs_person_student_type - field_hs_person_student_cohort - - field_hs_person_student_study - field_hs_person_student_dissert - field_hs_person_student_grad parent_name: group_tabs @@ -195,14 +195,13 @@ content: third_party_settings: { } type: email_default region: content - field_hs_person_faculty_interest: - weight: 27 + field_hs_person_external_profile: + weight: 14 settings: - match_operator: CONTAINS - size: 60 - placeholder: '' + placeholder_url: '' + placeholder_title: '' third_party_settings: { } - type: entity_reference_autocomplete + type: link_default region: content field_hs_person_faculty_status: weight: 26 @@ -236,6 +235,14 @@ content: third_party_settings: { } type: entity_browser_entity_reference region: content + field_hs_person_interests: + weight: 13 + settings: + size: 60 + placeholder: '' + third_party_settings: { } + type: string_textfield + region: content field_hs_person_last_name: weight: 4 settings: @@ -259,14 +266,6 @@ content: third_party_settings: { } type: address_default region: content - field_hs_person_mail_code: - weight: 17 - settings: - size: 60 - placeholder: '' - third_party_settings: { } - type: string_textfield - region: content field_hs_person_middle_name: weight: 3 settings: @@ -307,7 +306,7 @@ content: type: entity_reference_autocomplete region: content field_hs_person_student_cohort: - weight: 29 + weight: 54 settings: min: 'now - 10 years' max: 'now + 10 years' @@ -315,7 +314,7 @@ content: type: datetime_year_only region: content field_hs_person_student_dissert: - weight: 31 + weight: 55 settings: size: 60 placeholder: '' @@ -323,21 +322,18 @@ content: type: string_textfield region: content field_hs_person_student_grad: - weight: 32 + weight: 56 settings: min: 'now - 10 years' max: 'now + 10 years' third_party_settings: { } type: datetime_year_only region: content - field_hs_person_student_study: - weight: 30 - settings: - match_operator: CONTAINS - size: 60 - placeholder: '' + field_hs_person_student_type: + weight: 53 + settings: { } third_party_settings: { } - type: entity_reference_autocomplete_tags + type: options_select region: content field_hs_person_telephone: weight: 13 diff --git a/config/default/core.entity_view_display.node.hs_news.default.yml b/config/default/core.entity_view_display.node.hs_news.default.yml index 1c31ff9871..ee32c0d95a 100644 --- a/config/default/core.entity_view_display.node.hs_news.default.yml +++ b/config/default/core.entity_view_display.node.hs_news.default.yml @@ -4,7 +4,6 @@ status: true dependencies: config: - field.field.node.hs_news.body - - field.field.node.hs_news.field_hs_news_byline - field.field.node.hs_news.field_hs_news_categories - field.field.node.hs_news.field_hs_news_date - field.field.node.hs_news.field_hs_news_image @@ -73,28 +72,6 @@ third_party_settings: entity: layout_builder.entity additional: { } weight: 0 - b9a12242-ca2f-4bf9-841e-d7caddf1eb99: - uuid: b9a12242-ca2f-4bf9-841e-d7caddf1eb99 - region: top - configuration: - id: 'field_block:node:hs_news:field_hs_news_byline' - label: Byline - provider: layout_builder - label_display: '0' - formatter: - label: hidden - type: string - settings: - link_to_entity: false - third_party_settings: - field_formatter_class: - class: '' - hs_field_helpers: - inline_contents: 0 - context_mapping: - entity: layout_builder.entity - additional: { } - weight: 1 7ec8a376-e2a8-46b7-9f7c-f1096441c99d: uuid: 7ec8a376-e2a8-46b7-9f7c-f1096441c99d region: left_sidebar @@ -196,7 +173,6 @@ content: third_party_settings: { } hidden: body: true - field_hs_news_byline: true field_hs_news_categories: true field_hs_news_date: true field_hs_news_image: true diff --git a/config/default/core.entity_view_display.node.hs_news.hs_horizontal_card.yml b/config/default/core.entity_view_display.node.hs_news.hs_horizontal_card.yml index 458fd070d7..0dab62c77a 100644 --- a/config/default/core.entity_view_display.node.hs_news.hs_horizontal_card.yml +++ b/config/default/core.entity_view_display.node.hs_news.hs_horizontal_card.yml @@ -5,7 +5,6 @@ dependencies: config: - core.entity_view_mode.node.hs_horizontal_card - field.field.node.hs_news.body - - field.field.node.hs_news.field_hs_news_byline - field.field.node.hs_news.field_hs_news_categories - field.field.node.hs_news.field_hs_news_date - field.field.node.hs_news.field_hs_news_image @@ -77,14 +76,6 @@ content: class: '' hs_field_helpers: inline_contents: 0 - field_hs_news_byline: - type: string - weight: 4 - region: speaker - label: hidden - settings: - link_to_entity: false - third_party_settings: { } field_hs_news_date: type: datetime_default weight: 2 diff --git a/config/default/core.entity_view_display.node.hs_news.hs_vertical_card.yml b/config/default/core.entity_view_display.node.hs_news.hs_vertical_card.yml index b34e05fdd5..8fd2c442e0 100644 --- a/config/default/core.entity_view_display.node.hs_news.hs_vertical_card.yml +++ b/config/default/core.entity_view_display.node.hs_news.hs_vertical_card.yml @@ -5,7 +5,6 @@ dependencies: config: - core.entity_view_mode.node.hs_vertical_card - field.field.node.hs_news.body - - field.field.node.hs_news.field_hs_news_byline - field.field.node.hs_news.field_hs_news_categories - field.field.node.hs_news.field_hs_news_date - field.field.node.hs_news.field_hs_news_image @@ -95,7 +94,6 @@ content: settings: { } third_party_settings: { } hidden: - field_hs_news_byline: true field_hs_news_categories: true field_hs_news_date: true field_hs_news_link: true diff --git a/config/default/core.entity_view_display.node.hs_news.search_index.yml b/config/default/core.entity_view_display.node.hs_news.search_index.yml index 276335ac88..2ee3d19154 100644 --- a/config/default/core.entity_view_display.node.hs_news.search_index.yml +++ b/config/default/core.entity_view_display.node.hs_news.search_index.yml @@ -5,7 +5,6 @@ dependencies: config: - core.entity_view_mode.node.search_index - field.field.node.hs_news.body - - field.field.node.hs_news.field_hs_news_byline - field.field.node.hs_news.field_hs_news_categories - field.field.node.hs_news.field_hs_news_date - field.field.node.hs_news.field_hs_news_image @@ -30,14 +29,6 @@ content: label: hidden settings: { } third_party_settings: { } - field_hs_news_byline: - type: string - weight: 1 - region: content - label: hidden - settings: - link_to_entity: false - third_party_settings: { } field_hs_news_categories: type: entity_reference_label weight: 2 diff --git a/config/default/core.entity_view_display.node.hs_person.default.yml b/config/default/core.entity_view_display.node.hs_person.default.yml index 726fee1da1..34956b1345 100644 --- a/config/default/core.entity_view_display.node.hs_person.default.yml +++ b/config/default/core.entity_view_display.node.hs_person.default.yml @@ -8,14 +8,14 @@ dependencies: - field.field.node.hs_person.field_hs_person_affiliation - field.field.node.hs_person.field_hs_person_education - field.field.node.hs_person.field_hs_person_email - - field.field.node.hs_person.field_hs_person_faculty_interest + - field.field.node.hs_person.field_hs_person_external_profile - field.field.node.hs_person.field_hs_person_faculty_status - field.field.node.hs_person.field_hs_person_first_name - field.field.node.hs_person.field_hs_person_image + - field.field.node.hs_person.field_hs_person_interests - field.field.node.hs_person.field_hs_person_last_name - field.field.node.hs_person.field_hs_person_links - field.field.node.hs_person.field_hs_person_mail - - field.field.node.hs_person.field_hs_person_mail_code - field.field.node.hs_person.field_hs_person_middle_name - field.field.node.hs_person.field_hs_person_office - field.field.node.hs_person.field_hs_person_office_hours @@ -24,7 +24,7 @@ dependencies: - field.field.node.hs_person.field_hs_person_student_cohort - field.field.node.hs_person.field_hs_person_student_dissert - field.field.node.hs_person.field_hs_person_student_grad - - field.field.node.hs_person.field_hs_person_student_study + - field.field.node.hs_person.field_hs_person_student_type - field.field.node.hs_person.field_hs_person_telephone - field.field.node.hs_person.field_hs_person_title - node.type.hs_person @@ -33,6 +33,7 @@ dependencies: module: - hs_layouts - layout_builder + - link - menu_block - text - user @@ -223,54 +224,6 @@ third_party_settings: context_mapping: { } additional: { } weight: 7 - 9517dfef-610f-47a7-8f3b-73a84fdc2e6f: - uuid: 9517dfef-610f-47a7-8f3b-73a84fdc2e6f - region: main_above - configuration: - id: 'field_block:node:hs_person:field_hs_person_student_study' - label: 'Field of Study' - provider: layout_builder - label_display: '0' - formatter: - label: inline - type: entity_reference_label - settings: - link: false - third_party_settings: - field_formatter_class: - class: '' - ds: - ds_limit: '' - hs_field_helpers: - inline_contents: 0 - context_mapping: - entity: layout_builder.entity - additional: { } - weight: 11 - 5ca1fb3e-d8c0-49b4-aa0b-143421ed97a4: - uuid: 5ca1fb3e-d8c0-49b4-aa0b-143421ed97a4 - region: main_above - configuration: - id: 'field_block:node:hs_person:field_hs_person_faculty_interest' - label: 'Fields of Interest' - provider: layout_builder - label_display: '0' - formatter: - label: inline - type: entity_reference_label - settings: - link: false - third_party_settings: - field_formatter_class: - class: '' - ds: - ds_limit: '' - hs_field_helpers: - inline_contents: 0 - context_mapping: - entity: layout_builder.entity - additional: { } - weight: 10 5133b417-43d2-4b87-b554-2acac0cf09da: uuid: 5133b417-43d2-4b87-b554-2acac0cf09da region: main_below @@ -408,28 +361,6 @@ third_party_settings: entity: layout_builder.entity additional: { } weight: 5 - 0144cad2-b0f4-43e2-8847-78cdba464501: - uuid: 0144cad2-b0f4-43e2-8847-78cdba464501 - region: main_below - configuration: - id: 'field_block:node:hs_person:field_hs_person_mail_code' - label: 'Mail Code' - provider: layout_builder - label_display: '0' - formatter: - label: inline - type: string - settings: - link_to_entity: false - third_party_settings: - field_formatter_class: - class: '' - hs_field_helpers: - inline_contents: 0 - context_mapping: - entity: layout_builder.entity - additional: { } - weight: 6 f06e0aad-a1b7-4032-8a51-7c03f3934f52: uuid: f06e0aad-a1b7-4032-8a51-7c03f3934f52 region: main_below @@ -524,6 +455,58 @@ third_party_settings: entity: layout_builder.entity additional: { } weight: 9 + af9370bf-ba57-4859-ab07-51e3d43e15be: + uuid: af9370bf-ba57-4859-ab07-51e3d43e15be + region: main_above + configuration: + label_display: '0' + context_mapping: + entity: layout_builder.entity + id: 'field_block:node:hs_person:field_hs_person_interests' + formatter: + label: above + settings: + link_to_entity: false + third_party_settings: { } + type: string + additional: { } + weight: 14 + 0cbd0b12-a074-4b67-ab11-26f31add80d3: + uuid: 0cbd0b12-a074-4b67-ab11-26f31add80d3 + region: main_above + configuration: + label_display: '0' + context_mapping: + entity: layout_builder.entity + id: 'field_block:node:hs_person:field_hs_person_external_profile' + formatter: + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + additional: { } + weight: 15 + 8acc1b43-548d-4000-a2ce-d90a46666871: + uuid: 8acc1b43-548d-4000-a2ce-d90a46666871 + region: main_above + configuration: + label_display: '0' + context_mapping: + entity: layout_builder.entity + id: 'field_block:node:hs_person:field_hs_person_student_type' + formatter: + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + additional: { } + weight: 16 enabled: true allow_custom: false _core: @@ -540,6 +523,34 @@ content: settings: { } third_party_settings: { } region: content + field_hs_person_external_profile: + weight: 102 + label: above + settings: + trim_length: 80 + url_only: false + url_plain: false + rel: '' + target: '' + third_party_settings: { } + type: link + region: main_above + field_hs_person_interests: + weight: 101 + label: above + settings: + link_to_entity: false + third_party_settings: { } + type: string + region: main_above + field_hs_person_student_type: + weight: 103 + label: above + settings: + link: true + third_party_settings: { } + type: entity_reference_label + region: main_above links: weight: 100 settings: { } @@ -549,14 +560,12 @@ hidden: field_hs_person_affiliation: true field_hs_person_education: true field_hs_person_email: true - field_hs_person_faculty_interest: true field_hs_person_faculty_status: true field_hs_person_first_name: true field_hs_person_image: true field_hs_person_last_name: true field_hs_person_links: true field_hs_person_mail: true - field_hs_person_mail_code: true field_hs_person_middle_name: true field_hs_person_office: true field_hs_person_office_hours: true @@ -565,6 +574,5 @@ hidden: field_hs_person_student_cohort: true field_hs_person_student_dissert: true field_hs_person_student_grad: true - field_hs_person_student_study: true field_hs_person_telephone: true field_hs_person_title: true diff --git a/config/default/core.entity_view_display.node.hs_person.search_index.yml b/config/default/core.entity_view_display.node.hs_person.search_index.yml index 9d28d2c33a..bf39618c16 100644 --- a/config/default/core.entity_view_display.node.hs_person.search_index.yml +++ b/config/default/core.entity_view_display.node.hs_person.search_index.yml @@ -8,14 +8,12 @@ dependencies: - field.field.node.hs_person.field_hs_person_affiliation - field.field.node.hs_person.field_hs_person_education - field.field.node.hs_person.field_hs_person_email - - field.field.node.hs_person.field_hs_person_faculty_interest - field.field.node.hs_person.field_hs_person_faculty_status - field.field.node.hs_person.field_hs_person_first_name - field.field.node.hs_person.field_hs_person_image - field.field.node.hs_person.field_hs_person_last_name - field.field.node.hs_person.field_hs_person_links - field.field.node.hs_person.field_hs_person_mail - - field.field.node.hs_person.field_hs_person_mail_code - field.field.node.hs_person.field_hs_person_middle_name - field.field.node.hs_person.field_hs_person_office - field.field.node.hs_person.field_hs_person_office_hours @@ -24,13 +22,13 @@ dependencies: - field.field.node.hs_person.field_hs_person_student_cohort - field.field.node.hs_person.field_hs_person_student_dissert - field.field.node.hs_person.field_hs_person_student_grad - - field.field.node.hs_person.field_hs_person_student_study - field.field.node.hs_person.field_hs_person_telephone - field.field.node.hs_person.field_hs_person_title - node.type.hs_person module: - address - datetime + - field_formatter_class - hs_field_helpers - link - telephone @@ -73,14 +71,6 @@ content: label: hidden settings: { } third_party_settings: { } - field_hs_person_faculty_interest: - type: entity_reference_label - weight: 19 - region: content - label: hidden - settings: - link: true - third_party_settings: { } field_hs_person_faculty_status: type: entity_reference_label weight: 18 @@ -133,14 +123,6 @@ content: label: hidden settings: { } third_party_settings: { } - field_hs_person_mail_code: - type: string - weight: 12 - region: content - label: hidden - settings: - link_to_entity: false - third_party_settings: { } field_hs_person_middle_name: type: string weight: 11 @@ -211,14 +193,6 @@ content: date_format: 'Y' timezone_override: '' third_party_settings: { } - field_hs_person_student_study: - type: entity_reference_label - weight: 4 - region: content - label: hidden - settings: - link: true - third_party_settings: { } field_hs_person_telephone: type: telephone_link weight: 3 @@ -236,4 +210,7 @@ content: link_to_entity: false third_party_settings: { } hidden: + field_hs_person_external_profile: true + field_hs_person_interests: true + field_hs_person_student_type: true links: true diff --git a/config/default/core.extension.yml b/config/default/core.extension.yml index 37b1560a2f..2bf3b3f081 100644 --- a/config/default/core.extension.yml +++ b/config/default/core.extension.yml @@ -22,6 +22,7 @@ module: components: 0 config: 0 config_filter: 0 + config_ignore: 0 config_split: 0 config_update: 0 config_update_ui: 0 @@ -64,7 +65,7 @@ module: hs_basic_page: 0 hs_basic_page_display: 0 hs_blocks: 0 - hs_bugherd: 0 + hs_config_prefix: 0 hs_courses: 0 hs_courses_importer: 0 hs_event_series: 0 diff --git a/config/default/field.field.node.hs_news.field_hs_news_byline.yml b/config/default/field.field.node.hs_news.field_hs_news_byline.yml deleted file mode 100644 index 25c9029a16..0000000000 --- a/config/default/field.field.node.hs_news.field_hs_news_byline.yml +++ /dev/null @@ -1,21 +0,0 @@ -uuid: b4820c7d-17a7-4529-b5ea-0ec2ca48fe0e -langcode: en -status: true -dependencies: - config: - - field.storage.node.field_hs_news_byline - - node.type.hs_news -_core: - default_config_hash: x2q6U3FXci6jP4GiIhfxayLs56Mt18bBaSzY6Y03I0c -id: node.hs_news.field_hs_news_byline -field_name: field_hs_news_byline -entity_type: node -bundle: hs_news -label: Byline -description: 'Enter the author for this news item.' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: { } -field_type: string diff --git a/config/default/field.field.node.hs_person.field_hs_person_external_profile.yml b/config/default/field.field.node.hs_person.field_hs_person_external_profile.yml new file mode 100644 index 0000000000..b22e128924 --- /dev/null +++ b/config/default/field.field.node.hs_person.field_hs_person_external_profile.yml @@ -0,0 +1,23 @@ +uuid: 580b1131-8037-49c2-a109-2f6e83ee305b +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_hs_person_external_profile + - node.type.hs_person + module: + - link +id: node.hs_person.field_hs_person_external_profile +field_name: field_hs_person_external_profile +entity_type: node +bundle: hs_person +label: 'External Profile' +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + link_type: 16 + title: 2 +field_type: link diff --git a/config/default/field.field.node.hs_person.field_hs_person_faculty_interest.yml b/config/default/field.field.node.hs_person.field_hs_person_faculty_interest.yml deleted file mode 100644 index 085eb644d8..0000000000 --- a/config/default/field.field.node.hs_person.field_hs_person_faculty_interest.yml +++ /dev/null @@ -1,31 +0,0 @@ -uuid: 0c549612-6675-4704-a15b-7b61ea5a131c -langcode: en -status: true -dependencies: - config: - - field.storage.node.field_hs_person_faculty_interest - - node.type.hs_person - - taxonomy.vocabulary.hs_person_faculty_interests -_core: - default_config_hash: _RhGg1Qe-Ov-ktuMHaCDPOW-i9N5BFH7YwNn32hltyk -id: node.hs_person.field_hs_person_faculty_interest -field_name: field_hs_person_faculty_interest -entity_type: node -bundle: hs_person -label: 'Fields of Interest' -description: '' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: - handler: 'default:taxonomy_term' - handler_settings: - target_bundles: - hs_person_faculty_interests: hs_person_faculty_interests - sort: - field: name - direction: asc - auto_create: true - auto_create_bundle: '' -field_type: entity_reference diff --git a/config/default/field.field.node.hs_person.field_hs_person_faculty_status.yml b/config/default/field.field.node.hs_person.field_hs_person_faculty_status.yml index dd2a074a05..78248eed53 100644 --- a/config/default/field.field.node.hs_person.field_hs_person_faculty_status.yml +++ b/config/default/field.field.node.hs_person.field_hs_person_faculty_status.yml @@ -12,7 +12,7 @@ id: node.hs_person.field_hs_person_faculty_status field_name: field_hs_person_faculty_status entity_type: node bundle: hs_person -label: 'Faculty Status' +label: 'Faculty Type' description: '' required: false translatable: false diff --git a/config/default/field.field.node.hs_person.field_hs_person_interests.yml b/config/default/field.field.node.hs_person.field_hs_person_interests.yml new file mode 100644 index 0000000000..16de356957 --- /dev/null +++ b/config/default/field.field.node.hs_person.field_hs_person_interests.yml @@ -0,0 +1,19 @@ +uuid: 2b0ab7b0-b8d9-4ce3-a660-0e3c6407563d +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_hs_person_interests + - node.type.hs_person +id: node.hs_person.field_hs_person_interests +field_name: field_hs_person_interests +entity_type: node +bundle: hs_person +label: 'Field of Interest' +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: string diff --git a/config/default/field.field.node.hs_person.field_hs_person_mail_code.yml b/config/default/field.field.node.hs_person.field_hs_person_mail_code.yml deleted file mode 100644 index b743987d31..0000000000 --- a/config/default/field.field.node.hs_person.field_hs_person_mail_code.yml +++ /dev/null @@ -1,21 +0,0 @@ -uuid: 38ec848c-5e13-42d2-95ea-41da3cb5e933 -langcode: en -status: true -dependencies: - config: - - field.storage.node.field_hs_person_mail_code - - node.type.hs_person -_core: - default_config_hash: b3QtrOxGfXDVh2gtltPbbe4X5Q-8xKjlrddkCOiHIbs -id: node.hs_person.field_hs_person_mail_code -field_name: field_hs_person_mail_code -entity_type: node -bundle: hs_person -label: 'Mail Code' -description: 'This text field displays the 4-digit inter-departmental mail code (e.g., "5230").' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: { } -field_type: string diff --git a/config/default/field.field.node.hs_person.field_hs_person_student_study.yml b/config/default/field.field.node.hs_person.field_hs_person_student_study.yml deleted file mode 100644 index 289ebaaab3..0000000000 --- a/config/default/field.field.node.hs_person.field_hs_person_student_study.yml +++ /dev/null @@ -1,31 +0,0 @@ -uuid: d2351b59-bdff-44ed-b69c-fd056cd77d65 -langcode: en -status: true -dependencies: - config: - - field.storage.node.field_hs_person_student_study - - node.type.hs_person - - taxonomy.vocabulary.hs_person_student_study -_core: - default_config_hash: CHZutons490pvXWJI3MwGN2qy__mGbrS_-nBG40Vzjo -id: node.hs_person.field_hs_person_student_study -field_name: field_hs_person_student_study -entity_type: node -bundle: hs_person -label: 'Field of Study' -description: 'Free tagging for students to list areas of study including research. This free-tagging field provides a place for a student to declare areas of study and provides a stop-gap until the student has a dissertation title.' -required: false -translatable: false -default_value: { } -default_value_callback: '' -settings: - handler: 'default:taxonomy_term' - handler_settings: - target_bundles: - hs_person_student_study: hs_person_student_study - sort: - field: name - direction: asc - auto_create: false - auto_create_bundle: '' -field_type: entity_reference diff --git a/docroot/modules/humsci/hs_person/config/install/field.field.node.hs_person.field_hs_person_faculty_interest.yml b/config/default/field.field.node.hs_person.field_hs_person_student_type.yml similarity index 57% rename from docroot/modules/humsci/hs_person/config/install/field.field.node.hs_person.field_hs_person_faculty_interest.yml rename to config/default/field.field.node.hs_person.field_hs_person_student_type.yml index 988e09a280..6256056fc8 100644 --- a/docroot/modules/humsci/hs_person/config/install/field.field.node.hs_person.field_hs_person_faculty_interest.yml +++ b/config/default/field.field.node.hs_person.field_hs_person_student_type.yml @@ -1,15 +1,16 @@ +uuid: 88590f40-be5a-44ed-b220-7a02abacdc70 langcode: en status: true dependencies: config: - - field.storage.node.field_hs_person_faculty_interest + - field.storage.node.field_hs_person_student_type - node.type.hs_person - - taxonomy.vocabulary.hs_person_faculty_interests -id: node.hs_person.field_hs_person_faculty_interest -field_name: field_hs_person_faculty_interest + - taxonomy.vocabulary.hs_person_student_type +id: node.hs_person.field_hs_person_student_type +field_name: field_hs_person_student_type entity_type: node bundle: hs_person -label: 'Fields of Interest' +label: 'Student Type' description: '' required: false translatable: false @@ -19,7 +20,7 @@ settings: handler: 'default:taxonomy_term' handler_settings: target_bundles: - hs_person_faculty_interests: hs_person_faculty_interests + hs_person_student_type: hs_person_student_type sort: field: name direction: asc diff --git a/config/default/field.storage.node.field_hs_course_academic_career.yml b/config/default/field.storage.node.field_hs_course_academic_career.yml index d1a03a8047..65c5fad849 100644 --- a/config/default/field.storage.node.field_hs_course_academic_career.yml +++ b/config/default/field.storage.node.field_hs_course_academic_career.yml @@ -13,7 +13,7 @@ settings: allowed_values: - value: UG - label: 'Under Graduate' + label: Undergraduate - value: GR label: Graduate diff --git a/config/default/field.storage.node.field_hs_news_byline.yml b/config/default/field.storage.node.field_hs_news_byline.yml deleted file mode 100644 index 23fbb49196..0000000000 --- a/config/default/field.storage.node.field_hs_news_byline.yml +++ /dev/null @@ -1,23 +0,0 @@ -uuid: b569d910-b14e-43aa-8c6c-5b109cd6ce52 -langcode: en -status: true -dependencies: - module: - - node -_core: - default_config_hash: 23K1fpLmO3WfXjzZWzrfFO0D2zPsHl5b0esAnaKzutw -id: node.field_hs_news_byline -field_name: field_hs_news_byline -entity_type: node -type: string -settings: - max_length: 255 - is_ascii: false - case_sensitive: false -module: core -locked: false -cardinality: 1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/config/default/field.storage.node.field_hs_person_external_profile.yml b/config/default/field.storage.node.field_hs_person_external_profile.yml new file mode 100644 index 0000000000..a5ff439898 --- /dev/null +++ b/config/default/field.storage.node.field_hs_person_external_profile.yml @@ -0,0 +1,19 @@ +uuid: a47dbf30-a814-478c-b2e7-3f85e48596d5 +langcode: en +status: true +dependencies: + module: + - link + - node +id: node.field_hs_person_external_profile +field_name: field_hs_person_external_profile +entity_type: node +type: link +settings: { } +module: link +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/default/field.storage.node.field_hs_person_faculty_interest.yml b/config/default/field.storage.node.field_hs_person_faculty_interest.yml deleted file mode 100644 index 8faa6ed494..0000000000 --- a/config/default/field.storage.node.field_hs_person_faculty_interest.yml +++ /dev/null @@ -1,22 +0,0 @@ -uuid: 68c6da1d-00fb-47ea-bd87-b2f20684e596 -langcode: en -status: true -dependencies: - module: - - node - - taxonomy -_core: - default_config_hash: UtBhuaJN1qHZ86knp2dUGuS3N20OVS_R2Re5Dz9IqaQ -id: node.field_hs_person_faculty_interest -field_name: field_hs_person_faculty_interest -entity_type: node -type: entity_reference -settings: - target_type: taxonomy_term -module: core -locked: false -cardinality: -1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/docroot/modules/humsci/hs_person/config/install/field.storage.node.field_hs_person_mail_code.yml b/config/default/field.storage.node.field_hs_person_interests.yml similarity index 67% rename from docroot/modules/humsci/hs_person/config/install/field.storage.node.field_hs_person_mail_code.yml rename to config/default/field.storage.node.field_hs_person_interests.yml index 9d1702a7cd..e5ae105fe8 100644 --- a/docroot/modules/humsci/hs_person/config/install/field.storage.node.field_hs_person_mail_code.yml +++ b/config/default/field.storage.node.field_hs_person_interests.yml @@ -1,10 +1,11 @@ +uuid: b48e75ae-f598-4daf-9eb7-01b91502454f langcode: en status: true dependencies: module: - node -id: node.field_hs_person_mail_code -field_name: field_hs_person_mail_code +id: node.field_hs_person_interests +field_name: field_hs_person_interests entity_type: node type: string settings: @@ -13,7 +14,7 @@ settings: case_sensitive: false module: core locked: false -cardinality: 1 +cardinality: -1 translatable: true indexes: { } persist_with_no_fields: false diff --git a/config/default/field.storage.node.field_hs_person_mail_code.yml b/config/default/field.storage.node.field_hs_person_mail_code.yml deleted file mode 100644 index d9dbe2fca7..0000000000 --- a/config/default/field.storage.node.field_hs_person_mail_code.yml +++ /dev/null @@ -1,23 +0,0 @@ -uuid: 9df72152-7dec-45d9-9751-e90753753973 -langcode: en -status: true -dependencies: - module: - - node -_core: - default_config_hash: hu35jVsoh0sIUmjh-zvNMowVeVMpRNoO7_MYb6Sal2Y -id: node.field_hs_person_mail_code -field_name: field_hs_person_mail_code -entity_type: node -type: string -settings: - max_length: 255 - is_ascii: false - case_sensitive: false -module: core -locked: false -cardinality: 1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/config/default/field.storage.node.field_hs_person_student_study.yml b/config/default/field.storage.node.field_hs_person_student_study.yml deleted file mode 100644 index 493d8da91c..0000000000 --- a/config/default/field.storage.node.field_hs_person_student_study.yml +++ /dev/null @@ -1,22 +0,0 @@ -uuid: 299ff2c4-6cc3-46dd-b3ad-b995606b25c3 -langcode: en -status: true -dependencies: - module: - - node - - taxonomy -_core: - default_config_hash: M9eYPMMGCIAGVmHH7sZDswasrKvogfvLonKyTgPY1G8 -id: node.field_hs_person_student_study -field_name: field_hs_person_student_study -entity_type: node -type: entity_reference -settings: - target_type: taxonomy_term -module: core -locked: false -cardinality: -1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/docroot/modules/humsci/hs_person/config/install/field.storage.node.field_hs_person_faculty_interest.yml b/config/default/field.storage.node.field_hs_person_student_type.yml similarity index 66% rename from docroot/modules/humsci/hs_person/config/install/field.storage.node.field_hs_person_faculty_interest.yml rename to config/default/field.storage.node.field_hs_person_student_type.yml index 63bf2046df..0b0189afd0 100644 --- a/docroot/modules/humsci/hs_person/config/install/field.storage.node.field_hs_person_faculty_interest.yml +++ b/config/default/field.storage.node.field_hs_person_student_type.yml @@ -1,18 +1,19 @@ +uuid: 41331810-5d5e-4122-b47e-da98b50d82cc langcode: en status: true dependencies: module: - node - taxonomy -id: node.field_hs_person_faculty_interest -field_name: field_hs_person_faculty_interest +id: node.field_hs_person_student_type +field_name: field_hs_person_student_type entity_type: node type: entity_reference settings: target_type: taxonomy_term module: core locked: false -cardinality: -1 +cardinality: 1 translatable: true indexes: { } persist_with_no_fields: false diff --git a/config/default/hs_config_prefix.settings.yml b/config/default/hs_config_prefix.settings.yml new file mode 100644 index 0000000000..4ea7af5a55 --- /dev/null +++ b/config/default/hs_config_prefix.settings.yml @@ -0,0 +1,3 @@ +prefix: hs_ +_core: + default_config_hash: 7IIiZ2X-1vn8TFP1bP1PccDc7QgdYCxO2Kbi62fyzPU diff --git a/config/default/node.type.hs_event.yml b/config/default/node.type.hs_event.yml index 9341093b1b..baddb8fcc0 100644 --- a/config/default/node.type.hs_event.yml +++ b/config/default/node.type.hs_event.yml @@ -6,13 +6,14 @@ dependencies: - menu_ui third_party_settings: menu_ui: - available_menus: { } + available_menus: + - main parent: '' _core: default_config_hash: _RqEpKFtMIL9phINGaFF5UMPY919G_-TEZEbMFHaBII name: Event type: hs_event -description: 'An event pulled in from events.stanford.edu.' +description: 'An event pulled in from events.stanford.edu or local event.' help: '' new_revision: true preview_mode: 1 diff --git a/config/default/node.type.hs_person.yml b/config/default/node.type.hs_person.yml index e0304a8ce0..ff9190f577 100644 --- a/config/default/node.type.hs_person.yml +++ b/config/default/node.type.hs_person.yml @@ -12,7 +12,7 @@ _core: default_config_hash: MQCRttPkbCOUhoqxqaW116SLtLiuhARONAz7yqGZAXg name: Person type: hs_person -description: 'A generic person details, staff, faculty, student, or alumni.' +description: 'Person details for staff, faculty, student, or alumni.' help: '' new_revision: true preview_mode: 1 diff --git a/config/default/taxonomy.vocabulary.hs_person_faculty_interests.yml b/config/default/taxonomy.vocabulary.hs_person_faculty_interests.yml deleted file mode 100644 index bc920c95f4..0000000000 --- a/config/default/taxonomy.vocabulary.hs_person_faculty_interests.yml +++ /dev/null @@ -1,11 +0,0 @@ -uuid: ac356fc2-7799-47fc-875d-c70f28c66657 -langcode: en -status: true -dependencies: { } -_core: - default_config_hash: u69fARmmuDCI586QYI4myo0NXXEFcG1-Xp5OSVOXa2k -name: 'Person Faculty Fields of Interest' -vid: hs_person_faculty_interests -description: '' -hierarchy: 0 -weight: 0 diff --git a/config/default/taxonomy.vocabulary.hs_person_faculty_status.yml b/config/default/taxonomy.vocabulary.hs_person_faculty_status.yml index 69b6537fb6..246e9c9561 100644 --- a/config/default/taxonomy.vocabulary.hs_person_faculty_status.yml +++ b/config/default/taxonomy.vocabulary.hs_person_faculty_status.yml @@ -4,7 +4,7 @@ status: true dependencies: { } _core: default_config_hash: wjZjw2RVUez0gJUpJGa2FrUempb_MFt_NM1ZJ0_6PgE -name: 'Person Faculty Status' +name: 'Person Faculty Type' vid: hs_person_faculty_status description: '' hierarchy: 0 diff --git a/config/default/taxonomy.vocabulary.hs_person_student_study.yml b/config/default/taxonomy.vocabulary.hs_person_student_study.yml deleted file mode 100644 index b1e8d9b148..0000000000 --- a/config/default/taxonomy.vocabulary.hs_person_student_study.yml +++ /dev/null @@ -1,11 +0,0 @@ -uuid: f0111e73-63a0-465f-b6af-6d3fd392dac4 -langcode: en -status: true -dependencies: { } -_core: - default_config_hash: jdQuVt3pQZT2DDRg70b3CbrS9a8UwLuk0dop6ZOSOAg -name: 'Person Student Field of Study' -vid: hs_person_student_study -description: '' -hierarchy: 0 -weight: 0 diff --git a/config/default/taxonomy.vocabulary.hs_person_student_type.yml b/config/default/taxonomy.vocabulary.hs_person_student_type.yml new file mode 100644 index 0000000000..4f7ececffd --- /dev/null +++ b/config/default/taxonomy.vocabulary.hs_person_student_type.yml @@ -0,0 +1,9 @@ +uuid: 673663c6-479e-4227-ad69-0e656a8e5697 +langcode: en +status: true +dependencies: { } +name: 'Person Student Type' +vid: hs_person_student_type +description: '' +hierarchy: 0 +weight: 0 diff --git a/config/default/views.view.media_entity_browser.yml b/config/default/views.view.media_entity_browser.yml index 1b77d5cfc2..6aa93777c4 100644 --- a/config/default/views.view.media_entity_browser.yml +++ b/config/default/views.view.media_entity_browser.yml @@ -4,12 +4,14 @@ status: true dependencies: config: - core.entity_view_mode.media.thumbnail + - field.storage.media.field_media_image - media.type.file - media.type.image - media.type.video module: - entity_browser - entity_usage + - image - media - stanford_media - user @@ -33,7 +35,7 @@ display: access: type: perm options: - perm: 'access media_browser entity browser pages' + perm: 'administer entity browsers' cache: type: none options: { } @@ -407,6 +409,7 @@ display: operator: AND groups: 1: AND + use_ajax: true cache_metadata: max-age: -1 contexts: @@ -417,10 +420,15 @@ display: - user.permissions tags: - 'config:core.entity_view_display.media.file.default' + - extensions - 'config:core.entity_view_display.media.image.default' + - extensions - 'config:core.entity_view_display.media.image.thumbnail' + - extensions - 'config:core.entity_view_display.media.video.default' + - extensions - 'config:core.entity_view_display.media.video.full' + - extensions file_browser: display_plugin: entity_browser id: file_browser @@ -432,6 +440,7 @@ display: arguments: true filters: false filter_groups: false + access: false display_description: '' filters: name: @@ -533,6 +542,10 @@ display: operator: AND groups: 1: AND + access: + type: perm + options: + perm: 'access file_browser entity browser pages' cache_metadata: max-age: -1 contexts: @@ -543,10 +556,15 @@ display: - user.permissions tags: - 'config:core.entity_view_display.media.file.default' + - extensions - 'config:core.entity_view_display.media.image.default' + - extensions - 'config:core.entity_view_display.media.image.thumbnail' + - extensions - 'config:core.entity_view_display.media.video.default' + - extensions - 'config:core.entity_view_display.media.video.full' + - extensions image_browser: display_plugin: entity_browser id: image_browser @@ -558,6 +576,7 @@ display: arguments: true filters: false filter_groups: false + access: false display_description: '' filters: name: @@ -659,6 +678,10 @@ display: operator: AND groups: 1: AND + access: + type: perm + options: + perm: 'access image_browser entity browser pages' cache_metadata: max-age: -1 contexts: @@ -669,19 +692,30 @@ display: - user.permissions tags: - 'config:core.entity_view_display.media.file.default' + - extensions - 'config:core.entity_view_display.media.image.default' + - extensions - 'config:core.entity_view_display.media.image.thumbnail' + - extensions - 'config:core.entity_view_display.media.video.default' + - extensions - 'config:core.entity_view_display.media.video.full' + - extensions media_browser: display_plugin: entity_browser id: media_browser - display_title: 'Entity browser' + display_title: 'Media browser' position: 1 display_options: display_extenders: { } defaults: arguments: true + access: false + access: + type: perm + options: + perm: 'access media_browser entity browser pages' + display_description: '' cache_metadata: max-age: -1 contexts: @@ -692,10 +726,15 @@ display: - user.permissions tags: - 'config:core.entity_view_display.media.file.default' + - extensions - 'config:core.entity_view_display.media.image.default' + - extensions - 'config:core.entity_view_display.media.image.thumbnail' + - extensions - 'config:core.entity_view_display.media.video.default' + - extensions - 'config:core.entity_view_display.media.video.full' + - extensions use_detail: display_plugin: page id: use_detail @@ -823,6 +862,7 @@ display: title: false style: false row: false + access: false arguments: mid: id: mid @@ -933,6 +973,10 @@ display: separator: '' hide_empty: false default_field_elements: true + access: + type: perm + options: + perm: 'access media overview' cache_metadata: max-age: -1 contexts: @@ -970,6 +1014,7 @@ display: filter_groups: false style: false row: false + access: false fields: media_bulk_form: id: media_bulk_form @@ -1271,6 +1316,71 @@ display: entity_type: media entity_field: bundle plugin_id: field + field_media_image: + id: field_media_image + table: media__field_media_image + field: field_media_image + relationship: none + group_type: group + admin_label: '' + label: 'Alternative Text' + exclude: false + alter: + alter_text: true + text: '{{ field_media_image__alt }}' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: false + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: alt + type: image + settings: + image_style: '' + image_link: '' + group_column: target_id + group_columns: + alt: alt + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + plugin_id: field uid: id: uid table: media_field_data @@ -1632,6 +1742,7 @@ display: changed: changed count: count operations: operations + field_media_image: field_media_image info: media_bulk_form: align: '' @@ -1692,6 +1803,13 @@ display: separator: '' empty_column: false responsive: '' + field_media_image: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: true + responsive: '' default: changed empty_table: false row: @@ -1701,8 +1819,12 @@ display: separator: '' hide_empty: false default_field_elements: true + access: + type: perm + options: + perm: 'access media overview' cache_metadata: - max-age: -1 + max-age: 0 contexts: - 'languages:language_content' - 'languages:language_interface' @@ -1715,6 +1837,8 @@ display: - 'config:core.entity_view_display.media.image.thumbnail' - 'config:core.entity_view_display.media.video.default' - 'config:core.entity_view_display.media.video.full' + - 'config:field.storage.media.field_media_image' + - extensions video_browser: display_plugin: entity_browser id: video_browser @@ -1726,6 +1850,7 @@ display: arguments: true filters: false filter_groups: false + access: false display_description: '' filters: name: @@ -1827,6 +1952,10 @@ display: operator: AND groups: 1: AND + access: + type: perm + options: + perm: 'access video_browser entity browser pages' cache_metadata: max-age: -1 contexts: @@ -1837,7 +1966,12 @@ display: - user.permissions tags: - 'config:core.entity_view_display.media.file.default' + - extensions - 'config:core.entity_view_display.media.image.default' + - extensions - 'config:core.entity_view_display.media.image.thumbnail' + - extensions - 'config:core.entity_view_display.media.video.default' + - extensions - 'config:core.entity_view_display.media.video.full' + - extensions diff --git a/config/default/views.view.user_admin_people.yml b/config/default/views.view.user_admin_people.yml index 0260ab55e4..ab736dd329 100644 --- a/config/default/views.view.user_admin_people.yml +++ b/config/default/views.view.user_admin_people.yml @@ -7,9 +7,9 @@ dependencies: _core: default_config_hash: wTJRNzsLVTenCALONNlVfgm_pBOlqucSPuVFLOD56ck id: user_admin_people -label: People +label: Users module: user -description: 'Find and manage people interacting with your site.' +description: 'Find and manage users interacting with your site.' tag: default base_table: users_field_data base_field: uid @@ -842,7 +842,7 @@ display: plugin_id: date entity_type: user entity_field: created - title: People + title: Users empty: area_text_custom: id: area_text_custom @@ -853,7 +853,7 @@ display: admin_label: '' empty: true tokenize: false - content: 'No people available.' + content: 'No users available.' plugin_id: text_custom use_more: false use_more_always: false @@ -886,18 +886,18 @@ display: display_title: Page position: 1 display_options: - path: admin/people/list + path: admin/users/list show_admin_links: false menu: type: 'default tab' title: List - description: 'Find and manage people interacting with your site.' + description: 'Find and manage users interacting with your site.' menu_name: admin weight: -10 context: '' tab_options: type: normal - title: People + title: Users description: 'Manage user accounts, roles, and permissions.' menu_name: admin weight: 0 diff --git a/config/envs/ci/config_ignore.settings.yml b/config/envs/ci/config_ignore.settings.yml deleted file mode 100644 index f528b26efe..0000000000 --- a/config/envs/ci/config_ignore.settings.yml +++ /dev/null @@ -1,8 +0,0 @@ -ignored_config_entities: - - 'core.entity_view_display.node.hs_*.default' - - 'core.entity_form_display.node.hs_*' - - 'menu_position.menu_position_rule.*' - - 'user.role.*:permissions' - - system.site -_core: - default_config_hash: UVH1aJ4b44UM-VdPVN7hNNuuVqfReJxwfVeDQH1Hvsk diff --git a/config/default/rest.resource.hs_bugherd_resource.yml b/config/envs/ci/rest.resource.hs_bugherd_resource.yml similarity index 100% rename from config/default/rest.resource.hs_bugherd_resource.yml rename to config/envs/ci/rest.resource.hs_bugherd_resource.yml diff --git a/config/envs/ci/rest.resource.hs_bugherd_resource_bugherd.yml b/config/envs/ci/rest.resource.hs_bugherd_resource_bugherd.yml new file mode 100644 index 0000000000..ddd391fdf3 --- /dev/null +++ b/config/envs/ci/rest.resource.hs_bugherd_resource_bugherd.yml @@ -0,0 +1,19 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c2 +langcode: en +status: true +dependencies: + module: + - hs_bugherd + - serialization + - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec +id: hs_bugherd_resource_bugherd +plugin_id: hs_bugherd_resource_bugherd +granularity: method +configuration: + POST: + supported_formats: + - json + supported_auth: + - cookie diff --git a/config/envs/ci/rest.resource.hs_bugherd_resource_jira.yml b/config/envs/ci/rest.resource.hs_bugherd_resource_jira.yml new file mode 100644 index 0000000000..0048278fd1 --- /dev/null +++ b/config/envs/ci/rest.resource.hs_bugherd_resource_jira.yml @@ -0,0 +1,19 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c3 +langcode: en +status: true +dependencies: + module: + - hs_bugherd + - serialization + - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec +id: hs_bugherd_resource_jira +plugin_id: hs_bugherd_resource_jira +granularity: method +configuration: + POST: + supported_formats: + - json + supported_auth: + - cookie diff --git a/config/envs/dev/.htaccess b/config/envs/dev/.htaccess new file mode 100644 index 0000000000..0e4a69afd2 --- /dev/null +++ b/config/envs/dev/.htaccess @@ -0,0 +1,24 @@ +# Deny all requests from Apache 2.4+. + + Require all denied + + +# Deny all requests from Apache 2.0-2.2. + + Deny from all + + +# Turn off all options we don't need. +Options -Indexes -ExecCGI -Includes -MultiViews + +# Set the catch-all handler to prevent scripts from being executed. +SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006 + + # Override the handler again if we're run later in the evaluation list. + SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003 + + +# If we know how to do it safely, disable the PHP engine entirely. + + php_flag engine off + \ No newline at end of file diff --git a/config/envs/local/config_ignore.settings.yml b/config/envs/local/config_ignore.settings.yml new file mode 100644 index 0000000000..1c96b88d3e --- /dev/null +++ b/config/envs/local/config_ignore.settings.yml @@ -0,0 +1,12 @@ +ignored_config_entities: + - 'system.theme:default' + - 'core.extension:theme' + - 'block.block.*' + - '~block.block.su_humsci_theme_*' + - '~block.block.su_humsci_admin_*' + - '~block.block.seven_*' + - 'bugherd_api.settings:project_key' + - system.site +enable_export_filtering: '1' +_core: + default_config_hash: UVH1aJ4b44UM-VdPVN7hNNuuVqfReJxwfVeDQH1Hvsk diff --git a/config/envs/prod/hs_bugherd.bugherd.archaeology.yml b/config/envs/prod/hs_bugherd.bugherd.archaeology.yml new file mode 100644 index 0000000000..76dfb23333 --- /dev/null +++ b/config/envs/prod/hs_bugherd.bugherd.archaeology.yml @@ -0,0 +1,14 @@ +uuid: bd4bdc93-2fe6-4000-a254-363f1d5e84ad +langcode: en +status: true +dependencies: { } +id: archaeology +label: Archaeology +bugherdProject: 144496 +jiraProject: ARCH +statusMap: + backlog: '10301' + todo: '10901' + doing: '3' + done: '10801' + closed: '6,10000,10002' diff --git a/config/envs/prod/hs_bugherd.bugherd.hs_product.yml b/config/envs/prod/hs_bugherd.bugherd.hs_product.yml new file mode 100644 index 0000000000..a65f74833c --- /dev/null +++ b/config/envs/prod/hs_bugherd.bugherd.hs_product.yml @@ -0,0 +1,14 @@ +uuid: 3ae49db4-5131-4274-a4e8-37137575d8df +langcode: en +status: true +dependencies: { } +id: hs_product +label: 'H&S Product' +bugherdProject: 146572 +jiraProject: HSD8 +statusMap: + backlog: '10301' + todo: '10901' + doing: '3' + done: '10801' + closed: '6,10000,10002' diff --git a/config/envs/prod/hs_bugherd.connection_settings.yml b/config/envs/prod/hs_bugherd.connection_settings.yml new file mode 100644 index 0000000000..a1df2cf7f5 --- /dev/null +++ b/config/envs/prod/hs_bugherd.connection_settings.yml @@ -0,0 +1,4 @@ +dependencies: + config: + - key.key.bugherd_api_key +api_key: bugherd_api_key diff --git a/config/envs/prod/hs_config_prefix.settings.yml b/config/envs/prod/hs_config_prefix.settings.yml new file mode 100644 index 0000000000..bd2bee6d48 --- /dev/null +++ b/config/envs/prod/hs_config_prefix.settings.yml @@ -0,0 +1,3 @@ +prefix: custm_ +_core: + default_config_hash: 7IIiZ2X-1vn8TFP1bP1PccDc7QgdYCxO2Kbi62fyzPU diff --git a/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource.yml b/config/envs/prod/rest.resource.hs_bugherd_resource.yml similarity index 69% rename from docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource.yml rename to config/envs/prod/rest.resource.hs_bugherd_resource.yml index 91b0e84783..30f7f80ab8 100644 --- a/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource.yml +++ b/config/envs/prod/rest.resource.hs_bugherd_resource.yml @@ -1,3 +1,4 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c2 langcode: en status: true dependencies: @@ -5,6 +6,8 @@ dependencies: - hs_bugherd - serialization - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec id: hs_bugherd_resource plugin_id: hs_bugherd_resource granularity: method diff --git a/config/envs/prod/rest.resource.hs_bugherd_resource_bugherd.yml b/config/envs/prod/rest.resource.hs_bugherd_resource_bugherd.yml new file mode 100644 index 0000000000..ddd391fdf3 --- /dev/null +++ b/config/envs/prod/rest.resource.hs_bugherd_resource_bugherd.yml @@ -0,0 +1,19 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c2 +langcode: en +status: true +dependencies: + module: + - hs_bugherd + - serialization + - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec +id: hs_bugherd_resource_bugherd +plugin_id: hs_bugherd_resource_bugherd +granularity: method +configuration: + POST: + supported_formats: + - json + supported_auth: + - cookie diff --git a/config/envs/prod/rest.resource.hs_bugherd_resource_jira.yml b/config/envs/prod/rest.resource.hs_bugherd_resource_jira.yml new file mode 100644 index 0000000000..0048278fd1 --- /dev/null +++ b/config/envs/prod/rest.resource.hs_bugherd_resource_jira.yml @@ -0,0 +1,19 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c3 +langcode: en +status: true +dependencies: + module: + - hs_bugherd + - serialization + - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec +id: hs_bugherd_resource_jira +plugin_id: hs_bugherd_resource_jira +granularity: method +configuration: + POST: + supported_formats: + - json + supported_auth: + - cookie diff --git a/config/envs/stage/config_ignore.settings.yml b/config/envs/stage/config_ignore.settings.yml deleted file mode 100644 index abc5b8b45e..0000000000 --- a/config/envs/stage/config_ignore.settings.yml +++ /dev/null @@ -1,10 +0,0 @@ -ignored_config_entities: - - 'core.entity_view_display.node.hs_*.default' - - 'core.entity_form_display.node.hs_*' - - 'menu_position.menu_position_rule.*' - - 'google_analytics.settings' - - 'user.role.*:permissions' - - 'views.view.hs_*:status' - - system.site -_core: - default_config_hash: UVH1aJ4b44UM-VdPVN7hNNuuVqfReJxwfVeDQH1Hvsk diff --git a/config/envs/stage/field_ui.settings.yml b/config/envs/stage/field_ui.settings.yml index 4d0fe6b26d..274396991d 100644 --- a/config/envs/stage/field_ui.settings.yml +++ b/config/envs/stage/field_ui.settings.yml @@ -1,3 +1,3 @@ -field_prefix: custm_ +field_prefix: field_ _core: default_config_hash: Q1nMi90W6YQxKzZAgJQw7Ag9U4JrsEUwkomF0lhvbIM diff --git a/config/francestanford/config_split.config_split.francestanford.yml b/config/francestanford/config_split.config_split.francestanford.yml index ac2faedc69..6f83be27fb 100644 --- a/config/francestanford/config_split.config_split.francestanford.yml +++ b/config/francestanford/config_split.config_split.francestanford.yml @@ -4,6 +4,7 @@ status: false dependencies: { } id: francestanford label: 'France Stanford' +description: '' folder: ../config/francestanford module: { } theme: { } @@ -11,7 +12,8 @@ blacklist: - config_split.config_split.francestanford - 'menu_position.menu_position_rule.*' graylist: - - '*' + - migrate_plus.migration.hs_events_importer + - migrate_plus.migration.hs_events_image_importer graylist_dependents: false graylist_skip_equal: true weight: 10 diff --git a/config/francestanford/system.site.yml b/config/francestanford/system.site.yml deleted file mode 100644 index ad801f0fe1..0000000000 --- a/config/francestanford/system.site.yml +++ /dev/null @@ -1,14 +0,0 @@ -uuid: df7ecefc-c0c2-490f-ab5b-35211eba5be4 -name: 'FRANCE-STANFORD CENTER FOR INTERDISCIPLINARY STUDIES' -mail: pookmish@stanford.edu -slogan: 'School of Humanities & Sciences' -page: - 403: '' - 404: '' - front: /user -admin_compact_mode: false -weight_select_max: 100 -langcode: en -default_langcode: en -_core: - default_config_hash: yIkT6J-_K6qcEfo4ttMoLrwre-hS49g92otsRf4Hl14 diff --git a/config/swshumsci_sandbox/config_split.config_split.swshumsci_sandbox.yml b/config/swshumsci_sandbox/config_split.config_split.swshumsci_sandbox.yml deleted file mode 100644 index d5248fddd7..0000000000 --- a/config/swshumsci_sandbox/config_split.config_split.swshumsci_sandbox.yml +++ /dev/null @@ -1,17 +0,0 @@ -uuid: 1e0bd1f9-ce83-4b7d-9e5c-d10011665b3d -langcode: en -status: false -dependencies: { } -id: swshumsci_sandbox -label: SWSHumsci Sandbox -folder: ../config/swshumsci_sandbox -module: { } -theme: { } -blacklist: - - config_split.config_split.swshumsci_sandbox - - 'menu_position.menu_position_rule.*' -graylist: - - '*' -graylist_dependents: false -graylist_skip_equal: true -weight: 10 diff --git a/config/swshumsci_sandbox/system.site.yml b/config/swshumsci_sandbox/system.site.yml deleted file mode 100644 index 72e81aa541..0000000000 --- a/config/swshumsci_sandbox/system.site.yml +++ /dev/null @@ -1,14 +0,0 @@ -uuid: df7ecefc-c0c2-490f-ab5b-35211eba5be4 -name: 'France-Stanford Center for Interdisciplinary Studies' -mail: pookmish@stanford.edu -slogan: 'School of Humanities & Sciences' -page: - 403: '' - 404: '' - front: /user -admin_compact_mode: false -weight_select_max: 100 -langcode: en -default_langcode: en -_core: - default_config_hash: yIkT6J-_K6qcEfo4ttMoLrwre-hS49g92otsRf4Hl14 diff --git a/docroot/modules/humsci/hs_basic_page/hs_basic_page.info.yml b/docroot/modules/humsci/hs_basic_page/hs_basic_page.info.yml index 26f18df060..1bcd51744d 100755 --- a/docroot/modules/humsci/hs_basic_page/hs_basic_page.info.yml +++ b/docroot/modules/humsci/hs_basic_page/hs_basic_page.info.yml @@ -2,7 +2,7 @@ name: 'H&S Basic Page' description: 'Basic Page content type' core: 8.x type: module -version: 8.0.10 +version: 8.0.11 package: 'Humanities & Sciences' dependencies: - entity_reference_revisions diff --git a/docroot/modules/humsci/hs_basic_page/modules/hs_basic_page_display/hs_basic_page_display.info.yml b/docroot/modules/humsci/hs_basic_page/modules/hs_basic_page_display/hs_basic_page_display.info.yml index 47441439d0..a5c5d51e59 100755 --- a/docroot/modules/humsci/hs_basic_page/modules/hs_basic_page_display/hs_basic_page_display.info.yml +++ b/docroot/modules/humsci/hs_basic_page/modules/hs_basic_page_display/hs_basic_page_display.info.yml @@ -2,7 +2,7 @@ name: 'H&S Basic Page Display' description: 'Basic Page content type' core: 8.x type: module -version: 8.0.10 +version: 8.0.11 package: 'Humanities & Sciences' hidden: true dependencies: diff --git a/docroot/modules/humsci/hs_blocks/hs_blocks.info.yml b/docroot/modules/humsci/hs_blocks/hs_blocks.info.yml index dc81f3af84..3a14482905 100644 --- a/docroot/modules/humsci/hs_blocks/hs_blocks.info.yml +++ b/docroot/modules/humsci/hs_blocks/hs_blocks.info.yml @@ -2,7 +2,7 @@ name: 'H&S Blocks' type: module description: 'Custom blocks for Humsci' core: 8.x -version: 8.0.10 +version: 8.0.11 package: 'Humanities & Sciences' dependencies: - block diff --git a/docroot/modules/humsci/hs_bugherd/config/install/bugherdapi.settings.yml b/docroot/modules/humsci/hs_bugherd/config/install/bugherdapi.settings.yml index eeb7a2f941..26191dfab7 100644 --- a/docroot/modules/humsci/hs_bugherd/config/install/bugherdapi.settings.yml +++ b/docroot/modules/humsci/hs_bugherd/config/install/bugherdapi.settings.yml @@ -1,14 +1,16 @@ dependencies: config: - key.key.bugherd_api_key -project_key: lg5tp4ieu5uuxi19eanj5a +project_key: mukcpzcqeud9mq9husfaqa disable_on_admin: 0 api_key: bugherd_api_key -jira_project: ARCH -project_id: '144496' +jira_project: HSD8 +project_id: '146572' status_map: backlog: '10301' todo: '10901' doing: '3' done: '10801' - closed: '6,10002' + closed: '6,10000,10002' +_core: + default_config_hash: at0oXAcX1yzJqjUuDnySiImZzF3g14RSYlMlaTPnfA0 diff --git a/docroot/modules/humsci/hs_bugherd/config/install/key.key.bugherd_api_key.yml b/docroot/modules/humsci/hs_bugherd/config/install/key.key.bugherd_api_key.yml index d1d496f5eb..9bf8d01194 100644 --- a/docroot/modules/humsci/hs_bugherd/config/install/key.key.bugherd_api_key.yml +++ b/docroot/modules/humsci/hs_bugherd/config/install/key.key.bugherd_api_key.yml @@ -1,10 +1,13 @@ +uuid: 61918c04-76a5-41ce-8f78-93458dc0aa22 langcode: en status: true dependencies: config: - encrypt.profile.real_aes module: - - hs_bugherd + - key_encrypt +_core: + default_config_hash: 1jgMVdGks2LWcTxML1lSdo4oKewC3iZRroM-6utBI0s id: bugherd_api_key label: 'Bugherd API Key' description: '' @@ -13,6 +16,6 @@ key_type_settings: { } key_provider: encrypted_config key_provider_settings: encryption_profile: real_aes - key_value: def50200eca558b35d8323c1032117fa21bf2472b64c112f03361a7fd2f5bafe51e243ebd13d11f1411649c36b5af7676f567fd4252295b97a1001f3b04d2d85d87b914235558ad8656e0c8ce9c41f95a6a13de581346bee06350a2fda4a9316abb3552b493c1df8a3cb + key_value: def50200a7a1858ce6a8fe5d465dc1324ba53ac3c185e740263a6751d330cfd48fd99a44c876036b232421300e4a3f4f4dc0355dc84a0140911e90e64f3667e6390739e5a6204aba79390843288058e54f99dd791df0314afeb04b2952a695876493b9d33043daca8698 key_input: text_field key_input_settings: { } diff --git a/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource_bugherd.yml b/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource_bugherd.yml new file mode 100644 index 0000000000..ddd391fdf3 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource_bugherd.yml @@ -0,0 +1,19 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c2 +langcode: en +status: true +dependencies: + module: + - hs_bugherd + - serialization + - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec +id: hs_bugherd_resource_bugherd +plugin_id: hs_bugherd_resource_bugherd +granularity: method +configuration: + POST: + supported_formats: + - json + supported_auth: + - cookie diff --git a/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource_jira.yml b/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource_jira.yml new file mode 100644 index 0000000000..0048278fd1 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/config/install/rest.resource.hs_bugherd_resource_jira.yml @@ -0,0 +1,19 @@ +uuid: eddf0d9a-b688-4bf5-a170-ce0b622856c3 +langcode: en +status: true +dependencies: + module: + - hs_bugherd + - serialization + - user +_core: + default_config_hash: Jhgjr4bvQhJf8DKrRHIB6GCf1EfX3yOFe_XGoDBpZec +id: hs_bugherd_resource_jira +plugin_id: hs_bugherd_resource_jira +granularity: method +configuration: + POST: + supported_formats: + - json + supported_auth: + - cookie diff --git a/docroot/modules/humsci/hs_bugherd/config/schema/hs_bugherd.schema.yml b/docroot/modules/humsci/hs_bugherd/config/schema/hs_bugherd.schema.yml new file mode 100644 index 0000000000..d8bfcc4488 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/config/schema/hs_bugherd.schema.yml @@ -0,0 +1,45 @@ +hs_bugherd.connection_settings: + type: config_entity + label: 'Bugherd Connection Settings' + mapping: + api_key: + type: string + label: 'Key' + +hs_bugherd.bugherd.*: + type: config_entity + label: 'Bugherd Connection config' + mapping: + uuid: + type: string + id: + type: string + label: 'ID' + label: + type: label + label: 'Label' + bugherdProject: + type: integer + label: 'Project ID' + jiraProject: + type: string + label: 'Jira Project' + statusMap: + type: mapping + label: 'Jira Status Map' + mapping: + backlog: + type: string + label: 'Backlog' + todo: + type: string + label: 'ToDo' + doing: + type: string + label: 'Doing' + done: + type: string + label: 'Done' + closed: + type: string + label: 'Closed' diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.info.yml b/docroot/modules/humsci/hs_bugherd/hs_bugherd.info.yml index ce67159a0f..4925e6cecd 100644 --- a/docroot/modules/humsci/hs_bugherd/hs_bugherd.info.yml +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.info.yml @@ -2,7 +2,7 @@ name: 'H&S Bugherd' description: 'Bugherd API connection with JIRA' core: 8.x type: module -version: 8.0.10 +version: 8.0.11 package: 'Humanities & Sciences' dependencies: - encrypt diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.install b/docroot/modules/humsci/hs_bugherd/hs_bugherd.install new file mode 100644 index 0000000000..d378d831e9 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.install @@ -0,0 +1,28 @@ +getEditable('rest.resource.hs_bugherd_resource') + ->delete(); + + $source = new FileStorage(drupal_get_path('module', 'hs_bugherd') . '/config/install'); + /** @var \Drupal\Core\Config\CachedStorage $config_storage */ + $config_storage = \Drupal::service('config.storage'); + $config_names = [ + 'rest.resource.hs_bugherd_resource_bugherd', + 'rest.resource.hs_bugherd_resource_jira', + ]; + foreach ($config_names as $name) { + $config_storage->write($name, $source->read($name)); + } +} diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.action.yml b/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.action.yml new file mode 100644 index 0000000000..954fef1836 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.action.yml @@ -0,0 +1,6 @@ +entity.bugherd.add_form: + route_name: entity.bugherd_connection.add_form + title: 'Add Bugherd Connection' + appears_on: + - entity.bugherd_connection.collection + diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.menu.yml b/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.menu.yml new file mode 100644 index 0000000000..1142c06e17 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.menu.yml @@ -0,0 +1,7 @@ + +# Bugherd Connection menu items definition +entity.bugherd_connection.collection: + title: 'Bugherd Connection' + route_name: entity.bugherd_connection.collection + description: 'List Bugherd Connection (bundles)' + parent: system.admin_config_services diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.task.yml b/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.task.yml index ed54d1a963..8cb23c516a 100644 --- a/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.task.yml +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.links.task.yml @@ -1,22 +1,15 @@ -hs_bugherd.config: - route_name: bugherdapi.bugherd_configuration_form - title: 'Bugherd Configuration' - base_route: bugherdapi.bugherd_configuration_form +entity.bugherd_connection.collection: + route_name: entity.bugherd_connection.collection + title: 'Bugherd Connections' + base_route: entity.bugherd_connection.collection -hs_bugherd.api: - route_name: hs_bugherd.api - title: 'Bugherd REST' - base_route: bugherdapi.bugherd_configuration_form - weight: 100 - -hs_bugherd.jira: - route_name: jira_rest.config - title: 'Jira REST' - base_route: bugherdapi.bugherd_configuration_form - weight: 200 +hs_bugherd.connection_settings: + route_name: hs_bugherd.bugherd_connection_settings_form + title: 'Bugherd Connection Settings' + base_route: entity.bugherd_connection.collection hs_bugherd.webhooks: route_name: hs_bugherd.webhooks title: 'Webhooks' - base_route: bugherdapi.bugherd_configuration_form + base_route: entity.bugherd_connection.collection weight: 300 diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.routing.yml b/docroot/modules/humsci/hs_bugherd/hs_bugherd.routing.yml index 43a8772db7..dee189829e 100644 --- a/docroot/modules/humsci/hs_bugherd/hs_bugherd.routing.yml +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.routing.yml @@ -1,15 +1,6 @@ -hs_bugherd.api: - path: '/admin/config/system/bugherd/api' - defaults: - _form: '\Drupal\hs_bugherd\Form\HsBugherdForm' - _title: 'Bugherd Jira API' - requirements: - _permission: 'administer bugherd' - options: - _admin_route: TRUE hs_bugherd.webhooks: - path: '/admin/config/system/bugherd/hooks' + path: '/admin/config/services/bugherd/hooks' defaults: _form: '\Drupal\hs_bugherd\Form\HsBugherdHooksForm' _title: 'Bugherd Jira Webhooks' @@ -17,3 +8,12 @@ hs_bugherd.webhooks: _permission: 'administer bugherd' options: _admin_route: TRUE + +hs_bugherd.bugherd_connection_settings_form: + path: '/admin/config/services/bugherd/settings' + defaults: + _form: '\Drupal\hs_bugherd\Form\BugherdConnectionSettingsForm' + _title: 'BugherdConnectionSettingsForm' + requirements: + _access: 'TRUE' + diff --git a/docroot/modules/humsci/hs_bugherd/hs_bugherd.services.yml b/docroot/modules/humsci/hs_bugherd/hs_bugherd.services.yml index 22a3670586..a11dbfd823 100644 --- a/docroot/modules/humsci/hs_bugherd/hs_bugherd.services.yml +++ b/docroot/modules/humsci/hs_bugherd/hs_bugherd.services.yml @@ -1,9 +1,4 @@ services: hs_bugherd: class: Drupal\hs_bugherd\HsBugherd - arguments: ['@jira_rest_wrapper_service'] - hs_bugherd.overrider: - class: Drupal\hs_bugherd\Overrides\ConfigOverrides - arguments: ['@module_handler', '@config.factory', '@encryption'] - tags: - - {name: config.factory.override, priority: 5} + arguments: ['@cache.default'] diff --git a/docroot/modules/humsci/hs_bugherd/src/BugherdConnectionListBuilder.php b/docroot/modules/humsci/hs_bugherd/src/BugherdConnectionListBuilder.php new file mode 100644 index 0000000000..795a51c3d9 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/src/BugherdConnectionListBuilder.php @@ -0,0 +1,67 @@ +get('entity.manager')->getStorage($entity_type->id()), + $container->get('hs_bugherd') + ); + } + + /** + * {@inheritdoc} + */ + public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, HsBugherd $bugherd_api) { + parent::__construct($entity_type, $storage); + $this->bugherdApi = $bugherd_api; + } + + /** + * {@inheritdoc} + */ + public function buildHeader() { + $header = [ + 'label' => $this->t('Name'), + 'bugherd' => $this->t('Bugherd Project'), + 'jira' => $this->t('Jira Project'), + 'url' => $this->t('Url'), + ]; + return $header + parent::buildHeader(); + } + + /** + * {@inheritdoc} + */ + public function buildRow(EntityInterface $entity) { + $row['label'] = $entity->label(); + $project = $this->bugherdApi->getProject($entity->getBugherdProject()); + $row['bugherd'] = $project['name']; + $row['jira'] = $entity->getJiraProject(); + $row['url'] = $project['devurl']; + return $row + parent::buildRow($entity); + } + +} diff --git a/docroot/modules/humsci/hs_bugherd/src/Entity/BugherdConnection.php b/docroot/modules/humsci/hs_bugherd/src/Entity/BugherdConnection.php new file mode 100644 index 0000000000..443c00ba06 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/src/Entity/BugherdConnection.php @@ -0,0 +1,111 @@ +bugherdProject; + } + + /** + * {@inheritdoc} + */ + public function getStatusMap() { + return $this->statusMap; + } + + /** + * {@inheritdoc} + */ + public function getJiraProject() { + return $this->jiraProject; + } + + /** + * {@inheritdoc} + */ + public function getBugherdStatus($jira_status) { + foreach ($this->statusMap as $bugherd_status => $jira) { + $jira = explode(',', $jira); + if (in_array($jira_status, $jira)) { + return $bugherd_status; + } + } + } + +} diff --git a/docroot/modules/humsci/hs_bugherd/src/Entity/BugherdConnectionInterface.php b/docroot/modules/humsci/hs_bugherd/src/Entity/BugherdConnectionInterface.php new file mode 100644 index 0000000000..3d268fdd17 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/src/Entity/BugherdConnectionInterface.php @@ -0,0 +1,47 @@ + jira statuses. + */ + public function getStatusMap(); + + /** + * Get the appropriate bugherd status mapped to the given jira status. + * + * @param int $jira_status + * The status ID in Jira. + * + * @return string|null + * Bugherd status. + */ + public function getBugherdStatus($jira_status); + +} diff --git a/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionDeleteForm.php b/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionDeleteForm.php new file mode 100644 index 0000000000..e3b71ee60a --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionDeleteForm.php @@ -0,0 +1,45 @@ +t('Are you sure you want to delete %name?', ['%name' => $this->entity->label()]); + } + + /** + * {@inheritdoc} + */ + public function getCancelUrl() { + return new Url('entity.bugherd_connection.collection'); + } + + /** + * {@inheritdoc} + */ + public function getConfirmText() { + return $this->t('Delete'); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $this->entity->delete(); + $this->messenger() + ->addMessage($this->t('@label deleted.', ['@label' => $this->entity->label()])); + $form_state->setRedirectUrl($this->getCancelUrl()); + } + +} diff --git a/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionForm.php b/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionForm.php new file mode 100644 index 0000000000..80983370b4 --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionForm.php @@ -0,0 +1,225 @@ +get('hs_bugherd') + ); + } + + /** + * {@inheritdoc} + */ + public function __construct(HsBugherd $bugherd_api) { + $this->bugherdApi = $bugherd_api; + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state) { + // If connection to Bugherd fails, tell the user. + if (!$this->bugherdApi->isConnectionSuccessful()) { + $link = Link::createFromRoute('API settings', 'hs_bugherd.bugherd_connection_settings_form') + ->toString(); + return ['#markup' => '

' . $this->t('No connection to Bugherd. Please configure the @link.', ['@link' => $link]) . '

']; + } + + // If no bugherd projects are available, tell the user and don't allow them + // to enter any additional information. + if (empty($this->getAvailableBugherdProjects())) { + return ['#markup' => '

' . $this->t('No available bugherd projects') . '

']; + } + return parent::buildForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function form(array $form, FormStateInterface $form_state) { + $form = parent::form($form, $form_state); + + /** @var \Drupal\hs_bugherd\Entity\BugherdConnection $bugherd */ + $bugherd = $this->entity; + + $form['label'] = [ + '#type' => 'textfield', + '#title' => $this->t('Label'), + '#maxlength' => 255, + '#default_value' => $bugherd->label(), + '#description' => $this->t("Label for the Bugherd Connection."), + '#required' => TRUE, + ]; + $form['id'] = [ + '#type' => 'machine_name', + '#default_value' => $bugherd->id(), + '#machine_name' => ['exists' => '\Drupal\hs_bugherd\Entity\BugherdConnection::load'], + '#disabled' => !$bugherd->isNew(), + ]; + + $form['bugherdProject'] = [ + '#type' => 'select', + '#title' => $this->t('Bugherd Project'), + '#default_value' => $bugherd->getBugherdProject(), + '#options' => $this->getAvailableBugherdProjects(), + '#ajax' => [ + 'callback' => '::updateProjectUrls', + 'wrapper' => 'project-urls', + ], + ]; + + $form['jiraProject'] = [ + '#type' => 'textfield', + '#title' => $this->t('Jira Project'), + '#description' => $this->t('Which Jira project to connect with'), + '#default_value' => $bugherd->getJiraProject(), + '#required' => TRUE, + ]; + + $url = ''; + if ($project_id = $bugherd->getBugherdProject()) { + $project = $this->bugherdApi->getProject($project_id); + $url = $project['devurl']; + } + + $form['url'] = [ + '#type' => 'textfield', + '#title' => $this->t('Website Url'), + '#description' => $this->t('More urls may be configured for this project.'), + '#default_value' => $url, + '#size' => strlen($url), + '#attributes' => ['disabled' => TRUE], + '#prefix' => '
', + '#suffix' => '
', + ]; + + $form['statusMap'] = [ + '#type' => 'fieldset', + '#title' => $this->t('Bugherd to Jira Mapping'), + '#tree' => TRUE, + ]; + $form['statusMap'][HsBugherd::BUGHERDAPI_BACKLOG] = [ + '#type' => 'textfield', + '#title' => $this->t('Backlog Status'), + '#description' => $this->t('The JIRA status code for a "Backlog" status. Use comma separated numbers for multiple states.'), + '#required' => TRUE, + '#default_value' => $bugherd->getStatusMap()[HsBugherd::BUGHERDAPI_BACKLOG] ?? '', + ]; + $form['statusMap'][HsBugherd::BUGHERDAPI_TODO] = [ + '#type' => 'textfield', + '#title' => $this->t('ToDo Status'), + '#description' => $this->t('The JIRA status code for a "To Do" status. Use comma separated numbers for multiple states.'), + '#required' => TRUE, + '#default_value' => $bugherd->getStatusMap()[HsBugherd::BUGHERDAPI_TODO] ?? '', + ]; + $form['statusMap'][HsBugherd::BUGHERDAPI_DOING] = [ + '#type' => 'textfield', + '#title' => $this->t('Doing Status'), + '#description' => $this->t('The JIRA status code for a "Doing" status. Use comma separated numbers for multiple states.'), + '#required' => TRUE, + '#default_value' => $bugherd->getStatusMap()[HsBugherd::BUGHERDAPI_DOING] ?? '', + ]; + $form['statusMap'][HsBugherd::BUGHERDAPI_DONE] = [ + '#type' => 'textfield', + '#title' => $this->t('Done Status'), + '#description' => $this->t('The JIRA status code for a "Done" status. Use comma separated numbers for multiple states.'), + '#required' => TRUE, + '#default_value' => $bugherd->getStatusMap()[HsBugherd::BUGHERDAPI_DONE] ?? '', + ]; + $form['statusMap'][HsBugherd::BUGHERDAPI_CLOSED] = [ + '#type' => 'textfield', + '#title' => $this->t('Closed Status'), + '#description' => $this->t('The JIRA status code for a "Closed" status. This is normally after the user has accepted the change. Use comma separated numbers for multiple states.'), + '#required' => TRUE, + '#default_value' => $bugherd->getStatusMap()[HsBugherd::BUGHERDAPI_CLOSED] ?? '', + ]; + return $form; + } + + /** + * Get the Bugherd projects which haven't been mapped to a Jira project yet. + * + * @return array + * Associative array of Bugherd projects. + */ + protected function getAvailableBugherdProjects() { + $projects = $this->bugherdApi->getProjects(); + /** @var \Drupal\hs_bugherd\Entity\BugherdConnectionInterface $connection */ + foreach (BugherdConnection::loadMultiple() as $connection) { + if ($connection->id() == $this->entity->id()) { + continue; + } + unset($projects[$connection->getBugherdProject()]); + } + return $projects; + } + + /** + * Ajax callback to display the url of the chosen Bugherd project. + * + * @param array $form + * Complete form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * Current form state. + * + * @return array + * Url with new default value. + */ + public function updateProjectUrls(array $form, FormStateInterface $form_state) { + $project_id = $form_state->getValue('bugherdProject'); + $project = $this->bugherdApi->getProject($project_id); + $form['url']['#default_value'] = $project['project']['devurl']; + $form['url']['#size'] = strlen($project['project']['devurl']); + return $form['url']; + } + + /** + * {@inheritdoc} + */ + public function save(array $form, FormStateInterface $form_state) { + $bugherd = $this->entity; + $status = $bugherd->save(); + + switch ($status) { + case SAVED_NEW: + $this->messenger() + ->addStatus($this->t('Created the %label Bugherd Connection.', [ + '%label' => $bugherd->label(), + ])); + break; + + default: + $this->messenger() + ->addStatus($this->t('Saved the %label Bugherd Connection.', [ + '%label' => $bugherd->label(), + ])); + } + $form_state->setRedirectUrl($bugherd->toUrl('collection')); + } + +} diff --git a/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionSettingsForm.php b/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionSettingsForm.php new file mode 100644 index 0000000000..42b15a581d --- /dev/null +++ b/docroot/modules/humsci/hs_bugherd/src/Form/BugherdConnectionSettingsForm.php @@ -0,0 +1,64 @@ +config('hs_bugherd.connection_settings'); + + $keys = []; + /** @var \Drupal\key\Entity\Key $key */ + foreach (Key::loadMultiple() as $key) { + $keys[$key->id()] = $key->label(); + } + + $form['api_key'] = [ + '#type' => 'select', + '#title' => $this->t('BugHerd API key'), + '#default_value' => $config->get('api_key'), + '#options' => $keys, + '#required' => TRUE, + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + parent::submitForm($form, $form_state); + $key = Key::load($form_state->getValue('api_key')); + $this->config('hs_bugherd.connection_settings') + ->set('api_key', $key->id()) + ->set('dependencies.config', [$key->getConfigDependencyName()]) + ->save(); + } + +} diff --git a/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdForm.php b/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdForm.php deleted file mode 100644 index 6dbdd7e8a7..0000000000 --- a/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdForm.php +++ /dev/null @@ -1,221 +0,0 @@ -get('config.factory'), - $container->get('request_stack'), - $container->get('hs_bugherd'), - $container->get('encryption') - ); - } - - /** - * {@inheritdoc} - */ - public function __construct(ConfigFactoryInterface $config_factory, RequestStack $request_stack, HsBugherd $bugherd_api, EncryptService $encrypt) { - parent::__construct($config_factory); - $this->requestStack = $request_stack; - $this->bugherdApi = $bugherd_api; - $this->encryption = $encrypt; - } - - /** - * {@inheritdoc} - */ - public function buildForm(array $form, FormStateInterface $form_state) { - $form = parent::buildForm($form, $form_state); - $config = $this->config('bugherdapi.settings'); - - $keys = []; - /** @var \Drupal\key\Entity\Key $key */ - foreach (Key::loadMultiple() as $key) { - $keys[$key->id()] = $key->label(); - } - - $form['api_key'] = [ - '#type' => 'select', - '#title' => $this->t('BugHerd API key'), - '#default_value' => $config->get('api_key'), - '#options' => $keys, - '#required' => TRUE, - '#ajax' => [ - 'callback' => '::updateProjectOptions', - 'wrapper' => 'project-id', - 'effect' => 'fade', - ], - ]; - - $projects = []; - if ($this->bugherdApi->isConnectionSuccessful()) { - $projects = $this->bugherdApi->getProjects(); - } - - $form['project_id'] = [ - '#type' => 'select', - '#title' => $this->t('Bugherd Project'), - '#default_value' => $config->get('project_id'), - '#options' => $projects, - '#prefix' => '
', - '#suffix' => '
', - ]; - $form['jira_project'] = [ - '#type' => 'textfield', - '#title' => $this->t('Jira Project'), - '#default_value' => $config->get('jira_project'), - '#required' => TRUE, - ]; - - $form['status_map'] = [ - '#type' => 'fieldset', - '#title' => $this->t('Bugherd to Jira Mapping'), - '#tree' => TRUE, - ]; - - $form['status_map'][HsBugherd::BUGHERDAPI_BACKLOG] = [ - '#type' => 'textfield', - '#title' => $this->t('Backlog Status'), - '#description' => $this->t('The JIRA status code for a "Backlog" status. Use comma separated numbers for multiple states.'), - '#required' => TRUE, - '#default_value' => $config->get('status_map.' . HsBugherd::BUGHERDAPI_BACKLOG), - ]; - - $form['status_map'][HsBugherd::BUGHERDAPI_TODO] = [ - '#type' => 'textfield', - '#title' => $this->t('ToDo Status'), - '#description' => $this->t('The JIRA status code for a "To Do" status. Use comma separated numbers for multiple states.'), - '#required' => TRUE, - '#default_value' => $config->get('status_map.' . HsBugherd::BUGHERDAPI_TODO), - ]; - $form['status_map'][HsBugherd::BUGHERDAPI_DOING] = [ - '#type' => 'textfield', - '#title' => $this->t('Doing Status'), - '#description' => $this->t('The JIRA status code for a "Doing" status. Use comma separated numbers for multiple states.'), - '#required' => TRUE, - '#default_value' => $config->get('status_map.' . HsBugherd::BUGHERDAPI_DOING), - ]; - - $form['status_map'][HsBugherd::BUGHERDAPI_DONE] = [ - '#type' => 'textfield', - '#title' => $this->t('Done Status'), - '#description' => $this->t('The JIRA status code for a "Done" status. Use comma separated numbers for multiple states.'), - '#required' => TRUE, - '#default_value' => $config->get('status_map.' . HsBugherd::BUGHERDAPI_DONE), - ]; - - $form['status_map'][HsBugherd::BUGHERDAPI_CLOSED] = [ - '#type' => 'textfield', - '#title' => $this->t('Closed Status'), - '#description' => $this->t('The JIRA status code for a "Closed" status. This is normally after the user has accepted the change. Use comma separated numbers for multiple states.'), - '#required' => TRUE, - '#default_value' => $config->get('status_map.' . HsBugherd::BUGHERDAPI_CLOSED), - ]; - - return $form; - } - - /** - * Ajax handler to update project options. - * - * @param array $form - * Complete form array. - * @param \Drupal\Core\Form\FormStateInterface $form_state - * Current form state. - * - * @return array - * Modified select form element. - */ - public function updateProjectOptions(array $form, FormStateInterface $form_state) { - $project_options = []; - - $key = Key::load($form_state->getValue('api_key')); - $this->bugherdApi->setApiKey($key->getKeyValue()); - if ($this->bugherdApi->isConnectionSuccessful()) { - $project_options = $this->bugherdApi->getProjects(); - } - $form['project_id']['#options'] = $project_options; - return $form['project_id']; - } - - /** - * {@inheritdoc} - */ - public function validateForm(array &$form, FormStateInterface $form_state) { - parent::validateForm($form, $form_state); - $key = Key::load($form_state->getValue('api_key')); - $this->bugherdApi->setApiKey($key->getKeyValue()); - $test = $this->bugherdApi->getOrganization(); - if (isset($test['error'])) { - $form_state->setError($form['api_key'], $test['error']); - } - } - - /** - * {@inheritdoc} - */ - public function submitForm(array &$form, FormStateInterface $form_state) { - parent::submitForm($form, $form_state); - /** @var \Drupal\key\Entity\Key $key */ - $key = Key::load($form_state->getValue('api_key')); - $config_dependencies = [$key->getConfigDependencyName()]; - - $this->config('bugherdapi.settings') - ->set('project_id', $form_state->getValue('project_id')) - ->set('api_key', $key->id()) - ->set('jira_project', $form_state->getValue('jira_project')) - ->set('status_map', $form_state->getValue('status_map')) - ->set('dependencies.config', $config_dependencies) - ->save(); - } - -} diff --git a/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdHooksForm.php b/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdHooksForm.php index de85ae503d..f6c0d25a62 100644 --- a/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdHooksForm.php +++ b/docroot/modules/humsci/hs_bugherd/src/Form/HsBugherdHooksForm.php @@ -2,6 +2,9 @@ namespace Drupal\hs_bugherd\Form; +use Drupal\Component\Utility\SortArray; +use Drupal\Core\Cache\Cache; +use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Form\ConfirmFormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; @@ -32,22 +35,31 @@ class HsBugherdHooksForm extends ConfirmFormBase { */ protected $jiraIssueService; + /** + * Default cache backend. + * + * @var \Drupal\Core\Cache\CacheBackendInterface + */ + protected $cacheBackend; + /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('hs_bugherd'), - $container->get('jira_rest_wrapper_service') + $container->get('jira_rest_wrapper_service'), + $container->get('cache.default') ); } /** * {@inheritdoc} */ - public function __construct(HsBugherd $bugherd_api, JiraRestWrapperService $jira_wrapper) { + public function __construct(HsBugherd $bugherd_api, JiraRestWrapperService $jira_wrapper, CacheBackendInterface $cache_backend) { $this->bugherdApi = $bugherd_api; $this->jiraIssueService = $jira_wrapper->getIssueService(); + $this->cacheBackend = $cache_backend; } /** @@ -68,14 +80,8 @@ public function getQuestion() { * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { - $config = $this->config('bugherdapi.settings'); - if (!$config->get('project_id') || !$config->get('jira_project')) { - return [ - '#markup' => $this->t('Bugherd or Jira has not been configured.'), - ]; - } - $form = parent::buildForm($form, $form_state); + // Display a summary of all the hooks we have for jira and bugherd. $form['hooks'] = [ '#type' => 'fieldset', @@ -93,8 +99,16 @@ public function buildForm(array $form, FormStateInterface $form_state) { ]; $project_hooks = []; + $bugherd_projects = $this->bugherdApi->getProjects(); + foreach ($this->getBugherdHooks() as $webhook) { - $project_hooks[] = $webhook['event'] . ': ' . $webhook['target_url']; + $hook = [ + $webhook['event'], + $webhook['project_id'] ? $bugherd_projects[$webhook['project_id']] : '', + $webhook['target_url'], + ]; + + $project_hooks[] = implode(', ', array_filter($hook)); } $form['hooks']['bugherd']['hooks']['#markup'] = implode('
', $project_hooks); @@ -104,7 +118,6 @@ public function buildForm(array $form, FormStateInterface $form_state) { } $form['hooks']['jira']['hooks']['#markup'] = implode('
', $project_hooks); - return $form; } @@ -112,14 +125,6 @@ public function buildForm(array $form, FormStateInterface $form_state) { * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { - $url = $this->requestStack->getCurrentRequest()->getSchemeAndHttpHost(); - $url .= '/api/hs-bugherd'; - // Testing endpoint. - // $url = 'https://webhook.site/93c53d6c-b941-4103-a564-98d5e53b2a79'; - $config = $this->config('bugherdapi.settings'); - - $bugherd_project = $config->get('project_id'); - // Delete all bugherd webhooks for this project. foreach ($this->getBugherdHooks() as $webhook) { $this->bugherdApi->deleteWebhook($webhook['id']); @@ -130,33 +135,33 @@ public function submitForm(array &$form, FormStateInterface $form_state) { foreach ($bugherd_events as $event) { try { $this->bugherdApi->createWebhook([ - 'project_id' => $bugherd_project, 'event' => $event, - 'target_url' => $url, + 'target_url' => $this->getHookUrl() . '/bugherd', ]); } catch (\Exception $e) { + $this->messenger() + ->addError($this->t('Unable to add Bugherd Webook for event %event. More info in database logs', ['%event' => $event])); + $this->logger('hs_bugherd') - ->error('Unable to add Bugherd Webook for event %event', ['%event' => $event]); + ->error('Unable to add Bugherd Webook for event %event, @error', [ + '%event' => $event, + '@error' => $e->getMessage(), + ]); } } - // No jira filter is configured. - if ($this->getJiraFilter()) { - $this->addJiraHook(); - } + $this->addJiraHook(); + Cache::invalidateTags(['hs_bugherd:hooks']); } /** * Add the Jira hook via the Jira API. */ protected function addJiraHook() { - $url = $this->requestStack->getCurrentRequest()->getSchemeAndHttpHost(); - $url .= '/api/hs-bugherd'; - $hook_data = [ - 'name' => 'Bugherd for ARCH', - 'url' => $url, + 'name' => 'Bugherd Webhook', + 'url' => $this->getHookUrl() . '/jira', 'events' => ['jira:issue_updated', 'comment_created'], 'filters' => [ 'issue-related-events-section' => $this->getJiraFilter(), @@ -168,7 +173,6 @@ protected function addJiraHook() { if (empty($jira_hooks)) { $this->jiraIssueService->getCommunicationService() ->post('/rest/webhooks/1.0/webhook', (object) $hook_data); - return; } foreach (array_keys($jira_hooks) as $hook_id) { @@ -177,11 +181,22 @@ protected function addJiraHook() { } } + /** + * Get the url to be used for the webhooks. + * + * @return string + * Local url to API. + */ + protected function getHookUrl() { + $url = $this->requestStack->getCurrentRequest()->getSchemeAndHttpHost(); + return $url . '/api/hs-bugherd'; + } + /** * {@inheritdoc} */ public function getCancelUrl() { - return new Url('hs_bugherd.api'); + return new Url('entity.bugherd_connection.collection'); } /** @@ -191,9 +206,7 @@ public function getCancelUrl() { * Jira filter. */ protected function getJiraFilter() { - $config = $this->config('bugherdapi.settings'); - $jira_project = $config->get('jira_project'); - return "project = $jira_project and summary ~ 'BUGHERD-*'"; + return "summary ~ 'BUGHERD-*'"; } /** @@ -203,6 +216,10 @@ protected function getJiraFilter() { * Keyed array with the hook id as the array key. */ protected function getJiraHooks() { + if ($cache = $this->cacheBackend->get('hs_bugherd:jira_hooks')) { + return $cache->data; + } + $hooks = []; $jira_hooks = $this->jiraIssueService->getCommunicationService() ->get('/rest/webhooks/1.0/webhook') ?: []; @@ -215,6 +232,7 @@ protected function getJiraHooks() { $hooks[$id] = $jira_hook; } } + $this->cacheBackend->set('hs_bugherd:jira_hooks', $hooks, Cache::PERMANENT, ['hs_bugherd:hooks']); return $hooks; } @@ -225,19 +243,17 @@ protected function getJiraHooks() { * Array of webhooks. */ protected function getBugherdHooks() { - $config = $this->config('bugherdapi.settings'); - $project_id = $config->get('project_id'); + if ($cache = $this->cacheBackend->get('hs_bugherd:bugherd_hooks')) { + return $cache->data; + } - $hooks = []; $bugherd_hooks = $this->bugherdApi->getHooks(); - if (!isset($bugherd_hooks['webhooks'])) { - return []; - } - foreach ($bugherd_hooks['webhooks'] as $webhook) { - if ($webhook['project_id'] == $project_id) { - $hooks[] = $webhook; - } - } + $hooks = $bugherd_hooks['webhooks'] ?? []; + uasort($hooks, function ($a, $b) { + return SortArray::sortByKeyString($a, $b, 'target_url'); + }); + + $this->cacheBackend->set('hs_bugherd:bugherd_hooks', $hooks, Cache::PERMANENT, ['hs_bugherd:hooks']); return $hooks; } diff --git a/docroot/modules/humsci/hs_bugherd/src/HsBugherd.php b/docroot/modules/humsci/hs_bugherd/src/HsBugherd.php index f5515883ed..e0fe25345c 100644 --- a/docroot/modules/humsci/hs_bugherd/src/HsBugherd.php +++ b/docroot/modules/humsci/hs_bugherd/src/HsBugherd.php @@ -3,6 +3,7 @@ namespace Drupal\hs_bugherd; use Bugherd\Client; +use Drupal\Core\Cache\CacheBackendInterface; use Drupal\key\Entity\Key; /** @@ -48,10 +49,18 @@ class HsBugherd { */ protected $client; + /** + * Cache default service. + * + * @var \Drupal\Core\Cache\CacheBackendInterface + */ + protected $cacheDefault; + /** * HsBugherd constructor. */ - public function __construct() { + public function __construct(CacheBackendInterface $cache_default) { + $this->cacheDefault = $cache_default; $this->apiKey = static::getApiKey(); $this->projectKey = self::getProjectId(); $this->client = new Client($this->apiKey); @@ -65,7 +74,7 @@ public function __construct() { */ public static function getApiKey() { $key_id = \Drupal::configFactory() - ->get('bugherdapi.settings') + ->get('hs_bugherd.connection_settings') ->get('api_key'); /** @var \Drupal\key\Entity\Key $key */ if ($key_id && $key = Key::load($key_id)) { @@ -121,9 +130,6 @@ public function setProjectId($project_id) { /** * Get the desired API. * - * @param string $api - * Bugherd api to get: organization, user, project, task, comment, webhook. - * * @return \Bugherd\Api\AbstractApi * The api. */ @@ -195,6 +201,24 @@ public function getProjects() { return $this->getApi(self::BUGHERDAPI_PROJECT)->listing(FALSE, FALSE); } + /** + * Get a single project information. + * + * @param int $project_id + * Bugherd Project ID. + * + * @return array + * Data of the project. + */ + public function getProject($project_id) { + if ($cache = $this->cacheDefault->get("hs_bugherd:project-$project_id")) { + return $cache->data; + } + $project = $this->getApi(self::BUGHERDAPI_PROJECT)->show($project_id); + $this->cacheDefault->set("hs_bugherd:project-$project_id", $project['project']); + return $project['project'] ?? []; + } + /** * Get all task for a project. * @@ -209,7 +233,7 @@ public function getProjects() { * @see https://www.bugherd.com/api_v2#api_task_list */ public function getTasks($project_id = NULL, array $params = []) { - return (array) $this->getApi(self::BUGHERDAPI_TASK) + return $this->getApi(self::BUGHERDAPI_TASK) ->all($project_id ?: $this->projectKey, $params); } @@ -279,6 +303,9 @@ public function getComments($task_id, $project_id = NULL) { * @param int|null $project_id * Project ID if different than current. * + * @return array + * Api Response. + * * @throws \Exception * * @see https://www.bugherd.com/api_v2#api_comment_create @@ -287,7 +314,7 @@ public function addComment($task_id, array $comment_data, $project_id = NULL) { if (!isset($comment_data['text'])) { throw new \Exception('Text is required to add a comment'); } - $this->getApi(self::BUGHERDAPI_COMMENT) + return $this->getApi(self::BUGHERDAPI_COMMENT) ->create($project_id ?: $this->projectKey, $task_id, $comment_data); } diff --git a/docroot/modules/humsci/hs_bugherd/src/Plugin/rest/resource/BugherdResource.php b/docroot/modules/humsci/hs_bugherd/src/Plugin/rest/resource/BugherdResource.php index a7ef401f73..aa796ca684 100644 --- a/docroot/modules/humsci/hs_bugherd/src/Plugin/rest/resource/BugherdResource.php +++ b/docroot/modules/humsci/hs_bugherd/src/Plugin/rest/resource/BugherdResource.php @@ -2,115 +2,208 @@ namespace Drupal\hs_bugherd\Plugin\rest\resource; -use Drupal\hs_bugherd\HsBugherd; +use biologis\JIRA_PHP_API\Issue; +use Drupal\hs_bugherd\Entity\BugherdConnection; use Drupal\key\Entity\Key; use Drupal\rest\ResourceResponse; /** * Class BugherdResource. * + * API for bugherd webhooks to collect data for Jira tickets. + * * @RestResource( - * id = "hs_bugherd_resource", - * label = @translation("HS Bugherd Resource"), + * id = "hs_bugherd_resource_bugherd", + * label = @translation("HS Bugherd Resource Bugherd"), * uri_paths = { - * "canonical" = "/api/hs-bugherd", - * "https://www.drupal.org/link-relations/create" = "/api/hs-bugherd" + * "canonical" = "/api/hs-bugherd/bugherd", + * "https://www.drupal.org/link-relations/create" = "/api/hs-bugherd/bugherd" * } * ) */ -class BugherdResource extends BugherdResourceBase { +class BugherdResource extends HsBugherdResourceBase { /** * Responds to POST requests. * - * @param array $data + * @param array $bugherd_data * Post data from API. * * @return \Drupal\rest\ResourceResponse - * Returned responses. + * API response. + * + * @see https://www.bugherd.com/api_v2 */ - public function post(array $data) { - $this->logger->info('posted data: ' . var_export($data, TRUE)); - try { - // Data from jira has this key. Bugherd does not. - if (isset($data['webhookEvent'])) { - $response = $this->sendToBugherd($data); - $this->logger->info('bugherd response: ' . var_export($response, TRUE)); - return new ResourceResponse($response); - } + public function post(array $bugherd_data) { + $task = $bugherd_data['task'] ?: $bugherd_data['comment']['task']; + $this->setBugherdConnection($task['project_id']); + if (!$this->bugherdConnection) { + return new ResourceResponse($this->t('No connection data')); + } - return new ResourceResponse($this->sendToJira($data)); + // New bugherd task. + if (empty($task['external_id'])) { + $issue = $this->createJiraIssue($task); + $data = ['external_id' => $issue->getKey()]; + $this->bugherdApi->updateTask($task['id'], $data, $task['project_id']); + $response = new ResourceResponse($issue->getKey()); } - catch (\Exception $e) { - $this->logger->error($e->getMessage()); - return new ResourceResponse($e->getMessage()); + else { + $issue = $this->jiraApi->load($task['external_id']); + if (!empty($bugherd_data['comment'])) { + $this->addJiraComment($task, $issue, $bugherd_data['comment']); + $response = new ResourceResponse($this->t('Comment added to Jira ticket @key', ['@key' => $issue->getKey()])); + } + else { + // Bugherd task updated or status was changed. + $issue->fields->setDescription($this->getDescription($task)); + $issue->fields->setSummary($this->getTaskName($task)); + $issue->save(); + + // Attach the screenshot to the Jira Issue if it doesn't have any + // already. + if (!empty($task['screenshot_url']) && empty($issue->fields->attachment)) { + $this->addAttachment($issue->getKey(), $task['screenshot_url']); + } + + $response = new ResourceResponse($this->t('Jira issue updated @key', ['@key' => $issue->getKey()])); + } } + + $response->setMaxAge(0); + $build = ['#cache' => ['max-age' => 0]]; + $response->addCacheableDependency($build); + return $response; } /** - * Array of data from bugherd. + * Set the appropriate Bugherd connection entity. * - * @param array $data - * Bugherd api data. + * @param int $bugherd_project + * Bugherd Project ID. + */ + protected function setBugherdConnection($bugherd_project) { + /** @var \Drupal\hs_bugherd\Entity\BugherdConnectionInterface $connection */ + foreach (BugherdConnection::loadMultiple() as $connection) { + if ($connection->getBugherdProject() == $bugherd_project) { + $this->bugherdConnection = $connection; + } + } + } + + /** + * Create a new Jira issue from Bugherd webhook data. * - * @return string - * The Jira issue that was created/updated. + * @param array $bugherd_task + * Bugherd webhook data. * - * @throws \Exception + * @return \biologis\JIRA_PHP_API\Issue + * Created Jira issue. */ - protected function sendToJira(array $data) { - - // Bugherd commented. - if (isset($data['comment'])) { - $task = $data['comment']['task']; - unset($data['comment']['task']); - return $this->bugherdTaskCommented($data['comment'], $task); + protected function createJiraIssue(array $bugherd_task) { + /** @var \biologis\JIRA_PHP_API\Issue $issue */ + $issue = $this->jiraApi->create(); + $issue->fields->project->setKey($this->bugherdConnection->getJiraProject()); + $issue->fields->setDescription($this->getDescription($bugherd_task)); + $issue->fields->issuetype->setId('1'); + $issue->fields->addGenericJiraObject('priority'); + $issue->fields->priority->setId('4'); + $issue->fields->setSummary($this->getTaskName($bugherd_task)); + $issue->fields->addGenericJiraObject('reporter'); + $issue->fields->reporter->setName(''); + if (strpos($bugherd_task['requester']['email'], 'stanford.edu') !== FALSE) { + $requester_sunet = substr($bugherd_task['requester']['email'], 0, strpos($bugherd_task['requester']['email'], '@')); + // Search Jira for the users that match the username. + $jira_users = $this->jiraApi->getCommunicationService() + ->get('user/search?', ['username' => $requester_sunet]) ?: []; + // Since the search isn't an exact match search, we want to loop through + // and make sure we have the right user's name. + foreach ($jira_users as $user) { + if ($user->name == $requester_sunet) { + $issue->fields->reporter->setName($requester_sunet); + break; + } + } } - - // Bugherd task created or updated. - return $this->bugherdTaskUpdated($data['task']); + $issue->save(); + return $issue; } /** - * A task was either created or updated, find/create jira issue and update. - * - * @param array $task - * Bugherd API data. + * Add a Bugherd comment to a Jira issue. * - * @return string - * Jira issue id. + * @param array $bugherd_task + * Bugherd task data. + * @param \biologis\JIRA_PHP_API\Issue $jira_issue + * Issue that matches the Bugherd task. + * @param array $comment + * Comment data from webhook. * - * @throws \Exception + * @return \Drupal\Core\StringTranslation\TranslatableMarkup|bool + * Result of adding comment. */ - protected function bugherdTaskUpdated(array $task) { - $new_issue_created = FALSE; - // Create a jira issue if none exists. - if (empty($issue = $this->getJiraIssue($task['external_id']))) { - $new_issue_created = TRUE; - $issue = $this->createJiraIssue($task); + protected function addJiraComment(array $bugherd_task, Issue $jira_issue, array $comment) { + // Block comments from anonymous users so we don't have looping APIs. + if (empty($comment['user']['email'])) { + return $this->t('Comment rejected from Anonymous'); + } - $this->logger->info('New JIRA issue from bugherd. Jira: @jira, Bugherd: @bugherd', [ - '@jira' => $issue->getKey(), - '@bugherd' => $task['local_task_id'], + // Add the comment now. + if ($result = $jira_issue->addComment($comment['text'])) { + $this->logger->info('New comment sent to JIRA issue from @name. Jira: @jira, Bugherd: @bugherd', [ + '@name' => $comment['user']['display_name'], + '@jira' => $jira_issue->getKey(), + '@bugherd' => $bugherd_task['local_task_id'], ]); } + return $result; + } - // Issue needs to be updated. - if (!$new_issue_created) { - $issue->fields->setDescription($this->buildDescription($task)); - $issue->save(); - - if ($task['status'] == HsBugherd::BUGHERDAPI_CLOSED) { - $issue->addComment($this->t('Issue closed in Bugherd by @name', ['@name' => $task['updater']['display_name']])); - } + /** + * Create a usable description for JIRA from bugherd data. + * + * @param array $bugherd_task + * Bugherd task data. + * + * @return string + * Built description. + */ + protected function getDescription(array $bugherd_task) { + $description = []; + $description[] = $bugherd_task['description']; + $description[] = ''; + $description[] = "Requester: {$bugherd_task['requester']['display_name']}"; + $description[] = "URL: {$bugherd_task['site']}{$bugherd_task['url']}"; + $description[] = "Browser: {$bugherd_task['requester_browser']}"; + $description[] = "Browser size: {$bugherd_task['requester_browser_size']}"; + $description[] = "Browser size: {$bugherd_task['requester_resolution']}"; + if (!empty($bugherd_task['selector_info']['html'])) { + $description[] = "Item: " . strip_tags($bugherd_task['selector_info']['html'], '