diff --git a/script/preview.js b/script/preview.js index acd775667b..9597fbf92f 100644 --- a/script/preview.js +++ b/script/preview.js @@ -26,6 +26,9 @@ const createMetalSmithSymlink = require('../src/site/stages/build/plugins/create const { processLovellPages, } = require('../src/site/stages/build/drupal/process-lovell-pages'); +const { + processManilaPages, +} = require('../src/site/stages/build/drupal/process-manila-pages'); const defaultBuildtype = ENVIRONMENTS.LOCALHOST; const defaultHost = HOSTNAMES[defaultBuildtype]; @@ -284,6 +287,8 @@ app.get('/preview', async (req, res, next) => { drupalData.data.nodeQuery = drupalData.data.nodes; processLovellPages(drupalData); + processManilaPages(drupalData); + const pageIndex = req.query?.lovellVariant === 'va' ? 1 : 0; const drupalPage = drupalData.data.nodes.entities[pageIndex]; diff --git a/src/site/stages/build/drupal/metalsmith-drupal.js b/src/site/stages/build/drupal/metalsmith-drupal.js index 3f715f20f8..bc5cee320d 100644 --- a/src/site/stages/build/drupal/metalsmith-drupal.js +++ b/src/site/stages/build/drupal/metalsmith-drupal.js @@ -24,6 +24,7 @@ const { addHubIconField } = require('./benefit-hub'); const { addHomeContent } = require('./home'); const { processLovellPages } = require('./process-lovell-pages'); +const { processManilaPages } = require('./process-manila-pages'); const DRUPAL_CACHE_FILENAME = 'drupal/pages.json'; const DRUPAL_HUB_NAV_FILENAME = 'hubNavNames.json'; @@ -398,6 +399,8 @@ function getDrupalContent(buildOptions) { // Lovell specific data bifurcation processLovellPages(drupalData); + // Manila specific data bifurcation + processManilaPages(drupalData); pipeDrupalPagesIntoMetalsmith(drupalData, files); await createReactPages(files, drupalData); diff --git a/src/site/stages/build/drupal/process-manila-pages.js b/src/site/stages/build/drupal/process-manila-pages.js new file mode 100644 index 0000000000..088b36734a --- /dev/null +++ b/src/site/stages/build/drupal/process-manila-pages.js @@ -0,0 +1,76 @@ +/* eslint-disable no-param-reassign */ +const MANILA_VA_CLINIC_ENTITY_ID = '1187'; + +function getManilaClinicUrl(path) { + return typeof path === 'string' + ? path.replace(/manila-va-system/i, 'manila-va-clinic') + : path; +} + +function isManilaVAClinicPage(page) { + return ( + page?.fieldAdministration?.entity?.entityId === MANILA_VA_CLINIC_ENTITY_ID + ); +} + +function updateManilaSystemLinks(page) { + // Update main URL path + if (page.entityUrl?.path) { + page.entityUrl.path = getManilaClinicUrl(page.entityUrl.path); + } + + // Update breadcrumb links + if (page.entityUrl?.breadcrumb) { + page.entityUrl.breadcrumb = page.entityUrl.breadcrumb.map(crumb => ({ + ...crumb, + url: crumb.url ? getManilaClinicUrl(crumb.url) : crumb.url, + })); + } + + // Update field office links + if (page?.fieldOffice?.entity?.entityUrl) { + page.fieldOffice.entity.entityUrl.path = getManilaClinicUrl( + page.fieldOffice.entity.entityUrl.path, + ); + } + + // Update any listing page links + if (page?.fieldListing?.entity?.entityUrl) { + page.fieldListing.entity.entityUrl.path = getManilaClinicUrl( + page.fieldListing.entity.entityUrl.path, + ); + } + + return page; +} + +function processManilaPages(drupalData) { + const { + manilaVAClinicPages, + otherPages, + } = drupalData.data.nodeQuery.entities.reduce( + (acc, page) => { + if (isManilaVAClinicPage(page)) { + acc.manilaVAClinicPages.push(page); + } else { + acc.otherPages.push(page); + } + + return acc; + }, + { + manilaVAClinicPages: [], + otherPages: [], + }, + ); + + const processedManilaPages = [ + ...manilaVAClinicPages, + ].map((page, _index, _pages) => updateManilaSystemLinks(page)); + + drupalData.data.nodeQuery.entities = [...processedManilaPages, ...otherPages]; +} + +module.exports = { + processManilaPages, +}; diff --git a/src/site/stages/build/drupal/tests/process-manila-pages.unit.spec.js b/src/site/stages/build/drupal/tests/process-manila-pages.unit.spec.js new file mode 100644 index 0000000000..d36ce05d30 --- /dev/null +++ b/src/site/stages/build/drupal/tests/process-manila-pages.unit.spec.js @@ -0,0 +1,88 @@ +/* eslint-disable @department-of-veterans-affairs/axe-check-required */ +const { expect } = require('chai'); +const { processManilaPages } = require('../process-manila-pages'); + +describe('processManilaPages', () => { + it('should process Manila VA Clinic pages and update links', () => { + const mockDrupalData = { + data: { + nodeQuery: { + entities: [ + { + fieldAdministration: { + entity: { + entityId: '1187', + }, + }, + entityUrl: { + path: '/manila-va-system/test', + breadcrumb: [ + { url: '/manila-va-system' }, + { url: '/manila-va-system/test' }, + ], + }, + fieldOffice: { + entity: { + entityUrl: { + path: '/manila-va-system/office', + }, + }, + }, + fieldListing: { + entity: { + entityUrl: { + path: '/manila-va-system/listing', + }, + }, + }, + }, + { + fieldAdministration: { + entity: { + entityId: '999', + }, + }, + entityUrl: { + path: '/other-path', + }, + }, + ], + }, + }, + }; + + processManilaPages(mockDrupalData); + + const processedEntities = mockDrupalData.data.nodeQuery.entities; + const manilaPage = processedEntities[0]; + const otherPage = processedEntities[1]; + + expect(manilaPage.entityUrl.path).to.equal('/manila-va-clinic/test'); + expect(manilaPage.entityUrl.breadcrumb[0].url).to.equal( + '/manila-va-clinic', + ); + expect(manilaPage.entityUrl.breadcrumb[1].url).to.equal( + '/manila-va-clinic/test', + ); + expect(manilaPage.fieldOffice.entity.entityUrl.path).to.equal( + '/manila-va-clinic/office', + ); + expect(manilaPage.fieldListing.entity.entityUrl.path).to.equal( + '/manila-va-clinic/listing', + ); + expect(otherPage.entityUrl.path).to.equal('/other-path'); + }); + + it('should handle empty data gracefully', () => { + const emptyDrupalData = { + data: { + nodeQuery: { + entities: [], + }, + }, + }; + + processManilaPages(emptyDrupalData); + expect(emptyDrupalData.data.nodeQuery.entities).to.deep.equal([]); + }); +});