From 81576356cdd4813984d32075407e8f051280fcb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:35:33 -0800 Subject: [PATCH 01/23] Bump phpstan/phpstan from 1.10.49 to 1.10.50 (#16420) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.10.49 to 1.10.50. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.11.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.10.49...1.10.50) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index df0ce46d92..1d665f6f59 100644 --- a/composer.lock +++ b/composer.lock @@ -18790,16 +18790,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.49", + "version": "1.10.50", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "9367ba4c4f6ad53e9efb594d74a8941563caccf6" + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9367ba4c4f6ad53e9efb594d74a8941563caccf6", - "reference": "9367ba4c4f6ad53e9efb594d74a8941563caccf6", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", "shasum": "" }, "require": { @@ -18848,7 +18848,7 @@ "type": "tidelift" } ], - "time": "2023-12-12T10:05:12+00:00" + "time": "2023-12-13T10:59:42+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", From c287b3dee4b8ecc5913b56f99f7bd0956c5b6d0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 07:45:17 -0800 Subject: [PATCH 02/23] Bump drupal/path_redirect_import from 2.0.7 to 2.0.8 (#16365) * Bump drupal/path_redirect_import from 2.0.7 to 2.0.8 Bumps drupal/path_redirect_import from 2.0.7 to 2.0.8. --- updated-dependencies: - dependency-name: drupal/path_redirect_import dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * removed patch * updated compose.lock --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn --- composer.json | 3 --- composer.lock | 27 ++++++++++++++++----------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index a907d42db8..6cb04838ea 100644 --- a/composer.json +++ b/composer.json @@ -476,9 +476,6 @@ "3204586 - Update URL Alias action is only available for nodes + users and does not work with views_bulk_operations": "https://www.drupal.org/files/issues/2022-10-28/pathauto-add_deriver_for_alias_update_action-3204586-28_0.patch", "3214658 - Omit nolink items from url path args and add token that uses parent url": "https://www.drupal.org/files/issues/2022-05-08/remove-nolink-args-use-parent-entity-url-3214658-18.patch" }, - "drupal/path_redirect_import": { - "3373025 - Update to support path redirect import migrate_tools 6.0.2": "https://www.drupal.org/files/issues/2023-07-06/path_redirect_import-3373025.patch" - }, "drupal/prometheus_exporter": { "3214628 - Add published/unpublished node statistics to NodeCount.": "https://www.drupal.org/files/issues/2021-06-29/prometheus_exporter-add_status_metrics_to_node_count-3214628-3.patch" }, diff --git a/composer.lock b/composer.lock index 1d665f6f59..0818f55bd9 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": "5076eab84ec9f08c56247c3fc868efef", + "content-hash": "a3cb7d2f587c883513e7df7cb6b8332c", "packages": [ { "name": "asm89/stack-cors", @@ -10977,23 +10977,23 @@ }, { "name": "drupal/path_redirect_import", - "version": "2.0.7", + "version": "2.0.8", "source": { "type": "git", "url": "https://git.drupalcode.org/project/path_redirect_import.git", - "reference": "2.0.7" + "reference": "2.0.8" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/path_redirect_import-2.0.7.zip", - "reference": "2.0.7", - "shasum": "20c746f7dcccf1377e89741b20cd1ae22c64ddaf" + "url": "https://ftp.drupal.org/files/projects/path_redirect_import-2.0.8.zip", + "reference": "2.0.8", + "shasum": "a1fb1fe44bf657228d099576874ade5e6065c414" }, "require": { "drupal/core": ">=9.1", "drupal/migrate_source_csv": "^3.5", - "drupal/migrate_tools": "^5.0 || ^6.0", - "drupal/redirect": "*", + "drupal/migrate_tools": "^6.0.2", + "drupal/redirect": ">=1.7", "php": ">=7.1" }, "require-dev": { @@ -11002,12 +11002,17 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "2.0.7", - "datestamp": "1686322209", + "version": "2.0.8", + "datestamp": "1701853731", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" } + }, + "drush": { + "services": { + "drush.services.yml": ">=9" + } } }, "notification-url": "https://packages.drupal.org/8/downloads", @@ -11032,7 +11037,7 @@ "description": "Migrate Drupal redirects from CSV.", "homepage": "https://www.drupal.org/project/path_redirect_import", "support": { - "source": "https://cgit.drupalcode.org/path_redirect_import", + "source": "https://git.drupalcode.org/path_redirect_import", "issues": "https://www.drupal.org/project/issues/path_redirect_import" } }, From e4bd1efcefb4fc764228c67434fcc932e68291f5 Mon Sep 17 00:00:00 2001 From: Alex Finnarn Date: Fri, 15 Dec 2023 14:26:26 -0500 Subject: [PATCH 03/23] VACMS-9135: json api UI e (#16454) * base of adding JSON:API UI explorer modules and config * add dependency updates * add documentation * enable custom directory installer composer plugin --- READMES/jsonapi.md | 27 ++- composer.json | 12 +- composer.lock | 214 +++++++++++++++++- config/sync/core.extension.yml | 2 + .../js/json-schemas-table-filter.js | 21 ++ .../VaGovOpenApiGenerator.php | 34 +++ .../va_gov_api/va_gov_api.libraries.yml | 8 + .../custom/va_gov_api/va_gov_api.module | 18 ++ tests/phpunit/API/JsonApiExplorerUiTest.php | 44 ++++ 9 files changed, 376 insertions(+), 4 deletions(-) create mode 100644 docroot/modules/custom/va_gov_api/js/json-schemas-table-filter.js create mode 100644 docroot/modules/custom/va_gov_api/src/Plugin/openapi/OpenApiGenerator/VaGovOpenApiGenerator.php create mode 100644 docroot/modules/custom/va_gov_api/va_gov_api.libraries.yml create mode 100644 docroot/modules/custom/va_gov_api/va_gov_api.module create mode 100644 tests/phpunit/API/JsonApiExplorerUiTest.php diff --git a/READMES/jsonapi.md b/READMES/jsonapi.md index 6e6aa8e82c..18b72fd19c 100644 --- a/READMES/jsonapi.md +++ b/READMES/jsonapi.md @@ -21,5 +21,30 @@ If you expect to see a field's data included in the response and it is not there See the config at `admin/config/services/jsonapi/resource_types/node--news_story/edit?destination=/admin/config/services/jsonapi/resource_types` for an example. **Breadcrumbs and JSON:API** -See in [CMS Breadcrumb documentation](https://prod.cms.va.gov/admin/structure/cm_document/note/126/breadcrumbs) +See in [CMS Breadcrumb documentation](https://prod.cms.va.gov/admin/structure/cm_document/note/126/breadcrumbs) +## UI Explorer + +You can explore the JSON:API endpoints via a Swagger UI to see what's available and to test out requests and responses. + +1. Login to the site as a user with an "administrator" or "content_api_consumer" role. +2. Go to "/admin/config/services/openapi/swagger/jsonapi". +3. You should only see one UI option "VA.gov JSON:API". Click on the link to explore. +3. Read a [Swagger UI tutorial](https://idratherbewriting.com/learnapidoc/pubapis_swagger.html) to familiarize + yourself with the UI features, if you aren't already. + +Via this UI, you can: + +1. View resource information - Each endpoint has a description, list of parameters, and response codes. We limit the + operations to GET requests only. +2. Try it out - You can test each endpoint with a "Try it out" button in the top right section of "Parameters". +3. Filter by tag - Use the search to narrow down the endpoints displayed. +4. Deep Link - As you click to gather information about the API, the URL automatically updates so you can share that + specific documentation with others. + +## Tests + +You can find JSON:API tests in the following places: + +- 'tests/phpunit/API/JsonApiRequestTest' - Tests GET requests and associated configuration. +- 'tests/phpunit/API/JsonApiExplorerUITest' - Tests Swagger UI for OpenAPI documentation. diff --git a/composer.json b/composer.json index 6cb04838ea..6ce760376a 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "require": { "bower-asset/cropper": "^4.1", "caxy/php-htmldiff": "^0.1.14", - "composer/installers": "^2.2.0", + "composer/installers": "^2.2", "consolidation/site-process": "^5.2", "cweagans/composer-patches": "^1.7", "datadog/dd-trace": "^0.95.0", @@ -143,6 +143,8 @@ "drupal/office_hours": "^1.9", "drupal/openapi": "^2.0@RC", "drupal/openapi_jsonapi": "^3.0", + "drupal/openapi_ui": "^1.0@RC", + "drupal/openapi_ui_swagger": "^1.0", "drupal/override_node_options": "^2.4", "drupal/paragraphs": "^1.5", "drupal/paragraphs_browser": "^1.1", @@ -201,6 +203,7 @@ "mglaman/phpstan-drupal": "^1.0", "michelf/php-markdown": "^2.0", "mikey179/vfsstream": "^1.6", + "mnsami/composer-custom-directory-installer": "^2.0", "npm-asset/dropzone": "^5.5", "npm-asset/yarn": "1.19.1", "oomphinc/composer-installers-extender": "^2.0", @@ -303,7 +306,8 @@ "php-http/discovery": true, "cweagans/composer-patches": true, "orakili/composer-drupal-info-file-patch-helper": true, - "digitalrevolution/php-codesniffer-baseline": true + "digitalrevolution/php-codesniffer-baseline": true, + "mnsami/composer-custom-directory-installer": true } }, "extra": { @@ -334,6 +338,7 @@ "type:drupal-core" ], "docroot/libraries/{$name}": [ + "swagger-api/swagger-ui", "type:drupal-library", "type:bower-asset", "type:npm-asset" @@ -465,6 +470,9 @@ "3110109 - Support renamed resource types Part 2": "https://git.drupalcode.org/project/openapi_jsonapi/-/commit/9b02c70521c499152c915e481aaf4925992bc8f9.patch", "3185778 - Fix TypeError: Cannot read property 'anyOf' of undefined": "https://www.drupal.org/files/issues/2020-12-21/add_required_keyword_8.x_2.x-3185778-5.patch" }, + "drupal/openapi_ui_swagger": { + "3259746 - Add more UI config defaults": "https://www.drupal.org/files/issues/2023-12-13/add-more-config-defaults-3259746-3.patch" + }, "drupal/paragraphs": { "3138609 - Fix broken fieldsets on forms": "https://www.drupal.org/files/issues/2020-06-03/3138609-24.patch", "2919186 - Remove button should not be shown on required field": "https://www.drupal.org/files/issues/2020-05-13/hide_field_required_paragraphs_remove_button_1.patch" diff --git a/composer.lock b/composer.lock index 0818f55bd9..b981b0ebf8 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": "a3cb7d2f587c883513e7df7cb6b8332c", + "content-hash": "4111b619b59807990a80c64ccafdb1ce", "packages": [ { "name": "asm89/stack-cors", @@ -10544,6 +10544,100 @@ "source": "https://git.drupalcode.org/project/openapi_jsonapi" } }, + { + "name": "drupal/openapi_ui", + "version": "1.0.0-rc4", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/openapi_ui.git", + "reference": "8.x-1.0-rc4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/openapi_ui-8.x-1.0-rc4.zip", + "reference": "8.x-1.0-rc4", + "shasum": "11f8cc945a2e6eb45dad512077a42ea9024fb4fc" + }, + "require": { + "drupal/core": "^8.8 || ^9 || ^10" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.0-rc4", + "datestamp": "1670512625", + "security-coverage": { + "status": "not-covered", + "message": "RC releases are not covered by Drupal security advisories." + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "richgerdes", + "homepage": "https://www.drupal.org/user/3437973" + } + ], + "description": "Provides plugin system for OpenAPI/Swagger Interface libraries.", + "homepage": "http://drupal.org/project/openapi_ui", + "support": { + "source": "https://git.drupalcode.org/project/openapi_ui" + } + }, + { + "name": "drupal/openapi_ui_swagger", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/openapi_ui_swagger.git", + "reference": "8.x-1.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/openapi_ui_swagger-8.x-1.0.zip", + "reference": "8.x-1.0", + "shasum": "32478822e27fc02193f2179c752fbbfd092cf366" + }, + "require": { + "drupal/core": "^8 || ^9 || ^10", + "drupal/openapi_ui": "^1.0", + "swagger-api/swagger-ui": "^3.0.17" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-1.0", + "datestamp": "1696427728", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "richgerdes", + "homepage": "https://www.drupal.org/user/3437973" + } + ], + "description": "Creates OpenAPI specification for Drupal REST resources.", + "homepage": "https://www.drupal.org/project/openapi_ui_swagger", + "keywords": [ + "Drupal" + ], + "support": { + "source": "http://cgit.drupalcode.org/openapi_ui_swagger", + "issues": "http://drupal.org/project/issues/openapi_ui_swagger" + } + }, { "name": "drupal/override_node_options", "version": "2.7.0", @@ -16796,6 +16890,62 @@ }, "time": "2016-07-25T17:07:32+00:00" }, + { + "name": "mnsami/composer-custom-directory-installer", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/mnsami/composer-custom-directory-installer.git", + "reference": "85f66323978d0b1cb0e6acc7f69b3e7b912f82d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mnsami/composer-custom-directory-installer/zipball/85f66323978d0b1cb0e6acc7f69b3e7b912f82d9", + "reference": "85f66323978d0b1cb0e6acc7f69b3e7b912f82d9", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3" + }, + "type": "composer-plugin", + "extra": { + "class": [ + "Composer\\CustomDirectoryInstaller\\LibraryPlugin", + "Composer\\CustomDirectoryInstaller\\PearPlugin", + "Composer\\CustomDirectoryInstaller\\PluginPlugin" + ], + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Composer\\CustomDirectoryInstaller": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mina Nabil Sami", + "email": "mina.nsami@gmail.com" + } + ], + "description": "A composer plugin, to help install packages of different types in custom paths.", + "keywords": [ + "composer", + "composer-installer", + "composer-plugin" + ], + "support": { + "issues": "https://github.com/mnsami/composer-custom-directory-installer/issues", + "source": "https://github.com/mnsami/composer-custom-directory-installer/tree/2.0.0" + }, + "time": "2020-08-18T11:00:11+00:00" + }, { "name": "monolog/monolog", "version": "2.9.2", @@ -21783,6 +21933,67 @@ }, "time": "2023-09-08T16:15:47+00:00" }, + { + "name": "swagger-api/swagger-ui", + "version": "v3.52.5", + "source": { + "type": "git", + "url": "https://github.com/swagger-api/swagger-ui.git", + "reference": "f1ad60dc92e7edb0898583e16c3e66fe3e9eada2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/f1ad60dc92e7edb0898583e16c3e66fe3e9eada2", + "reference": "f1ad60dc92e7edb0898583e16c3e66fe3e9eada2", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Anna Bodnia", + "email": "anna.bodnia@gmail.com" + }, + { + "name": "Buu Nguyen", + "email": "buunguyen@gmail.com" + }, + { + "name": "Josh Ponelat", + "email": "jponelat@gmail.com" + }, + { + "name": "Kyle Shockey", + "email": "kyleshockey1@gmail.com" + }, + { + "name": "Robert Barnwell", + "email": "robert@robertismy.name" + }, + { + "name": "Sahar Jafari", + "email": "shr.jafari@gmail.com" + } + ], + "description": " Swagger UI is a collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.", + "homepage": "http://swagger.io", + "keywords": [ + "api", + "documentation", + "openapi", + "specification", + "swagger", + "ui" + ], + "support": { + "issues": "https://github.com/swagger-api/swagger-ui/issues", + "source": "https://github.com/swagger-api/swagger-ui/tree/v3.52.5" + }, + "time": "2021-10-14T14:25:14+00:00" + }, { "name": "symfony/browser-kit", "version": "v6.4.0", @@ -26889,6 +27100,7 @@ "drupal/mimemail": 15, "drupal/no_table_drag": 15, "drupal/openapi": 5, + "drupal/openapi_ui": 5, "drupal/paragraphs_features": 10, "drupal/password_strength": 20, "drupal/pathologic": 15, diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 9f42a81fbc..3e1c540223 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -176,6 +176,8 @@ module: office_hours: 0 openapi: 0 openapi_jsonapi: 0 + openapi_ui: 0 + openapi_ui_swagger: 0 options: 0 override_node_options: 0 page_cache: 0 diff --git a/docroot/modules/custom/va_gov_api/js/json-schemas-table-filter.js b/docroot/modules/custom/va_gov_api/js/json-schemas-table-filter.js new file mode 100644 index 0000000000..8086755b3b --- /dev/null +++ b/docroot/modules/custom/va_gov_api/js/json-schemas-table-filter.js @@ -0,0 +1,21 @@ +/** + * Attach a behavior to filter out unwanted schemas for OpenAPI UI viewing. + */ +(function ($, Drupal, drupalSettings) { + Drupal.behaviors.vaGovJsonSchemasTableFilter = { + attach: function (context, settings) { + // Get all the rows in the table body. + const rows = document.querySelectorAll('#block-vagovclaro-content table tbody tr'); + + rows.forEach(function(row) { + // Get the first cell (td) of the row, which contains the schema label. + const firstCell = row.cells[0]; + + // Remove all but 'VA.gov JSON:API'. + if (firstCell.textContent.trim() !== 'VA.gov JSON:API') { + row.remove(); + } + }); + } + } +})(jQuery, Drupal, drupalSettings); diff --git a/docroot/modules/custom/va_gov_api/src/Plugin/openapi/OpenApiGenerator/VaGovOpenApiGenerator.php b/docroot/modules/custom/va_gov_api/src/Plugin/openapi/OpenApiGenerator/VaGovOpenApiGenerator.php new file mode 100644 index 0000000000..4cbcf6d4b0 --- /dev/null +++ b/docroot/modules/custom/va_gov_api/src/Plugin/openapi/OpenApiGenerator/VaGovOpenApiGenerator.php @@ -0,0 +1,34 @@ + $operations) { + if (isset($operations['get'])) { + $filteredPaths[$path] = ['get' => $operations['get']]; + } + } + + return $filteredPaths; + } + +} diff --git a/docroot/modules/custom/va_gov_api/va_gov_api.libraries.yml b/docroot/modules/custom/va_gov_api/va_gov_api.libraries.yml new file mode 100644 index 0000000000..01402f7a12 --- /dev/null +++ b/docroot/modules/custom/va_gov_api/va_gov_api.libraries.yml @@ -0,0 +1,8 @@ +json_schemas_table_filter: + version: 1.x + js: + js/json-schemas-table-filter.js: {} + dependencies: + - core/jquery + - core/drupal + - core/drupalSettings diff --git a/docroot/modules/custom/va_gov_api/va_gov_api.module b/docroot/modules/custom/va_gov_api/va_gov_api.module new file mode 100644 index 0000000000..3251458992 --- /dev/null +++ b/docroot/modules/custom/va_gov_api/va_gov_api.module @@ -0,0 +1,18 @@ +getPath(); + if ($current_path == '/admin/config/services/openapi') { + $attachments['#attached']['library'][] = 'va_gov_api/json_schemas_table_filter'; + } +} diff --git a/tests/phpunit/API/JsonApiExplorerUiTest.php b/tests/phpunit/API/JsonApiExplorerUiTest.php new file mode 100644 index 0000000000..491a0d2050 --- /dev/null +++ b/tests/phpunit/API/JsonApiExplorerUiTest.php @@ -0,0 +1,44 @@ +createUser(); + $user->addRole('content_api_consumer'); + $user->save(); + + $this->drupalLogin($user); + $this->drupalGet('/admin/config/services/openapi/swagger/jsonapi'); + + // Confirm that the page is accessible. + $this->assertSession()->statusCodeEquals(200); + + // Assert that ".page-title" is "OpenAPI Documentation". + $this->assertSession()->elementTextContains( + 'css', + '.page-title', + 'OpenAPI Documentation' + ); + + // Any further assertions would need to be done with JavaScript test bases, + // such as Nightwatch. Or this test could be moved to Cypress. + // But this is a good start... + } + +} From 0b8b6face5e9e0050db0d94ee3d2b3abae00cccc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 19:46:40 -0600 Subject: [PATCH 04/23] Bump va-gov/content-build from 0.0.3405 to 0.0.3407 (#16466) Bumps [va-gov/content-build](https://github.com/department-of-veterans-affairs/content-build) from 0.0.3405 to 0.0.3407. - [Release notes](https://github.com/department-of-veterans-affairs/content-build/releases) - [Commits](https://github.com/department-of-veterans-affairs/content-build/compare/v0.0.3405...v0.0.3407) --- updated-dependencies: - dependency-name: va-gov/content-build dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 6ce760376a..95c1293f90 100644 --- a/composer.json +++ b/composer.json @@ -222,7 +222,7 @@ "symfony/phpunit-bridge": "^5.1", "symfony/process": "^6.3", "symfony/routing": "^6.3", - "va-gov/content-build": "^0.0.3405", + "va-gov/content-build": "^0.0.3407", "vlucas/phpdotenv": "^5.3", "webflo/drupal-finder": "^1.0.0", "webmozart/path-util": "^2.3", diff --git a/composer.lock b/composer.lock index b981b0ebf8..d0e7162659 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": "4111b619b59807990a80c64ccafdb1ce", + "content-hash": "cbe9e19ec2cf9ee2879b8c1d0876e95b", "packages": [ { "name": "asm89/stack-cors", @@ -26044,16 +26044,16 @@ }, { "name": "va-gov/content-build", - "version": "v0.0.3405", + "version": "v0.0.3407", "source": { "type": "git", "url": "https://github.com/department-of-veterans-affairs/content-build.git", - "reference": "66e1d0173d127b650eeff6bf9c57ff7273a6cfdf" + "reference": "32a22486a842d5b2f73fca475bc81fc67f175d0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/department-of-veterans-affairs/content-build/zipball/66e1d0173d127b650eeff6bf9c57ff7273a6cfdf", - "reference": "66e1d0173d127b650eeff6bf9c57ff7273a6cfdf", + "url": "https://api.github.com/repos/department-of-veterans-affairs/content-build/zipball/32a22486a842d5b2f73fca475bc81fc67f175d0a", + "reference": "32a22486a842d5b2f73fca475bc81fc67f175d0a", "shasum": "" }, "type": "node-project", @@ -26080,9 +26080,9 @@ "description": "Front-end for VA.gov. This repository contains the code that generates the www.va.gov website. It contains a Metalsmith static site builder that uses a Drupal CMS for content. This file is here to publish releases to https://packagist.org/packages/va-gov/content-build, so that the CMS CI system can install it and update it using standard composer processes, and so that we can run tests across both systems. See https://github.com/department-of-veterans-affairs/va.gov-cms for the CMS repo, and stand by for more documentation.", "support": { "issues": "https://github.com/department-of-veterans-affairs/content-build/issues", - "source": "https://github.com/department-of-veterans-affairs/content-build/tree/v0.0.3405" + "source": "https://github.com/department-of-veterans-affairs/content-build/tree/v0.0.3407" }, - "time": "2023-12-12T21:18:47+00:00" + "time": "2023-12-13T21:29:35+00:00" }, { "name": "vlucas/phpdotenv", From 430efdc2f1773a47872305db6a702bbc5b472b56 Mon Sep 17 00:00:00 2001 From: Steve Wirt Date: Mon, 18 Dec 2023 11:26:31 -0500 Subject: [PATCH 05/23] VACMS-16335 Add VAMC System police contact migration (#16430) * VACMS-16335 Add VAMC System police contact migration * VACMS-16335 Update migration to add skip. * VACMS-16335 Update migration CSV to add skip. * VACMS-16335 Update police contact migration to properly set phone. * VACMS-16335 Update migration_tools module to bring in updates to process plugins. * VACMS-16335 Remove empry rows from CSV. * VACMS-166335 Tweak data and parse wrapper. * VACMS-16335 Make migration id, more unique --- composer.json | 2 +- composer.lock | 16 +- ...s.migration.vamc_system_police_contact.yml | 176 ++++++++++++++++++ ...s.migration.vamc_system_police_contact.yml | 173 +++++++++++++++++ .../data/police_system_contacts.csv | 171 +++++++++++++++++ 5 files changed, 529 insertions(+), 9 deletions(-) create mode 100644 config/sync/migrate_plus.migration.vamc_system_police_contact.yml create mode 100644 docroot/modules/custom/va_gov_migrate/config/install/migrate_plus.migration.vamc_system_police_contact.yml create mode 100644 docroot/modules/custom/va_gov_migrate/data/police_system_contacts.csv diff --git a/composer.json b/composer.json index 95c1293f90..50e349a33b 100644 --- a/composer.json +++ b/composer.json @@ -132,7 +132,7 @@ "drupal/migrate_source_csv": "^3.4", "drupal/migrate_source_ui": "^1.0", "drupal/migrate_tools": "^6.0", - "drupal/migration_tools": "^2.7", + "drupal/migration_tools": "^2.8", "drupal/mimemail": "^1.0@alpha", "drupal/monolog": "^2.0", "drupal/next": "^1.1", diff --git a/composer.lock b/composer.lock index d0e7162659..c4d1fef41d 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": "cbe9e19ec2cf9ee2879b8c1d0876e95b", + "content-hash": "12ed709114460a0b530fda1c82e666d6", "packages": [ { "name": "asm89/stack-cors", @@ -9877,17 +9877,17 @@ }, { "name": "drupal/migration_tools", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/migration_tools.git", - "reference": "8.x-2.7" + "reference": "8.x-2.8" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/migration_tools-8.x-2.7.zip", - "reference": "8.x-2.7", - "shasum": "14ca503e29aeb7b1d276c017c906a715615679d6" + "url": "https://ftp.drupal.org/files/projects/migration_tools-8.x-2.8.zip", + "reference": "8.x-2.8", + "shasum": "d961119e9d8c3ee54d4780d95f091088a0d5a4ee" }, "require": { "drupal/core": "^8 || ^9 || ^10" @@ -9895,8 +9895,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-2.7", - "datestamp": "1687321365", + "version": "8.x-2.8", + "datestamp": "1702853115", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" diff --git a/config/sync/migrate_plus.migration.vamc_system_police_contact.yml b/config/sync/migrate_plus.migration.vamc_system_police_contact.yml new file mode 100644 index 0000000000..a251ef70e2 --- /dev/null +++ b/config/sync/migrate_plus.migration.vamc_system_police_contact.yml @@ -0,0 +1,176 @@ +uuid: 76c51618-4d13-499e-8cf9-3022715c0070 +langcode: en +status: true +dependencies: { } +id: vamc_system_police_contact +class: null +field_plugin_method: null +cck_plugin_method: null +migration_tags: + - Content + - Node +migration_group: vamc +label: 'Node - VAMC System police contact.' +source: + plugin: csv + path: modules/custom/va_gov_migrate/data/police_system_contacts.csv + delimiter: ',' + enclosure: '"' + escape: \ + header_offset: 0 + track_changes: true + ids: + - vamc_system_label + - facility_name + - facility_id + - status + - skip + constants: + cms_migrator: 1317 + fields: + - + name: city + label: City + - + name: facility_name + label: 'Facility Name' + - + name: telephone_ops + label: 'Phone Ops number' + - + name: visn + label: 'VISN number' + - + name: vamc_system_label + label: 'VAMC System name' + - + name: facility_id + label: 'The API id of the main facility' + - + name: status + label: 'Status of the entry (used for internal tracking)' + - + name: skip + label: 'A boolean indicating if the row should be skipped' +process: + pseudo_clean_phone: + - + plugin: str_replace + search: + - ( + - ) + - X + replace: + - '' + - '-' + - x + source: telephone_ops + pseudo_phone: + - + plugin: explode + delimiter: x + limit: 2 + source: '@pseudo_clean_phone' + - + plugin: array_shift + - + plugin: callback + callable: trim + pseudo_extension: + - + plugin: explode + delimiter: x + limit: 2 + source: '@pseudo_clean_phone' + - + plugin: array_pop + - + plugin: callback + callable: trim + - + plugin: gate_comparator + value_a: '@source' + comparison: '!==' + value_b: '@pseudo_phone' + when_false_value: '' + skip: + - + plugin: skip_on_value + source: skip + method: row + value: 1 + nid: + - + plugin: entity_lookup + access_check: false + ignore_case: true + entity_type: node + bundle_key: type + bundle: health_care_region_page + value_key: title + source: vamc_system_label + - + plugin: skip_on_empty + method: row + message: 'Entity lookup found no VAMC System for @vamc_system_label.' + - + plugin: entity_lookup + access_check: false + ignore_case: true + entity_type: node + bundle_key: type + bundle: vamc_system_va_police + value_key: field_office + - + plugin: skip_on_empty + method: row + message: 'Entity lookup found no police page for @vamc_system_label.' + field_phone_numbers_paragraph: + - + plugin: create_default_paragraph_revision + paragraph_default: + create_paragraph_bundle: phone_number + field_phone_number_type: tel + field_phone_label: 'non-emergency phone number, 24/7' + field_phone_number: '@pseudo_phone' + field_phone_extension: '@pseudo_extension' + changed: + plugin: callback + callable: va_gov_migrate_time + new_revision: + plugin: default_value + default_value: true + revision_default: + plugin: default_value + default_value: true + revision_log: + plugin: default_value + default_value: 'Updated contact data by VAMC System Police contact migration.' + revision_timestamp: + plugin: callback + callable: va_gov_migrate_time + revision_uid: + plugin: default_value + default_value: constants/cms_migrator + langcode: + plugin: default_value + default_value: en + uid: + plugin: default_value + default_value: constants/cms_migrator +destination: + plugin: 'entity:node' + default_bundle: vamc_system_va_police + validate: false + overwrite_properties: + - changed + - field_phone_numbers_paragraph + - new_revision + - nid + - revision_default + - revision_log + - revision_timestamp + - revision_uid +migration_dependencies: + required: { } + optional: { } diff --git a/docroot/modules/custom/va_gov_migrate/config/install/migrate_plus.migration.vamc_system_police_contact.yml b/docroot/modules/custom/va_gov_migrate/config/install/migrate_plus.migration.vamc_system_police_contact.yml new file mode 100644 index 0000000000..eb59183a2e --- /dev/null +++ b/docroot/modules/custom/va_gov_migrate/config/install/migrate_plus.migration.vamc_system_police_contact.yml @@ -0,0 +1,173 @@ +langcode: en +status: true +dependencies: { } +id: vamc_system_police_contact +class: null +field_plugin_method: null +cck_plugin_method: null +migration_tags: + - Content + - Node +migration_group: vamc +label: 'Node - VAMC System police contact.' +source: + plugin: csv + path: modules/custom/va_gov_migrate/data/police_system_contacts.csv + delimiter: ',' + enclosure: '"' + escape: \ + header_offset: 0 + track_changes: true + ids: + - vamc_system_label + - facility_name + - facility_id + - status + - skip + constants: + cms_migrator: 1317 + fields: + - + name: city + label: City + - + name: facility_name + label: 'Facility Name' + - + name: telephone_ops + label: 'Phone Ops number' + - + name: visn + label: 'VISN number' + - + name: vamc_system_label + label: "VAMC System name" + - + name: facility_id + label: "The API id of the main facility" + - + name: status + label: "Status of the entry (used for internal tracking)" + - + name: skip + label: "A boolean indicating if the row should be skipped" +process: + # This is where we process the incoming row and assign to fields. + pseudo_clean_phone: + - + plugin: str_replace + search: ["(", ")", "X"] + replace: ["", "-", "x"] + source: telephone_ops + pseudo_phone: + - + plugin: explode + delimiter: x + limit: 2 + source: "@pseudo_clean_phone" + - + plugin: array_shift + - + plugin: callback + callable: trim + pseudo_extension: + - + plugin: explode + delimiter: x + limit: 2 + source: "@pseudo_clean_phone" + - + plugin: array_pop + - + plugin: callback + callable: trim + # Remove the original number if it made it this far. + - + plugin: gate_comparator + value_a: '@source' + comparison: '!==' + value_b: '@pseudo_phone' + when_false_value: '' + skip: + - + plugin: skip_on_value + source: skip + method: row + value: 1 + # This looks up the system by name, then looks up the police node based on the + # node id of the system. + nid: + - + plugin: entity_lookup + access_check: false + ignore_case: true + entity_type: node + bundle_key: type + bundle: health_care_region_page + value_key: title + source: vamc_system_label + - + plugin: skip_on_empty + method: row + message: 'Entity lookup found no VAMC System for @vamc_system_label.' + - + plugin: entity_lookup + access_check: false + ignore_case: true + entity_type: node + bundle_key: type + bundle: vamc_system_va_police + value_key: field_office + - + plugin: skip_on_empty + method: row + message: 'Entity lookup found no police page for @vamc_system_label.' + field_phone_numbers_paragraph: + - + plugin: create_default_paragraph_revision + paragraph_default: + create_paragraph_bundle: phone_number + field_phone_number_type: tel + field_phone_label: 'non-emergency phone number, 24/7' + field_phone_number: '@pseudo_phone' + field_phone_extension: '@pseudo_extension' + changed: + plugin: callback + callable: va_gov_migrate_time + new_revision: + plugin: default_value + default_value: true + revision_default: + plugin: default_value + default_value: true + revision_log: + plugin: default_value + default_value: 'Updated contact data by VAMC System Police contact migration.' + revision_timestamp: + plugin: callback + callable: va_gov_migrate_time + revision_uid: + plugin: default_value + default_value: "constants/cms_migrator" + langcode: + plugin: default_value + default_value: en + uid: + plugin: default_value + default_value: "constants/cms_migrator" +destination: + plugin: 'entity:node' + default_bundle: vamc_system_va_police + validate: false + overwrite_properties: + - changed + - field_phone_numbers_paragraph + - new_revision + - nid + - revision_default + - revision_log + - revision_timestamp + - revision_uid +migration_dependencies: + required: [] + optional: [] diff --git a/docroot/modules/custom/va_gov_migrate/data/police_system_contacts.csv b/docroot/modules/custom/va_gov_migrate/data/police_system_contacts.csv new file mode 100644 index 0000000000..20f74460c1 --- /dev/null +++ b/docroot/modules/custom/va_gov_migrate/data/police_system_contacts.csv @@ -0,0 +1,171 @@ +city,facility_name,telephone_ops,visn,vamc_system_label,facility_id,status,skip +North Chicago,Captain James A. Lovell Federal HCC,224-610-3703,12,Lovell Federal health care - VA,vha_556,1 to 1, +Anchorage,Alaska HCS,907-257-6950,20,VA Alaska health care,vha_463,1 to 1, +Albany,Albany Stratton VAMC ,518-626-6750,2,VA Albany health care,vha_528,1 to 1, +Alexandria,Alexandria VA HCS,318-466-2771,16,VA Alexandria health care,vha_502,1 to 1, +Altoona,James E. Van Zandt VAMC,814-943-8164x17059,4,VA Altoona health care,vha_503,1 to 1, +Amarillo,Amarillo VA HCS - Thomas E. Creek VAMC,806-354-7861,17,VA Amarillo health care,vha_504,1 to 1, +Ann Arbor,VA Ann Arbor HCS,734-845-3405,10,VA Ann Arbor health care,vha_506,1 to 1, +Asheville,Asheville VAMC,828-296-4493,6,VA Asheville health care,vha_637,1 to 1, +Atlanta,Atlanta VA HCS,404-321-6111x127641,7,VA Atlanta health care,vha_508,1 to 1, +Augusta,Charlie Norwood VAMC ,706-823-2211,7,VA Augusta health care,vha_509,1 to 1, +Battle Creek,Battle Creek VAMC,269-223-5365,10,VA Battle Creek health care,vha_515,1 to 1, +Bay Pines,Bay Pines VA HCS,727-398-6661x14111,8,VA Bay Pines health care,vha_516,1 to 1, +Beckley,Beckley VAMC,304-255-2121x4381,5,VA Beckley health care,vha_517,1 to 1, +Bedford,Edith Nourse Rogers Memorial Veterans Hospital,781-687-2404,1,VA Bedford health care,vha_518,1 to 1, +Birmingham,Birmingham VAMC,205-933-8101x6444,7,VA Birmingham health care,vha_521,1 to 1, +Fort Meade,VA Black Hills HCS - Fort Meade Campus,605-720-7177,23,VA Black Hills health care,vha_568,Use Fort Meade, +Hot Springs,VA Black Hills HCS - Hot Springs Campus,605-745-2020,23,VA Black Hills health care,vha_568,Use Fort Meade,1 +Boise,Boise VAMC,208-422-1122,20,VA Boise health care,vha_531,1 to 1, +Boston,VA Boston HCS - Jamaica Plain Division,857-364-5293,1,VA Boston health care,vha_523,Use Jamaica Plain, +Boston,VA Boston HCS - West Roxbury Division,857-203-6007,1,VA Boston health care,vha_523,Use Jamaica Plain,1 +Brockton,VA Boston HCS - Brockton Division,774-826-2530,1,VA Boston health care,vha_523,Use Jamaica Plain,1 +Bronx,James J. Peters VAMC,718-584-9000x5377,2,VA Bronx health care,vha_526,1 to 1, +Butler,VA Butler Healthcare,878-271-6002,4,VA Butler health care,vha_529,1 to 1, +San Juan,VA Caribbean HCS,787-641-7582x31251,8,VA Caribbean health care,vha_672,1 to 1, +Montgomery,Central Alabama HCS - West Campus,(334)727-6448,7,VA Central Alabama health care,vha_619,Good duplicate, +Tuskegee,Central Alabama HCS - East Campus,(334)727-6448,7,VA Central Alabama health care,vha_619,Good duplicate,1 +Little Rock,Cent. Arkansas HCS - John L. McClellan Mem. Hospital,501-257-6550,16,VA Central Arkansas health care,vha_598,Good duplicate, +No. Little Rock,Cent. Arkansas HCS - Eugene J. Towbin HCC,501-257-6550,16,VA Central Arkansas health care,vha_598,Good duplicate,1 +Fresno,Central California VA HCS,559-228-6982,21,VA Central California health care,vha_570,1 to 1, +Des Moines,VA Central Iowa HCS,515-699-5839,23,VA Central Iowa health care,vha_636,1 to 1, +Columbus,Chalmers P. Wylie ACC,614-257-5555,10,VA Central Ohio health care,vha_757,1 to 1, +Temple,Central Texas Veterans HCS - Olin E. Teague VAMC,254-743-2278,17,VA Central Texas health care,vha_674,Good duplicate, +Waco,Central Texas Veterans HCS - Doris Miller VAMC,254-743-2278,17,VA Central Texas health care,vha_674,Good duplicate,1 +Leeds,VA Central Western Massachusetts HCS,413-582-3029,1,VA Central Western Massachusetts health care,vha_631,1 to 1, +Charleston,Ralph H. Johnson VAMC,843-789-7251,7,VA Charleston health care,vha_534,1 to 1, +Cheyenne,Cheyenne VAMC,307-778-7315,19,VA Cheyenne health care,vha_442,1 to 1, +Chicago,Jesse Brown VAMC,312-569-6108,12,VA Chicago health care,vha_537,1 to 1, +Chillicothe,Chillicothe VAMC,740-773-1141x7273,10,VA Chillicothe health care,vha_538,1 to 1, +Cincinnati,Cincinnati VAMC,513-475-6331,10,VA Cincinnati health care,vha_539,1 to 1, +Clarksburg,Louis A. Johnson VAMC,304-623-3461x3890,5,VA Clarksburg health care,vha_540,1 to 1, +Coatesville,Coatesville VAMC,610-383-0222,4,VA Coatesville health care,vha_542,1 to 1, +Columbia,Harry S. Truman Memorial,573-814-6320,15,VA Columbia Missouri health care,vha_589,1 to 1, +Columbia,Wm. Jennings Bryan Dorn VAMC,803-695-6804,7,VA Columbia South Carolina health care,vha_544,1 to 1, +Newington,VA Connecticut HCS - Newington Campus,860-667-6707,1,VA Connecticut health care,vha_689,Use West Have,1 +West Haven,VA Connecticut HCS - West Haven Campus,203-937-3864,1,VA Connecticut health care,vha_689,Use West Have, +Dayton,Dayton VAMC,937-262-2160,10,VA Dayton health care,vha_552,1 to 1, +Detroit,John D. Dingell VAMC,313-576-3375,10,VA Detroit health care,vha_553,1 to 1, +Dublin,Carl Vinson VAMC,478-277-2766,7,VA Dublin health care,vha_557,1 to 1, +Durham,Durham VAMC,919-286-6872,6,VA Durham health care,vha_558,1 to 1, +Aurora,VA East. Colorado HCS - Rocky Mountain Region VAMC,720-857-5800,19,VA Eastern Colorado health care,vha_554,1 to 1, +Leavenworth,VA Eastern Kansas HCS - Dwight D. Eisenhower VAMC,913-682-2000x52059,15,VA Eastern Kansas health care,vha_589,Use Eisenhower, +Topeka,VA Eastern Kansas HCS - Colmery-O'Neil VAMC,785-350-3111x52695,15,VA Eastern Kansas health care,vha_589,Use Eisenhower,1 +Muskogee,Jack C. Montgomery VAMC,918-577-3807,19,VA Eastern Oklahoma health care,vha_623,1 to 1, +El Paso,El Paso VAMC,915-564-6103x7572,17,VA El Paso health care,vha_756,1 to 1, +Erie,Erie VAMC,814-860-2277,4,VA Erie health care,vha_562,1 to 1, +Fargo,Fargo VA HCS,701-239-3700x93299,23,VA Fargo health care,vha_437,1 to 1, +Fayetteville,Veterans HCS of the Ozarks,479-444-4050,16,VA Fayetteville Arkansas health care,vha_564,"Use Fayetteville, not Springfield", +"Springfield, MO",Veterans HCS of the Ozarks - Gene Taylor HCC,417-891-4800x64711 ,16,VA Fayetteville Arkansas health care,vha_564,"Use Fayetteville, not Springfield",1 +Fayetteville,Fayetteville VAMC,910-822-7922,6,VA Fayetteville Coastal health care,vha_565,1 to 1, +Bath,Finger Lakes VA HCS - Bath VAMC,607-664-4768,2,VA Finger Lakes health care,vha_528,Use Canandaigua,1 +Canandaigua,Finger lakes HCS - Canandaigua VAMC,585-393-7405,2,VA Finger Lakes health care,vha_528,Use Canandaigua, +Los Angeles,VA Greater LA HCS - Sepulveda ACC,310-268-4524,22,VA Greater Los Angeles health care,vha_691,Good duplicate, +Los Angeles,VA Greater LA HCS - W. LA VAMC,310-268-4524,22,VA Greater Los Angeles health care,vha_691,Good duplicate,1 +Biloxi,Gulf Coast Veterans HCS,228-523-5499x5734,16,VA Gulf Coast health care,vha_520,1 to 1, +Hampton,Hampton VAMC,757-728-3197,6,VA Hampton health care,vha_590,1 to 1, +Hines,Edward Hines Jr. VA Hospital,708-202-2013,12,VA Hines health care,vha_578,1 to 1, +Houston,Michael E. DeBakey VAMC,713-794-7106,17,VA Houston health care,vha_580,1 to 1, +Montrose,Hudson Valley HCS - Franklin Delano Roosevelt Campus,914-737-4400x2509,2,VA Hudson Valley health care,vha_620,Use Roosevelt, +Wappingers Falls,VA Hudson Valley HCS - Castle Point Campus,845-838-5211,2,VA Hudson Valley health care,vha_620,Use Roosevelt,1 +Huntington,"Hershel ""Woody"" Williams VAMC",304-429-6755x2855,5,VA Huntington health care,vha_581,1 to 1, +Danville,VA Illiana HCS,217-554-5146,12,VA Illiana health care,vha_550,1 to 1, +Indianapolis,Richard L. Roudebush VAMC,317-988-2200,10,VA Indiana health care,vha_583,1 to 1, +Iowa City,Iowa City HCS,319-338-0581x6600,23,VA Iowa City health care,vha_636,1 to 1, +Iron Mountain,Oscar G. Johnson VAMC,906-774-3300x32030,12,VA Iron Mountain health care,vha_585,1 to 1, +Jackson,G. V. (Sonny) Montgomery VAMC,601-364-1234,16,VA Jackson health care,vha_586,1 to 1, +Kansas City,Kansas City VAMC,816-922-2875,15,VA Kansas City health care,vha_589,1 to 1, +Lebanon,Lebannon VAMC,717-228-5910,4,VA Lebanon health care,vha_595,1 to 1, +Lexington,Lexington VAMC,859-281-4444,9,VA Lexington health care,vha_596,1 to 1, +Loma Linda,VA Loma Linda HCS,909-825-7084x2135,22,VA Loma Linda health care,vha_605,1 to 1, +Long Beach,VA Long Beach HCS,562-826-5800,22,VA Long Beach health care,vha_600,1 to 1, +Louisville,Robley Rex VAMC,502-287-5255,9,VA Louisville health care,vha_603,1 to 1, +Madison,William S. Middleton Mem. Veterans Hospital,608-256-1901x7270,12,VA Madison health care,vha_607,1 to 1, +Togus,VA Maine HCS,207-623-5796,1,VA Maine health care,vha_402,1 to 1, +Manchester,Manchester VAMC,603-624-4366 X6426,1,VA Manchester health care,vha_608,1 to 1, +Marion,Marion VAMC,618-993-4167,15,VA Marion health care,vha_657,1 to 1, +Martinsburg,Martinsburg VAMC,304-264-4818,5,VA Martinsburg health care,vha_613,1 to 1, +Baltimore,VA Maryland HCS - Baltimore VAMC,410-605-7300,5,VA Maryland health care,vha_512,Use Baltimore, +Loch Raven,VA Maryland HCS - Loch Raven VAMC,410-605-7000x55880,5,VA Maryland health care,vha_512,Use Baltimore,1 +Perry Point,VA Maryland HCS - Perry Point VAMC,410-642-1000,5,VA Maryland health care,vha_512,Use Baltimore,1 +Memphis,Memphis VAMC,901-577-7570,9,VA Memphis health care,vha_614,1 to 1, +Miami,Miami VA HCS,305-575-3400,8,VA Miami health care,vha_546,1 to 1, +Milwaukee,Clement J. Zablocki VAMC,414-384-2000x42222,12,VA Milwaukee health care,vha_695,1 to 1, +Minneapolis,Minneapolis VA HCS,612-467-3589,23,VA Minneapolis health care,vha_618,1 to 1, +Fort Harrison,VA Montana HCS,406-447-7586,19,VA Montana health care,vha_436,1 to 1, +Mountain Home,Mountain Home VAMC,423-926-1171x7197,9,VA Mountain Home health care,vha_621,1 to 1, +Grand Island,VA Nebraska/Western Iowa HCS - Grand Island VAMC,402-995-3202,23,VA Nebraska-Western Iowa health care,vha_636,Good duplicate, +Lincoln,VA Nebraska/Western Iowa HCS - Lincoln Clinic,402-995-3202,23,VA Nebraska-Western Iowa health care,vha_636,Good duplicate,1 +Omaha,VA Nebraska/Western Iowa HCS - Omaha VAMC,402-995-3202,23,VA Nebraska-Western Iowa health care,vha_636,Good duplicate,1 +East Orange,VA New Jersey HCS - East Orange Campus,908-604-5824,2,VA New Jersey health care,vha_561,Good duplicate, +Lyons,VA New Jersey HCS - Lyons Campus,908-604-5824,2,VA New Jersey health care,vha_561,Good duplicate,1 +Albuquerque,New Mexico VA HCS,505-256-2865,22,VA New Mexico health care,vha_501,1 to 1, +Brooklyn,VA New York Harbor HCS - Brooklyn Campus,718-630-3549,2,VA New York Harbor health care,vha_630,Use Manhattan,1 +Jamaica,VA New York Harbor HCS - St. Albans Campus,718-526-1000x8501,2,VA New York Harbor health care,vha_630,Use Manhattan,1 +Manhattan,VA New York Harbor HCS - Manhattan Campus,212-686-7500x3701,2,VA New York Harbor health care,vha_630,Use Manhattan, +Gainesville,No. Florida/So. Georgia HCS - Malcom Randall VAMC,352-379-4091,8,VA North Florida/South Georgia health care,vha_573,Use Lake City,1 +Lake City,No. Florida/So. Georgia HCS - Lake City VAMC,386-754-6301,8,VA North Florida/South Georgia health care,vha_573,Use Lake City, +Bonham,North Texas HCS - Sam Rayburn Mem. Veterans Center,214-857-0411,17,VA North Texas health care,vha_549,Good duplicate, +Dallas,VA North Texas HCS - Dallas VAMC,214-857-0411,17,VA North Texas health care,vha_549,Good duplicate,1 +Cleveland,Louis Stokes Cleveland VAMC,216-421-3223 ,10,VA Northeast Ohio health care,vha_541,1 to 1, +Prescott,Northern Arizona HCS,928-776-6019,22,VA Northern Arizona health care,vha_649,1 to 1, +Martinez,VA Northern California HCS - Martinez OPC ,916-366-5401,21,VA Northern California health care,vha_612,Good duplicate, +Mather,VA Northern California HCS - Sacramento VAMC,916-366-5401,21,VA Northern California health care,vha_612,Good duplicate,1 +Fort Wayne,VA No. Indiana HCS - Fort Wayne Campus,765-677-3142,10,VA Northern Indiana health care,vha_610,Good duplicate,1 +Marion,VA No. Indiana HCS - Marion Campus,765-677-3142,10,VA Northern Indiana health care,vha_610,Good duplicate, +Northport,Northport VAMC,631-261-4400x7186,2,VA Northport health care,vha_632,1 to 1, +Oklahoma City,Oklahoma City VA HCS,405-456-5590,19,VA Oklahoma City health care,vha_635,1 to 1, +Orlando,Orlando VAMC,407-631-8285,8,VA Orlando health care,vha_675,1 to 1, +Honolulu,VA Pacific Island HCS - Spark M. Matsunaga VAMC,808-433-4467,21,VA Pacific Islands health care,vha_459,1 to 1, +Livermore,VA Palo HCS - Menlo Park Division,650-858-3901,21,VA Palo Alto health care,vha_640,Good duplicate,1 +Menlo Park,VA Palo HCS - Livermore Division,650-858-3901,21,VA Palo Alto health care,vha_640,Good duplicate,1 +Palo Alto,VA Palo HCS - Palo Alto Division,650-858-3901,21,VA Palo Alto health care,vha_640,Good duplicate, +Philadelphia,Philadelphia VAMC,215-823-5895,4,VA Philadelphia health care,vha_642,1 to 1, +Phoenix,Phoenix VA HCS,602-222-6420,22,VA Phoenix health care,vha_644,1 to 1, +Pittsburgh,VA Pittsburgh HCS - H.J. Heinz Campus,412-360-6911,4,VA Pittsburgh health care,vha_646,Good duplicate,1 +Pittsburgh,VA Pittsburgh HCS - University Campus,412-360-6911,4,VA Pittsburgh health care,vha_646,Good duplicate, +Poplar Bluff,John J. Pershing VAMC,573-778-4357,15,VA Poplar Bluff health care,vha_657,1 to 1, +Portland,VA Portland HCS,503-808-1911,20,VA Portland health care,vha_648,1 to 1, +Providence,Providence VAMC,401-457-3008,1,VA Providence health care,vha_650,1 to 1, +Seattle,VA Puget Sound HCS - Seattle Division,206-764-2899,20,VA Puget Sound health care,vha_663,Good duplicate,1 +Tacoma,VA Puget Sound HCS - American Lake Division,206-764-2899,20,VA Puget Sound health care,vha_663,Good duplicate, +Richmond,Hunter Holmes McGuire VAMC,804-675-5278,6,VA Richmond health care,vha_652,1 to 1, +Roseburg,Roseburg VAMC,541-440-1000x44333,20,VA Roseburg health care,vha_653,1 to 1, +Saginaw,Aleda E. Lutz VAMC,989-497-2500x13203,10,VA Saginaw health care,vha_655,1 to 1, +Salem,Salem VAMC,540-983-1044,6,VA Salem health care,vha_658,1 to 1, +Salisbury,W.G. (Bill) Hefner VAMC,704-638-3334,6,VA Salisbury health care,vha_659,1 to 1, +Salt Lake City,VA Salt Lake City HCS - George E. Wahlen VAMC,801-584-1287,19,VA Salt Lake City health care,vha_660,1 to 1, +San Diego,VA San Diego HCS,858-642-3931,22,VA San Diego health care,vha_664,1 to 1, +San Francisco,San Francisco VA HCS,415-750-2003,21,VA San Francisco health care,vha_662,1 to 1, +Sheridan,Sheridan VAMC,307-675-3323x3220,19,VA Sheridan health care,vha_666,1 to 1, +Shreveport,Overton Brooks VAMC,318-221-8411x16911,16,VA Shreveport health care,vha_667,1 to 1, +Reno,VA Sierra Nevada HCS,775-328-1234,21,VA Sierra Nevada health care,vha_654,1 to 1, +Sioux Falls,Royal C. Johnson Memorial Medical Center,605-336-3230x97376,23,VA Sioux Falls health care,vha_438,1 to 1, +Kerrville,South Texas Veterans HCS - Kerrville VAMC,210-617-5168,17,VA South Texas health care,vha_671,Good duplicate, +San Antonio,So. Texas Veterans HCS - Audie L. Murphy VA Hospital,210-617-5168,17,VA South Texas health care,vha_671,Good duplicate,1 +New Orleans,Southeast Louisiana Veterans HCS,504-207-2011,16,VA Southeast Louisiana health care,vha_629,1 to 1, +Tucson,Southern Arizona HCS,520-629-1823,22,VA Southern Arizona health care,vha_678,1 to 1, +North Las Vegas,VA Southern Nevada HCS,702-791-9000x14073,21,VA Southern Nevada health care,vha_593,1 to 1, +White City,Southern Oregon Rehabilitation Center & Clinics,541-826-2111x3362,20,VA Southern Oregon health care,vha_692,1 to 1, +Spokane,Mann-Grandstaff VAMC,509-434-7912,20,VA Spokane health care,vha_668,1 to 1, +St. Cloud,St. Cloud VA HCS,320-255-6335,23,VA St Cloud health care,vha_656,1 to 1, +St. Louis,VA St. Louis HCS - John Cochran Division,314-289-6326,15,VA St Louis health care,vha_657,Good duplicate,1 +St. Louis,VA St. Louis HCS - John Cochran Division,314-289-6326,15,VA St Louis health care,vha_657,Good duplicate, +Syracuse,Syracuse VAMC,315-425-4336,2,VA Syracuse health care,vha_528,1 to 1, +Tampa,James A. Haley Veterans Hospital,813-972-7554,8,VA Tampa health care,vha_673,1 to 1, +Murfreesboro,Tennessee Valley HCS - Alvin C. York Campus,615-225-6600,9,VA Tennessee Valley health care,vha_626,Good duplicate,1 +Nashville,Tennessee Valley HCS - Nashville Campus,615-225-6600,9,VA Tennessee Valley health care,vha_626,Good duplicate, +Harlingen,Texas Valley Coastal Bend HCS - Harlingen HCC,956-291-9001,17,VA Texas Valley health care,vha_740,1 to 1, +Tomah,Tomah VAMC,608-372-1245,12,VA Tomah health care,vha_676,1 to 1, +Tuscaloosa,Tuscaloosa VAMC,205-554-2086,7,VA Tuscaloosa health care,vha_679,1 to 1, +Walla Walla,Jonathan M. Wainwright Memorial VAMC,509-527-6135,20,VA Walla Walla health care,vha_687,1 to 1, +Washington,Washington DC VAMC,202-745-8189,5,VA Washington DC health care,vha_688,1 to 1, +West Palm Beach,West Palm VAMC,561-422-7312,8,VA West Palm Beach health care,vha_548,1 to 1, +Big Spring,"West Texas VA HCS - George H. O'Brien, Jr. VAMC",432-263-7361x7003,17,VA West Texas health care,vha_519,1 to 1, +Grand Junction,Grand Junction VAMC,970-263-5078,19,VA Western Colorado health care,vha_575,1 to 1, +Batavia,VA Western New York HCS - Batavia Campus,716-862-8747,2,VA Western New York health care,vha_528,Good duplicate,1 +Buffalo,VA Western New York HCS - Buffalo Campus,716-862-8747,2,VA Western New York health care,vha_528,Good duplicate, +White River Junction,White River Junction VAMC,802-295-9363x6361,1,VA White River Junction health care,vha_405,1 to 1, +Wichita,Robert J. Dole VAMC,316-651-3631,15,VA Wichita health care,vha_589,1 to 1, +Wilkes-Barre,Wilkes-Barre VAMC,570-824-3521x27365,4,VA Wilkes-Barre health care,vha_693,1 to 1, +Wilmington,Wilmington VAMC,302-633-5280,4,VA Wilmington health care,vha_460,1 to 1, From cc7b4a4e276b4c402166247730a1ac9884dee5f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 10:53:36 -0800 Subject: [PATCH 06/23] Bump drupal/sitewide_alert from 2.1.2 to 2.2.1 (#16343) * Bump drupal/sitewide_alert from 2.1.2 to 2.2.1 Bumps drupal/sitewide_alert from 2.1.2 to 2.2.1. --- updated-dependencies: - dependency-name: drupal/sitewide_alert dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * removed patch, it has been merged * updated composer.lock --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> Co-authored-by: Edmund Dunn --- composer.json | 3 --- composer.lock | 19 ++++++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 50e349a33b..8a65295ffd 100644 --- a/composer.json +++ b/composer.json @@ -527,9 +527,6 @@ }, "drupal/views_data_export": { "3189135 - Use relative URL for export button": "https://www.drupal.org/files/issues/2022-08-06/use-relative-url-for-export-3189135-10.patch" - }, - "drupal/sitewide_alert": { - "3290964 - Add drush commands for sitewide alerts": "https://www.drupal.org/files/issues/2023-11-27/3290964-add-drush-commands-19.patch" } } }, diff --git a/composer.lock b/composer.lock index c4d1fef41d..4570b1a21b 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": "12ed709114460a0b530fda1c82e666d6", + "content-hash": "04f5d4445784cc83c0d9c7c508b890c3", "packages": [ { "name": "asm89/stack-cors", @@ -12280,17 +12280,17 @@ }, { "name": "drupal/sitewide_alert", - "version": "2.1.2", + "version": "2.2.1", "source": { "type": "git", "url": "https://git.drupalcode.org/project/sitewide_alert.git", - "reference": "2.1.2" + "reference": "2.2.1" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/sitewide_alert-2.1.2.zip", - "reference": "2.1.2", - "shasum": "8cc408c5822af6b408180e59dea35c3e748eb28c" + "url": "https://ftp.drupal.org/files/projects/sitewide_alert-2.2.1.zip", + "reference": "2.2.1", + "shasum": "991c7b406fd1497d5346970080c3d2d7c3ad5bf2" }, "require": { "drupal/core": "^9.2 || ^10", @@ -12298,13 +12298,14 @@ }, "require-dev": { "drupal/domain": "*", - "drupal/domain_entity": "*" + "drupal/domain_entity": "*", + "drush/drush": "^11 || ^12" }, "type": "drupal-module", "extra": { "drupal": { - "version": "2.1.2", - "datestamp": "1693492788", + "version": "2.2.1", + "datestamp": "1701398224", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" From 2a46d4e56a0c437545662dc01bf9e3a8c2f7d0a3 Mon Sep 17 00:00:00 2001 From: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> Date: Mon, 18 Dec 2023 11:48:31 -0800 Subject: [PATCH 07/23] VACMS-16241: post launch D10 cleanup, remove ckeditor 4 (#16471) * VACMS-16241: removed empty files * VACMS-16241: removed seven theme, updated entity_diff_ui * VACMS-16241: fixed formating * VACMS-16241: refactored subscriber for future use/expansion * VACMS-16241: disabled ckeditor 4 * VACMS-16241: removed twig alias, no longer needed * VACMS-16241: updated documentation for D10 and composer aliasing * VACMS-16241: updated composer.lock * VACMS-16241: remove ckeditor 4 * VACMS-16241: updated composer.lock --- composer.json | 1 - composer.lock | 97 +-------------------------------------------------- 2 files changed, 1 insertion(+), 97 deletions(-) diff --git a/composer.json b/composer.json index 8a65295ffd..124eba3b14 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,6 @@ "drupal/block_content_permissions": "^1.6", "drupal/cer": "^5.0@beta", "drupal/change_labels": "dev-3326097-remove-dependency-on-drupal-autoservices#7f92f90b456ac2f394dd434257e39e1d9b3086eb", - "drupal/ckeditor": "^1.0", "drupal/ckeditor_abbreviation": "^4.0@alpha", "drupal/coder": "^8.3", "drupal/codit_menu_tools": "^1.0@alpha", diff --git a/composer.lock b/composer.lock index 4570b1a21b..feabf348d7 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": "04f5d4445784cc83c0d9c7c508b890c3", + "content-hash": "7d0171563d22043d0af8195712a84dba", "packages": [ { "name": "asm89/stack-cors", @@ -2950,101 +2950,6 @@ }, "time": "2022-12-08T18:55:31+00:00" }, - { - "name": "drupal/ckeditor", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://git.drupalcode.org/project/ckeditor.git", - "reference": "1.0.2" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/ckeditor-1.0.2.zip", - "reference": "1.0.2", - "shasum": "fec2ca9ad852a00c7b9584cb6040dc860364c481" - }, - "require": { - "drupal/core": "^9.4 || ^10" - }, - "require-dev": { - "drupal/classy": "*" - }, - "type": "drupal-module", - "extra": { - "drupal": { - "version": "1.0.2", - "datestamp": "1695740655", - "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" - } - } - }, - "notification-url": "https://packages.drupal.org/8/downloads", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "dczepierga", - "homepage": "https://www.drupal.org/user/911466" - }, - { - "name": "hass", - "homepage": "https://www.drupal.org/user/85918" - }, - { - "name": "jcisio", - "homepage": "https://www.drupal.org/user/210762" - }, - { - "name": "Jorrit", - "homepage": "https://www.drupal.org/user/161217" - }, - { - "name": "lauriii", - "homepage": "https://www.drupal.org/user/1078742" - }, - { - "name": "Magnus", - "homepage": "https://www.drupal.org/user/73919" - }, - { - "name": "mkesicki", - "homepage": "https://www.drupal.org/user/922884" - }, - { - "name": "nod_", - "homepage": "https://www.drupal.org/user/598310" - }, - { - "name": "p.wiaderny", - "homepage": "https://www.drupal.org/user/2956619" - }, - { - "name": "vokiel", - "homepage": "https://www.drupal.org/user/2793801" - }, - { - "name": "Wim Leers", - "homepage": "https://www.drupal.org/user/99777" - }, - { - "name": "wwalc", - "homepage": "https://www.drupal.org/user/184556" - }, - { - "name": "xjm", - "homepage": "https://www.drupal.org/user/65776" - } - ], - "description": "WYSIWYG editing for rich text fields using CKEditor.", - "homepage": "https://www.drupal.org/project/ckeditor", - "support": { - "source": "https://git.drupalcode.org/project/ckeditor" - } - }, { "name": "drupal/ckeditor_abbreviation", "version": "4.0.0-alpha1", From fa60372ea7b3a43783266d399ca21dea52a4a3bf Mon Sep 17 00:00:00 2001 From: Eli Selkin Date: Mon, 18 Dec 2023 11:56:40 -0800 Subject: [PATCH 08/23] Update vamc-facilities-lovell.md (#16402) Description of how to make sure Lovell VA pages get processed --- READMES/vamc-facilities-lovell.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/READMES/vamc-facilities-lovell.md b/READMES/vamc-facilities-lovell.md index 9638c3b354..5c33ba79cd 100644 --- a/READMES/vamc-facilities-lovell.md +++ b/READMES/vamc-facilities-lovell.md @@ -33,6 +33,20 @@ In the CMS, pages are either Clones or singles. - Single: A page that only appears in one or the other. Any page with a field_administration of "Lovell - TRICARE" (tid: 1039) OR "Lovell - VA" (tid: 1040) - Twins: Separate CMS nodes that have a non-identical counterpart in both subsystems. In the CMS a twin has no connection to its twin. It has no knowledge that the twin exists. So a twin is just a single, that has another similar single out there. Twin is a human construct, not a CMS construct. +Side note to correctly trigger processing of a Lovell - VA system page on content-build: + 1. In GraphQL make sure you pull the fieldAdministration as: + ``` + fieldAdministration { + entity { + ... on TaxonomyTermAdministration { + entityId + name + } + } + }``` + 2. the `entityId` is the same as the `tid` above and will pull in the page as a single or clone or whichever process. + + ### Content-Build There are a set of steps that run during the content build. The order for these may not be reflected correctly here. 1. Deep copy any node with a field administration of a clone, to become the TRICARE clones. @@ -41,6 +55,7 @@ There are a set of steps that run during the content build. The order for these 1. Alterations to titles of some pages to match VA or TRICARE. 1. Put the new TRICARE copies back in the pages data. + ## Menus ### CMS From 1c77cfa679c6742fb4cbc1a8babf4dcba9f5e301 Mon Sep 17 00:00:00 2001 From: Christian Burk Date: Mon, 18 Dec 2023 14:05:05 -0600 Subject: [PATCH 09/23] VACMS-16152: Adds new view and export (#16326) * VACMS-16152: Adds new view and export * VACMS-16152: Updates export to match online view * VACMS-16152: A few changes * VACMS-16152: Update view with old moderation state filter operator_id * VACMS-16152: Updates export to accord with style guide --- config/sync/views.view.facility_services.yml | 2968 +++++++++++++++++- 1 file changed, 2928 insertions(+), 40 deletions(-) diff --git a/config/sync/views.view.facility_services.yml b/config/sync/views.view.facility_services.yml index 0f89f8dd12..e61d6678b5 100644 --- a/config/sync/views.view.facility_services.yml +++ b/config/sync/views.view.facility_services.yml @@ -32,7 +32,9 @@ dependencies: - node.type.health_care_region_page - node.type.nca_facility - node.type.regional_health_care_service_des + - node.type.service_region - node.type.vba_facility + - node.type.vba_facility_service - node.type.vet_center - node.type.vet_center_cap - node.type.vet_center_facility_health_servi @@ -7822,6 +7824,2789 @@ display: tags: - 'config:field.storage.node.field_facility_locator_api_id' - 'config:workflow_list' + facility_services: + id: facility_services + display_title: 'Facility services' + display_plugin: page + position: 4 + display_options: + title: 'Facility services' + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + plugin_id: field + label: Title + exclude: false + alter: + alter_text: false + element_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + type: string + settings: + link_to_entity: true + nid: + id: nid + table: node_field_data + field: nid + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: nid + plugin_id: field + label: ID + exclude: true + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: number_integer + settings: + thousand_separator: '' + prefix_suffix: true + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + edit_node: + id: edit_node + table: node_field_revision + field: edit_node + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: entity_link_edit + label: '' + exclude: false + alter: + alter_text: true + text: 'Edit' + 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 + text: '' + output_url_as_text: true + absolute: false + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: type + plugin_id: field + label: 'Content type' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: false + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_facility_location: + id: field_facility_location + table: node__field_facility_location + field: field_facility_location + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Facility + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_facility_locator_api_id: + id: field_facility_locator_api_id + table: node__field_facility_locator_api_id + field: field_facility_locator_api_id + relationship: field_facility_location + group_type: group + admin_label: '' + plugin_id: field + label: 'Facility Locator ID' + exclude: false + alter: + alter_text: false + text: '' + 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: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + name_1: + id: name_1 + table: taxonomy_term_field_data + field: name + relationship: field_service_name_and_descripti + group_type: group + admin_label: '' + entity_type: taxonomy_term + entity_field: name + plugin_id: term_name + label: 'Service name' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + convert_spaces: false + name_2: + id: name_2 + table: taxonomy_term_field_data + field: name + relationship: field_service_name_and_descripti_1 + group_type: group + admin_label: '' + entity_type: taxonomy_term + entity_field: name + plugin_id: term_name + label: 'Service Name (for non-VAMC services)' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + convert_spaces: false + field_administration: + id: field_administration + table: node__field_administration + field: field_administration + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Section + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + id: + id: id + table: paragraphs_item_field_data + field: id + relationship: field_service_location + group_type: count + admin_label: '' + entity_type: paragraph + entity_field: id + plugin_id: field + label: 'Service locations' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: number_integer + settings: + thousand_separator: '' + prefix_suffix: true + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + revision_uid: + id: revision_uid + table: node_revision + field: revision_uid + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: revision_uid + plugin_id: field + label: '' + exclude: true + alter: + alter_text: false + text: '' + 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: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + moderation_state: + id: moderation_state + table: node_field_data + field: moderation_state + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: moderation_state_field + label: 'Moderation state' + exclude: false + alter: + alter_text: false + text: '' + 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: value + type: string + settings: + link_to_entity: false + group_column: entity_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + changed: + id: changed + table: node_field_data + field: changed + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: changed + plugin_id: field + label: Updated + exclude: false + alter: + alter_text: true + text: '{{ changed }} by {{ revision_uid }}' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: short + custom_date_format: '' + timezone: '' + tooltip: + date_format: '' + custom_date_format: '' + time_diff: + enabled: false + future_format: '@interval hence' + past_format: '@interval ago' + granularity: 2 + refresh: 60 + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + filters: + type_1: + id: type_1 + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: type + plugin_id: bundle + operator: in + value: + service_region: service_region + health_care_local_health_service: health_care_local_health_service + vha_facility_nonclinical_service: vha_facility_nonclinical_service + vba_facility_service: vba_facility_service + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + operator_limit_selection: false + operator_list: { } + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + title_1: + id: title_1 + table: node_field_data + field: title + relationship: field_facility_location + group_type: group + admin_label: '' + entity_type: node + entity_field: title + plugin_id: string + operator: contains + value: '' + group: 1 + exposed: true + expose: + operator_id: title_1_op + label: 'Facility name contains' + description: '' + use_operator: false + operator: title_1_op + operator_limit_selection: false + operator_list: { } + identifier: facility_title + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: type + plugin_id: bundle + operator: in + value: + service_region: service_region + health_care_local_health_service: health_care_local_health_service + vha_facility_nonclinical_service: vha_facility_nonclinical_service + vba_facility_service: vba_facility_service + group: 1 + exposed: true + expose: + operator_id: type_op + label: 'Content type' + description: '' + use_operator: false + operator: type_op + operator_limit_selection: false + operator_list: { } + identifier: type + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vba: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + homepage_manager: '0' + next_js: '0' + translation_manager: '0' + reduce: true + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + workbench_access_section__section: + id: workbench_access_section__section + table: node + field: workbench_access_section__section + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: workbench_access_section + operator: in + value: { } + group: 1 + exposed: true + expose: + operator_id: workbench_access_section__section_op + label: Section + description: '' + use_operator: false + operator: workbench_access_section__section_op + operator_limit_selection: false + operator_list: { } + identifier: workbench_access_section__section + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + reduce: 1 + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: 0 + section_filter: + show_hierarchy: 1 + field_service_location_target_id: + id: field_service_location_target_id + table: node__field_service_location + field: field_service_location_target_id + relationship: none + group_type: count + admin_label: '' + plugin_id: numeric + operator: '=' + value: + min: '' + max: '' + value: '' + group: 1 + exposed: true + expose: + operator_id: field_service_location_target_id_op + label: 'Number of Service locations' + description: '' + use_operator: true + operator: field_service_location_target_id_op + operator_limit_selection: false + operator_list: { } + identifier: field_service_location_target_id + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vba: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + homepage_manager: '0' + next_js: '0' + translation_manager: '0' + min_placeholder: '' + max_placeholder: '' + placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + moderation_state_multiple_workflow_filter: + id: moderation_state_multiple_workflow_filter + table: node + field: moderation_state_multiple_workflow_filter + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: moderation_state_multiple_workflow_filter + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: moderation_state_op + label: 'Moderation state' + description: '' + use_operator: false + operator: moderation_state_multiple_workflow_filter_op + operator_limit_selection: false + operator_list: { } + identifier: moderation_state + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + homepage_manager: '0' + translation_manager: '0' + next_js: '0' + reduce: 0 + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: 0 + filter_groups: + operator: AND + groups: + 1: AND + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + columns: + title: title + nid: nid + edit_node: edit_node + type: type + field_facility_location: field_facility_location + field_facility_locator_api_id: field_facility_locator_api_id + name_1: name_1 + field_administration: field_administration + id: id + field_referral_required: field_referral_required + field_walk_ins_accepted: field_walk_ins_accepted + field_online_scheduling_availabl: field_online_scheduling_availabl + revision_uid: revision_uid + moderation_state: moderation_state + changed: changed + name: name + timestamp: timestamp + break: break + is_locked: is_locked + name_2: name_1 + default: id + info: + title: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + nid: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + edit_node: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + type: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + field_facility_location: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + field_facility_locator_api_id: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + name_1: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + field_administration: + sortable: true + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + id: + sortable: true + default_sort_order: desc + align: '' + separator: '' + empty_column: false + responsive: '' + field_referral_required: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + field_walk_ins_accepted: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + field_online_scheduling_availabl: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + revision_uid: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + moderation_state: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + changed: + sortable: true + default_sort_order: desc + align: '' + separator: by + empty_column: false + responsive: priority-low + name: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + timestamp: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + break: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + is_locked: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + name_2: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + override: true + sticky: true + summary: '' + empty_table: true + caption: 'List of facility services' + description: '' + row: + type: fields + options: { } + defaults: + access: true + title: false + group_by: false + style: false + row: false + relationships: false + fields: false + filters: false + filter_groups: false + header: false + relationships: + uid: + id: uid + table: node_field_data + field: uid + admin_label: author + plugin_id: standard + required: true + field_regional_health_service: + id: field_regional_health_service + table: node__field_regional_health_service + field: field_regional_health_service + relationship: none + group_type: group + admin_label: 'VAMC system health service' + plugin_id: standard + required: false + field_service_name_and_descripti: + id: field_service_name_and_descripti + table: node__field_service_name_and_descripti + field: field_service_name_and_descripti + relationship: field_regional_health_service + group_type: group + admin_label: 'Service name' + plugin_id: standard + required: false + field_facility_location: + id: field_facility_location + table: node__field_facility_location + field: field_facility_location + relationship: none + group_type: group + admin_label: Facility + plugin_id: standard + required: false + field_service_location: + id: field_service_location + table: node__field_service_location + field: field_service_location + relationship: none + group_type: group + admin_label: 'Service locations' + plugin_id: standard + required: false + field_service_name_and_descripti_1: + id: field_service_name_and_descripti_1 + table: node__field_service_name_and_descripti + field: field_service_name_and_descripti + relationship: none + group_type: group + admin_label: 'field_service_name_and_descripti: Taxonomy term' + plugin_id: standard + required: false + group_by: true + display_description: '' + header: + result: + id: result + table: views + field: result + relationship: none + group_type: group + admin_label: '' + plugin_id: result + empty: false + content: 'Displaying @start - @end of @total' + display_extenders: + jsonapi_views: + enabled: true + path: admin/content/audit/facility-services + menu: + type: tab + title: 'Facility services' + description: '' + weight: 0 + expanded: false + menu_name: admin + parent: system.admin_content + context: '0' + as_local_task: true + local_task_link_title: 'Facility services' + local_task_parent: 'views_view:view.content.content_audit_page' + local_task_weight: 1000 + local_task_custom_parent_route: '' + tab_options: + type: none + title: Content + description: 'Find and manage content' + weight: -10 + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - user + - 'user.node_grants:view' + - user.roles + tags: + - 'config:field.storage.node.field_administration' + - 'config:field.storage.node.field_facility_location' + - 'config:field.storage.node.field_facility_locator_api_id' + - workbench_access_view + deleted: false + facility_services_export: + id: facility_services_export + display_title: 'Facility services export' + display_plugin: data_export + position: 4 + display_options: + title: 'Facility services export' + fields: + title: + id: title + table: node_field_data + field: title + entity_type: node + entity_field: title + plugin_id: field + label: Title + exclude: false + alter: + alter_text: false + element_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + type: string + settings: + link_to_entity: true + nid: + id: nid + table: node_field_data + field: nid + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: nid + plugin_id: field + label: ID + exclude: true + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: number_integer + settings: + thousand_separator: '' + prefix_suffix: true + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: type + plugin_id: field + label: 'Content type' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: false + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_facility_location: + id: field_facility_location + table: node__field_facility_location + field: field_facility_location + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Facility + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_facility_locator_api_id: + id: field_facility_locator_api_id + table: node__field_facility_locator_api_id + field: field_facility_locator_api_id + relationship: field_facility_location + group_type: group + admin_label: '' + plugin_id: field + label: 'Facility Locator ID' + exclude: false + alter: + alter_text: false + text: '' + 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: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + name_1: + id: name_1 + table: taxonomy_term_field_data + field: name + relationship: field_service_name_and_descripti + group_type: group + admin_label: '' + entity_type: taxonomy_term + entity_field: name + plugin_id: term_name + label: 'Service name' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + convert_spaces: false + name_2: + id: name_2 + table: taxonomy_term_field_data + field: name + relationship: field_service_name_and_descripti_1 + group_type: group + admin_label: '' + entity_type: taxonomy_term + entity_field: name + plugin_id: term_name + label: 'Service name (for non-VAMC services)' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + convert_spaces: false + field_administration: + id: field_administration + table: node__field_administration + field: field_administration + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Section + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + id: + id: id + table: paragraphs_item_field_data + field: id + relationship: field_service_location + group_type: count + admin_label: '' + entity_type: paragraph + entity_field: id + plugin_id: field + label: 'Service locations' + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: number_integer + settings: + thousand_separator: '' + prefix_suffix: true + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + revision_uid: + id: revision_uid + table: node_revision + field: revision_uid + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: revision_uid + plugin_id: field + label: '' + exclude: true + alter: + alter_text: false + text: '' + 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: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + moderation_state: + id: moderation_state + table: node_field_data + field: moderation_state + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: moderation_state_field + label: 'Moderation state' + exclude: false + alter: + alter_text: false + text: '' + 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: value + type: string + settings: + link_to_entity: false + group_column: entity_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + changed: + id: changed + table: node_field_data + field: changed + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: changed + plugin_id: field + label: Updated + exclude: false + alter: + alter_text: true + text: '{{ changed }} by {{ revision_uid }}' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: custom + custom_date_format: 'Y-m-d H:ia' + timezone: '' + tooltip: + date_format: '' + custom_date_format: '' + time_diff: + enabled: false + future_format: '@interval hence' + past_format: '@interval ago' + granularity: 2 + refresh: 60 + description: '' + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + nothing: + id: nothing + table: views + field: nothing + relationship: none + group_type: group + admin_label: '' + plugin_id: custom + label: URL + exclude: false + alter: + alter_text: true + text: 'https://prod.cms.va.gov/node/{{ nid }}' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: false + sorts: + field_service_location_target_id: + id: field_service_location_target_id + table: node__field_service_location + field: field_service_location_target_id + relationship: none + group_type: count + admin_label: '' + plugin_id: standard + order: DESC + expose: + label: '' + field_identifier: '' + exposed: false + filters: + type_1: + id: type_1 + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: type + plugin_id: bundle + operator: in + value: + service_region: service_region + health_care_local_health_service: health_care_local_health_service + vha_facility_nonclinical_service: vha_facility_nonclinical_service + vba_facility_service: vba_facility_service + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + operator_limit_selection: false + operator_list: { } + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + title_1: + id: title_1 + table: node_field_data + field: title + relationship: field_facility_location + group_type: group + admin_label: '' + entity_type: node + entity_field: title + plugin_id: string + operator: contains + value: '' + group: 1 + exposed: true + expose: + operator_id: title_1_op + label: 'Facility name contains' + description: '' + use_operator: false + operator: title_1_op + operator_limit_selection: false + operator_list: { } + identifier: facility_title + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + type: + id: type + table: node_field_data + field: type + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: type + plugin_id: bundle + operator: in + value: + service_region: service_region + health_care_local_health_service: health_care_local_health_service + vha_facility_nonclinical_service: vha_facility_nonclinical_service + vba_facility_service: vba_facility_service + group: 1 + exposed: true + expose: + operator_id: type_op + label: 'Content type' + description: '' + use_operator: false + operator: type_op + operator_limit_selection: false + operator_list: { } + identifier: type + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vba: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + homepage_manager: '0' + next_js: '0' + translation_manager: '0' + reduce: true + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + workbench_access_section__section: + id: workbench_access_section__section + table: node + field: workbench_access_section__section + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: workbench_access_section + operator: in + value: { } + group: 1 + exposed: true + expose: + operator_id: workbench_access_section__section_op + label: Section + description: '' + use_operator: false + operator: workbench_access_section__section_op + operator_limit_selection: false + operator_list: { } + identifier: workbench_access_section__section + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + reduce: 1 + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: 0 + section_filter: + show_hierarchy: 1 + field_service_location_target_id: + id: field_service_location_target_id + table: node__field_service_location + field: field_service_location_target_id + relationship: none + group_type: count + admin_label: '' + plugin_id: numeric + operator: '=' + value: + min: '' + max: '' + value: '' + group: 1 + exposed: true + expose: + operator_id: field_service_location_target_id_op + label: 'Number of Service locations' + description: '' + use_operator: true + operator: field_service_location_target_id_op + operator_limit_selection: false + operator_list: { } + identifier: field_service_location_target_id + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vba: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + homepage_manager: '0' + next_js: '0' + translation_manager: '0' + min_placeholder: '' + max_placeholder: '' + placeholder: '' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + moderation_state_multiple_workflow_filter: + id: moderation_state_multiple_workflow_filter + table: node + field: moderation_state_multiple_workflow_filter + relationship: none + group_type: group + admin_label: '' + entity_type: node + plugin_id: moderation_state_multiple_workflow_filter + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: moderation_state_op + label: 'Moderation state' + description: '' + use_operator: false + operator: moderation_state_multiple_workflow_filter_op + operator_limit_selection: false + operator_list: { } + identifier: moderation_state + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + homepage_manager: '0' + translation_manager: '0' + next_js: '0' + reduce: 0 + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: 0 + filter_groups: + operator: AND + groups: + 1: AND + style: + type: data_export + options: + formats: + csv: csv + csv_settings: + delimiter: ',' + enclosure: '"' + escape_char: \ + strip_tags: true + trim: true + encoding: utf8 + utf8_bom: '0' + use_serializer_encode_only: false + row: + type: data_field + options: + field_options: + title: + alias: '' + raw_output: false + edit_node: + alias: '' + raw_output: false + type: + alias: '' + raw_output: false + field_facility_location: + alias: '' + raw_output: false + field_facility_locator_api_id: + alias: '' + raw_output: false + name_1: + alias: '' + raw_output: false + field_administration: + alias: '' + raw_output: false + id: + alias: '' + raw_output: false + field_referral_required: + alias: '' + raw_output: false + field_walk_ins_accepted: + alias: '' + raw_output: false + field_online_scheduling_availabl: + alias: '' + raw_output: false + moderation_state: + alias: '' + raw_output: false + changed: + alias: '' + raw_output: false + name_2: + alias: '' + raw_output: false + defaults: + access: true + title: false + group_by: false + style: false + row: false + relationships: false + fields: false + sorts: false + filters: false + filter_groups: false + header: false + relationships: + uid: + id: uid + table: node_field_data + field: uid + admin_label: author + plugin_id: standard + required: true + field_regional_health_service: + id: field_regional_health_service + table: node__field_regional_health_service + field: field_regional_health_service + relationship: none + group_type: group + admin_label: 'VAMC system health service' + plugin_id: standard + required: false + field_service_name_and_descripti: + id: field_service_name_and_descripti + table: node__field_service_name_and_descripti + field: field_service_name_and_descripti + relationship: field_regional_health_service + group_type: group + admin_label: 'Service name' + plugin_id: standard + required: false + field_facility_location: + id: field_facility_location + table: node__field_facility_location + field: field_facility_location + relationship: none + group_type: group + admin_label: Facility + plugin_id: standard + required: false + field_service_location: + id: field_service_location + table: node__field_service_location + field: field_service_location + relationship: none + group_type: group + admin_label: 'Service locations' + plugin_id: standard + required: false + field_service_name_and_descripti_1: + id: field_service_name_and_descripti_1 + table: node__field_service_name_and_descripti + field: field_service_name_and_descripti + relationship: none + group_type: group + admin_label: 'field_service_name_and_descripti: Taxonomy term' + plugin_id: standard + required: false + group_by: true + display_description: '' + header: + result: + id: result + table: views + field: result + relationship: none + group_type: group + admin_label: '' + plugin_id: result + empty: false + content: 'Displaying @start - @end of @total' + display_extenders: + jsonapi_views: + enabled: true + path: admin/content/audit/facility-services-exports + displays: + facility_services: facility_services + default: '0' + accordion_audit: '0' + addresses: '0' + content_audit_facilities: '0' + facility_status_page: '0' + page_1: '0' + vamc_facility_health_services_page: '0' + vamc_facility_non_clinical_services_page: '0' + vamc_system_service_audit_page: '0' + vamc_systems: '0' + vet_center_services_page: '0' + filename: va-gov-cms-facility-services.csv + automatic_download: false + redirect_path: /admin/content/audit/facility-services + export_method: batch + export_batch_size: 500 + store_in_public_file_directory: null + custom_redirect_path: true + redirect_to_display: none + include_query_params: true + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - request_format + - url + - user + - 'user.node_grants:view' + - user.roles + tags: + - 'config:field.storage.node.field_administration' + - 'config:field.storage.node.field_facility_location' + - 'config:field.storage.node.field_facility_locator_api_id' + - workbench_access_view + deleted: false facility_status_export: id: facility_status_export display_title: 'Facility status export' @@ -13051,11 +15836,11 @@ display: deleted: false vamc_facility_health_services_page: id: vamc_facility_health_services_page - display_title: 'VAMC facility health services' + display_title: 'Facility health services' display_plugin: page position: 4 display_options: - title: 'VAMC facility health services' + title: 'Facility health services' fields: title: id: title @@ -14192,37 +16977,116 @@ display: type_custom_true: '' type_custom_false: '' not: false + name_2: + id: name_2 + table: taxonomy_term_field_data + field: name + relationship: field_service_name_and_descripti_1 + group_type: group + admin_label: '' + entity_type: taxonomy_term + entity_field: name + plugin_id: term_name + label: Name + exclude: false + alter: + alter_text: false + text: '' + 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: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + convert_spaces: false filters: - type: - id: type + title_1: + id: title_1 table: node_field_data - field: type - relationship: none + field: title + relationship: field_facility_location group_type: group admin_label: '' entity_type: node - entity_field: type - plugin_id: bundle - operator: in - value: - health_care_local_health_service: health_care_local_health_service + entity_field: title + plugin_id: string + operator: contains + value: '' group: 1 - exposed: false + exposed: true expose: - operator_id: type_op - label: 'Content type' - description: null + operator_id: title_1_op + label: 'Facility name contains' + description: '' use_operator: false - operator: type_op + operator: title_1_op operator_limit_selection: false operator_list: { } - identifier: type + identifier: facility_title required: false remember: false multiple: false remember_roles: authenticated: authenticated - reduce: false + anonymous: '0' + content_api_consumer: '0' + content_creator_benefits_hubs: '0' + content_creator_resources_and_support: '0' + office_content_creator: '0' + vamc_content_creator: '0' + content_creator_vet_center: '0' + content_editor: '0' + content_reviewer: '0' + content_publisher: '0' + content_admin: '0' + redirect_administrator: '0' + admnistrator_users: '0' + administrator: '0' + placeholder: '' is_grouped: false group_info: label: '' @@ -14235,29 +17099,30 @@ display: default_group: All default_group_multiple: { } group_items: { } - title_1: - id: title_1 + type: + id: type table: node_field_data - field: title - relationship: field_facility_location + field: type + relationship: none group_type: group admin_label: '' entity_type: node - entity_field: title - plugin_id: string - operator: contains - value: '' + entity_field: type + plugin_id: bundle + operator: in + value: + health_care_local_health_service: health_care_local_health_service group: 1 - exposed: true + exposed: false expose: - operator_id: title_1_op - label: 'Facility name contains' + operator_id: type_op + label: 'Content type' description: '' use_operator: false - operator: title_1_op + operator: type_op operator_limit_selection: false operator_list: { } - identifier: facility_title + identifier: type required: false remember: false multiple: false @@ -14269,6 +17134,7 @@ display: content_creator_resources_and_support: '0' office_content_creator: '0' vamc_content_creator: '0' + content_creator_vba: '0' content_creator_vet_center: '0' content_editor: '0' content_reviewer: '0' @@ -14277,7 +17143,10 @@ display: redirect_administrator: '0' admnistrator_users: '0' administrator: '0' - placeholder: '' + homepage_manager: '0' + next_js: '0' + translation_manager: '0' + reduce: true is_grouped: false group_info: label: '' @@ -14749,6 +17618,7 @@ display: timestamp: timestamp break: break is_locked: is_locked + name_2: name_1 default: changed info: title: @@ -14808,8 +17678,8 @@ display: empty_column: false responsive: '' id: - sortable: false - default_sort_order: asc + sortable: true + default_sort_order: desc align: '' separator: '' empty_column: false @@ -14884,11 +17754,18 @@ display: separator: '' empty_column: false responsive: '' + name_2: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' override: true sticky: true summary: '' empty_table: true - caption: 'List of health services at VAMC facilities' + caption: 'List of facility health services' description: '' row: type: fields @@ -14929,7 +17806,7 @@ display: group_type: group admin_label: 'VAMC system health service' plugin_id: standard - required: true + required: false field_service_name_and_descripti: id: field_service_name_and_descripti table: node__field_service_name_and_descripti @@ -14938,7 +17815,7 @@ display: group_type: group admin_label: 'Service name' plugin_id: standard - required: true + required: false field_facility_location: id: field_facility_location table: node__field_facility_location @@ -14947,7 +17824,7 @@ display: group_type: group admin_label: Facility plugin_id: standard - required: true + required: false field_service_location: id: field_service_location table: node__field_service_location @@ -14957,6 +17834,15 @@ display: admin_label: 'Service locations' plugin_id: standard required: false + field_service_name_and_descripti_1: + id: field_service_name_and_descripti_1 + table: node__field_service_name_and_descripti + field: field_service_name_and_descripti + relationship: none + group_type: group + admin_label: 'field_service_name_and_descripti: Taxonomy term' + plugin_id: standard + required: false group_by: true display_description: '' header: @@ -14970,7 +17856,9 @@ display: plugin_id: result empty: false content: 'Displaying @start - @end of @total' - display_extenders: { } + display_extenders: + jsonapi_views: + enabled: true path: admin/content/facilities/vamc-facility-health-services menu: type: tab @@ -21691,7 +24579,7 @@ display: group: 1 exposed: true expose: - operator_id: moderation_state_multiple_workflow_filter_op + operator_id: moderation_state_op label: 'Moderation state' description: '' use_operator: false From aecc55578e4b67ccca2fbd1aed7229a0c178a41e Mon Sep 17 00:00:00 2001 From: Daniel Sasser Date: Mon, 18 Dec 2023 13:00:46 -0800 Subject: [PATCH 10/23] DNM: VACMS-15385: Event Email CTA (#16173) * VACMS-15385: Adding new field: field_how_to_sign_up to Event content type. * VACMS-15385: Adds email cta field to Event content type. * VACMS-15385: Remove unused option in Event how to apply allowed values. * VACMS-15385: Updates Event javascript behavior for new 'how to sign up' and 'email' fields. * VACMS-15385: Adds validation constraints for Event CTA url and email fields. * VACMS-15385: Update link constraint. * VACMS-15385: Ensure registration fields are emptied any time a CTA input change is made. * VACMS-15385: Adds and or updates tests for new CTA email field and related conditional display. * VACMS-15385: Making phpstan happy. * VACMS-15385: Update Event Email CTA validation and help text. * VACMS-15385: Update CTA fieldset help text and label. --------- Co-authored-by: Daniel Sasser --- ...entity_form_display.node.event.default.yml | 41 ++-- ...entity_view_display.node.event.default.yml | 28 ++- ....entity_view_display.node.event.teaser.yml | 4 + ...field.field.node.event.field_cta_email.yml | 24 +++ ....field.node.event.field_how_to_sign_up.yml | 25 +++ .../field.storage.node.field_cta_email.yml | 18 ++ ...ield.storage.node.field_how_to_sign_up.yml | 27 +++ .../va_gov_events/js/eventFormHelpers.es6.js | 175 ++++++++++++++++-- .../va_gov_events/js/eventFormHelpers.js | 87 ++++++--- .../Constraint/EmailToVaOnlyConstraint.php | 24 +++ .../EmailToVaOnlyConstraintValidator.php | 29 +++ .../Constraint/LinkNoMailtoConstraint.php | 24 +++ .../LinkNoMailtoConstraintValidator.php | 30 +++ .../custom/va_gov_events/va_gov_events.module | 6 + .../features/content_type/event.feature | 85 +++++++-- .../common/i_create_a_node.js | 4 + 16 files changed, 556 insertions(+), 75 deletions(-) create mode 100644 config/sync/field.field.node.event.field_cta_email.yml create mode 100644 config/sync/field.field.node.event.field_how_to_sign_up.yml create mode 100644 config/sync/field.storage.node.field_cta_email.yml create mode 100644 config/sync/field.storage.node.field_how_to_sign_up.yml create mode 100644 docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/EmailToVaOnlyConstraint.php create mode 100644 docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/EmailToVaOnlyConstraintValidator.php create mode 100644 docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/LinkNoMailtoConstraint.php create mode 100644 docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/LinkNoMailtoConstraintValidator.php diff --git a/config/sync/core.entity_form_display.node.event.default.yml b/config/sync/core.entity_form_display.node.event.default.yml index 682eb896b5..31abd78ffe 100644 --- a/config/sync/core.entity_form_display.node.event.default.yml +++ b/config/sync/core.entity_form_display.node.event.default.yml @@ -8,6 +8,7 @@ dependencies: - field.field.node.event.field_address - field.field.node.event.field_administration - field.field.node.event.field_body + - field.field.node.event.field_cta_email - field.field.node.event.field_datetime_range_timezone - field.field.node.event.field_description - field.field.node.event.field_event_cost @@ -15,6 +16,7 @@ dependencies: - field.field.node.event.field_event_registrationrequired - field.field.node.event.field_facility_location - field.field.node.event.field_featured + - field.field.node.event.field_how_to_sign_up - field.field.node.event.field_include_registration_info - field.field.node.event.field_last_saved_by_an_editor - field.field.node.event.field_link @@ -112,8 +114,10 @@ third_party_settings: group_registration_link: children: - field_event_cta + - field_how_to_sign_up - field_link - label: 'Call to action link' + - field_cta_email + label: 'Call to action' region: content parent_name: group_link weight: 30 @@ -122,8 +126,9 @@ third_party_settings: classes: '' show_empty_fields: false id: '' - description: 'Direct people to take the next step. For example, "Register" with a link to event registration.' + description: 'Tell people what they should do next to join this event. For example, "Register" with a link to event registration.' required_fields: true + description_display: after group_feature_this_content: children: - field_featured @@ -204,7 +209,7 @@ content: third_party_settings: { } field_additional_information_abo: type: text_textarea - weight: 32 + weight: 31 region: content settings: rows: 5 @@ -212,7 +217,7 @@ content: third_party_settings: { } field_address: type: address_default - weight: 17 + weight: 16 region: content settings: { } third_party_settings: { } @@ -233,6 +238,14 @@ content: allowed_formats: hide_help: '1' hide_guidelines: '1' + field_cta_email: + type: email_default + weight: 34 + region: content + settings: + placeholder: '' + size: 60 + third_party_settings: { } field_datetime_range_timezone: type: smartdate_timezone weight: 1 @@ -315,11 +328,17 @@ content: third_party_settings: { } field_featured: type: boolean_checkbox - weight: 10 + weight: 15 region: content settings: display_label: true third_party_settings: { } + field_how_to_sign_up: + type: options_select + weight: 32 + region: content + settings: { } + third_party_settings: { } field_include_registration_info: type: boolean_checkbox weight: 27 @@ -329,13 +348,13 @@ content: third_party_settings: { } field_last_saved_by_an_editor: type: datetime_timestamp - weight: 16 + weight: 17 region: content settings: { } third_party_settings: { } field_link: type: linkit - weight: 32 + weight: 33 region: content settings: placeholder_url: '' @@ -355,7 +374,7 @@ content: add_another: '' field_location_humanreadable: type: string_textfield - weight: 16 + weight: 15 region: content settings: size: 60 @@ -376,7 +395,7 @@ content: third_party_settings: { } field_order: type: options_select - weight: 11 + weight: 16 region: content settings: { } third_party_settings: { } @@ -389,7 +408,7 @@ content: third_party_settings: { } field_url_of_an_online_event: type: linkit - weight: 15 + weight: 14 region: content settings: placeholder_url: '' @@ -428,7 +447,7 @@ content: placeholder: '' third_party_settings: { } url_redirects: - weight: 14 + weight: 15 region: content settings: { } third_party_settings: { } diff --git a/config/sync/core.entity_view_display.node.event.default.yml b/config/sync/core.entity_view_display.node.event.default.yml index 9dce9c4eb3..3568f9c2f8 100644 --- a/config/sync/core.entity_view_display.node.event.default.yml +++ b/config/sync/core.entity_view_display.node.event.default.yml @@ -8,6 +8,7 @@ dependencies: - field.field.node.event.field_address - field.field.node.event.field_administration - field.field.node.event.field_body + - field.field.node.event.field_cta_email - field.field.node.event.field_datetime_range_timezone - field.field.node.event.field_description - field.field.node.event.field_event_cost @@ -15,6 +16,7 @@ dependencies: - field.field.node.event.field_event_registrationrequired - field.field.node.event.field_facility_location - field.field.node.event.field_featured + - field.field.node.event.field_how_to_sign_up - field.field.node.event.field_include_registration_info - field.field.node.event.field_last_saved_by_an_editor - field.field.node.event.field_link @@ -86,9 +88,11 @@ third_party_settings: description: '' group_registration_related: children: - - field_link - field_event_registrationrequired - field_event_cost + - field_how_to_sign_up + - field_link + - field_cta_email - field_additional_information_abo label: 'Registration related' parent_name: group_c @@ -124,7 +128,7 @@ content: label: above settings: { } third_party_settings: { } - weight: 21 + weight: 28 region: content field_additional_listings: type: entity_reference_label @@ -148,6 +152,13 @@ content: third_party_settings: { } weight: 5 region: content + field_cta_email: + type: basic_string + label: above + settings: { } + third_party_settings: { } + weight: 27 + region: content field_datetime_range_timezone: type: smartdate_default label: above @@ -184,7 +195,7 @@ content: settings: link_to_entity: false third_party_settings: { } - weight: 19 + weight: 24 region: content field_event_cta: type: list_default @@ -201,7 +212,7 @@ content: format_custom_false: '' format_custom_true: '' third_party_settings: { } - weight: 18 + weight: 23 region: content field_facility_location: type: entity_reference_label @@ -221,6 +232,13 @@ content: third_party_settings: { } weight: 30 region: content + field_how_to_sign_up: + type: list_default + label: above + settings: { } + third_party_settings: { } + weight: 25 + region: content field_include_registration_info: type: boolean label: above @@ -241,7 +259,7 @@ content: rel: '' target: '' third_party_settings: { } - weight: 17 + weight: 26 region: content field_listing: type: entity_reference_label diff --git a/config/sync/core.entity_view_display.node.event.teaser.yml b/config/sync/core.entity_view_display.node.event.teaser.yml index 1a2e185989..c323c45126 100644 --- a/config/sync/core.entity_view_display.node.event.teaser.yml +++ b/config/sync/core.entity_view_display.node.event.teaser.yml @@ -9,6 +9,7 @@ dependencies: - field.field.node.event.field_address - field.field.node.event.field_administration - field.field.node.event.field_body + - field.field.node.event.field_cta_email - field.field.node.event.field_datetime_range_timezone - field.field.node.event.field_description - field.field.node.event.field_event_cost @@ -16,6 +17,7 @@ dependencies: - field.field.node.event.field_event_registrationrequired - field.field.node.event.field_facility_location - field.field.node.event.field_featured + - field.field.node.event.field_how_to_sign_up - field.field.node.event.field_include_registration_info - field.field.node.event.field_last_saved_by_an_editor - field.field.node.event.field_link @@ -62,12 +64,14 @@ hidden: field_additional_listings: true field_address: true field_administration: true + field_cta_email: true field_description: true field_event_cost: true field_event_cta: true field_event_registrationrequired: true field_facility_location: true field_featured: true + field_how_to_sign_up: true field_include_registration_info: true field_last_saved_by_an_editor: true field_link: true diff --git a/config/sync/field.field.node.event.field_cta_email.yml b/config/sync/field.field.node.event.field_cta_email.yml new file mode 100644 index 0000000000..024c43fa46 --- /dev/null +++ b/config/sync/field.field.node.event.field_cta_email.yml @@ -0,0 +1,24 @@ +uuid: df9794d7-fa67-4e3b-9cd4-00aaa31a7d0e +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_cta_email + - node.type.event + module: + - tmgmt_content +third_party_settings: + tmgmt_content: + excluded: false +id: node.event.field_cta_email +field_name: field_cta_email +entity_type: node +bundle: event +label: Email +description: 'Add a VA.gov email address that people can contact to sign up for this event. Use a general VA email address whenever possible. Example: contact@va.gov.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: email diff --git a/config/sync/field.field.node.event.field_how_to_sign_up.yml b/config/sync/field.field.node.event.field_how_to_sign_up.yml new file mode 100644 index 0000000000..04797f3f51 --- /dev/null +++ b/config/sync/field.field.node.event.field_how_to_sign_up.yml @@ -0,0 +1,25 @@ +uuid: 105b9891-0058-4a34-8c00-39c167a32e3b +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_how_to_sign_up + - node.type.event + module: + - options + - tmgmt_content +third_party_settings: + tmgmt_content: + excluded: false +id: node.event.field_how_to_sign_up +field_name: field_how_to_sign_up +entity_type: node +bundle: event +label: 'How to sign up' +description: 'Choose to provide a URL or email address where participants can sign up for the event.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: list_string diff --git a/config/sync/field.storage.node.field_cta_email.yml b/config/sync/field.storage.node.field_cta_email.yml new file mode 100644 index 0000000000..ff6089c906 --- /dev/null +++ b/config/sync/field.storage.node.field_cta_email.yml @@ -0,0 +1,18 @@ +uuid: 789f9b03-ec13-4e1e-b267-60900c787d38 +langcode: en +status: true +dependencies: + module: + - node +id: node.field_cta_email +field_name: field_cta_email +entity_type: node +type: email +settings: { } +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/field.storage.node.field_how_to_sign_up.yml b/config/sync/field.storage.node.field_how_to_sign_up.yml new file mode 100644 index 0000000000..4aacedaa66 --- /dev/null +++ b/config/sync/field.storage.node.field_how_to_sign_up.yml @@ -0,0 +1,27 @@ +uuid: b3dc57ec-4a04-4426-9d41-498a09b98cc4 +langcode: en +status: true +dependencies: + module: + - node + - options +id: node.field_how_to_sign_up +field_name: field_how_to_sign_up +entity_type: node +type: list_string +settings: + allowed_values: + - + value: url + label: URL + - + value: email + label: Email + allowed_values_function: '' +module: options +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/docroot/modules/custom/va_gov_events/js/eventFormHelpers.es6.js b/docroot/modules/custom/va_gov_events/js/eventFormHelpers.es6.js index b6dadd7abb..078adb3f7f 100644 --- a/docroot/modules/custom/va_gov_events/js/eventFormHelpers.es6.js +++ b/docroot/modules/custom/va_gov_events/js/eventFormHelpers.es6.js @@ -15,6 +15,24 @@ const fieldLinkWrapperLabel = document.querySelector( "#edit-field-link-wrapper label" ); + const fieldCtaEmailInput = document.getElementById( + "edit-field-cta-email-0-value" + ); + const fieldCtaEmailWrapper = document.getElementById( + "edit-field-cta-email-wrapper" + ); + const fieldCtaEmailWrapperLabel = document.querySelector( + "#edit-field-cta-email-wrapper label" + ); + const fieldCtaHowToSignUp = document.getElementById( + "edit-field-how-to-sign-up" + ); + const fieldCtaHowToSignUpWrapper = document.getElementById( + "edit-field-how-to-sign-up-wrapper" + ); + const fieldCtaHowToSignUpLabel = document.querySelector( + "#edit-field-how-to-sign-up-wrapper label" + ); const fieldLocationTypeFacility = document.getElementById( "edit-field-location-type-facility" ); @@ -76,25 +94,50 @@ ".centralized.reduced-padding, #edit-field-event-registrationrequired-wrapper, #edit-field-event-cta-wrapper, #edit-group-registration-link, #group-registration-link, #edit-field-additional-information-abo-wrapper" ); - const toggleCtaLinkRequired = (required = true) => { + const toggleCtaInputRequired = (label, wrapper, input, required = true) => { const addRemove = required ? "add" : "remove"; - fieldLinkWrapper.style.display = required ? "block" : "none"; - fieldLinkInput.required = required ? "required" : ""; - fieldLinkWrapperLabel.classList[addRemove]( - "js-form-required", - "form-required" + wrapper.style.display = required ? "block" : "none"; + input.required = required ? "required" : ""; + label.classList[addRemove]("js-form-required", "form-required"); + }; + + const toggleAllCtaInputsRequired = (required = true) => { + toggleCtaInputRequired( + fieldLinkWrapperLabel, + fieldLinkWrapper, + fieldLinkInput, + required + ); + toggleCtaInputRequired( + fieldCtaEmailWrapperLabel, + fieldCtaEmailWrapper, + fieldCtaEmailInput, + required + ); + toggleCtaInputRequired( + fieldCtaHowToSignUpLabel, + fieldCtaHowToSignUpWrapper, + fieldCtaHowToSignUp, + required ); }; + const emptyAllCtaInputs = () => { + fieldCtaEmailInput.value = ""; + fieldLinkInput.value = ""; + fieldCtaHowToSignUp.value = "_none"; + }; + const toggleRegistrationElements = () => { const toggleVal = !!includeRegistrationsBool.checked; let elementDisplayStyle = "block"; if (!toggleVal) { fieldLinkInput.value = ""; + fieldCtaEmailInput.value = ""; ctaSelect.value = "_none"; elementDisplayStyle = "none"; registrationRequiredBool.checked = false; - toggleCtaLinkRequired(false); + toggleAllCtaInputsRequired(false); } targetRegistrationElements.forEach((element) => { element.style.display = elementDisplayStyle; @@ -104,19 +147,123 @@ const requireCTA = () => { // Default should be hidden. fieldLinkWrapper.style.display = "none"; + fieldCtaEmailWrapper.style.display = "none"; + fieldCtaHowToSignUpWrapper.style.display = "none"; - // If there is a cta on page load, require an input. + // If there is a cta on page load, show conditional fields. if (ctaSelect.value !== "_none") { - toggleCtaLinkRequired(); + // If there is an email field value, display the email field. + if (fieldCtaEmailInput.value.length > 0) { + toggleCtaInputRequired( + fieldCtaEmailWrapperLabel, + fieldCtaEmailWrapper, + fieldCtaEmailInput, + true + ); + // Also display the 'how to apply' field, and set the value accordingly. + toggleCtaInputRequired( + fieldCtaHowToSignUpLabel, + fieldCtaHowToSignUpWrapper, + fieldCtaHowToSignUp, + true + ); + fieldCtaHowToSignUp.value = "email"; + } + // If there is an url field value, display the url field. + else if (fieldLinkInput.value.length > 0) { + toggleCtaInputRequired( + fieldLinkWrapperLabel, + fieldLinkWrapper, + fieldLinkInput, + true + ); + // Also display the 'how to apply' field, and set the value accordingly. + toggleCtaInputRequired( + fieldCtaHowToSignUpLabel, + fieldCtaHowToSignUpWrapper, + fieldCtaHowToSignUp, + true + ); + fieldCtaHowToSignUp.value = "url"; + } + // Otherwise, display the 'how to sign up' field. + else { + toggleCtaInputRequired( + fieldCtaHowToSignUpLabel, + fieldCtaHowToSignUpWrapper, + fieldCtaHowToSignUpWrapper + ); + } } - // Check on change if cta value, and require input if so. + // Check on change of cta value, and require input if so. ctaSelect.addEventListener("change", (e) => { - toggleCtaLinkRequired(false); + emptyAllCtaInputs(); + toggleAllCtaInputsRequired(false); if (e.target.value !== "_none") { - toggleCtaLinkRequired(); - } else { - fieldLinkInput.value = ""; + toggleCtaInputRequired( + fieldCtaHowToSignUpLabel, + fieldCtaHowToSignUpWrapper, + fieldCtaHowToSignUp + ); + } + }); + + fieldCtaHowToSignUp.addEventListener("change", (e) => { + switch (e.target.value) { + case "url": + // Empty email field. + fieldCtaEmailInput.value = ""; + // Hide email field. + toggleCtaInputRequired( + fieldCtaEmailWrapperLabel, + fieldCtaEmailWrapper, + fieldCtaEmailInput, + false + ); + // Display url field and make required. + toggleCtaInputRequired( + fieldLinkWrapperLabel, + fieldLinkWrapper, + fieldLinkInput + ); + break; + + case "email": + // Empty url field. + fieldLinkInput.value = ""; + // Hide url field. + toggleCtaInputRequired( + fieldLinkWrapperLabel, + fieldLinkWrapper, + fieldLinkInput, + false + ); + // Display email field and make required. + toggleCtaInputRequired( + fieldCtaEmailWrapperLabel, + fieldCtaEmailWrapper, + fieldCtaEmailInput + ); + break; + + default: + // Hide both url and email fields and empty their values. + toggleCtaInputRequired( + fieldLinkWrapperLabel, + fieldLinkWrapper, + fieldLinkInput, + false + ); + toggleCtaInputRequired( + fieldCtaEmailWrapperLabel, + fieldCtaEmailWrapper, + fieldCtaEmailInput, + false + ); + fieldLinkInput.value = ""; + fieldCtaEmailInput.value = ""; + break; } }); }; diff --git a/docroot/modules/custom/va_gov_events/js/eventFormHelpers.js b/docroot/modules/custom/va_gov_events/js/eventFormHelpers.js index b1612beb0c..226e412d71 100644 --- a/docroot/modules/custom/va_gov_events/js/eventFormHelpers.js +++ b/docroot/modules/custom/va_gov_events/js/eventFormHelpers.js @@ -4,7 +4,6 @@ * https://www.drupal.org/node/2815083 * @preserve **/ - (function (Drupal) { var registrationRequiredBool = document.getElementById("edit-field-event-registrationrequired-value"); var includeRegistrationsBool = document.getElementById("edit-field-include-registration-info-value"); @@ -12,6 +11,12 @@ var fieldLinkWrapper = document.getElementById("edit-field-link-wrapper"); var fieldLinkInput = document.getElementById("edit-field-link-0-uri"); var fieldLinkWrapperLabel = document.querySelector("#edit-field-link-wrapper label"); + var fieldCtaEmailInput = document.getElementById("edit-field-cta-email-0-value"); + var fieldCtaEmailWrapper = document.getElementById("edit-field-cta-email-wrapper"); + var fieldCtaEmailWrapperLabel = document.querySelector("#edit-field-cta-email-wrapper label"); + var fieldCtaHowToSignUp = document.getElementById("edit-field-how-to-sign-up"); + var fieldCtaHowToSignUpWrapper = document.getElementById("edit-field-how-to-sign-up-wrapper"); + var fieldCtaHowToSignUpLabel = document.querySelector("#edit-field-how-to-sign-up-wrapper label"); var fieldLocationTypeFacility = document.getElementById("edit-field-location-type-facility"); var fieldLocationTypeNonFacility = document.getElementById("edit-field-location-type-non-facility"); var includeLocationItemsRadios = document.getElementById("edit-field-location-type"); @@ -32,48 +37,84 @@ var fieldAddressAdminArea = document.getElementById("edit-field-address-0-address-administrative-area"); var fieldAddressAdminAreaLabel = document.querySelector("label[for='edit-field-address-0-address-administrative-area']"); var targetRegistrationElements = document.querySelectorAll(".centralized.reduced-padding, #edit-field-event-registrationrequired-wrapper, #edit-field-event-cta-wrapper, #edit-group-registration-link, #group-registration-link, #edit-field-additional-information-abo-wrapper"); - - var toggleCtaLinkRequired = function toggleCtaLinkRequired() { - var required = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - + var toggleCtaInputRequired = function toggleCtaInputRequired(label, wrapper, input) { + var required = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; var addRemove = required ? "add" : "remove"; - fieldLinkWrapper.style.display = required ? "block" : "none"; - fieldLinkInput.required = required ? "required" : ""; - fieldLinkWrapperLabel.classList[addRemove]("js-form-required", "form-required"); + wrapper.style.display = required ? "block" : "none"; + input.required = required ? "required" : ""; + label.classList[addRemove]("js-form-required", "form-required"); + }; + var toggleAllCtaInputsRequired = function toggleAllCtaInputsRequired() { + var required = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + toggleCtaInputRequired(fieldLinkWrapperLabel, fieldLinkWrapper, fieldLinkInput, required); + toggleCtaInputRequired(fieldCtaEmailWrapperLabel, fieldCtaEmailWrapper, fieldCtaEmailInput, required); + toggleCtaInputRequired(fieldCtaHowToSignUpLabel, fieldCtaHowToSignUpWrapper, fieldCtaHowToSignUp, required); + }; + var emptyAllCtaInputs = function emptyAllCtaInputs() { + fieldCtaEmailInput.value = ""; + fieldLinkInput.value = ""; + fieldCtaHowToSignUp.value = "_none"; }; - var toggleRegistrationElements = function toggleRegistrationElements() { var toggleVal = !!includeRegistrationsBool.checked; var elementDisplayStyle = "block"; if (!toggleVal) { fieldLinkInput.value = ""; + fieldCtaEmailInput.value = ""; ctaSelect.value = "_none"; elementDisplayStyle = "none"; registrationRequiredBool.checked = false; - toggleCtaLinkRequired(false); + toggleAllCtaInputsRequired(false); } targetRegistrationElements.forEach(function (element) { element.style.display = elementDisplayStyle; }); }; - var requireCTA = function requireCTA() { fieldLinkWrapper.style.display = "none"; - + fieldCtaEmailWrapper.style.display = "none"; + fieldCtaHowToSignUpWrapper.style.display = "none"; if (ctaSelect.value !== "_none") { - toggleCtaLinkRequired(); + if (fieldCtaEmailInput.value.length > 0) { + toggleCtaInputRequired(fieldCtaEmailWrapperLabel, fieldCtaEmailWrapper, fieldCtaEmailInput, true); + toggleCtaInputRequired(fieldCtaHowToSignUpLabel, fieldCtaHowToSignUpWrapper, fieldCtaHowToSignUp, true); + fieldCtaHowToSignUp.value = "email"; + } else if (fieldLinkInput.value.length > 0) { + toggleCtaInputRequired(fieldLinkWrapperLabel, fieldLinkWrapper, fieldLinkInput, true); + toggleCtaInputRequired(fieldCtaHowToSignUpLabel, fieldCtaHowToSignUpWrapper, fieldCtaHowToSignUp, true); + fieldCtaHowToSignUp.value = "url"; + } else { + toggleCtaInputRequired(fieldCtaHowToSignUpLabel, fieldCtaHowToSignUpWrapper, fieldCtaHowToSignUpWrapper); + } } - ctaSelect.addEventListener("change", function (e) { - toggleCtaLinkRequired(false); + emptyAllCtaInputs(); + toggleAllCtaInputsRequired(false); if (e.target.value !== "_none") { - toggleCtaLinkRequired(); - } else { - fieldLinkInput.value = ""; + toggleCtaInputRequired(fieldCtaHowToSignUpLabel, fieldCtaHowToSignUpWrapper, fieldCtaHowToSignUp); + } + }); + fieldCtaHowToSignUp.addEventListener("change", function (e) { + switch (e.target.value) { + case "url": + fieldCtaEmailInput.value = ""; + toggleCtaInputRequired(fieldCtaEmailWrapperLabel, fieldCtaEmailWrapper, fieldCtaEmailInput, false); + toggleCtaInputRequired(fieldLinkWrapperLabel, fieldLinkWrapper, fieldLinkInput); + break; + case "email": + fieldLinkInput.value = ""; + toggleCtaInputRequired(fieldLinkWrapperLabel, fieldLinkWrapper, fieldLinkInput, false); + toggleCtaInputRequired(fieldCtaEmailWrapperLabel, fieldCtaEmailWrapper, fieldCtaEmailInput); + break; + default: + toggleCtaInputRequired(fieldLinkWrapperLabel, fieldLinkWrapper, fieldLinkInput, false); + toggleCtaInputRequired(fieldCtaEmailWrapperLabel, fieldCtaEmailWrapper, fieldCtaEmailInput, false); + fieldLinkInput.value = ""; + fieldCtaEmailInput.value = ""; + break; } }); }; - var toggleAddressRequiredFields = function toggleAddressRequiredFields(enableDisable, addRemove) { if (fieldAddressLine1) { fieldAddressLine1.required = enableDisable; @@ -81,14 +122,12 @@ if (fieldAddressLine1Label) { fieldAddressLine1Label.classList[addRemove]("form-required"); } - if (fieldAddressLocality) { fieldAddressLocality.required = enableDisable; } if (fieldAddressLocalityLabel) { fieldAddressLocalityLabel.classList[addRemove]("form-required"); } - if (fieldAddressAdminArea) { fieldAddressAdminArea.required = enableDisable; } @@ -96,7 +135,6 @@ fieldAddressAdminAreaLabel.classList[addRemove]("form-required"); } }; - var toggleLocationElements = function toggleLocationElements() { targetLocationElements.forEach(function (element) { element.style.display = "none"; @@ -128,23 +166,20 @@ fieldLocationHumanreadable.value = ""; } }; - var operate = function operate() { requireCTA(); includeRegistrationsBool.addEventListener("click", function () { toggleRegistrationElements(); }); toggleRegistrationElements(); - includeLocationItemsRadios.addEventListener("change", function () { toggleLocationElements(); }); toggleLocationElements(); }; - Drupal.behaviors.vaGovEventFormHelpers = { attach: function attach() { operate(); } }; -})(Drupal); +})(Drupal); \ No newline at end of file diff --git a/docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/EmailToVaOnlyConstraint.php b/docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/EmailToVaOnlyConstraint.php new file mode 100644 index 0000000000..dcfb9ce3d8 --- /dev/null +++ b/docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/EmailToVaOnlyConstraint.php @@ -0,0 +1,24 @@ +getValue() as $item) { + $value = $item['value']; + $domain = substr($value, strpos($value, '@') + 1); + if ($domain !== 'va.gov') { + $this->context->addViolation($constraint->errorMessage); + } + } + } + +} diff --git a/docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/LinkNoMailtoConstraint.php b/docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/LinkNoMailtoConstraint.php new file mode 100644 index 0000000000..955b70f2be --- /dev/null +++ b/docroot/modules/custom/va_gov_events/src/Plugin/Validation/Constraint/LinkNoMailtoConstraint.php @@ -0,0 +1,24 @@ +getValue() as $delta => $item) { + if (preg_match('/^mailto:/i', $item['uri']) === 1) { + $this->context + ->buildViolation($constraint->errorMessage) + ->atPath((string) $delta . '.uri') + ->addViolation(); + } + } + } + +} diff --git a/docroot/modules/custom/va_gov_events/va_gov_events.module b/docroot/modules/custom/va_gov_events/va_gov_events.module index a35076167c..f0c0ee7c57 100644 --- a/docroot/modules/custom/va_gov_events/va_gov_events.module +++ b/docroot/modules/custom/va_gov_events/va_gov_events.module @@ -55,5 +55,11 @@ function va_gov_events_entity_bundle_field_info_alter(&$fields, EntityTypeInterf if (isset($fields['field_datetime_range_timezone'])) { $fields['field_datetime_range_timezone']->addConstraint('NonZeroEventDate', []); } + if (isset($fields['field_link'])) { + $fields['field_link']->addConstraint('LinkNoMailto', []); + } + if (isset($fields['field_cta_email'])) { + $fields['field_cta_email']->addConstraint('EmailToVaOnly', []); + } } } diff --git a/tests/cypress/integration/features/content_type/event.feature b/tests/cypress/integration/features/content_type/event.feature index f3e157d6af..b4779d0e4a 100644 --- a/tests/cypress/integration/features/content_type/event.feature +++ b/tests/cypress/integration/features/content_type/event.feature @@ -5,17 +5,10 @@ Feature: Content Type: Event Given I am logged in as a user with the "content_admin" role Then I create a "event" node - Scenario: Confirm that event form conditional fields are cleared out if parent options change + Scenario: Confirm that event location conditional fields are cleared out if parent options change Given I am logged in as a user with the "content_admin" role When I am at "node/add/event" - # Check registration call to action conditional field - And I select option "Register" from dropdown "Call to action" - And I fill in autocomplete field with selector "#edit-field-url-of-an-online-event-0-uri" with value "/node/5016" - And I select option "- None -" from dropdown "Call to action" - And I select option "Register" from dropdown "Call to action" - Then an element with the selector "#edit-field-url-of-an-online-event-0-uri" should be empty - # Check the location type conditional fields When I select the "At a VA facility" radio button And I fill in autocomplete field with selector "#edit-field-facility-location-0-target-id" with value "Aberdeen VA Clinic | VA Sioux Falls health care (1111)" @@ -34,6 +27,17 @@ Feature: Content Type: Event When I select the "Online" radio button Then an element with the selector "#edit-field-url-of-an-online-event-0-uri" should be empty + # Check the registration conditional fields. + When I check the "Include registration information" checkbox + And I scroll to element '#edit-field-include-registration-info-wrapper' + And I select option "Register" from dropdown "Call to action" + And I select option "URL" from dropdown "How to sign up" + And I fill in field with selector "#edit-field-link-0-uri" with value "http://example.com" + Then an element with the selector "#edit-field-cta-email-0-value" should be empty + When I select option "Email" from dropdown "How to sign up" + And I fill in field with selector "#edit-field-cta-email-0-value" with value "test@example.com" + Then an element with the selector "#edit-field-link-0-uri" should be empty + Scenario: Confirm that the default time zone when creating an event is set explicitly to Eastern. Given I am logged in as a user with the "content_admin" role When I am at "node/add/event" @@ -42,7 +46,6 @@ Feature: Content Type: Event Scenario: Confirm that the event form conditional elements are shown or hidden appropriately Given I am logged in as a user with the "content_admin" role When I am at "node/add/event" - And I select the "At a VA facility" radio button Then I should see "Facility location" And I should see "Building, floor, or room" @@ -52,6 +55,7 @@ Feature: Content Type: Event And I should not see "Country" And I should not see an element with the selector "#edit-field-url-of-an-online-event-0-uri" + # Location conditional fields. When I select the "At a non-VA location" radio button Then I should not see "Facility location" And I should see "Building, floor, or room" @@ -70,30 +74,73 @@ Feature: Content Type: Event And I should not see "Country" And I should see an element with the selector "#edit-field-url-of-an-online-event-0-uri" - # Registration checkbox reveals conditional form elements + # Registration conditional fields. When I check the "Include registration information" checkbox + And I scroll to element '#edit-field-include-registration-info-wrapper' Then "Cost" should be visible And I should see "Registration is required for this event" And "Call to action" should be visible + And "How to sign up" should not be visible + And I should not see an element with the selector "#edit-field-link-0-uri" + And I should not see an element with the selector "#edit-field-cta-email-0-value" When I select option "Register" from dropdown "Call to action" + Then I should see "How to sign up" + And the option "- None -" from dropdown "How to sign up" should be selected + + When I select option "URL" from dropdown "How to sign up" Then I should see an element with the selector "#edit-field-link-0-uri" - And I select option "Apply" from dropdown "Call to action" + And I should not see an element with the selector "#edit-field-cta-email-0-value" + + When I select option "Email" from dropdown "How to sign up" + Then I should see an element with the selector "#edit-field-cta-email-0-value" + And I should not see an element with the selector "#edit-field-link-0-uri" + + When I select option "Apply" from dropdown "Call to action" + Then I should see "How to sign up" + And the option "- None -" from dropdown "How to sign up" should be selected + + When I select option "URL" from dropdown "How to sign up" Then I should see an element with the selector "#edit-field-link-0-uri" - And I select option "RSVP" from dropdown "Call to action" + And I should not see an element with the selector "#edit-field-cta-email-0-value" + + When I select option "Email" from dropdown "How to sign up" + Then I should see an element with the selector "#edit-field-cta-email-0-value" + And I should not see an element with the selector "#edit-field-link-0-uri" + + When I select option "RSVP" from dropdown "Call to action" + Then I should see "How to sign up" + And the option "- None -" from dropdown "How to sign up" should be selected + + When I select option "URL" from dropdown "How to sign up" Then I should see an element with the selector "#edit-field-link-0-uri" - And I select option "More Details" from dropdown "Call to action" + And I should not see an element with the selector "#edit-field-cta-email-0-value" + + When I select option "Email" from dropdown "How to sign up" + Then I should see an element with the selector "#edit-field-cta-email-0-value" + And I should not see an element with the selector "#edit-field-link-0-uri" + + When I select option "More Details" from dropdown "Call to action" + Then I should see "How to sign up" + And the option "- None -" from dropdown "How to sign up" should be selected + + When I select option "URL" from dropdown "How to sign up" Then I should see an element with the selector "#edit-field-link-0-uri" - And I select option "- None -" from dropdown "Call to action" - Then I should not see an element with the selector "#edit-field-link-0-uri" + And I should not see an element with the selector "#edit-field-cta-email-0-value" + + When I select option "Email" from dropdown "How to sign up" + Then I should see an element with the selector "#edit-field-cta-email-0-value" + And I should not see an element with the selector "#edit-field-link-0-uri" When I uncheck the "Include registration information" checkbox Then I should not see "Cost" And I should not see "Registration is required for this event" And I should not see "Call to action" And I should not see an element with the selector "#edit-field-link-0-uri" + And "How to sign up" should not be visible + And I should not see an element with the selector "#edit-field-cta-email-0-value" -Scenario: Confirm tabledrag is not enabled on the event date field - Given I am logged in as a user with the "content_admin" role - When I am at "node/add/event" - Then an element with the selector "#edit-field-datetime-range-timezone-wrapper button.tabledrag-toggle-weight" should not exist + Scenario: Confirm tabledrag is not enabled on the event date field + Given I am logged in as a user with the "content_admin" role + When I am at "node/add/event" + Then an element with the selector "#edit-field-datetime-range-timezone-wrapper button.tabledrag-toggle-weight" should not exist diff --git a/tests/cypress/integration/step_definitions/common/i_create_a_node.js b/tests/cypress/integration/step_definitions/common/i_create_a_node.js index bff94a12cb..c9d85fc0f4 100644 --- a/tests/cypress/integration/step_definitions/common/i_create_a_node.js +++ b/tests/cypress/integration/step_definitions/common/i_create_a_node.js @@ -278,6 +278,10 @@ const creators = { timeout: 20000, } ).should("exist"); + cy.get("#edit-revision-log-0-value").type( + `[Test revision log]${faker.lorem.sentence()}`, + { force: true } + ); cy.get("form.node-form").find("input#edit-submit").click(); cy.get(".node__content").contains("Sun, Nov 5 2023, 10:00am - 11:00am MST"); cy.get(".node__content").contains("Outreach events"); From 8265c86a9fbb7228b817f53b07e9262c0d03e2f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 14:23:29 -0800 Subject: [PATCH 11/23] Bump drupal/geocoder from 4.15.0 to 4.16.0 (#16467) Bumps drupal/geocoder from 4.15.0 to 4.16.0. --- updated-dependencies: - dependency-name: drupal/geocoder dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index feabf348d7..89a97e3a30 100644 --- a/composer.lock +++ b/composer.lock @@ -6508,17 +6508,17 @@ }, { "name": "drupal/geocoder", - "version": "4.15.0", + "version": "4.16.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/geocoder.git", - "reference": "8.x-4.15" + "reference": "8.x-4.16" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-4.15.zip", - "reference": "8.x-4.15", - "shasum": "2314ab3c6210ef1a09bccb711e57521a44be4594" + "url": "https://ftp.drupal.org/files/projects/geocoder-8.x-4.16.zip", + "reference": "8.x-4.16", + "shasum": "76ac68a73663edd2d9c51b3907d4ebb7185fd229" }, "require": { "davedevelopment/stiphle": "^0.9.2", @@ -6563,8 +6563,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-4.15", - "datestamp": "1701960764", + "version": "8.x-4.16", + "datestamp": "1702679287", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" From df3840d9a5158432914ca9db1086d2abe1d9afac Mon Sep 17 00:00:00 2001 From: Christian Burk Date: Mon, 18 Dec 2023 17:18:15 -0600 Subject: [PATCH 12/23] VACMS-14000: Adds and populates meta tags on VBA Facility (#16395) * VACMS-14000: Adds config, hides field * VACMS-14000: Adds script to update VBA facilities * VACMS-14000: Tweaks script for accuracy. * VACMS-14000: Updates Service Region form display to match VBA Facility --------- Co-authored-by: Steve Wirt --- ...rm_display.node.service_region.default.yml | 2 +- ...form_display.node.vba_facility.default.yml | 31 ++++- ...view_display.node.vba_facility.default.yml | 2 + ...d.node.vba_facility.field_cc_meta_tags.yml | 29 ++++ .../field.storage.node.field_cc_meta_tags.yml | 19 +++ ...ag.metatag_defaults.node__vba_facility.yml | 9 ++ .../VACMS-14000-vba-facility-meta-tags.php | 128 ++++++++++++++++++ 7 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 config/sync/field.field.node.vba_facility.field_cc_meta_tags.yml create mode 100644 config/sync/field.storage.node.field_cc_meta_tags.yml create mode 100644 config/sync/metatag.metatag_defaults.node__vba_facility.yml create mode 100644 scripts/content/VACMS-14000-vba-facility-meta-tags.php diff --git a/config/sync/core.entity_form_display.node.service_region.default.yml b/config/sync/core.entity_form_display.node.service_region.default.yml index d8e4c0e5a7..e8304cad85 100644 --- a/config/sync/core.entity_form_display.node.service_region.default.yml +++ b/config/sync/core.entity_form_display.node.service_region.default.yml @@ -11,7 +11,7 @@ dependencies: - field.field.node.service_region.field_service_name_and_descripti - field.field.node.service_region.field_vba_region_facility_list - node.type.service_region - - workflows.workflow.editorial + - workflows.workflow.restricted_archive module: - change_labels - content_moderation diff --git a/config/sync/core.entity_form_display.node.vba_facility.default.yml b/config/sync/core.entity_form_display.node.vba_facility.default.yml index 818a11f37f..7c187a7ad3 100644 --- a/config/sync/core.entity_form_display.node.vba_facility.default.yml +++ b/config/sync/core.entity_form_display.node.vba_facility.default.yml @@ -13,6 +13,7 @@ dependencies: - field.field.node.vba_facility.field_cc_benefits_hotline - field.field.node.vba_facility.field_cc_cant_find_benefits - field.field.node.vba_facility.field_cc_get_updates_from_vba + - field.field.node.vba_facility.field_cc_meta_tags - field.field.node.vba_facility.field_cc_national_spotlight_1 - field.field.node.vba_facility.field_cc_vba_facility_overview - field.field.node.vba_facility.field_dismissible_option @@ -36,7 +37,7 @@ dependencies: - field.field.node.vba_facility.field_table_of_contents - field.field.node.vba_facility.field_timezone - node.type.vba_facility - - workflows.workflow.editorial + - workflows.workflow.restricted_archive module: - address - allowed_formats @@ -328,7 +329,7 @@ third_party_settings: label: 'Spotlight content' region: content parent_name: '' - weight: 8 + weight: 9 format_type: fieldset format_settings: classes: '' @@ -337,6 +338,21 @@ third_party_settings: description: '' required_fields: true description_display: after + group_meta_tags: + children: + - field_cc_meta_tags + label: 'Meta tags' + region: content + parent_name: '' + weight: 15 + format_type: fieldset + format_settings: + classes: hidden + show_empty_fields: false + id: '' + description: '' + required_fields: false + description_display: after id: node.vba_facility.default targetEntityType: node bundle: vba_facility @@ -427,9 +443,18 @@ content: show_link_to_source: '1' show_source_updated_date: '1' third_party_settings: { } + field_cc_meta_tags: + type: entity_field_fetch_widget + weight: 0 + region: content + settings: + show_field_label: '1' + show_link_to_source: 0 + show_source_updated_date: 0 + third_party_settings: { } field_cc_national_spotlight_1: type: entity_field_fetch_widget - weight: 10 + weight: 1 region: content settings: show_field_label: '1' diff --git a/config/sync/core.entity_view_display.node.vba_facility.default.yml b/config/sync/core.entity_view_display.node.vba_facility.default.yml index f3cf6f70de..1563a78acb 100644 --- a/config/sync/core.entity_view_display.node.vba_facility.default.yml +++ b/config/sync/core.entity_view_display.node.vba_facility.default.yml @@ -13,6 +13,7 @@ dependencies: - field.field.node.vba_facility.field_cc_benefits_hotline - field.field.node.vba_facility.field_cc_cant_find_benefits - field.field.node.vba_facility.field_cc_get_updates_from_vba + - field.field.node.vba_facility.field_cc_meta_tags - field.field.node.vba_facility.field_cc_national_spotlight_1 - field.field.node.vba_facility.field_cc_vba_facility_overview - field.field.node.vba_facility.field_dismissible_option @@ -530,6 +531,7 @@ hidden: content_moderation_control: true field_administration: true field_banner_types_description: true + field_cc_meta_tags: true field_facility_vba_classificatio: true field_geolocation: true field_last_saved_by_an_editor: true diff --git a/config/sync/field.field.node.vba_facility.field_cc_meta_tags.yml b/config/sync/field.field.node.vba_facility.field_cc_meta_tags.yml new file mode 100644 index 0000000000..987de061c5 --- /dev/null +++ b/config/sync/field.field.node.vba_facility.field_cc_meta_tags.yml @@ -0,0 +1,29 @@ +uuid: 8e17f221-14a1-4920-b33f-4739d8ddf543 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_cc_meta_tags + - node.type.vba_facility + module: + - entity_field_fetch + - tmgmt_content +third_party_settings: + tmgmt_content: + excluded: false +id: node.vba_facility.field_cc_meta_tags +field_name: field_cc_meta_tags +entity_type: node +bundle: vba_facility +label: 'Meta tags' +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + target_entity_type: node + target_entity_id: '61744' + field_to_fetch: field_content_block + target_paragraph_uuid: '142580' +field_type: entity_field_fetch diff --git a/config/sync/field.storage.node.field_cc_meta_tags.yml b/config/sync/field.storage.node.field_cc_meta_tags.yml new file mode 100644 index 0000000000..810cd93692 --- /dev/null +++ b/config/sync/field.storage.node.field_cc_meta_tags.yml @@ -0,0 +1,19 @@ +uuid: 04efffc3-15ed-43b2-8079-dd55b0f7a388 +langcode: en +status: true +dependencies: + module: + - entity_field_fetch + - node +id: node.field_cc_meta_tags +field_name: field_cc_meta_tags +entity_type: node +type: entity_field_fetch +settings: { } +module: entity_field_fetch +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/metatag.metatag_defaults.node__vba_facility.yml b/config/sync/metatag.metatag_defaults.node__vba_facility.yml new file mode 100644 index 0000000000..3b0037ac67 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node__vba_facility.yml @@ -0,0 +1,9 @@ +uuid: 8dab1acd-96b7-4f47-adff-d38ea93ea39a +langcode: en +status: true +dependencies: { } +id: node__vba_facility +label: 'Content: VBA Facility' +tags: + description: '[node:field_cc_meta_tags]' + og_description: '[node:field_cc_meta_tags]' diff --git a/scripts/content/VACMS-14000-vba-facility-meta-tags.php b/scripts/content/VACMS-14000-vba-facility-meta-tags.php new file mode 100644 index 0000000000..b02cfc2d09 --- /dev/null +++ b/scripts/content/VACMS-14000-vba-facility-meta-tags.php @@ -0,0 +1,128 @@ + 0]; +do { + print(va_gov_set_vba_facility_meta_tags($sandbox)); +} while ($sandbox['#finished'] < 1); +// Node processing complete. Call this done. +return; + +/** + * Setting the VBA facility meta tags. + * + * @param array $sandbox + * Modeling the structure of hook_update_n sandbox. + * + * @return string + * Status message. + */ +function va_gov_set_vba_facility_meta_tags(array &$sandbox) { + $node_storage = \Drupal::entityTypeManager()->getStorage('node'); + + // Get the count for VBA facilities. + // This runs only once. + if (!isset($sandbox['total'])) { + $query = $node_storage->getQuery(); + $query->condition('type', 'vba_facility'); + $query->accessCheck(FALSE); + $nids_to_update = $query->execute(); + $result_count = count($nids_to_update); + $sandbox['total'] = $result_count; + $sandbox['current'] = 0; + $sandbox['updated'] = 0; + + // Create non-numeric keys to accurately remove each nid when processed. + $sandbox['nids_to_update'] = array_combine( + array_map('_va_gov_stringifynid', array_values($nids_to_update)), + array_values($nids_to_update) + ); + } + + // Do not continue if no nodes are found. + if (empty($sandbox['total'])) { + $sandbox['#finished'] = 1; + return "No VBA facility nodes found for processing.\n"; + } + + $limit = 25; + + // Load entities. + $node_ids = array_slice($sandbox['nids_to_update'], 0, $limit, TRUE); + $nodes = $node_storage->loadMultiple($node_ids); + foreach ($nodes as $node) { + /** @var \Drupal\node\NodeInterface $node */ + $nid = $node->id(); + $nvid = $node->getRevisionId(); + $node_storage = get_node_storage(); + $latest_nvid = $node_storage->getLatestRevisionId($nid); + + update_field_cc_meta_tags_table($nid, $nvid); + + // Set the latest revision, if different than the default. + if ($nvid < $latest_nvid) { + update_field_cc_meta_tags_table($nid, $latest_nvid); + } + + $sandbox['updated']++; + $nids[] = $nid; + + unset($sandbox['nids_to_update']["node_{$nid}"]); + $sandbox['current'] = $sandbox['total'] - count($sandbox['nids_to_update']); + } + + // Log the processed nodes. + Drupal::logger('va_gov_db') + ->log(LogLevel::INFO, 'VBA Facility update: Successfully updated %current nodes with meta tags from centralized content. Nodes updated: %nids', [ + '%current' => $sandbox['current'], + '%nids' => empty($nids) ? 'None' : implode(', ', $nids), + ]); + + $sandbox['#finished'] = ($sandbox['current'] / $sandbox['total']); + + // Log the all-finished notice. + if ($sandbox['#finished'] == 1) { + Drupal::logger('va_gov_db')->log(LogLevel::INFO, 'Updating all %count VBA facility nodes with meta tags from centralized content.', [ + '%count' => $sandbox['total'], + ]); + return "VBA facility node updates complete. {$sandbox['current']} / {$sandbox['total']} - Total updated: {$sandbox['updated']}\n"; + } + + return "Processed nodes... {$sandbox['current']} / {$sandbox['total']}.\n"; +} + +/** + * Update the node__field_cc_meta_tags table to set the entity fetch field. + * + * @param string $nodeId + * The id of the node. + * @param string $revisionId + * The id of the node revision. + */ +function update_field_cc_meta_tags_table(string $nodeId, string $revisionId) { + $connection = \Drupal::database(); + $connection->upsert('node__field_cc_meta_tags') + ->fields([ + 'bundle' => 'vba_facility', + 'entity_id' => $nodeId, + 'revision_id' => $revisionId, + 'langcode' => 'en', + 'delta' => 0, + 'field_cc_meta_tags_value' => 0, + ]) + ->key('revision_id') + ->execute(); +} From a00f483d9abcb234a5798e63198322c622199f57 Mon Sep 17 00:00:00 2001 From: Steve Wirt Date: Mon, 18 Dec 2023 20:26:50 -0500 Subject: [PATCH 13/23] VACMS-16322 Fix VC Outstation typo (#16482) --- ...eld.field.node.vet_center_outstation.field_official_name.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sync/field.field.node.vet_center_outstation.field_official_name.yml b/config/sync/field.field.node.vet_center_outstation.field_official_name.yml index 108472617e..33bb70b6b2 100644 --- a/config/sync/field.field.node.vet_center_outstation.field_official_name.yml +++ b/config/sync/field.field.node.vet_center_outstation.field_official_name.yml @@ -14,7 +14,7 @@ id: node.vet_center_outstation.field_official_name field_name: field_official_name entity_type: node bundle: vet_center_outstation -label: 'Name of Vet Center - Oustation' +label: 'Name of Vet Center - Outstation' description: 'The official name of the Vet Center. To request a correction or update, email an administrator.' required: false translatable: true From 31f735d0ace47db0e366c2a508003e51f9580ecf Mon Sep 17 00:00:00 2001 From: Steve Wirt Date: Tue, 19 Dec 2023 09:40:12 -0500 Subject: [PATCH 14/23] VACMS-16411 Add metatag setup for VA Police. (#16480) --- ...metatag_defaults.node__vamc_system_va_police.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 config/sync/metatag.metatag_defaults.node__vamc_system_va_police.yml diff --git a/config/sync/metatag.metatag_defaults.node__vamc_system_va_police.yml b/config/sync/metatag.metatag_defaults.node__vamc_system_va_police.yml new file mode 100644 index 0000000000..0558fbdd35 --- /dev/null +++ b/config/sync/metatag.metatag_defaults.node__vamc_system_va_police.yml @@ -0,0 +1,13 @@ +uuid: 6ae224e4-dc7b-42de-988f-66ccf6ee70d2 +langcode: en +status: true +dependencies: { } +id: node__vamc_system_va_police +label: 'Content: VAMC System VA Police page' +tags: + description: '[node:field_cc_va_police_overview]' + image_src: '[node:field_office:entity:field_media:entity:image:entity:3_2_medium_thumbnail:url]' + og_description: '[node:field_cc_va_police_overview]' + og_image: '[node:field_office:entity:field_media:entity:image:entity:3_2_medium_thumbnail:url]' + og_title: '[node:title] | [node:field_office] | Veterans Affairs' + title: '[node:title] | [node:field_office] | Veterans Affairs' From fbcb2345c6c76c17ef592d05ad6ce4b9a9cd22fb Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 19 Dec 2023 13:25:44 -0500 Subject: [PATCH 15/23] Documentation updates (#16253) * Update Readmes Fix some broken links * Update documentation * Update recommendations regarding forks vs branches * Add links to some orphan docs * Update documentation * Update * Move docs to vagov-team * Move two files back * Revert "Move docs to vagov-team" This reverts commit fede8a7b05b74fca286d750d515b774a72679576. --- README.md | 15 +++++-- READMES/alerts.md | 2 +- READMES/blackfire.md | 5 +-- READMES/codeowners.md | 4 ++ READMES/comparing-graphql-output.md | 4 ++ READMES/getting-started.md | 55 +++++++++----------------- READMES/github-workflows.md | 4 ++ READMES/{ => historical}/analytics.md | 0 READMES/https.md | 24 ++++++----- READMES/images/macos-keychains.png | Bin 0 -> 45358 bytes READMES/interfaces.md | 4 ++ READMES/qa.md | 4 +- READMES/security.md | 10 ++--- READMES/sentry.md | 2 +- READMES/workflow.md | 10 ++--- 15 files changed, 75 insertions(+), 68 deletions(-) rename READMES/{ => historical}/analytics.md (100%) create mode 100644 READMES/images/macos-keychains.png diff --git a/README.md b/README.md index d65367ee7e..146222ddfa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # VA.gov CMS -This is the public/open documentation for the VA.gov Content Management System (CMS). The private/sensitive documentation is [here](https://github.com/department-of-veterans-affairs/va.gov-team-sensitive/tree/master/platform/cms). See [sensitive-guidance.md](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/platform/working-with-vsp/policies-work-norms/sensitive-guidance.md) to read about what should be public vs. private. We follow the U.S. Digital Services Playbook and [default to open/public](https://playbook.cio.gov/#play13)). +This is the public/open documentation for the VA.gov Content Management System (CMS) for development, QA and DevOps topics. For product, design, support, research and cross-team documentation, visit the [platform/cms docs](https://github.com/department-of-veterans-affairs/va.gov-team/tree/master/platform/cms). For private/sensitive documentation, visit the [private docs repo](https://github.com/department-of-veterans-affairs/va.gov-team-sensitive/tree/master/platform/cms). See [sensitive-guidance.md](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/platform/working-with-vsp/policies-work-norms/sensitive-guidance.md) to read about what should be public vs. private. We follow the U.S. Digital Services Playbook and [default to open/public](https://playbook.cio.gov/#play13)). [VA.gov](https://www.va.gov) is constructed at the highest level by three projects: - the **CMS** or **Content Management System**, in this repository @@ -29,6 +29,7 @@ The VA.gov CMS Team 1. [WEB & CMS Integration](READMES/unity.md) 1. [Workflow](READMES/workflow.md) 1. [Project Conventions](READMES/project-conventions.md) + 1. [Code Ownership](READMES/codeowners.md) 1. [Environments](READMES/environments.md) 1. [CI Environments](READMES/tugboat.md) 1. [Local - DDEV](READMES/local.md) @@ -45,26 +46,31 @@ The VA.gov CMS Team 1. [Code Review](READMES/code-review.md) 1. [Testing](READMES/testing.md) 1. [Debugging](READMES/debugging.md) - 1. [Comparing GraphQL Output](READMES/graph_ql.md) + 1. [Comparing GraphQL Output](READMES/comparing-graphql-output.md) + 1. [Dependabot Alerts](READMES/dependabot-alerts.md) 1. [Dependabot Updates](READMES/dependabot-updates.md) + 1. [Sentry](READMES/sentry.md) + 1. [Profiling with Blackfire](READMES/blackfire.md) + 1. [Scalability Testing](READMES/scalability-testing.md) 1. **Release & Deployment** 1. [The BRD System: Build, Release, Deploy](READMES/brd.md) 1. [CMS Release Process](READMES/brd.md#cms-release-process) 1. [CMS-CI Release Process (TODO)](READMES/brd.md#cmsci-release-process) 1. **Architecture** - 1. Overview 1. Drupal 1. [Memcache](READMES/drupal-memcache.md) 1. [Content Models and Documentation](READMES/content-models.md) 1. [Centralized Content](READMES/content-model-centralized-content.md) 1. MetalSmith + 1. [GraphQL](READMES/graph_ql.md) 1. [Interfaces](READMES/interfaces.md) - APIs and Feature Flag 1. Migrations (data imports) 1. [Facility](READMES/migrations-facility.md) 1. [Form](READMES/migrations-forms.md) + 1. [Removing deprecated fields](READMES/remove-deprecated-fields.md) 1. [Security](READMES/security.md) 1. [Upstream Dependencies](READMES/upstream-dependencies.md) - 1. [Downstream Dependencies](READMES/downstream-dependencies.md) + 1. [Downstream Dependencies](READMES/downstream_dependencies.md) 1. **CMS Users** 1. [Login / SSOi](READMES/cms-login.md) 2. [CMS User Notification Systems](READMES/cms-editor-notifications.md) @@ -138,6 +144,7 @@ This section outlines only the systems utilized by the CMS. See the READMEs in t - A single "mirror" environment is regularly populated with a sanitized production database copy. - Open Pull Requests get environments created automatically, cloned from the "mirror" environment, with URLs like: - [pr123-{hash}.ci.cms.va.gov](https://pr123-{hash}.ci.cms.va.gov) for the CMS + - Cypress test logs and artifacts, see [Testing](READMES/testing.md) for details. - [web-{hash}.ci.cms.va.gov](http://web-{hash}.ci.cms.va.gov) for the frontend web build - [storybook-{hash}.ci.cms.va.gov](http://storybook-{hash}.ci.cms.va.gov) for design system documentation - Ad-hoc environments can be created and deleted at any time by any logged in user on [tugboat.vfs.va.gov/](https://tugboat.vfs.va.gov/): diff --git a/READMES/alerts.md b/READMES/alerts.md index 0c1e4ffd52..9b24c37bab 100644 --- a/READMES/alerts.md +++ b/READMES/alerts.md @@ -4,7 +4,7 @@ CMS Alerts are managed by [Sentry](https://sentry.vfs.va.gov/) and [DataDog](https://vagov.ddog-gov.com/). -Runtime issues are reported to Sentry via the Raven module. +[Runtime issues](READMES/sentry.md) are reported to Sentry via the Raven module. Various metrics in the CI/CD phases and at runtime are reported to DataDog. diff --git a/READMES/blackfire.md b/READMES/blackfire.md index 3c66f98753..58578737f9 100644 --- a/READMES/blackfire.md +++ b/READMES/blackfire.md @@ -5,7 +5,7 @@ are used by PHP applications. It can be used to measure the performance of a specific bit of code or an entire request. This allows us to measure the performance impact of a code or platform change and debug performance issues. -See also: +See also: * https://ddev.readthedocs.io/en/latest/users/debugging-profiling/blackfire-profiling * https://blackfire.io/docs/integrations/paas/ddev * https://blackfire.io/docs/up-and-running/installation (install instructions for non-DDEV environments) @@ -69,9 +69,6 @@ Memory 3.62MB Network n/a n/a n/a SQL 1.72ms 5rq ``` -## Credits - -The `blackfire-init.sh` script is based on [this gist](https://gist.github.com/tylerssn/8923149702d4a796c5e103412c2370c3) by @tylerssn. ---- diff --git a/READMES/codeowners.md b/READMES/codeowners.md index 9f75f6e365..1371ebab57 100644 --- a/READMES/codeowners.md +++ b/READMES/codeowners.md @@ -27,3 +27,7 @@ The important ideas are: 6. Viewing the CODEOWNERS file in GitHub should provide debugging information. As with everything else in this project, CODEOWNERS is subject to continual refinement and development. Please raise issues and suggest improvements where appropriate. + +---- + +[Table of Contents](../README.md) \ No newline at end of file diff --git a/READMES/comparing-graphql-output.md b/READMES/comparing-graphql-output.md index 0c7a378500..4a9faea8ea 100644 --- a/READMES/comparing-graphql-output.md +++ b/READMES/comparing-graphql-output.md @@ -50,3 +50,7 @@ jq -S '.data.nodeQuery.entities|=sort_by(.entityId)' pages2.json > pages3.json ``` After processing both the "before" and "after" `pages.json` in this way, diffing the two should yield a far more useful visualization of the changes. + +---- + +[Table of Contents](../README.md) \ No newline at end of file diff --git a/READMES/getting-started.md b/READMES/getting-started.md index e218e36917..2d0b52d9c7 100644 --- a/READMES/getting-started.md +++ b/READMES/getting-started.md @@ -13,31 +13,12 @@ See [the Codespaces README](./codespaces.md) to get a fully functional cloud-bas ## Step 1: Get Source Code / Git Setup -- Fork the repo by pressing the "Fork" button: [github.com/department-of-veterans-affairs/va.gov-cms](https://github.com/department-of-veterans-affairs/va.gov-cms) -- Clone your fork. +- Clone the repo: [github.com/department-of-veterans-affairs/va.gov-cms](https://github.com/department-of-veterans-affairs/va.gov-cms) ```sh - $ git clone git@github.com:YOUR-GITHUB-USERNAME/va.gov-cms.git + $ git clone git@github.com:department-of-veterans-affairs/va.gov-cms.git $ cd va.gov-cms ``` -* Add upstream repo (Recommended): - - ```sh - $ git remote add upstream git@github.com:department-of-veterans-affairs/va.gov-cms.git - ``` -* Optionally rename your fork so its name is more meaningful and ensures your upstream and origin are not misnamed. - ```sh - $ git remote rename origin myfork - ``` -* Verify your remotes, it should list upstream and myfork/origin as remotes. - ```sh - $ git remote -v - - myfork git@github.com:YOUR_GIT_USERNAME/va.gov-cms.git (fetch) - myfork git@github.com:YOUR_GIT_USERNAME/va.gov-cms.git (push) - upstream git@github.com:department-of-veterans-affairs/va.gov-cms.git (fetch) - upstream git@github.com:department-of-veterans-affairs/va.gov-cms.git (push) - ``` * Make sure your local repo is aware of what's on the remotes. ```sh $ git fetch --all @@ -55,35 +36,35 @@ See [the Codespaces README](./codespaces.md) to get a fully functional cloud-bas $ git config --global branch.main.rebase true ``` -* Make branch main always pulls from the remote: upstream. - ```sh - $ git checkout main - $ git branch --set-upstream-to upstream/main - ``` - * Make changes to simplesaml storage not be tracked locally. ```sh git update-index --skip-worktree samlsessiondb.sq3 ``` - You should periodically update your branch from `upstream main` branch: + You should periodically update your branch from `origin main` branch. This will rebase your current branch on top of new commits in main: ```sh - $ git pull upstream main + $ git pull origin main ``` ## Step 2: Launch development environment -1. [Install ddev](https://ddev.readthedocs.io/en/stable/#installation) -2. Change into the project directory and run `ddev start`: +1. Set ddev environment variables: - ```bash - $ cd va.gov-cms - $ ddev start - ``` +```bash +$ cd va.gov-cms +$ cp .env.example .env +``` + +2. [Install ddev](https://ddev.readthedocs.io/en/stable/#installation) +3. Change into the project directory and run `ddev start`: + +```bash +$ ddev start +``` -The `ddev start` command will include the `composer install` command. +The `ddev start` command will include the `composer install` command. Ensure that a CMS account is created and [Step 3](#step-3-sync-your-local-site-with-production-data) is run to sync login information before logging into the local CMS environment. See [Environments: Local](./local.md) for more information on ddev. @@ -96,7 +77,7 @@ correct locations in your local development environment. - `ddev pull va ` or `ddev pull va --skip-files` -NOTE: This command downloads and impoorts the db followed by any configuration import. +NOTE: This command downloads and imports the db followed by any configuration import. If you are not using ddev, the scripts will fail, but the files will still be available. The `sync-db.sh` script downloads the diff --git a/READMES/github-workflows.md b/READMES/github-workflows.md index e092ee5000..6f48aa51b0 100644 --- a/READMES/github-workflows.md +++ b/READMES/github-workflows.md @@ -23,3 +23,7 @@ Please follow the following guidelines: - If you need to check that a given workflow or action still triggers as expected, consider running the scripts `scripts/create-bad-test-files.sh` and `scripts/delete-bad-test-files.sh` to respectively create and delete files that can be used to test lints and checks. See ["Security hardening for GitHub Actions"](https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions) for more details concerning GitHub Actions and security. + +---- + +[Table of Contents](../README.md) \ No newline at end of file diff --git a/READMES/analytics.md b/READMES/historical/analytics.md similarity index 100% rename from READMES/analytics.md rename to READMES/historical/analytics.md diff --git a/READMES/https.md b/READMES/https.md index f54d267acd..457cd341b8 100644 --- a/READMES/https.md +++ b/READMES/https.md @@ -14,15 +14,21 @@ If you see a message from your browser like the following: Click the "^" button and select "Keep." -### OSX -1. Open Keychain Access -1. Go to Certificates (under Category in left sidebar) -2. Select "System" under Keychains (in sidebar) -3. Select "Import Items..." from File menu. (Shift-Command-I) -4. Select the three .cer files above. -5. They should now appear in your list of certificates -6. For each certificate: 1) File > Get info 2) Under Trust > When using this certificate, select "Always Trust". 3) Close the Get info window, which will prompt a password save. -7. You may need to restart your browser. +### macOS (as of 13.4) +1. Import the certificates. + 1. Open Keychain Access + 1. Select "System" under System Keychains (in sidebar) + + 1. Select "Import Items..." from File menu. (Shift-Command-I) + 1. Select the three .cer files above. + 1. They should now appear in your list of certificates under the "Keychain Access" view +1. Trust each certificate. + 1. For each of the three certificates, select it + 1. File > Get info (Command-I) + 1. Expand the "Trust" view + 1. In the "When using this certificate" popup button, select "Always Trust". + 1. Close the "Get Info" window, which will prompt a password save. +1. You may need to restart your browser. ### Linux diff --git a/READMES/images/macos-keychains.png b/READMES/images/macos-keychains.png new file mode 100644 index 0000000000000000000000000000000000000000..f419dcca56b5ace36843d5c237797f8018894839 GIT binary patch literal 45358 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 UeQXebPe)LCt1ee5V;S=Q0DztaSpWb4 literal 0 HcmV?d00001 diff --git a/READMES/interfaces.md b/READMES/interfaces.md index 4b319e0c23..76d6e3514a 100644 --- a/READMES/interfaces.md +++ b/READMES/interfaces.md @@ -63,6 +63,10 @@ and common calls look like: * Since this is a React widget displaying dynamic data it’s not using Metalsmith templates. The .jsx component files to support rendering are located in https://github.com/department-of-veterans-affairs/vets-website/tree/main/src/applications/facility-locator/components +## JSON API + +See [JSON:API](jsonapi.md) + ## Mirrors There are environments which exist in [Tugboat](tugboat.md) that provide a mirror of Prod. The content and code are updated daily at 3am EST on the mirrors. The list of mirrors can be found in the "[Mirrors (refreshed daily from PROD at 3am ET)](https://tugboat.vfs.va.gov/6042eeed6a89945a99399d3d)" project in tugboat. Contact CMS Support in the #cms-support Slack channel to request a new mirror. diff --git a/READMES/qa.md b/READMES/qa.md index ee12033346..49b51566cd 100644 --- a/READMES/qa.md +++ b/READMES/qa.md @@ -4,8 +4,8 @@ This document will act as an in-repo collection of links while we attempt to boo All of this is very much in flux at present. -- [CMS-QA Confluence Space](https://va-gov.atlassian.net/wiki/spaces/CMSQA/overview?homepageId=1814626528) - - [Strategy](https://va-gov.atlassian.net/wiki/spaces/CMSQA/pages/1814724630/Quality+Assurance+and+Testing+Strategy) -- an outline of the strategy we use to evaluate issues impacting QA, and how we address them in practice. +- CMS-QA Confluence Space + - [Strategy](https://vfs.atlassian.net/wiki/spaces/~821090906/pages/2304933915/Quality+Assurance+and+Testing+Strategy) -- an outline of the strategy we use to evaluate issues impacting QA, and how we address them in practice. - [Current Challenges](https://va-gov.atlassian.net/wiki/spaces/CMSQA/pages/1812987905/Current+Challenges+Facing+the+Project) -- a survey of some of the more noteworthy QA challenges identified at this time, and how we're attempting to assess and deal with them. [Table of Contents](../README.md) diff --git a/READMES/security.md b/READMES/security.md index 18d0e92df3..70ae6ef583 100644 --- a/READMES/security.md +++ b/READMES/security.md @@ -1,18 +1,18 @@ # Security -1. [Fortify Security Scans](testing.md#fortify-security-scans) -2. [PII](#pii) + +1. [PII](#pii) ## PII -The Content API has no PII or PHI on it and is a replacement for the public, open source [content repo](https://github.com/department-of-veterans-affairs/vagov-content). +The Content API has no PII or PHI on it and is a replacement for the public, open source [content repo](https://github.com/department-of-veterans-affairs/vagov-content). -A sanitized database is available in a public S3 bucket (for open source development purposes) since all the configuration is already open source in [this repository](https://github.com/department-of-veterans-affairs/va.gov-cms/). +A sanitized database is available in a public S3 bucket (for open source development purposes) since all the configuration is already open source in [this repository](https://github.com/department-of-veterans-affairs/va.gov-cms/). The sanitized version removes all email addresses and resets to a commonly known development password. ## See Also -- Our [security policy](/security/policy). +- Our [security policy](/SECURITY.md). ---- diff --git a/READMES/sentry.md b/READMES/sentry.md index cf5e0771e0..763e5d9b37 100644 --- a/READMES/sentry.md +++ b/READMES/sentry.md @@ -1,6 +1,6 @@ # Sentry -Sentry is used to track errors fom Drupal. +Sentry is used to track errors fom Drupal. URL: http://sentry.vfs.va.gov/ * Login using your Github Login diff --git a/READMES/workflow.md b/READMES/workflow.md index b2eba318b9..d93fbb8cbf 100644 --- a/READMES/workflow.md +++ b/READMES/workflow.md @@ -17,7 +17,7 @@ 1. Write a manual to test ticket completion. ## Git -To avoid cluttering up the repo with lots of branches, fork the repo and push your branches to your fork and make your pull request from your fork to the upstream repo. You can use the GitHub CLI, [`gh`](https://cli.github.com/), to make PRs from the command line much faster. Or after you push you will see a link in the output to ctrl + click and create a new PR from the branch you just pushed. [Getting started](./getting-started.md). +In this repo, we recommend working in individual branches and creating PRs to merge the branches to main. You can use the GitHub CLI, [`gh`](https://cli.github.com/), to make PRs from the command line much faster. Or after you push you will see a link in the output to ctrl + click and create a new PR from the branch you just pushed. See [Getting started](./getting-started.md) for more details. ### Branches We are currently working off a single `main` branch. `main` is protected and requires both approval from code review and passing tests to be merged. Commits within pull requests are squashed and merged when they are accepted so that the only relate to one git commit, even if they originally contained multiple commits, the commit messages are added as a bulleted list so they are retained in the merge commit. @@ -25,7 +25,7 @@ We are currently working off a single `main` branch. `main` is protected and req ### Example Git workflow: 1. `git fetch --all` -1. `git checkout -b upstream/main` +1. `git checkout -b origin/main` 1. `ddev composer install` 1. `ddev start` or `ddev restart` 1. `ddev pull va --skip-files` or `ddev pull va` idf you need managed files (images and pdfs) @@ -34,15 +34,15 @@ We are currently working off a single `main` branch. `main` is protected and req 1. Fix code formatting issues with CodeSniffer, Drupal standard (linters should run automatically upon trying to commit). 1. Commit your changes. Each commit should be logically atomic (e.g. module adds in one commit, config in another, custom code in additional logical commits), and your commit messages should follow the pattern: "VACMS-123: A grammatically correct sentence starting with an action verb and ending with punctuation." _Example: VACMS-1234 Add configuration for menu reduction._ -1. Push work to your fork of the repository so a Pull Request may be created -`git push myfork ` +1. Push work in your branch to the remote repository so a Pull Request may be created +`git push origin ` 1. Once your PR is merged it will be automatically deployed to staging.cms.va.gov. If it is merged before 2:30pm ET and tests pass it will be in the daily, scheduled deploy to prod.cms.va.gov at 3:30pm ET. While working on your own branch, you may have to rebase it on main which will make it out of sync with your remote branch and will require you to force push to your branch. ### When is it ok to do a force push (-f)? - On the upstream repo, never. On your own fork, it is perfectly acceptable to do force pushes. If you have recently rebased your branch on main, you may have to do a force push to your fork. When in doubt, ask in Slack. + It is never ok to force push to the main branch or an integration branch where other folks may be working from. On your own branch, it is perfectly acceptable to do force pushes. If you have recently rebased your branch on main, you may have to do a force push to your branch. When in doubt, ask in Slack. ### Pull Request Norms * Pull requests should be made against the `main` branch. From 357a21be11035471bcf573ef4db8547fa528415c Mon Sep 17 00:00:00 2001 From: Dave Pickett <51967950+davidmpickett@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:23:04 -0600 Subject: [PATCH 16/23] [docs] Create taxonomy-update-term.yml New issue template --- .../ISSUE_TEMPLATE/taxonomy-update-term.yml | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/taxonomy-update-term.yml diff --git a/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml b/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml new file mode 100644 index 0000000000..aa4f619dd9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml @@ -0,0 +1,79 @@ + +name: "Taxonomy - Update Term" +description: "Use this template when updating an existing terms in the Service or Benefit taxonomy." +title: "[Update] (Term name) in (taxonomy name)" +labels: Content, Content governance + +body: + +- type: dropdown + id: which-taxonomy + attributes: + label: Which Taxonomy is this term for? + multiple: false + options: + - VA Benefits taxonomy + - VA services taxonomy + - Other + validations: + required: true +- type: input + id: term-link + attributes: + label: Link to existing term + description: e.g. https://prod.cms.va.gov/health-care/medical-records + validations: + required: true +- type: textarea + id: rationale + attributes: + label: Rationale for adding this term + description: Write a short explanation of why this term is needed. Include links to any relevant issues, research findings, etc. + validations: + required: true +- type: dropdown + id: products + attributes: + label: Which products will this term impact? + multiple: true + options: + - VAMCs + - Vet Centers + - VBA Regional Office + - Benefit hubs + - Other + validations: + required: false +- type: dropdown + id: stakeholders + attributes: + label: Have stakeholders from impacted products been consulted? + multiple: false + options: + - 'Yes' + - 'No' + validations: + required: true +- type: dropdown + id: subfields + attributes: + label: Have you drafted content for all the relevant subfields? + multiple: false + options: + - 'Yes' + - 'No' + validations: + required: true +- type: textarea + id: acceptance-critera + attributes: + label: Acceptance Criteria + description: Customize the Acceptance Critera or use the default + value: | + - [ ] Content for subfields is drafted in Drupal by Product team + - [ ] Content is reviewed by relevant taxonomy governance body + - [ ] Content is reviewed by relevant stakeholders + - [ ] (List any necessary review and approval steps here) + - [ ] Term is published + validations: + required: true From f48153e6d0d077e8dfdf8142bfbf03b655a61b7c Mon Sep 17 00:00:00 2001 From: Dave Pickett <51967950+davidmpickett@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:30:04 -0600 Subject: [PATCH 17/23] [docs] Update taxonomy-update-term.yml capitalization --- .github/ISSUE_TEMPLATE/taxonomy-update-term.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml b/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml index aa4f619dd9..69e2c9bde4 100644 --- a/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml +++ b/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml @@ -1,7 +1,7 @@ name: "Taxonomy - Update Term" description: "Use this template when updating an existing terms in the Service or Benefit taxonomy." -title: "[Update] (Term name) in (taxonomy name)" +title: "[UPDATE] (Term name) in (taxonomy name)" labels: Content, Content governance body: From 82b1d433febb316b4c8451beb41368856497d2bb Mon Sep 17 00:00:00 2001 From: Dave Pickett <51967950+davidmpickett@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:31:47 -0600 Subject: [PATCH 18/23] [docs] Update taxonomy-update-term.yml --- .github/ISSUE_TEMPLATE/taxonomy-update-term.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml b/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml index 69e2c9bde4..ddf05150b7 100644 --- a/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml +++ b/.github/ISSUE_TEMPLATE/taxonomy-update-term.yml @@ -27,8 +27,8 @@ body: - type: textarea id: rationale attributes: - label: Rationale for adding this term - description: Write a short explanation of why this term is needed. Include links to any relevant issues, research findings, etc. + label: Rationale for updating this term + description: Write a short explanation of why this term needs to be updated. Include links to any relevant issues, research findings, etc. validations: required: true - type: dropdown From 5431e550a4eb490897622e7fcd4aecf5d62a87f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:33:54 -0600 Subject: [PATCH 19/23] Bump va-gov/content-build from 0.0.3407 to 0.0.3408 (#16483) Bumps [va-gov/content-build](https://github.com/department-of-veterans-affairs/content-build) from 0.0.3407 to 0.0.3408. - [Release notes](https://github.com/department-of-veterans-affairs/content-build/releases) - [Commits](https://github.com/department-of-veterans-affairs/content-build/compare/v0.0.3407...v0.0.3408) --- updated-dependencies: - dependency-name: va-gov/content-build dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 124eba3b14..96f9ac84f9 100644 --- a/composer.json +++ b/composer.json @@ -221,7 +221,7 @@ "symfony/phpunit-bridge": "^5.1", "symfony/process": "^6.3", "symfony/routing": "^6.3", - "va-gov/content-build": "^0.0.3407", + "va-gov/content-build": "^0.0.3408", "vlucas/phpdotenv": "^5.3", "webflo/drupal-finder": "^1.0.0", "webmozart/path-util": "^2.3", diff --git a/composer.lock b/composer.lock index 89a97e3a30..d4b38f3998 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": "7d0171563d22043d0af8195712a84dba", + "content-hash": "f04196255d00c59b9ff6ae98b9916493", "packages": [ { "name": "asm89/stack-cors", @@ -25950,16 +25950,16 @@ }, { "name": "va-gov/content-build", - "version": "v0.0.3407", + "version": "v0.0.3408", "source": { "type": "git", "url": "https://github.com/department-of-veterans-affairs/content-build.git", - "reference": "32a22486a842d5b2f73fca475bc81fc67f175d0a" + "reference": "2f7853443043121d5a2cd0ac4dbf510b081f48de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/department-of-veterans-affairs/content-build/zipball/32a22486a842d5b2f73fca475bc81fc67f175d0a", - "reference": "32a22486a842d5b2f73fca475bc81fc67f175d0a", + "url": "https://api.github.com/repos/department-of-veterans-affairs/content-build/zipball/2f7853443043121d5a2cd0ac4dbf510b081f48de", + "reference": "2f7853443043121d5a2cd0ac4dbf510b081f48de", "shasum": "" }, "type": "node-project", @@ -25986,9 +25986,9 @@ "description": "Front-end for VA.gov. This repository contains the code that generates the www.va.gov website. It contains a Metalsmith static site builder that uses a Drupal CMS for content. This file is here to publish releases to https://packagist.org/packages/va-gov/content-build, so that the CMS CI system can install it and update it using standard composer processes, and so that we can run tests across both systems. See https://github.com/department-of-veterans-affairs/va.gov-cms for the CMS repo, and stand by for more documentation.", "support": { "issues": "https://github.com/department-of-veterans-affairs/content-build/issues", - "source": "https://github.com/department-of-veterans-affairs/content-build/tree/v0.0.3407" + "source": "https://github.com/department-of-veterans-affairs/content-build/tree/v0.0.3408" }, - "time": "2023-12-13T21:29:35+00:00" + "time": "2023-12-18T18:02:57+00:00" }, { "name": "vlucas/phpdotenv", From 8dd24b183ac0ecc5e4f9c325e16b73ed50bdbf33 Mon Sep 17 00:00:00 2001 From: Alex Finnarn Date: Wed, 20 Dec 2023 15:44:16 -0500 Subject: [PATCH 20/23] add field_last_saved_by_an_editor back to JSON:API responses for certain resources (#16525) --- .../sync/jsonapi_extras.jsonapi_resource_config.node--event.yml | 2 +- ...onapi_extras.jsonapi_resource_config.node--event_listing.yml | 2 +- .../jsonapi_extras.jsonapi_resource_config.node--news_story.yml | 2 +- ...napi_extras.jsonapi_resource_config.node--person_profile.yml | 2 +- ...onapi_extras.jsonapi_resource_config.node--story_listing.yml | 2 +- tests/phpunit/API/JsonApiRequestTest.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/sync/jsonapi_extras.jsonapi_resource_config.node--event.yml b/config/sync/jsonapi_extras.jsonapi_resource_config.node--event.yml index f2e2b18809..2faae141df 100644 --- a/config/sync/jsonapi_extras.jsonapi_resource_config.node--event.yml +++ b/config/sync/jsonapi_extras.jsonapi_resource_config.node--event.yml @@ -243,7 +243,7 @@ resourceFields: enhancer: id: '' field_last_saved_by_an_editor: - disabled: true + disabled: false fieldName: field_last_saved_by_an_editor publicName: field_last_saved_by_an_editor enhancer: diff --git a/config/sync/jsonapi_extras.jsonapi_resource_config.node--event_listing.yml b/config/sync/jsonapi_extras.jsonapi_resource_config.node--event_listing.yml index 531d9a4b83..d9dd6e810d 100644 --- a/config/sync/jsonapi_extras.jsonapi_resource_config.node--event_listing.yml +++ b/config/sync/jsonapi_extras.jsonapi_resource_config.node--event_listing.yml @@ -189,7 +189,7 @@ resourceFields: enhancer: id: '' field_last_saved_by_an_editor: - disabled: true + disabled: false fieldName: field_last_saved_by_an_editor publicName: field_last_saved_by_an_editor enhancer: diff --git a/config/sync/jsonapi_extras.jsonapi_resource_config.node--news_story.yml b/config/sync/jsonapi_extras.jsonapi_resource_config.node--news_story.yml index 52434b307b..2ced31d564 100644 --- a/config/sync/jsonapi_extras.jsonapi_resource_config.node--news_story.yml +++ b/config/sync/jsonapi_extras.jsonapi_resource_config.node--news_story.yml @@ -197,7 +197,7 @@ resourceFields: enhancer: id: '' field_last_saved_by_an_editor: - disabled: true + disabled: false fieldName: field_last_saved_by_an_editor publicName: field_last_saved_by_an_editor enhancer: diff --git a/config/sync/jsonapi_extras.jsonapi_resource_config.node--person_profile.yml b/config/sync/jsonapi_extras.jsonapi_resource_config.node--person_profile.yml index 8169f04917..3b8a076fdc 100644 --- a/config/sync/jsonapi_extras.jsonapi_resource_config.node--person_profile.yml +++ b/config/sync/jsonapi_extras.jsonapi_resource_config.node--person_profile.yml @@ -207,7 +207,7 @@ resourceFields: enhancer: id: '' field_last_saved_by_an_editor: - disabled: true + disabled: false fieldName: field_last_saved_by_an_editor publicName: field_last_saved_by_an_editor enhancer: diff --git a/config/sync/jsonapi_extras.jsonapi_resource_config.node--story_listing.yml b/config/sync/jsonapi_extras.jsonapi_resource_config.node--story_listing.yml index deb281f67b..e48b291e0d 100644 --- a/config/sync/jsonapi_extras.jsonapi_resource_config.node--story_listing.yml +++ b/config/sync/jsonapi_extras.jsonapi_resource_config.node--story_listing.yml @@ -183,7 +183,7 @@ resourceFields: enhancer: id: '' field_last_saved_by_an_editor: - disabled: true + disabled: false fieldName: field_last_saved_by_an_editor publicName: field_last_saved_by_an_editor enhancer: diff --git a/tests/phpunit/API/JsonApiRequestTest.php b/tests/phpunit/API/JsonApiRequestTest.php index f259ee52b8..80c324ba65 100644 --- a/tests/phpunit/API/JsonApiRequestTest.php +++ b/tests/phpunit/API/JsonApiRequestTest.php @@ -21,6 +21,7 @@ public function routeProvider() { ['/jsonapi/node/event'], ['/jsonapi/node/event_listing'], ['/jsonapi/node/news_story'], + ['/jsonapi/node/person_profile'], ['/jsonapi/node/story_listing'], ]; } @@ -48,7 +49,6 @@ public function testJsonApiResponseExcludesFields($route) { 'menu_link', 'content_translation_source', 'content_translation_outdate', - 'field_last_saved_by_an_editor', ]; $user = $this->createUser(); From 23b7fbe9edb9c86c0385d8b4ef5b5489c311aa7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:00:27 -0800 Subject: [PATCH 21/23] Bump drupal/migrate_source_csv from 3.5.0 to 3.6.0 (#16513) Bumps drupal/migrate_source_csv from 3.5.0 to 3.6.0. --- updated-dependencies: - dependency-name: drupal/migrate_source_csv dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn <109987005+edmund-dunn@users.noreply.github.com> --- composer.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index d4b38f3998..5d37de2892 100644 --- a/composer.lock +++ b/composer.lock @@ -9604,17 +9604,17 @@ }, { "name": "drupal/migrate_source_csv", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://git.drupalcode.org/project/migrate_source_csv.git", - "reference": "8.x-3.5" + "reference": "8.x-3.6" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/migrate_source_csv-8.x-3.5.zip", - "reference": "8.x-3.5", - "shasum": "ddddba22fa7b4a54f05a606db33986b23b1a69ea" + "url": "https://ftp.drupal.org/files/projects/migrate_source_csv-8.x-3.6.zip", + "reference": "8.x-3.6", + "shasum": "60b5e7dcb5d7a68ed0a43693fe67e7d26b1a9d83" }, "require": { "drupal/core": ">=9.1", @@ -9627,8 +9627,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "8.x-3.5", - "datestamp": "1645538421", + "version": "8.x-3.6", + "datestamp": "1702995930", "security-coverage": { "status": "covered", "message": "Covered by Drupal's security advisory policy" @@ -18804,16 +18804,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.4", + "version": "1.24.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496" + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6bd0c26f3786cd9b7c359675cb789e35a8e07496", - "reference": "6bd0c26f3786cd9b7c359675cb789e35a8e07496", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", "shasum": "" }, "require": { @@ -18845,9 +18845,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.4" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" }, - "time": "2023-11-26T18:29:22+00:00" + "time": "2023-12-16T09:33:33+00:00" }, { "name": "phpstan/phpstan", From 1d8da151b79b46084d75ea08bac1918f4429dc96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 19:51:23 -0600 Subject: [PATCH 22/23] Bump datadog/dd-trace from 0.95.0 to 0.96.0 (#16533) Bumps [datadog/dd-trace](https://github.com/DataDog/dd-trace-php) from 0.95.0 to 0.96.0. - [Release notes](https://github.com/DataDog/dd-trace-php/releases) - [Commits](https://github.com/DataDog/dd-trace-php/compare/0.95.0...0.96.0) --- updated-dependencies: - dependency-name: datadog/dd-trace dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 96f9ac84f9..0d202a004d 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "composer/installers": "^2.2", "consolidation/site-process": "^5.2", "cweagans/composer-patches": "^1.7", - "datadog/dd-trace": "^0.95.0", + "datadog/dd-trace": "^0.96.0", "dealerdirect/phpcodesniffer-composer-installer": "0.7.2", "drupal/address": "^1.4", "drupal/admin_feedback": "^2.2", diff --git a/composer.lock b/composer.lock index 5d37de2892..67b221ec11 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": "f04196255d00c59b9ff6ae98b9916493", + "content-hash": "cb8fda1d112e05be8fece3fbc7c46e03", "packages": [ { "name": "asm89/stack-cors", @@ -1176,16 +1176,16 @@ }, { "name": "datadog/dd-trace", - "version": "0.95.0", + "version": "0.96.0", "source": { "type": "git", "url": "https://github.com/DataDog/dd-trace-php.git", - "reference": "0e5f4d519e64e42035e0f840a946130fc728a277" + "reference": "96ce8786574a1cc1f0fbcf8570a5b9025cdabca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DataDog/dd-trace-php/zipball/0e5f4d519e64e42035e0f840a946130fc728a277", - "reference": "0e5f4d519e64e42035e0f840a946130fc728a277", + "url": "https://api.github.com/repos/DataDog/dd-trace-php/zipball/96ce8786574a1cc1f0fbcf8570a5b9025cdabca9", + "reference": "96ce8786574a1cc1f0fbcf8570a5b9025cdabca9", "shasum": "" }, "require": { @@ -1274,9 +1274,9 @@ ], "support": { "issues": "https://github.com/DataDog/dd-trace-php/issues", - "source": "https://github.com/DataDog/dd-trace-php/tree/0.95.0" + "source": "https://github.com/DataDog/dd-trace-php/tree/0.96.0" }, - "time": "2023-12-06T19:12:59+00:00" + "time": "2023-12-19T09:26:52+00:00" }, { "name": "davedevelopment/stiphle", From 66e0119cde728e1379dad1939b0ee933c67aab42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:09:11 -0800 Subject: [PATCH 23/23] Bump drupal/entity_reference_hierarchy from 1.0.0-beta3 to 1.0.0-beta4 (#16537) * Bump drupal/entity_reference_hierarchy from 1.0.0-beta3 to 1.0.0-beta4 Bumps drupal/entity_reference_hierarchy from 1.0.0-beta3 to 1.0.0-beta4. --- updated-dependencies: - dependency-name: drupal/entity_reference_hierarchy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * removed uneeded patch * updated composer.lock --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Edmund Dunn --- composer.json | 1 - composer.lock | 22 +++++++++------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 0d202a004d..7c2f500189 100644 --- a/composer.json +++ b/composer.json @@ -415,7 +415,6 @@ "3112577 - Cloning child references to nodes has potential to cause memory resource issues": "https://www.drupal.org/files/issues/2020-02-10/entity_clone-child-node-system-drain-3112577-1.patch" }, "drupal/entity_reference_hierarchy": { - "3346631 - D10 compatbility": "https://www.drupal.org/files/issues/2023-08-17/3346631-entity-referency-hierarchy-d10-compatibility-12.patch", "3219011 - reference fields are shown twice when ERwH is installed": "https://www.drupal.org/files/issues/2023-08-22/3219011-ERwH-removes-preconfigured-fields-06.patch" }, "drupal/entity_reference_revisions": { diff --git a/composer.lock b/composer.lock index 67b221ec11..80e0348a50 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": "cb8fda1d112e05be8fece3fbc7c46e03", + "content-hash": "64e595873f42dc18baa9eeaaa378e1b1", "packages": [ { "name": "asm89/stack-cors", @@ -2249,10 +2249,6 @@ "name": "jsacksick", "homepage": "https://www.drupal.org/user/972218" }, - { - "name": "mglaman", - "homepage": "https://www.drupal.org/user/2416470" - }, { "name": "rszrama", "homepage": "https://www.drupal.org/user/49344" @@ -5448,20 +5444,20 @@ }, { "name": "drupal/entity_reference_hierarchy", - "version": "1.0.0-beta3", + "version": "1.0.0-beta4", "source": { "type": "git", "url": "https://git.drupalcode.org/project/entity_reference_hierarchy.git", - "reference": "1.0.0-beta3" + "reference": "1.0.0-beta4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/entity_reference_hierarchy-1.0.0-beta3.zip", - "reference": "1.0.0-beta3", - "shasum": "a53423e364ee96a94af5328d9dfd4cd358c63f62" + "url": "https://ftp.drupal.org/files/projects/entity_reference_hierarchy-1.0.0-beta4.zip", + "reference": "1.0.0-beta4", + "shasum": "4159c2b83b23ded933a669c3551e39d6819d9084" }, "require": { - "drupal/core": "^9" + "drupal/core": "^9 || ^10" }, "require-dev": { "drupal/entity_reference_hierarchy_revisions": "*", @@ -5477,8 +5473,8 @@ "type": "drupal-module", "extra": { "drupal": { - "version": "1.0.0-beta3", - "datestamp": "1621678352", + "version": "1.0.0-beta4", + "datestamp": "1703062848", "security-coverage": { "status": "not-covered", "message": "Beta releases are not covered by Drupal security advisories."