diff --git a/src/applications/check-in/locales/en/translation.json b/src/applications/check-in/locales/en/translation.json index 9d81da944815..28cf0adbcc29 100644 --- a/src/applications/check-in/locales/en/translation.json +++ b/src/applications/check-in/locales/en/translation.json @@ -365,10 +365,7 @@ "sign-in-to-find-appointment": "Sign in to VA.gov to find your appointment", "phone-appointment": "Phone appointment", "phone-error-help-text": "Your provider will call you at the appointment time. You may need to wait 15 minutes for their call.", - "pre-check-in-no-longer-available": "Pre-check-in is no longer available for your appointment time.", "something-went-wrong-please-try-again": "Something went wrong on our end. Please try again.", - "if-you-have-questions-call": "If you have questions about your appointments, call your VA health facility.", - "something-went-wrong": "Something went wrong. If you have questions about your appointments, call your VA health facility.", "clinic-phone": "Clinic phone", "need-to-make-changes": "Need to make changes?", "contact-this-facility": "Contact this facility if you need to reschedule or cancel your appointment.", @@ -384,12 +381,9 @@ "review-your-information-now": "Review your information now", "your-information-is-up-to-date": "Your information is up to date", "day-of-week-month-day-time": "{{ date, day }}, {{ date, monthDay }}, {{ date, time }}", - "in-person-appointments": "In-person appointments", "phone-appointments": "Phone appointments", "check-in-now-for-your-date-time-appointment": "Check in now for appointment on {{ date, day }}, {{ date, monthDay }} at {{ date, time }}", "details-for-appointment-on-date-at-time": "Details for {{ type }} appointment on {{ dateTime, date }} at {{ dateTime, time }}", - "appointment-on-date-at-time": "Appointment on {{dateTime, date}} at {{ dateTime, time}}", - "submit-claim": "Submit claim", "review-body-text-unified": "You can submit your claim now or choose to file later. Either way, you can still complete the check-in process.", "we-cant-find-any-upcoming-appointments": "We can’t find any upcoming VA medical appointments for you", "canceled": "Canceled", @@ -399,7 +393,6 @@ "video": "Video", "we-cant-access-appointments": "We can’t access your appointments right now", "were-sorry-theres-a-problem-with-system": "We’re sorry. There’s a problem with our system.", - "when-time-to-check-in-for-appointment-well-send-another-text": "When it’s time to check in for your appointment, we’ll send you another text.", "what-if-cant-find-appointments-in-list": "What if I can’t find my appointments in this list?", "youve-successfully-reviewed-your-contact-information": "You’ve successfully reviewed your contact information", "todays-appointments-at-this-facility": "Today’s appointments at this facility", @@ -430,7 +423,6 @@ "review-todays-appointments": "Review today’s appointments", "were-sorry-weve-run-into-a-problem": "We’re sorry. We’ve run into a problem.", "were-having-trouble-getting-your-upcoming-appointments": "We’re having trouble getting your upcoming appointments. Please try again later.", - "to-file-another-claim-for-different-date": "To file another claim for a different date, you can visit the Beneficiary Travel Self-Service System (BTSSS). You must file within 30 days of the appointment.", "find-a-full-list-of-things-to-bring": "Find a full list of things to bring to your appointment", "find-out-how-to-check-in-opens-in-new-tab": "Find out how to check in (opens in new tab)", "we-cant-show-all-information": "We can’t show all your information right now", diff --git a/src/applications/discharge-wizard/components/v2/RequestDD214.jsx b/src/applications/discharge-wizard/components/v2/RequestDD214.jsx index 6de8886e945c..8383fa0ee238 100644 --- a/src/applications/discharge-wizard/components/v2/RequestDD214.jsx +++ b/src/applications/discharge-wizard/components/v2/RequestDD214.jsx @@ -6,6 +6,7 @@ import { determineBoardObj, determineVenueAddress, determineBranchOfService, + determineBoardName, } from '../../helpers'; import { SHORT_NAME_MAP } from '../../constants/question-data-map'; import { pageSetup } from '../../utilities/page-setup'; @@ -93,14 +94,14 @@ const RequestDD214v2 = ({ router, formResponses, viewedIntroPage }) => { There are a number of different boards that handle discharge upgrades and corrections. Because you want a new DD214, which is seen as a correction of your military record, you’ll need to apply - to the {abbr} for the {branchOfService}. + to the {determineBoardName(formResponses.SERVICE_BRANCH)}.

-

At this time, there isn’t a way to submit this form online.

Mail your completed form and all supporting documents to the{' '} {abbr} at:

{determineVenueAddress(formResponses, true)}

+

At this time, there isn’t a way to submit this form online.

{ + if (option === PREV_APPLICATION_DADT) { + return formResponses.REASON === RESPONSES.REASON_DD215_UPDATE_TO_DD214; + } if ( [RESPONSES.NAVY, RESPONSES.MARINE_CORPS].includes( formResponses.SERVICE_BRANCH, diff --git a/src/applications/discharge-wizard/components/v2/resultsComponents/StepThree.jsx b/src/applications/discharge-wizard/components/v2/resultsComponents/StepThree.jsx index 6bbf3c98056e..c1506175e6ac 100644 --- a/src/applications/discharge-wizard/components/v2/resultsComponents/StepThree.jsx +++ b/src/applications/discharge-wizard/components/v2/resultsComponents/StepThree.jsx @@ -7,16 +7,16 @@ import { } from '../../../constants/question-data-map'; import { BCNR, BCMR, DRB, AFDRB } from '../../../constants'; import { + determineBoardName, determineBoardObj, determineVenueAddress, - getBoardExplanation, isPreviousApplicationYear, } from '../../../helpers'; const StepThree = ({ formResponses }) => { let onlineSubmissionMsg; const boardToSubmit = determineBoardObj(formResponses); - const boardExplanation = getBoardExplanation(formResponses); + const boardName = determineBoardName(formResponses.SERVICE_BRANCH); if ( boardToSubmit.abbr === DRB && @@ -54,10 +54,19 @@ const StepThree = ({ formResponses }) => { return ( + {formResponses.SERVICE_BRANCH === RESPONSES.AIR_FORCE ? ( +

+ Based on your answers, you need to complete an Application for + Correction of Military Record (DD 149). You can download this form + from the Air Force Review Boards Agency Website and Portal. +

+ ) : ( + '' + )}

There are a number of different boards that handle discharge upgrades and corrections. Based on your answers on the previous page, you need to - apply to {boardExplanation} + apply to the {boardName}.

{boardToSubmit.abbr === AFDRB ? ( <> diff --git a/src/applications/discharge-wizard/constants/question-data-map.js b/src/applications/discharge-wizard/constants/question-data-map.js index c2d54852b36e..c5936fa836c6 100644 --- a/src/applications/discharge-wizard/constants/question-data-map.js +++ b/src/applications/discharge-wizard/constants/question-data-map.js @@ -10,7 +10,8 @@ export const QUESTION_MAP = Object.freeze({ COURT_MARTIAL: 'Was your discharge the outcome of a general court-martial?', PREV_APPLICATION: 'Have you previously applied for and been denied a discharge upgrade for this period of service?', - PREV_APPLICATION_TYPE: 'How did you apply for a discharge upgrade last time?', + PREV_APPLICATION_TYPE: + 'How did you previously apply for a discharge upgrade?', PREV_APPLICATION_YEAR: 'What year did you apply for a discharge upgrade?', PRIOR_SERVICE: 'Did you complete a period of service in which your character of service was Honorable or General Under Honorable Conditions?', @@ -75,6 +76,8 @@ export const RESPONSES = Object.freeze({ 'I applied to a Board for Correction of Military Records (BCMR).', PREV_APPLICATION_BCNR: 'I applied to the Board for Correction of Naval Records (BCNR).', + PREV_APPLICATION_DADT: + 'I haven’t previously applied for a discharge upgrade, but I received an upgrade from the Defense Department (DOD) due to the Don’t Ask, Don’t Tell policy.', YES: 'Yes', NO: 'No', PREV_APPLICATION_BEFORE_2014: '2014 or earlier', diff --git a/src/applications/discharge-wizard/helpers/index.jsx b/src/applications/discharge-wizard/helpers/index.jsx index dbf4b8841a4a..c3e9b541c469 100644 --- a/src/applications/discharge-wizard/helpers/index.jsx +++ b/src/applications/discharge-wizard/helpers/index.jsx @@ -797,3 +797,25 @@ export const renderMedicalRecordInfo = formResponses => { } return null; }; + +export const determineBoardName = branch => { + let boardName; + + switch (branch) { + case RESPONSES.AIR_FORCE: + boardName = 'Air Force Board for Correction of Military Records'; + break; + case RESPONSES.ARMY: + case RESPONSES.COAST_GUARD: + boardName = 'Board for Correction of Military Records (BCMR)'; + break; + case RESPONSES.NAVY: + case RESPONSES.MARINE_CORPS: + boardName = 'Board for Correction of Naval Records (BCNR)'; + break; + default: + boardName = ''; + break; + } + return boardName; +}; diff --git a/src/applications/edu-benefits/10282/containers/ConfirmationPage.jsx b/src/applications/edu-benefits/10282/containers/ConfirmationPage.jsx index 4718bc3bb279..11ec36e5074e 100644 --- a/src/applications/edu-benefits/10282/containers/ConfirmationPage.jsx +++ b/src/applications/edu-benefits/10282/containers/ConfirmationPage.jsx @@ -56,10 +56,7 @@ export class ConfirmationPage extends React.Component {

Confirmation for your records
- - You can print this confirmation page for your records. You can - also download your completed application as a PDF. - + You can print this confirmation page for your records.

{/* eslint-disable-next-line @department-of-veterans-affairs/prefer-button-component */} -

What to expect next

If you're accepted into the SkillsBuild program, you'll receive an email from sbuser@us.ibm.com{' '} - with your login informatia. If you don't receive an email, check + with your login information. If you don't receive an email, check your spam folder.

diff --git a/src/applications/edu-benefits/10282/containers/IntroductionPage.jsx b/src/applications/edu-benefits/10282/containers/IntroductionPage.jsx index 3fd8bea7ff62..27a7c16c1bfa 100644 --- a/src/applications/edu-benefits/10282/containers/IntroductionPage.jsx +++ b/src/applications/edu-benefits/10282/containers/IntroductionPage.jsx @@ -39,8 +39,7 @@ const IntroductionPage = ({ router }) => {

  • After you submit your form, you can print the confirmation page for - your records. You can also download a copy of your completed form as a - PDF. + your records.
  • After we review your form, we’ll email you a decision. If we need more diff --git a/src/applications/edu-benefits/10282/pages/applicantInformation/applicantGender.js b/src/applications/edu-benefits/10282/pages/applicantInformation/applicantGender.js index b20a6f392675..057677b35823 100644 --- a/src/applications/edu-benefits/10282/pages/applicantInformation/applicantGender.js +++ b/src/applications/edu-benefits/10282/pages/applicantInformation/applicantGender.js @@ -29,7 +29,7 @@ export const genderInfoHelpText = (
  • Sharing your gender identity in your VA.gov profile is optional. If you get healthcare at VA, this information can help your care team - better better assess your health needs and risks. + better assess your health needs and risks.
  • But you should know that any information you share in your VA.gov diff --git a/src/applications/gi/components/profile/InstitutionProfile.jsx b/src/applications/gi/components/profile/InstitutionProfile.jsx index 754f2de84fa8..25f1488e5a2d 100644 --- a/src/applications/gi/components/profile/InstitutionProfile.jsx +++ b/src/applications/gi/components/profile/InstitutionProfile.jsx @@ -141,6 +141,13 @@ export default function InstitutionProfile({ jumpToId="calculate-your-benefits" /> )} + {institution.yr === true && + toggleValue && ( + + )} - {institution.yr === true && - toggleValue && ( - - )}
  • {showSchoolContentBasedOnType(type) && @@ -214,7 +214,7 @@ export default function InstitutionProfile({ of higher learning (IHL). Schools that choose to participate in the Yellow Ribbon program will contribute up to a certain dollar amount toward the extra tuition. VA will match the participating - school’s contribution{' '} + school’s contribution {type === 'FOREIGN' && `${` `}in United States Dollars (USD)`}, up to the total cost of the tuition and fees. To confirm the number of students eligible for funding, contact the individual school. diff --git a/src/applications/gi/sass/gi.scss b/src/applications/gi/sass/gi.scss index f0e58ab909cd..be45135bf02a 100644 --- a/src/applications/gi/sass/gi.scss +++ b/src/applications/gi/sass/gi.scss @@ -429,6 +429,7 @@ height: auto; display: flex; width: 100%; + max-width: 305px; .degree-level-card { flex: 1; width: 100%; @@ -441,6 +442,10 @@ @media screen and (max-width: $medium-screen) { .degree-level-results { flex-direction: column; + .degree-item { + width: 100%; + max-width: 100%; + } } } } diff --git a/src/applications/ivc-champva/10-10D/containers/App.jsx b/src/applications/ivc-champva/10-10D/containers/App.jsx index 96ec29764ea7..03938e5265f2 100644 --- a/src/applications/ivc-champva/10-10D/containers/App.jsx +++ b/src/applications/ivc-champva/10-10D/containers/App.jsx @@ -25,6 +25,10 @@ const breadcrumbList = [ href: `/family-and-caregiver-benefits/health-and-disability/champva`, label: `CHAMPVA benefits`, }, + { + href: `#content`, + label: `Apply for CHAMPVA benefits`, + }, ]; export default function App({ location, children }) { diff --git a/src/applications/representative-appoint/components/ProfileNotUpdatedNote.jsx b/src/applications/representative-appoint/components/ProfileNotUpdatedNote.jsx index 3440b61c783e..92d413892d85 100644 --- a/src/applications/representative-appoint/components/ProfileNotUpdatedNote.jsx +++ b/src/applications/representative-appoint/components/ProfileNotUpdatedNote.jsx @@ -5,16 +5,17 @@ import PropTypes from 'prop-types'; import { CONTACTS } from '@department-of-veterans-affairs/component-library/contacts'; import { isLoggedIn } from 'platform/user/selectors'; +import { preparerIsVeteran } from '../utilities/helpers'; function ProfileNotUpdatedNote(props) { const { + formData, includeLink, includePhone, includePrefix, loggedIn, - preparerIsVeteran, } = props; - const isLoggedInVeteran = loggedIn && preparerIsVeteran; + const isLoggedInVeteran = loggedIn && preparerIsVeteran({ formData }); return ( <> @@ -52,16 +53,17 @@ function ProfileNotUpdatedNote(props) { } ProfileNotUpdatedNote.propTypes = { + formData: PropTypes.object, includeLink: PropTypes.bool, includePhone: PropTypes.bool, includePrefix: PropTypes.bool, loggedIn: PropTypes.bool, - preparerIsVeteran: PropTypes.bool, }; function mapStateToProps(state) { return { loggedIn: isLoggedIn(state), + formData: state.form.data, }; } diff --git a/src/applications/representative-appoint/pages/veteran/veteranContactMailing.js b/src/applications/representative-appoint/pages/veteran/veteranContactMailing.js index c355f5e6dd76..6d9424f3d280 100644 --- a/src/applications/representative-appoint/pages/veteran/veteranContactMailing.js +++ b/src/applications/representative-appoint/pages/veteran/veteranContactMailing.js @@ -7,7 +7,6 @@ import { titleSchema, } from 'platform/forms-system/src/js/web-component-patterns'; import ProfileNotUpdatedNote from '../../components/ProfileNotUpdatedNote'; -import { preparerIsVeteran } from '../../utilities/helpers'; export const uiSchema = { ...titleUI( @@ -15,13 +14,7 @@ export const uiSchema = { 'We’ll send any important information about your form to this address.', ), profileNotUpdatedNote: { - 'ui:description': formData => ( - - ), + 'ui:description': () => , }, veteranHomeAddress: addressUI({ labels: { diff --git a/src/applications/representative-appoint/pages/veteran/veteranContactPhoneEmail.js b/src/applications/representative-appoint/pages/veteran/veteranContactPhoneEmail.js index 955e7e06f1a9..7e21e4bf00ee 100644 --- a/src/applications/representative-appoint/pages/veteran/veteranContactPhoneEmail.js +++ b/src/applications/representative-appoint/pages/veteran/veteranContactPhoneEmail.js @@ -10,17 +10,12 @@ import { } from 'platform/forms-system/src/js/web-component-patterns'; import ProfileNotUpdatedNote from '../../components/ProfileNotUpdatedNote'; -import { preparerIsVeteran } from '../../utilities/helpers'; +// import { preparerIsVeteran } from '../../utilities/helpers'; export const uiSchema = { ...titleUI(() => 'Your phone number and email address'), profileNotUpdatedNote: { - 'ui:description': formData => ( - - ), + 'ui:description': () => , }, 'Primary phone': phoneUI({ required: true, diff --git a/src/applications/representative-appoint/pages/veteran/veteranIdentification.js b/src/applications/representative-appoint/pages/veteran/veteranIdentification.js index 51e05305b276..0ec6fb67fabc 100644 --- a/src/applications/representative-appoint/pages/veteran/veteranIdentification.js +++ b/src/applications/representative-appoint/pages/veteran/veteranIdentification.js @@ -32,12 +32,8 @@ export const uiSchema = { } Social Security and VA file numbers are the same. `, ), profileNotUpdatedNote: { - 'ui:description': formData => ( - + 'ui:description': () => ( + ), }, veteranSocialSecurityNumber: ssnUI('Social Security number'), diff --git a/src/applications/representative-appoint/pages/veteran/veteranPersonalInformation.js b/src/applications/representative-appoint/pages/veteran/veteranPersonalInformation.js index e159846f1f3e..e5b58e261106 100644 --- a/src/applications/representative-appoint/pages/veteran/veteranPersonalInformation.js +++ b/src/applications/representative-appoint/pages/veteran/veteranPersonalInformation.js @@ -24,12 +24,7 @@ export const uiSchema = { } name and date of birth`, ), profileNotUpdatedNote: { - 'ui:description': formData => ( - - ), + 'ui:description': () => , }, veteranFullName: fullNameMiddleInitialUI, veteranDateOfBirth: dateOfBirthUI(), diff --git a/src/applications/representative-appoint/pages/veteran/veteranServiceInformation.js b/src/applications/representative-appoint/pages/veteran/veteranServiceInformation.js index cb2800861a55..04763f9251fe 100644 --- a/src/applications/representative-appoint/pages/veteran/veteranServiceInformation.js +++ b/src/applications/representative-appoint/pages/veteran/veteranServiceInformation.js @@ -18,12 +18,7 @@ export const uiSchema = { } service information`, ), profileNotUpdatedNote: { - 'ui:description': formData => ( - - ), + 'ui:description': () => , }, 'Branch of Service': radioUI('Branch of service'), }; diff --git a/src/applications/representative-appoint/tests/pages/claimant/claimantContactPhoneEmail.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/claimant/claimantContactPhoneEmail.unit.spec.jsx index c843e02ef7b1..1660ef25077f 100644 --- a/src/applications/representative-appoint/tests/pages/claimant/claimantContactPhoneEmail.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/claimant/claimantContactPhoneEmail.unit.spec.jsx @@ -16,6 +16,7 @@ describe('Claimant Contact Phone Email page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); it('should render', () => { diff --git a/src/applications/representative-appoint/tests/pages/claimant/claimantPersonalInformation.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/claimant/claimantPersonalInformation.unit.spec.jsx index eeb84dbde0cd..b667065ec066 100644 --- a/src/applications/representative-appoint/tests/pages/claimant/claimantPersonalInformation.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/claimant/claimantPersonalInformation.unit.spec.jsx @@ -18,6 +18,7 @@ describe('Claimant Personal Information page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); // Custom page is rendered, so this only renders a submit button diff --git a/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmail.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmail.unit.spec.jsx index 96f0798cd02d..87ca3b87d522 100644 --- a/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmail.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmail.unit.spec.jsx @@ -16,6 +16,7 @@ describe('Veteran Contact Phone Email page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); it('should render', () => { diff --git a/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmailClaimant.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmailClaimant.unit.spec.jsx index 0aa29a923dcd..0376443b697d 100644 --- a/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmailClaimant.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/veteran/veteranContactPhoneEmailClaimant.unit.spec.jsx @@ -16,6 +16,7 @@ describe('Veteran Contact Phone Email Claimant page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); it('should render', () => { diff --git a/src/applications/representative-appoint/tests/pages/veteran/veteranIdentification.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/veteran/veteranIdentification.unit.spec.jsx index 4b76186b3051..432684bdd875 100644 --- a/src/applications/representative-appoint/tests/pages/veteran/veteranIdentification.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/veteran/veteranIdentification.unit.spec.jsx @@ -16,6 +16,7 @@ describe('Veteran Identification page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); it('should render', () => { diff --git a/src/applications/representative-appoint/tests/pages/veteran/veteranPersonalInformation.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/veteran/veteranPersonalInformation.unit.spec.jsx index 91f5b0adc99e..3dd0ee5647f2 100644 --- a/src/applications/representative-appoint/tests/pages/veteran/veteranPersonalInformation.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/veteran/veteranPersonalInformation.unit.spec.jsx @@ -16,6 +16,7 @@ describe('Veteran Personal Information page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); it('should render', () => { diff --git a/src/applications/representative-appoint/tests/pages/veteran/veteranServiceInformation.unit.spec.jsx b/src/applications/representative-appoint/tests/pages/veteran/veteranServiceInformation.unit.spec.jsx index f13afe37281e..40c3f8219ac2 100644 --- a/src/applications/representative-appoint/tests/pages/veteran/veteranServiceInformation.unit.spec.jsx +++ b/src/applications/representative-appoint/tests/pages/veteran/veteranServiceInformation.unit.spec.jsx @@ -16,6 +16,7 @@ describe('Veteran Service Information page', () => { const mockStore = configureStore(); const store = mockStore({ user: { login: { currentlyLoggedIn: true } }, + form: { data: {} }, }); it('should render', () => { diff --git a/src/applications/simple-forms/form-upload/components/CustomReviewTopContent.jsx b/src/applications/simple-forms/form-upload/components/CustomReviewTopContent.jsx index 2bcbbdace781..bbac40ed232a 100644 --- a/src/applications/simple-forms/form-upload/components/CustomReviewTopContent.jsx +++ b/src/applications/simple-forms/form-upload/components/CustomReviewTopContent.jsx @@ -25,25 +25,32 @@ const CustomReviewTopContent = () => { } = form?.data; const renderFileInfo = file => ( - -
    - - -
    - {file.name} - - {getFileSize(file.size)} +
    + +
    + + +
    + + {file.name} + + + {getFileSize(file.size)} + +
    -
    - + +
    ); const renderPersonalInfo = () => ( diff --git a/src/applications/vaos/covid-19-vaccine/flow.js b/src/applications/vaos/covid-19-vaccine/flow.js index 6fb7f36cbd1e..ac508035704f 100644 --- a/src/applications/vaos/covid-19-vaccine/flow.js +++ b/src/applications/vaos/covid-19-vaccine/flow.js @@ -147,11 +147,11 @@ export function routeToNextAppointmentPage(history, current, data) { } /* Function to get label from the flow - * The URL displayed in the browser address bar is compared to the + * The URL displayed in the browser address bar is compared to the * flow URL * * @export - * @param {object} state + * @param {object} state * @param {string} location - the pathname * @returns {string} the label string */ diff --git a/src/applications/vaos/covid-19-vaccine/redux/actions.js b/src/applications/vaos/covid-19-vaccine/redux/actions.js index b02caa8a9de4..598b062abd15 100644 --- a/src/applications/vaos/covid-19-vaccine/redux/actions.js +++ b/src/applications/vaos/covid-19-vaccine/redux/actions.js @@ -39,7 +39,7 @@ import { STARTED_NEW_APPOINTMENT_FLOW, } from '../../redux/sitewide'; import { createAppointment } from '../../services/appointment'; -import { transformFormToVAOSAppointment } from './helpers/formSubmitTransformers.v2'; +import { transformFormToVAOSAppointment } from './helpers/formSubmitTransformers'; export const FORM_PAGE_OPENED = 'covid19Vaccine/FORM_PAGE_OPENED'; export const FORM_DATA_UPDATED = 'covid19Vaccine/FORM_DATA_UPDATED'; diff --git a/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.js b/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.js index b7630af5b15b..7e93bd69b3b5 100644 --- a/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.js +++ b/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.js @@ -1,45 +1,23 @@ -import moment from 'moment'; import { getChosenClinicInfo, getChosenSlot, selectCovid19VaccineFormData, } from '../selectors'; -import { getClinicId, getSiteCode } from '../../../services/healthcare-service'; +import { getClinicId } from '../../../services/healthcare-service'; -export function transformFormToAppointment(state) { - const clinic = getChosenClinicInfo(state); +export function transformFormToVAOSAppointment(state) { const data = selectCovid19VaccineFormData(state); - + const clinic = getChosenClinicInfo(state); const slot = getChosenSlot(state); - const appointmentLength = moment(slot.end).diff(slot.start, 'minutes'); + return { - appointmentType: 'Vaccine', - clinic: { - siteCode: getSiteCode(clinic), - clinicId: getClinicId(clinic), - clinicName: clinic.serviceName, - clinicFriendlyLocationName: clinic.serviceName, - institutionName: clinic.stationName, - institutionCode: clinic.stationId, + kind: 'clinic', + status: 'booked', + clinic: getClinicId(clinic), + slot: { id: slot.id }, + extension: { + desiredDate: slot.start, }, - - // These times are a lie, they're actually in local time, but the upstream - // service expects the 0 offset. - desiredDate: `${moment(slot.start).format('YYYY-MM-DD')}T00:00:00+00:00`, - dateTime: `${slot.start}+00:00`, - duration: appointmentLength, - bookingNotes: '', - preferredEmail: data.email, - // defaulted values - apptType: 'P', - purpose: '9', - lvl: '1', - ekg: '', - lab: '', - xRay: '', - schedulingRequestType: 'NEXT_AVAILABLE_APPT', - type: 'REGULAR', - appointmentKind: 'TRADITIONAL', - schedulingMethod: 'direct', + locationId: data.vaFacility, }; } diff --git a/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.v2.js b/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.v2.js deleted file mode 100644 index 7e93bd69b3b5..000000000000 --- a/src/applications/vaos/covid-19-vaccine/redux/helpers/formSubmitTransformers.v2.js +++ /dev/null @@ -1,23 +0,0 @@ -import { - getChosenClinicInfo, - getChosenSlot, - selectCovid19VaccineFormData, -} from '../selectors'; -import { getClinicId } from '../../../services/healthcare-service'; - -export function transformFormToVAOSAppointment(state) { - const data = selectCovid19VaccineFormData(state); - const clinic = getChosenClinicInfo(state); - const slot = getChosenSlot(state); - - return { - kind: 'clinic', - status: 'booked', - clinic: getClinicId(clinic), - slot: { id: slot.id }, - extension: { - desiredDate: slot.start, - }, - locationId: data.vaFacility, - }; -} diff --git a/src/applications/vaos/new-appointment/components/ReviewPage/AppointmentDate.jsx b/src/applications/vaos/new-appointment/components/ReviewPage/AppointmentDate.jsx index c5a40a62fcba..800f9a198b85 100644 --- a/src/applications/vaos/new-appointment/components/ReviewPage/AppointmentDate.jsx +++ b/src/applications/vaos/new-appointment/components/ReviewPage/AppointmentDate.jsx @@ -11,9 +11,38 @@ export default function AppointmentDate({ dates, facilityId, level = 3, + directSchedule = false, }) { const Heading = `h${level}`; const timezone = getTimezoneByFacilityId(facilityId); + const timezoneAbbr = getTimezoneAbbrByFacilityId(facilityId); + + if (directSchedule) { + return ( + <> + + Date and time + + {dates?.map(selected => { + const dateTime = + selected.endsWith('Z') && timezone + ? moment(selected).tz(timezone) + : moment(selected, 'YYYY-MM-DDTHH:mm:ssZ'); + return ( + <> + {dateTime.format('dddd, MMMM D, YYYY')} +
    + + {dateTime.format('h:mm a')} {timezoneAbbr} + + + ); + })} + + ); + } if (dates[0].endsWith('Z') && timezone) { return dates?.map((selected, i) => ( @@ -38,5 +67,6 @@ AppointmentDate.propTypes = { dates: PropTypes.array.isRequired, facilityId: PropTypes.string.isRequired, classes: PropTypes.string, + directSchedule: PropTypes.bool, level: PropTypes.oneOf([PropTypes.string, PropTypes.number]), }; diff --git a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ContactDetailSection.jsx b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ContactDetailSection.jsx index 6d6a1a6fbd7f..8d8d9c7ecd2c 100644 --- a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ContactDetailSection.jsx +++ b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ContactDetailSection.jsx @@ -4,11 +4,11 @@ import PropTypes from 'prop-types'; import { useHistory } from 'react-router-dom'; import { useSelector } from 'react-redux'; -import { FACILITY_TYPES, FLOW_TYPES } from '../../../../utils/constants'; -import { getFlowType, getFormData } from '../../../redux/selectors'; +import { FACILITY_TYPES } from '../../../../utils/constants'; +import { getFormData } from '../../../redux/selectors'; import getNewAppointmentFlow from '../../../newAppointmentFlow'; -function formatBestTimetoCall(bestTime) { +function formatBestTimeToCall(bestTime) { const times = []; let output = ''; if (bestTime?.morning) { @@ -24,7 +24,7 @@ function formatBestTimetoCall(bestTime) { } if (times.length === 1) { - output = times[0]; + [output] = times; } else if (times.length === 2) { output = `${times[0]} or ${times[1]}`; } else { @@ -48,66 +48,8 @@ function handleClick(history, home, contactInfo) { }; } -function getContent({ data, flowType, formData }) { - if (FLOW_TYPES.DIRECT === flowType) - return ( - <> -

    Your contact details

    - - {data.email} -
    - - {formData.facilityType === FACILITY_TYPES.COMMUNITY_CARE && - flowType === FLOW_TYPES.REQUEST && ( - <> -
    - {/* The following line tag is for italics not an icon */} - {/* eslint-disable-next-line @department-of-veterans-affairs/prefer-icon-component */} - Call {formatBestTimetoCall(data.bestTimeToCall)} - - )} -
    - - ); - - return ( - <> -

    - Your contact information -

    - - Email: - {data.email} -
    - Phone number: - - {formData.facilityType === FACILITY_TYPES.COMMUNITY_CARE && ( - <> -
    - Best time to call: - {/* The following line tag is for italics not an icon */} - {/* eslint-disable-next-line @department-of-veterans-affairs/prefer-icon-component */} - Call {formatBestTimetoCall(data.bestTimeToCall)} - - )} -
    - - ); -} - export default function ContactDetailSection({ data }) { const formData = useSelector(getFormData); - const flowType = useSelector(getFlowType); const history = useHistory(); const { home, contactInfo } = useSelector(getNewAppointmentFlow); @@ -119,7 +61,30 @@ export default function ContactDetailSection({ data }) { className="vads-u-flex--1 vads-u-padding-right--1" data-dd-privacy="mask" > - {getContent({ data, flowType, formData })} +

    + Your contact information +

    + + Email: + {data.email} +
    + Phone number: + + {formData.facilityType === FACILITY_TYPES.COMMUNITY_CARE && ( + <> +
    + Best time to call: + {/* The following line tag is for italics not an icon */} + {/* eslint-disable-next-line @department-of-veterans-affairs/prefer-icon-component */} + Call {formatBestTimeToCall(data.bestTimeToCall)} + + )} +
    { @@ -27,41 +26,29 @@ export default function ReasonForAppointmentSection({ data }) { const { home, reasonForAppointment: reason } = useSelector( getNewAppointmentFlow, ); - const flowType = useSelector(getFlowType); return ( <>
    - {FLOW_TYPES.DIRECT === flowType && ( -

    - {PURPOSE_TEXT_V2.find( - purpose => purpose.id === reasonForAppointment, - )?.short || 'Additional details'} -

    - )} - {FLOW_TYPES.REQUEST === flowType && ( +

    + Details you’d like to share with your provider +

    + {reasonForAppointment && ( <> -

    - Details you’d like to share with your provider -

    - {reasonForAppointment && ( - <> - - { - PURPOSE_TEXT_V2.find( - purpose => purpose.id === reasonForAppointment, - )?.short - } - -
    - - )} - {!reasonForAppointment && - !reasonAdditionalInfo && No details shared} + + { + PURPOSE_TEXT_V2.find( + purpose => purpose.id === reasonForAppointment, + )?.short + } + +
    )} + {!reasonForAppointment && + !reasonAdditionalInfo && No details shared} - {isDirectSchedule && ( - <> -

    - You're scheduling {isVowel ? 'an' : 'a'} {description} appointment -

    -

    - Make sure the information is correct. Then confirm your appointment. - If you need to update any details, click Edit to go back to the - screen where you entered the information. After you update your - information, you'll need to go through the tool again to schedule - your appointment. -

    - - )} - - ); -} -Description.propTypes = { - data: PropTypes.object, - flowType: PropTypes.string, -}; diff --git a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ReviewDirectScheduleInfo/ReviewDirectScheduleInfo.jsx b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ReviewDirectScheduleInfo/ReviewDirectScheduleInfo.jsx index 2c82f028474c..de1da4ca24c7 100644 --- a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ReviewDirectScheduleInfo/ReviewDirectScheduleInfo.jsx +++ b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/ReviewDirectScheduleInfo/ReviewDirectScheduleInfo.jsx @@ -1,12 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FLOW_TYPES } from '../../../../../utils/constants'; import ReasonForAppointmentSection from '../ReasonForAppointmentSection'; import ContactDetailSection from '../ContactDetailSection'; import AppointmentDate from '../../AppointmentDate'; -import Description from './Description'; import TypeOfAppointmentSection from '../TypeOfAppointmentSection'; -import State from '../../../../../components/State'; +import FacilitySection from '../VAAppointmentSection/FacilitySection'; export default function ReviewDirectScheduleInfo({ data, @@ -17,19 +15,16 @@ export default function ReviewDirectScheduleInfo({ return (

    {pageTitle}

    - + + -

    {clinic.serviceName}

    - {facility.name} -
    - {facility.address?.city}, - diff --git a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/TypeOfAppointmentSection.jsx b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/TypeOfAppointmentSection.jsx index 8d9f56cc3ced..94a441914f32 100644 --- a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/TypeOfAppointmentSection.jsx +++ b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/TypeOfAppointmentSection.jsx @@ -1,34 +1,17 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FLOW_TYPES } from '../../../../utils/constants'; +import { sentenceCase } from '../../../../utils/formatters'; import { getTypeOfCare } from '../../../redux/selectors'; -export default function TypeOfAppointmentSection({ data, flowType }) { - const typeOfCare = getTypeOfCare(data)?.name; - - let typeOfAppt = 'VA Appointment'; - - if (FLOW_TYPES.REQUEST === flowType) { - typeOfAppt = 'Type of care'; - - return ( - <> -

    - {typeOfAppt} -

    - {typeOfCare} - - ); - } +export default function TypeOfAppointmentSection({ data }) { + const typeOfCare = sentenceCase(getTypeOfCare(data)?.name); return ( <>

    - {typeOfAppt} + Type of care

    - - {typeOfCare} - + {typeOfCare} ); } diff --git a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/VAAppointmentSection/FacilitySection.jsx b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/VAAppointmentSection/FacilitySection.jsx index 6e30a6598f5e..f2884ad78a45 100644 --- a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/VAAppointmentSection/FacilitySection.jsx +++ b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/VAAppointmentSection/FacilitySection.jsx @@ -5,26 +5,26 @@ import { FLOW_TYPES } from '../../../../../utils/constants'; import State from '../../../../../components/State'; import { getFlowType } from '../../../../redux/selectors'; -export default function FacilitySection({ facility }) { +export default function FacilitySection({ facility, clinic }) { const flowType = useSelector(getFlowType); - if (FLOW_TYPES.DIRECT === flowType) - return ( - <> -

    {facility.name}

    - {facility.address?.city}, - - ); - return ( <>

    Facility

    {facility.name}
    {facility.address?.city}, + {FLOW_TYPES.DIRECT === flowType && ( + <> +
    +
    + Clinic: {clinic.serviceName || 'Not available'} + + )} ); } FacilitySection.propTypes = { facility: PropTypes.object.isRequired, + clinic: PropTypes.object, }; diff --git a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/index.jsx b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/index.jsx index bdd502d0d85d..3390ca644560 100644 --- a/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/index.jsx +++ b/src/applications/vaos/new-appointment/components/ReviewPage/ReviewRequestInfo/index.jsx @@ -1,10 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { FACILITY_TYPES, FLOW_TYPES } from '../../../../utils/constants'; +import { FACILITY_TYPES } from '../../../../utils/constants'; import TypeOfAppointmentSection from './TypeOfAppointmentSection'; import VAAppointmentSection from './VAAppointmentSection'; import CommunityCareSection from './CommunityCareSection/CommunityCareSection'; -import Description from './ReviewDirectScheduleInfo/Description'; export default function ReviewRequestInfo({ data, @@ -18,8 +17,7 @@ export default function ReviewRequestInfo({ return (

    {pageTitle}

    - - + {isCommunityCare && ( { +describe('VAOS Page: ReviewPage direct scheduling', () => { let store; let start; @@ -116,36 +116,43 @@ describe('VAOS Page: ReviewPage direct scheduling with v2 api', () => { store, }); - await screen.findByText(/scheduling a primary care appointment/i); + await screen.findByText('Primary care'); expect(screen.getByText('Primary care')).to.have.tagName('span'); const [ pageHeading, - descHeading, typeOfCareHeading, + facilityHeading, dateHeading, - clinicHeading, reasonHeading, contactHeading, ] = screen.getAllByRole('heading'); - expect(pageHeading).to.contain.text('Review your appointment details'); - expect(descHeading).to.contain.text( - 'scheduling a primary care appointment', + expect(pageHeading).to.contain.text( + 'Review and confirm your appointment details', ); - expect(typeOfCareHeading).to.contain.text('VA Appointment'); + expect(typeOfCareHeading).to.contain.text('Type of care'); expect(screen.baseElement).to.contain.text('Primary care'); - expect(dateHeading).to.contain.text( - start.tz('America/Denver').format('dddd, MMMM D, YYYY [at] h:mm a'), - ); - - expect(clinicHeading).to.contain.text('Some VA clinic'); + expect(facilityHeading).to.contain.text('Facility'); expect(screen.baseElement).to.contain.text('Cheyenne VA Medical Center'); + expect(screen.baseElement).to.contain.text('Cheyenne, WyomingWY'); + expect(screen.baseElement).to.contain.text('Clinic: Some VA clinic'); + + expect(dateHeading).to.contain.text('Date and time'); + expect(screen.baseElement).to.contain.text( + start.tz('America/Denver').format('dddd, MMMM D, YYYY'), + ); + expect(screen.baseElement).to.contain.text( + start.tz('America/Denver').format('h:mm a'), + ); - expect(reasonHeading).to.contain.text('Routine/Follow-up'); + expect(reasonHeading).to.contain.text( + 'Details you’d like to share with your provider', + ); + expect(screen.baseElement).to.contain.text('Routine/Follow-up'); expect(screen.baseElement).to.contain.text('I need an appt'); - expect(contactHeading).to.contain.text('Your contact details'); - expect(screen.baseElement).to.contain.text('joeblow@gmail.com'); + expect(contactHeading).to.contain.text('Your contact information'); + expect(screen.baseElement).to.contain.text('Email: joeblow@gmail.com'); expect(screen.getByTestId('patient-telephone')).to.exist; expect(screen.baseElement).to.not.contain.text( 'Call anytime during the day', @@ -172,7 +179,7 @@ describe('VAOS Page: ReviewPage direct scheduling with v2 api', () => { store, }); - await screen.findByText(/scheduling a primary care appointment/i); + await screen.findByText('Primary care'); userEvent.click(screen.getByText(/Confirm appointment/i)); await waitFor(() => { @@ -214,7 +221,7 @@ describe('VAOS Page: ReviewPage direct scheduling with v2 api', () => { store, }); - await screen.findByText(/scheduling a primary care appointment/i); + await screen.findByText('Primary care'); userEvent.click(screen.getByText(/Confirm appointment/i)); @@ -259,7 +266,7 @@ describe('VAOS Page: ReviewPage direct scheduling with v2 api', () => { store, }); - await screen.findByText(/scheduling a primary care appointment/i); + await screen.findByText('Primary care'); userEvent.click(screen.getByText(/Confirm appointment/i)); @@ -298,7 +305,7 @@ describe('VAOS Page: ReviewPage direct scheduling with v2 api', () => { store, }); - await screen.findByText(/scheduling a primary care appointment/i); + await screen.findByText('Primary care'); userEvent.click(screen.getByText(/Confirm appointment/i)); @@ -337,7 +344,7 @@ describe('VAOS Page: ReviewPage direct scheduling with v2 api', () => { store, }); - await screen.findByText(/scheduling a primary care appointment/i); + await screen.findByText('Primary care'); userEvent.click(screen.getByText(/Confirm appointment/i)); diff --git a/src/applications/vaos/new-appointment/newAppointmentFlow.js b/src/applications/vaos/new-appointment/newAppointmentFlow.js index 0ed089541a73..ff7546089f95 100644 --- a/src/applications/vaos/new-appointment/newAppointmentFlow.js +++ b/src/applications/vaos/new-appointment/newAppointmentFlow.js @@ -317,7 +317,7 @@ const flow = { }, review: { url: '/new-appointment/review', - label: 'Review your appointment details', + label: 'Review and confirm your appointment details', }, }; @@ -416,7 +416,7 @@ export default function getNewAppointmentFlow(state) { ...flow.review, label: FLOW_TYPES.DIRECT === flowType - ? 'Review your appointment details' + ? 'Review and confirm your appointment details' : 'Review and submit your request', url: featureBreadcrumbUrlUpdate ? 'review' : '/new-appointment/review', }, diff --git a/src/applications/vaos/new-appointment/redux/actions.js b/src/applications/vaos/new-appointment/redux/actions.js index 68e31d45d931..aa4abf2ce044 100644 --- a/src/applications/vaos/new-appointment/redux/actions.js +++ b/src/applications/vaos/new-appointment/redux/actions.js @@ -43,7 +43,7 @@ import { transformFormToVAOSAppointment, transformFormToVAOSCCRequest, transformFormToVAOSVARequest, -} from './helpers/formSubmitTransformers.v2'; +} from './helpers/formSubmitTransformers'; import { resetDataLayer, recordItemsRetrieved, diff --git a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.js b/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.js index 374b48fbe12b..4de0467d499b 100644 --- a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.js +++ b/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.js @@ -1,238 +1,167 @@ -import moment from 'moment'; -import environment from '@department-of-veterans-affairs/platform-utilities/environment'; import titleCase from 'platform/utilities/data/titleCase'; import { selectVAPResidentialAddress } from 'platform/user/selectors'; -import { getTimezoneByFacilityId } from '../../../utils/timezone'; -import { - PURPOSE_TEXT_V2, - TYPE_OF_VISIT, - LANGUAGES, -} from '../../../utils/constants'; +import moment from '../../../lib/moment-tz'; +import { LANGUAGES } from '../../../utils/constants'; import { getTypeOfCare, getFormData, - getChosenClinicInfo, - getChosenFacilityInfo, - getSiteIdForChosenFacility, getChosenCCSystemById, + getChosenClinicInfo, getChosenSlot, } from '../selectors'; -import { getClinicId, getSiteCode } from '../../../services/healthcare-service'; - -const CC_PURPOSE = 'other'; - -function getUserMessage(data) { - const label = PURPOSE_TEXT_V2.find( - purpose => purpose.id === data.reasonForAppointment, - ).short; - - return `${label}: ${data.reasonAdditionalInfo}`; -} - -function getTestFacilityName(id, name) { - if (!environment.isProduction() && id.startsWith('983')) { - return `CHYSHR-${name}`; - } - - if (!environment.isProduction() && id.startsWith('984')) { - // The extra space here is intentional, that appears to be how it is named - // in CDW - return `DAYTSHR -${name}`; - } - - return name; -} - -function getRequestedDates(data) { - return data.selectedDates.reduce( - (acc, date, index) => ({ - ...acc, - [`optionDate${index + 1}`]: moment(date).format('MM/DD/YYYY'), - [`optionTime${index + 1}`]: moment(date).hour() >= 12 ? 'PM' : 'AM', - }), - { - optionDate1: 'No Date Selected', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'No Time Selected', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - }, - ); -} - -export function transformFormToVARequest(state) { - const facility = getChosenFacilityInfo(state); - const data = getFormData(state); - const typeOfCare = getTypeOfCare(data); - const siteId = getSiteIdForChosenFacility(state); - const facilityId = facility.id; - const facilityName = getTestFacilityName(facilityId, facility.name); - - return { - typeOfCare: typeOfCare.id, - typeOfCareId: typeOfCare.id, - appointmentType: typeOfCare.name, - facility: { - name: facilityName, - facilityCode: facilityId, - parentSiteCode: siteId, - }, - purposeOfVisit: PURPOSE_TEXT_V2.find( - purpose => purpose.id === data.reasonForAppointment, - )?.serviceName, - otherPurposeOfVisit: - data.reasonForAppointment === 'other' - ? 'See additional information' - : null, - visitType: TYPE_OF_VISIT.find(type => type.id === data.visitType) - ?.serviceName, - phoneNumber: data.phoneNumber, - verifyPhoneNumber: data.phoneNumber, - ...getRequestedDates(data), - // The bad camel casing here is intentional, to match downstream - // system - bestTimetoCall: Object.entries(data.bestTimeToCall) - .filter(item => item[1]) - .map(item => titleCase(item[0])), - emailPreferences: { - emailAddress: data.email, - // defaulted values - notificationFrequency: 'Each new message', - emailAllowed: true, - textMsgAllowed: false, - textMsgPhNumber: '', - }, - email: data.email, - // defaulted values - status: 'Submitted', - schedulingMethod: 'clerk', - requestedPhoneCall: false, - providerId: '0', - providerOption: '', - }; -} +import { getClinicId } from '../../../services/healthcare-service'; +import { getTimezoneByFacilityId } from '../../../utils/timezone'; +import { getReasonCode } from './getReasonCode'; -export function transformFormToCCRequest(state) { +export function transformFormToVAOSCCRequest(state) { const data = getFormData(state); const provider = data.communityCareProvider; - let preferredProviders = []; + const residentialAddress = selectVAPResidentialAddress(state); + const parentFacility = getChosenCCSystemById(state); + let practitioners = []; - if ( - !!data.communityCareProvider && - Object.keys(data.communityCareProvider).length - ) { - preferredProviders = [ + if (provider?.identifier) { + practitioners = [ { + identifier: [ + { + system: 'http://hl7.org/fhir/sid/us-npi', + value: data.communityCareProvider.identifier.find( + item => item.system === 'PPMS', + )?.value, + }, + ], address: { - street: provider.address.line.join(', '), + line: provider.address.line, city: provider.address.city, state: provider.address.state, - zipCode: provider.address.postalCode, + postalCode: provider.address.postalCode, }, - practiceName: provider.name, }, ]; } - const residentialAddress = selectVAPResidentialAddress(state); - const organization = getChosenCCSystemById(state); - let cityState; + let preferredLocation; if ( residentialAddress && - residentialAddress.addressType !== 'MILITARY OVERSEAS' + residentialAddress.addressType !== 'OVERSEAS MILITARY' ) { - cityState = { - preferredCity: residentialAddress.city, - preferredState: residentialAddress.stateCode, + preferredLocation = { + city: residentialAddress.city, + state: residentialAddress.stateCode, }; - } else { - cityState = { - preferredCity: organization.address?.city, - preferredState: organization.address?.state, + } else if (parentFacility.address) { + preferredLocation = { + city: parentFacility.address.city, + state: parentFacility.address.state, }; } const typeOfCare = getTypeOfCare(data); - + const facilityTimezone = getTimezoneByFacilityId(data.communityCareSystemId); return { - typeOfCare: typeOfCare.ccId, - typeOfCareId: typeOfCare.ccId, - appointmentType: typeOfCare.name, - facility: { - name: organization.name, - facilityCode: organization.id, - parentSiteCode: organization.vistaId, + kind: 'cc', + status: 'proposed', + locationId: data.communityCareSystemId, + serviceType: typeOfCare.idV2 || typeOfCare.ccId, + // comment: data.reasonAdditionalInfo, + reasonCode: getReasonCode({ + data, + isCC: true, + isDS: false, + }), + contact: { + telecom: [ + { + type: 'phone', + value: data.phoneNumber, + }, + { + type: 'email', + value: data.email, + }, + ], }, - purposeOfVisit: CC_PURPOSE, - phoneNumber: data.phoneNumber, - verifyPhoneNumber: data.phoneNumber, - // The bad camel casing here is intentional, to match downstream - // system - bestTimetoCall: Object.entries(data.bestTimeToCall) + requestedPeriods: data.selectedDates.map(date => ({ + start: moment + .tz(date, facilityTimezone) + .utc() + .format(), + end: moment + .tz(date, facilityTimezone) + .utc() + .add(12, 'hours') + .subtract(1, 'minute') + .format(), + })), + // These four fields aren't in the current schema, but probably should be + preferredTimesForPhoneCall: Object.entries(data.bestTimeToCall || {}) .filter(item => item[1]) .map(item => titleCase(item[0])), - preferredProviders, - newMessage: data.reasonAdditionalInfo, preferredLanguage: LANGUAGES.find( lang => lang.id === data.preferredLanguage, )?.value, - ...getRequestedDates(data), - ...cityState, - // defaulted values - visitType: 'Office Visit', - requestedPhoneCall: false, - email: data.email, - officeHours: [], - reasonForVisit: '', - distanceWillingToTravel: 40, - secondRequest: false, - secondRequestSubmitted: false, - inpatient: false, - status: 'Submitted', - providerId: '0', - providerOption: '', + preferredLocation, + practitioners, }; } -export function transformFormToAppointment(state) { +export function transformFormToVAOSVARequest(state) { const data = getFormData(state); - const clinic = getChosenClinicInfo(state); - const timezone = getTimezoneByFacilityId(data.vaFacility); + const typeOfCare = getTypeOfCare(data); + return { + kind: data.visitType, + status: 'proposed', + locationId: data.vaFacility, + // This may need to change when we get the new service type ids + serviceType: typeOfCare.idV2, + reasonCode: getReasonCode({ + data, + isCC: false, + isDS: false, + }), + // comment: data.reasonAdditionalInfo, + requestedPeriods: [ + { + start: moment.utc(data.selectedDates[0]).format(), + end: moment + .utc(data.selectedDates[0]) + .add(12, 'hours') + .subtract(1, 'minute') + .format(), + }, + ], + // This field isn't in the schema yet + preferredTimesForPhoneCall: Object.entries(data.bestTimeToCall || {}) + .filter(item => item[1]) + .map(item => titleCase(item[0])), + }; +} + +export function transformFormToVAOSAppointment(state) { + const data = getFormData(state); + const clinic = getChosenClinicInfo(state); const slot = getChosenSlot(state); - const purpose = getUserMessage(data); - const appointmentLength = moment(slot.end).diff(slot.start, 'minutes'); + + // slot start and end times are not allowed on a booked va appointment. + delete slot.start; + delete slot.end; + return { - appointmentType: getTypeOfCare(data).name, - clinic: { - siteCode: getSiteCode(clinic), - clinicId: getClinicId(clinic), - clinicName: clinic.serviceName, - clinicFriendlyLocationName: clinic.serviceName, - institutionName: clinic.stationName, - institutionCode: clinic.stationId, + kind: 'clinic', + status: 'booked', + clinic: getClinicId(clinic), + slot, + extension: { + desiredDate: `${data.preferredDate}T00:00:00+00:00`, }, - - // These times are a lie, they're actually in local time, but the upstream - // service expects the 0 offset. - desiredDate: `${data.preferredDate}T00:00:00+00:00`, - dateTime: `${slot.start}+00:00`, - duration: appointmentLength, - bookingNotes: purpose, - preferredEmail: data.email, - timeZone: timezone, - // defaulted values - apptType: 'P', - purpose: '9', - lvl: '1', - ekg: '', - lab: '', - xRay: '', - schedulingRequestType: 'NEXT_AVAILABLE_APPT', - type: 'REGULAR', - appointmentKind: 'TRADITIONAL', - schedulingMethod: 'direct', + locationId: data.vaFacility, + reasonCode: getReasonCode({ + data, + isCC: false, + isDS: true, + }), }; } diff --git a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.unit.spec.js b/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.unit.spec.js index 50dd9eaa328e..0fd36480ec83 100644 --- a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.unit.spec.js +++ b/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.unit.spec.js @@ -1,490 +1,154 @@ import { expect } from 'chai'; import { - transformFormToCCRequest, - transformFormToVARequest, - transformFormToAppointment, + transformFormToVAOSAppointment, + transformFormToVAOSVARequest, } from './formSubmitTransformers'; -import { - FETCH_STATUS, - FLOW_TYPES, - VHA_FHIR_ID, -} from '../../../utils/constants'; +import { FLOW_TYPES, VHA_FHIR_ID } from '../../../utils/constants'; +import { getReasonCode } from './getReasonCode'; -describe('VAOS data transformation', () => { - it('should transform form into VA request', () => { - const state = { - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - morning: true, - }, - email: 'test@va.gov', - visitType: 'clinic', - reasonForAppointment: 'other', - reasonAdditionalInfo: 'Testing', - selectedDates: ['2019-11-20T12:00:00.000'], - vaParent: '983A6', - vaFacility: '983GB', - facilityType: 'vamc', - typeOfCareId: '323', - }, - parentFacilities: [ - { - id: '983A6', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983A6', - }, - ], - partOf: { - reference: 'Organization/983', +describe('VAOS V2 data transformation', () => { + describe('VA booked', () => { + it('remove slot.start and slot.end from new appointment object', () => { + const state = { + user: { + profile: { + vapContactInfo: {}, + }, + }, + newAppointment: { + data: { + phoneNumber: '5035551234', + bestTimeToCall: { + morning: true, + }, + email: 'test@va.gov', + reasonForAppointment: 'routine-follow-up', + reasonAdditionalInfo: 'asdfasdf', + selectedDates: ['2019-11-22T09:30:00'], + preferredDate: '2019-12-02', + clinicId: '983_308', + vaParent: '983', + vaFacility: '983', + facilityType: 'vamc', + typeOfCareId: '323', + }, + availableSlots: [ + { + start: '2019-12-22T09:30:00', + end: '2019-12-22T10:00:00', }, - }, - ], - facilities: { - '323': [ { - id: '983GB', + start: '2019-11-22T09:30:00', + end: '2019-11-22T10:00:00', + }, + ], + parentFacilities: [ + { + id: '983', identifier: [ { system: VHA_FHIR_ID, - value: '983GB', + value: '983', }, ], - name: 'Cheyenne VA Medical Center', address: { city: 'Cheyenne', state: 'WY', }, - legacyVAR: { - institutionTimezone: 'America/Denver', - }, }, ], - }, - flowType: FLOW_TYPES.REQUEST, - }, - featureToggles: {}, - }; - const data = transformFormToVARequest(state); - expect(data).to.deep.equal({ - typeOfCare: '323', - typeOfCareId: '323', - appointmentType: 'Primary care', - status: 'Submitted', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983GB', - parentSiteCode: '983', - }, - purposeOfVisit: 'Other', - otherPurposeOfVisit: 'See additional information', - visitType: 'Office Visit', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - bestTimetoCall: ['Morning'], - emailPreferences: { - emailAddress: 'test@va.gov', - notificationFrequency: 'Each new message', - emailAllowed: true, - textMsgAllowed: false, - textMsgPhNumber: '', - }, - email: 'test@va.gov', - schedulingMethod: 'clerk', - requestedPhoneCall: false, - providerId: '0', - providerOption: '', - }); - }); - it('should transform form for Sleep Care into VA request', () => { - const state = { - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - morning: true, - }, - email: 'test@va.gov', - visitType: 'clinic', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'Testing', - selectedDates: ['2019-11-20T12:00:00.000'], - vaParent: '983', - vaFacility: '983GB', - facilityType: 'vamc', - typeOfCareId: 'SLEEP', - typeOfSleepCareId: '349', - }, - parentFacilities: [ - { - id: '983', - identifier: [ + facilities: { + '323': [ { - system: VHA_FHIR_ID, - value: '983', + id: '983', + identifier: [ + { + system: VHA_FHIR_ID, + value: '983', + }, + ], + name: 'Cheyenne VA Medical Center', + address: { + city: 'Cheyenne', + state: 'WY', + }, + legacyVAR: { + institutionTimezone: 'America/Denver', + }, }, ], }, - ], - facilities: { - '349': [ - { - id: '983GB', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983GB', - }, - ], - name: 'Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - legacyVAR: { - institutionTimezone: 'America/Denver', + clinics: { + '983_323': [ + { + id: '983_308', + serviceName: 'Green Team Clinic1', + stationId: '983', + stationName: 'CHYSHR-Cheyenne VA Medical Center', }, - }, - ], - }, - flowType: FLOW_TYPES.REQUEST, - }, - featureToggles: {}, - }; - const data = transformFormToVARequest(state); - expect(data).to.deep.equal({ - typeOfCare: '349', - typeOfCareId: '349', - appointmentType: 'Continuous Positive Airway Pressure (CPAP)', - status: 'Submitted', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983GB', - parentSiteCode: '983', - }, - purposeOfVisit: 'Routine Follow-up', - otherPurposeOfVisit: null, - visitType: 'Office Visit', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - bestTimetoCall: ['Morning'], - emailPreferences: { - emailAddress: 'test@va.gov', - notificationFrequency: 'Each new message', - emailAllowed: true, - textMsgAllowed: false, - textMsgPhNumber: '', - }, - email: 'test@va.gov', - schedulingMethod: 'clerk', - requestedPhoneCall: false, - providerId: '0', - providerOption: '', - }); - }); - - it('should transform form into CC request', () => { - const state = { - user: { - profile: { - vapContactInfo: {}, - }, - }, - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - afternoon: true, - }, - email: 'test@va.gov', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'asdf', - communityCareSystemId: '983', - preferredLanguage: 'english', - hasCommunityCareProvider: true, - communityCareProvider: { - firstName: 'asdf', - lastName: 'asdf', - name: 'Practice', - address: { - line: ['456 elm st', 'sfasdf'], - state: 'MA', - city: 'northampton', - postalCode: '01050', - }, - phone: '2342444444', - }, - selectedDates: ['2019-11-20T12:00:00.000'], - facilityType: 'communityCare', - typeOfCareId: '323', - }, - facilities: {}, - facilityDetails: {}, - clinics: {}, - eligibility: {}, - ccEnabledSystems: [ - { - id: '983', - vistaId: '983', - name: 'CHYSHR-Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - }, - { - id: '984', - vistaId: '984', - address: { - city: 'Dayton', - state: 'OH', - }, - }, - ], - pageChangeInProgress: false, - parentFacilitiesStatus: FETCH_STATUS.succeeded, - eligibilityStatus: FETCH_STATUS.succeeded, - facilityDetailsStatus: FETCH_STATUS.succeeded, - pastAppointments: null, - submitStatus: 'succeeded', - }, - featureToggles: {}, - }; - const data = transformFormToCCRequest(state); - expect(data).to.deep.equal({ - typeOfCare: 'CCPRMYRTNE', - typeOfCareId: 'CCPRMYRTNE', - appointmentType: 'Primary care', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983', - parentSiteCode: '983', - }, - purposeOfVisit: 'other', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - bestTimetoCall: ['Afternoon'], - preferredProviders: [ - { - address: { - street: '456 elm st, sfasdf', - city: 'northampton', - state: 'MA', - zipCode: '01050', + ], }, - practiceName: 'Practice', }, - ], - newMessage: 'asdf', - preferredLanguage: 'English', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - preferredCity: 'Cheyenne', - preferredState: 'WY', - requestedPhoneCall: false, - email: 'test@va.gov', - officeHours: [], - reasonForVisit: '', - visitType: 'Office Visit', - distanceWillingToTravel: 40, - secondRequest: false, - secondRequestSubmitted: false, - inpatient: false, - status: 'Submitted', - providerId: '0', - providerOption: '', - }); - }); + }; - it('should transform audiology form into audiology CC request', () => { - const state = { - user: { - profile: { - vapContactInfo: {}, - }, - }, - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - afternoon: true, - }, - email: 'test@va.gov', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'asdf', - communityCareSystemId: '983', - preferredLanguage: 'english', - hasCommunityCareProvider: true, - communityCareProvider: { - firstName: 'asdf', - lastName: 'asdf', - name: 'Practice', - address: { - line: ['456 elm st', 'sfasdf'], - state: 'MA', - city: 'northampton', - postalCode: '01050', - }, - phone: '2342444444', - }, - selectedDates: ['2019-11-20T12:00:00.000'], - facilityType: 'communityCare', - typeOfCareId: '203', - audiologyType: 'CCAUDHEAR', - }, - facilities: {}, - facilityDetails: {}, - clinics: {}, - eligibility: {}, - ccEnabledSystems: [ - { - id: '983', - vistaId: '983', - name: 'CHYSHR-Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - }, - { - id: '984', - vistaId: '984', - address: { - city: 'Dayton', - state: 'OH', - }, - }, - ], - pageChangeInProgress: false, - parentFacilitiesStatus: FETCH_STATUS.succeeded, - eligibilityStatus: FETCH_STATUS.succeeded, - facilityDetailsStatus: FETCH_STATUS.succeeded, - pastAppointments: null, - submitStatus: 'succeeded', - }, - featureToggles: {}, - }; - const data = transformFormToCCRequest(state); - expect(data).to.deep.equal({ - typeOfCare: 'CCAUDHEAR', - typeOfCareId: 'CCAUDHEAR', - appointmentType: 'Hearing aid support', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983', - parentSiteCode: '983', - }, - purposeOfVisit: 'other', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - bestTimetoCall: ['Afternoon'], - preferredProviders: [ - { - address: { - street: '456 elm st, sfasdf', - city: 'northampton', - state: 'MA', - zipCode: '01050', - }, - practiceName: 'Practice', + // when the reason text is combined with appointment information + const reasonTextTransformed = getReasonCode({ + data: state.newAppointment.data, + isCC: false, + isDS: true, + }); + + const stateWithSlotId = { + ...state, + newAppointment: { + ...state.newAppointment, + availableSlots: [ + { ...state.newAppointment.availableSlots[0], id: 'test' }, + { ...state.newAppointment.availableSlots[1], id: 'test2' }, + ], }, - ], - newMessage: 'asdf', - preferredLanguage: 'English', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - preferredCity: 'Cheyenne', - preferredState: 'WY', - requestedPhoneCall: false, - email: 'test@va.gov', - officeHours: [], - reasonForVisit: '', - visitType: 'Office Visit', - distanceWillingToTravel: 40, - secondRequest: false, - secondRequestSubmitted: false, - inpatient: false, - status: 'Submitted', - providerId: '0', - providerOption: '', + }; + + const data = transformFormToVAOSAppointment(stateWithSlotId); + expect(data).to.deep.equal({ + kind: 'clinic', + status: 'booked', + clinic: '308', + slot: { + id: 'test2', + }, + extension: { desiredDate: '2019-12-02T00:00:00+00:00' }, + locationId: '983', + reasonCode: reasonTextTransformed, + }); }); }); - it('should transform form into VA appointment', () => { - const state = { - user: { - profile: { - vapContactInfo: {}, - }, - }, - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - morning: true, - }, - email: 'test@va.gov', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'asdfasdf', - selectedDates: ['2019-11-22T09:30:00'], - preferredDate: '2019-12-02', - clinicId: '983_308', - vaParent: '983', - vaFacility: '983', - facilityType: 'vamc', - typeOfCareId: '323', - }, - availableSlots: [ - { - start: '2019-12-22T09:30:00', - end: '2019-12-22T10:00:00', - }, - { - start: '2019-11-22T09:30:00', - end: '2019-11-22T10:00:00', - }, - ], - parentFacilities: [ - { - id: '983', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983', - }, - ], - address: { - city: 'Cheyenne', - state: 'WY', - }, - }, - ], - facilities: { - '323': [ + describe('VA request', () => { + it('request body is valid', () => { + const superLongText = + 'The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.'; + // Given the VA request is submitted + const state = { + newAppointment: { + data: { + phoneNumber: '5035551234', + bestTimeToCall: { + morning: true, + }, + email: 'test@va.gov', + visitType: 'clinic', + reasonForAppointment: 'other', + reasonAdditionalInfo: superLongText, + selectedDates: ['2019-11-20T12:00:00.000'], + vaParent: '983', + vaFacility: '983GB', + facilityType: 'vamc', + typeOfCareId: 'SLEEP', + typeOfSleepCareId: '349', + }, + parentFacilities: [ { id: '983', identifier: [ @@ -493,391 +157,52 @@ describe('VAOS data transformation', () => { value: '983', }, ], - name: 'Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - legacyVAR: { - institutionTimezone: 'America/Denver', - }, }, ], - }, - clinics: { - '983_323': [ - { - id: '983_308', - serviceName: 'Green Team Clinic1', - stationId: '983', - stationName: 'CHYSHR-Cheyenne VA Medical Center', - }, - ], - }, - }, - featureToggles: {}, - }; - const data = transformFormToAppointment(state); - expect(data).to.deep.equal({ - clinic: { - siteCode: '983', - clinicId: '308', - clinicName: 'Green Team Clinic1', - clinicFriendlyLocationName: 'Green Team Clinic1', - institutionName: 'CHYSHR-Cheyenne VA Medical Center', - institutionCode: '983', - }, - desiredDate: '2019-12-02T00:00:00+00:00', - dateTime: '2019-11-22T09:30:00+00:00', - duration: 30, - bookingNotes: 'Routine/Follow-up: asdfasdf', - preferredEmail: 'test@va.gov', - timeZone: 'America/Denver', - apptType: 'P', - purpose: '9', - lvl: '1', - ekg: '', - lab: '', - xRay: '', - schedulingRequestType: 'NEXT_AVAILABLE_APPT', - type: 'REGULAR', - appointmentKind: 'TRADITIONAL', - appointmentType: 'Primary care', - schedulingMethod: 'direct', - }); - }); - - it('should transform form for Eye Care into VA request', () => { - const state = { - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - morning: true, - }, - email: 'test@va.gov', - visitType: 'clinic', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'Testing', - selectedDates: ['2019-11-20T12:00:00.000'], - vaParent: '983', - vaFacility: '983GB', - facilityType: 'vamc', - typeOfCareId: 'EYE', - typeOfEyeCareId: '407', - }, - parentFacilities: [ - { - id: '983', - identifier: [ + facilities: { + '349': [ { - system: VHA_FHIR_ID, - value: '983', - }, - ], - }, - ], - facilities: { - '407': [ - { - id: '983GB', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983GB', + id: '983GB', + identifier: [ + { + system: VHA_FHIR_ID, + value: '983GB', + }, + ], + name: 'Cheyenne VA Medical Center', + address: { + city: 'Cheyenne', + state: 'WY', + }, + legacyVAR: { + institutionTimezone: 'America/Denver', }, - ], - name: 'Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - legacyVAR: { - institutionTimezone: 'America/Denver', }, - }, - ], - }, - flowType: FLOW_TYPES.REQUEST, - }, - featureToggles: {}, - }; - const data = transformFormToVARequest(state); - expect(data).to.deep.equal({ - typeOfCare: '407', - typeOfCareId: '407', - appointmentType: 'Ophthalmology', - status: 'Submitted', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983GB', - parentSiteCode: '983', - }, - purposeOfVisit: 'Routine Follow-up', - otherPurposeOfVisit: null, - visitType: 'Office Visit', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - bestTimetoCall: ['Morning'], - emailPreferences: { - emailAddress: 'test@va.gov', - notificationFrequency: 'Each new message', - emailAllowed: true, - textMsgAllowed: false, - textMsgPhNumber: '', - }, - email: 'test@va.gov', - schedulingMethod: 'clerk', - requestedPhoneCall: false, - providerId: '0', - providerOption: '', - }); - }); - - it('should transform form using provider selection into CC request', () => { - const state = { - user: { - profile: { - facilities: [{ facilityId: '983', isCerner: false }], - vapContactInfo: { - residentialAddress: { - addressLine1: '123 big sky st', - city: 'Cincinnati', - stateCode: 'OH', - zipCode: '45220', - latitude: 39.1, - longitude: -84.6, - }, - }, - }, - }, - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - afternoon: true, - }, - email: 'test@va.gov', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'asdf', - communityCareSystemId: '983', - preferredLanguage: 'english', - communityCareProvider: { - name: 'Practice', - address: { - line: ['456 elm st', 'sfasdf'], - state: 'MA', - city: 'northampton', - postalCode: '01050', - }, - }, - selectedDates: ['2019-11-20T12:00:00.000'], - facilityType: 'communityCare', - typeOfCareId: '323', - }, - facilities: {}, - facilityDetails: {}, - clinics: {}, - eligibility: {}, - ccEnabledSystems: [ - { - id: '983', - vistaId: '983', - name: 'CHYSHR-Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - }, - { - id: '984', - vistaId: '984', - address: { - city: 'Dayton', - state: 'OH', - }, - }, - ], - pageChangeInProgress: false, - parentFacilitiesStatus: FETCH_STATUS.succeeded, - eligibilityStatus: FETCH_STATUS.succeeded, - facilityDetailsStatus: FETCH_STATUS.succeeded, - pastAppointments: null, - submitStatus: 'succeeded', - }, - featureToggles: {}, - }; - const data = transformFormToCCRequest(state); - expect(data).to.deep.equal({ - typeOfCare: 'CCPRMYRTNE', - typeOfCareId: 'CCPRMYRTNE', - appointmentType: 'Primary care', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983', - parentSiteCode: '983', - }, - purposeOfVisit: 'other', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - bestTimetoCall: ['Afternoon'], - preferredProviders: [ - { - address: { - street: '456 elm st, sfasdf', - city: 'northampton', - state: 'MA', - zipCode: '01050', + ], }, - practiceName: 'Practice', + flowType: FLOW_TYPES.REQUEST, }, - ], - newMessage: 'asdf', - preferredLanguage: 'English', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - preferredCity: 'Cincinnati', - preferredState: 'OH', - requestedPhoneCall: false, - email: 'test@va.gov', - officeHours: [], - reasonForVisit: '', - visitType: 'Office Visit', - distanceWillingToTravel: 40, - secondRequest: false, - secondRequestSubmitted: false, - inpatient: false, - status: 'Submitted', - providerId: '0', - providerOption: '', - }); - }); + }; + // when the reason text is combined with appointment information + const reasonTextTransformed = getReasonCode({ + data: state.newAppointment.data, + isCC: false, + isDS: false, + }); - it('should transform form using provider selection into CC request when residential address is missing', () => { - const state = { - user: { - profile: { - facilities: [{ facilityId: '983', isCerner: false }], - vapContactInfo: { - residentialAddress: null, - }, - }, - }, - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - afternoon: true, - }, - email: 'test@va.gov', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'asdf', - communityCareSystemId: '983', - preferredLanguage: 'english', - communityCareProvider: { - name: 'Practice', - address: { - line: ['456 elm st', 'sfasdf'], - state: 'MA', - city: 'northampton', - postalCode: '01050', - }, - firstName: 'test', - lastName: 'mctesty', - }, - selectedDates: ['2019-11-20T12:00:00.000'], - facilityType: 'communityCare', - typeOfCareId: '323', - }, - facilities: {}, - facilityDetails: {}, - clinics: {}, - eligibility: {}, - ccEnabledSystems: [ - { - id: '983', - vistaId: '983', - name: 'CHYSHR-Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - }, - { - id: '984', - vistaId: '984', - address: { - city: 'Dayton', - state: 'OH', - }, - }, + const data = transformFormToVAOSVARequest(state); + // Then the request body will transform + expect(data).to.deep.equal({ + kind: 'clinic', + status: 'proposed', + locationId: '983GB', + serviceType: 'cpap', + reasonCode: reasonTextTransformed, + requestedPeriods: [ + { start: '2019-11-20T12:00:00Z', end: '2019-11-20T23:59:00Z' }, ], - pageChangeInProgress: false, - parentFacilitiesStatus: FETCH_STATUS.succeeded, - eligibilityStatus: FETCH_STATUS.succeeded, - facilityDetailsStatus: FETCH_STATUS.succeeded, - pastAppointments: null, - submitStatus: 'succeeded', - }, - featureToggles: {}, - }; - const data = transformFormToCCRequest(state); - expect(data).to.deep.equal({ - typeOfCare: 'CCPRMYRTNE', - typeOfCareId: 'CCPRMYRTNE', - appointmentType: 'Primary care', - facility: { - name: 'CHYSHR-Cheyenne VA Medical Center', - facilityCode: '983', - parentSiteCode: '983', - }, - purposeOfVisit: 'other', - phoneNumber: '5035551234', - verifyPhoneNumber: '5035551234', - bestTimetoCall: ['Afternoon'], - preferredProviders: [ - { - address: { - street: '456 elm st, sfasdf', - city: 'northampton', - state: 'MA', - zipCode: '01050', - }, - practiceName: 'Practice', - }, - ], - newMessage: 'asdf', - preferredLanguage: 'English', - optionDate1: '11/20/2019', - optionDate2: 'No Date Selected', - optionDate3: 'No Date Selected', - optionTime1: 'PM', - optionTime2: 'No Time Selected', - optionTime3: 'No Time Selected', - preferredCity: 'Cheyenne', - preferredState: 'WY', - requestedPhoneCall: false, - email: 'test@va.gov', - officeHours: [], - reasonForVisit: '', - visitType: 'Office Visit', - distanceWillingToTravel: 40, - secondRequest: false, - secondRequestSubmitted: false, - inpatient: false, - status: 'Submitted', - providerId: '0', - providerOption: '', + preferredTimesForPhoneCall: ['Morning'], + }); }); }); }); diff --git a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.v2.js b/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.v2.js deleted file mode 100644 index 4de0467d499b..000000000000 --- a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.v2.js +++ /dev/null @@ -1,167 +0,0 @@ -import titleCase from 'platform/utilities/data/titleCase'; -import { selectVAPResidentialAddress } from 'platform/user/selectors'; -import moment from '../../../lib/moment-tz'; -import { LANGUAGES } from '../../../utils/constants'; -import { - getTypeOfCare, - getFormData, - getChosenCCSystemById, - getChosenClinicInfo, - getChosenSlot, -} from '../selectors'; -import { getClinicId } from '../../../services/healthcare-service'; -import { getTimezoneByFacilityId } from '../../../utils/timezone'; -import { getReasonCode } from './getReasonCode'; - -export function transformFormToVAOSCCRequest(state) { - const data = getFormData(state); - const provider = data.communityCareProvider; - const residentialAddress = selectVAPResidentialAddress(state); - const parentFacility = getChosenCCSystemById(state); - let practitioners = []; - - if (provider?.identifier) { - practitioners = [ - { - identifier: [ - { - system: 'http://hl7.org/fhir/sid/us-npi', - value: data.communityCareProvider.identifier.find( - item => item.system === 'PPMS', - )?.value, - }, - ], - address: { - line: provider.address.line, - city: provider.address.city, - state: provider.address.state, - postalCode: provider.address.postalCode, - }, - }, - ]; - } - - let preferredLocation; - - if ( - residentialAddress && - residentialAddress.addressType !== 'OVERSEAS MILITARY' - ) { - preferredLocation = { - city: residentialAddress.city, - state: residentialAddress.stateCode, - }; - } else if (parentFacility.address) { - preferredLocation = { - city: parentFacility.address.city, - state: parentFacility.address.state, - }; - } - - const typeOfCare = getTypeOfCare(data); - const facilityTimezone = getTimezoneByFacilityId(data.communityCareSystemId); - return { - kind: 'cc', - status: 'proposed', - locationId: data.communityCareSystemId, - serviceType: typeOfCare.idV2 || typeOfCare.ccId, - // comment: data.reasonAdditionalInfo, - reasonCode: getReasonCode({ - data, - isCC: true, - isDS: false, - }), - contact: { - telecom: [ - { - type: 'phone', - value: data.phoneNumber, - }, - { - type: 'email', - value: data.email, - }, - ], - }, - requestedPeriods: data.selectedDates.map(date => ({ - start: moment - .tz(date, facilityTimezone) - .utc() - .format(), - end: moment - .tz(date, facilityTimezone) - .utc() - .add(12, 'hours') - .subtract(1, 'minute') - .format(), - })), - // These four fields aren't in the current schema, but probably should be - preferredTimesForPhoneCall: Object.entries(data.bestTimeToCall || {}) - .filter(item => item[1]) - .map(item => titleCase(item[0])), - preferredLanguage: LANGUAGES.find( - lang => lang.id === data.preferredLanguage, - )?.value, - preferredLocation, - practitioners, - }; -} - -export function transformFormToVAOSVARequest(state) { - const data = getFormData(state); - const typeOfCare = getTypeOfCare(data); - - return { - kind: data.visitType, - status: 'proposed', - locationId: data.vaFacility, - // This may need to change when we get the new service type ids - serviceType: typeOfCare.idV2, - reasonCode: getReasonCode({ - data, - isCC: false, - isDS: false, - }), - // comment: data.reasonAdditionalInfo, - requestedPeriods: [ - { - start: moment.utc(data.selectedDates[0]).format(), - end: moment - .utc(data.selectedDates[0]) - .add(12, 'hours') - .subtract(1, 'minute') - .format(), - }, - ], - // This field isn't in the schema yet - preferredTimesForPhoneCall: Object.entries(data.bestTimeToCall || {}) - .filter(item => item[1]) - .map(item => titleCase(item[0])), - }; -} - -export function transformFormToVAOSAppointment(state) { - const data = getFormData(state); - const clinic = getChosenClinicInfo(state); - const slot = getChosenSlot(state); - - // slot start and end times are not allowed on a booked va appointment. - delete slot.start; - delete slot.end; - - return { - kind: 'clinic', - status: 'booked', - clinic: getClinicId(clinic), - slot, - extension: { - desiredDate: `${data.preferredDate}T00:00:00+00:00`, - }, - locationId: data.vaFacility, - reasonCode: getReasonCode({ - data, - isCC: false, - isDS: true, - }), - }; -} diff --git a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.v2.unit.spec.js b/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.v2.unit.spec.js deleted file mode 100644 index 297633f5c8da..000000000000 --- a/src/applications/vaos/new-appointment/redux/helpers/formSubmitTransformers.v2.unit.spec.js +++ /dev/null @@ -1,208 +0,0 @@ -import { expect } from 'chai'; - -import { - transformFormToVAOSAppointment, - transformFormToVAOSVARequest, -} from './formSubmitTransformers.v2'; -import { FLOW_TYPES, VHA_FHIR_ID } from '../../../utils/constants'; -import { getReasonCode } from './getReasonCode'; - -describe('VAOS V2 data transformation', () => { - describe('VA booked', () => { - it('remove slot.start and slot.end from new appointment object', () => { - const state = { - user: { - profile: { - vapContactInfo: {}, - }, - }, - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - morning: true, - }, - email: 'test@va.gov', - reasonForAppointment: 'routine-follow-up', - reasonAdditionalInfo: 'asdfasdf', - selectedDates: ['2019-11-22T09:30:00'], - preferredDate: '2019-12-02', - clinicId: '983_308', - vaParent: '983', - vaFacility: '983', - facilityType: 'vamc', - typeOfCareId: '323', - }, - availableSlots: [ - { - start: '2019-12-22T09:30:00', - end: '2019-12-22T10:00:00', - }, - { - start: '2019-11-22T09:30:00', - end: '2019-11-22T10:00:00', - }, - ], - parentFacilities: [ - { - id: '983', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983', - }, - ], - address: { - city: 'Cheyenne', - state: 'WY', - }, - }, - ], - facilities: { - '323': [ - { - id: '983', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983', - }, - ], - name: 'Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - legacyVAR: { - institutionTimezone: 'America/Denver', - }, - }, - ], - }, - clinics: { - '983_323': [ - { - id: '983_308', - serviceName: 'Green Team Clinic1', - stationId: '983', - stationName: 'CHYSHR-Cheyenne VA Medical Center', - }, - ], - }, - }, - }; - - // when the reason text is combined with appointment information - const reasonTextTransformed = getReasonCode({ - data: state.newAppointment.data, - isCC: false, - isDS: true, - }); - - const stateWithSlotId = { - ...state, - newAppointment: { - ...state.newAppointment, - availableSlots: [ - { ...state.newAppointment.availableSlots[0], id: 'test' }, - { ...state.newAppointment.availableSlots[1], id: 'test2' }, - ], - }, - }; - - const data = transformFormToVAOSAppointment(stateWithSlotId); - expect(data).to.deep.equal({ - kind: 'clinic', - status: 'booked', - clinic: '308', - slot: { - id: 'test2', - }, - extension: { desiredDate: '2019-12-02T00:00:00+00:00' }, - locationId: '983', - reasonCode: reasonTextTransformed, - }); - }); - }); - - describe('VA request', () => { - it('request body is valid', () => { - const superLongText = - 'The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.'; - // Given the VA request is submitted - const state = { - newAppointment: { - data: { - phoneNumber: '5035551234', - bestTimeToCall: { - morning: true, - }, - email: 'test@va.gov', - visitType: 'clinic', - reasonForAppointment: 'other', - reasonAdditionalInfo: superLongText, - selectedDates: ['2019-11-20T12:00:00.000'], - vaParent: '983', - vaFacility: '983GB', - facilityType: 'vamc', - typeOfCareId: 'SLEEP', - typeOfSleepCareId: '349', - }, - parentFacilities: [ - { - id: '983', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983', - }, - ], - }, - ], - facilities: { - '349': [ - { - id: '983GB', - identifier: [ - { - system: VHA_FHIR_ID, - value: '983GB', - }, - ], - name: 'Cheyenne VA Medical Center', - address: { - city: 'Cheyenne', - state: 'WY', - }, - legacyVAR: { - institutionTimezone: 'America/Denver', - }, - }, - ], - }, - flowType: FLOW_TYPES.REQUEST, - }, - }; - // when the reason text is combined with appointment information - const reasonTextTransformed = getReasonCode({ - data: state.newAppointment.data, - isCC: false, - isDS: false, - }); - - const data = transformFormToVAOSVARequest(state); - // Then the request body will transform - expect(data).to.deep.equal({ - kind: 'clinic', - status: 'proposed', - locationId: '983GB', - serviceType: 'cpap', - reasonCode: reasonTextTransformed, - requestedPeriods: [ - { start: '2019-11-20T12:00:00Z', end: '2019-11-20T23:59:00Z' }, - ], - preferredTimesForPhoneCall: ['Morning'], - }); - }); - }); -}); diff --git a/src/applications/vaos/services/mocks/v2/slots.json b/src/applications/vaos/services/mocks/v2/slots.json index 53953514e5c5..17434cf16eaf 100644 --- a/src/applications/vaos/services/mocks/v2/slots.json +++ b/src/applications/vaos/services/mocks/v2/slots.json @@ -2487,6 +2487,14 @@ "start": "2024-08-22T21:15:00Z", "end": "2024-08-22T00:00:00Z" } + }, + { + "id": "1913", + "type": "slots", + "attributes": { + "start": "2025-02-22T21:15:00Z", + "end": "2025-02-22T00:00:00Z" + } } ] } \ No newline at end of file diff --git a/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/ophthalmology.cypress.spec.js b/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/ophthalmology.cypress.spec.js index 41fe0e10b870..efb25332d12e 100644 --- a/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/ophthalmology.cypress.spec.js +++ b/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/ophthalmology.cypress.spec.js @@ -143,12 +143,9 @@ describe('VAOS request schedule flow - Audiology', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling an ophthalmology appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /ophthalmology/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ diff --git a/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/primary-care.cypress.spec.js b/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/primary-care.cypress.spec.js index 4955a341b9d1..d205052fe2cf 100644 --- a/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/primary-care.cypress.spec.js +++ b/src/applications/vaos/tests/e2e/workflows/direct-schedule-workflow/primary-care.cypress.spec.js @@ -137,12 +137,9 @@ describe('VAOS direct schedule flow - Primary care', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling a primary care appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /primary care/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ @@ -209,12 +206,9 @@ describe('VAOS direct schedule flow - Primary care', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling a primary care appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /primary care/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ @@ -291,12 +285,9 @@ describe('VAOS direct schedule flow - Primary care', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling a primary care appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /primary care/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ @@ -481,12 +472,9 @@ describe('VAOS direct schedule flow - Primary care', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling a primary care appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /primary care/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ @@ -548,12 +536,9 @@ describe('VAOS direct schedule flow - Primary care', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling a primary care appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /primary care/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ @@ -711,12 +696,9 @@ describe('VAOS direct schedule flow - Primary care', () => { ReviewPageObject.assertUrl() .assertHeading({ - name: /Review your appointment details/i, - }) - .assertHeading({ - level: 2, - name: /You.re scheduling a primary care appointment/i, + name: /Review and confirm your appointment details/i, }) + .assertText({ text: /primary care/i }) .clickConfirmButton(); ConfirmationPageObject.assertUrl().assertText({ diff --git a/src/applications/verify-your-enrollment/actions/index.js b/src/applications/verify-your-enrollment/actions/index.js index a1560f24faad..5c67d98a21e7 100644 --- a/src/applications/verify-your-enrollment/actions/index.js +++ b/src/applications/verify-your-enrollment/actions/index.js @@ -237,7 +237,7 @@ export const verifyEnrollmentAction = verifications => { verifiedThroughDate: lastVerification?.verificationEndDate, verificationMethod: 'VYE', appCommunication: { - responseype: 'Y', + responseType: 'Y', }, }; })() diff --git a/src/platform/site-wide/user-nav/sass/user-nav.scss b/src/platform/site-wide/user-nav/sass/user-nav.scss index 64881f27c1e3..2957576bdcd0 100644 --- a/src/platform/site-wide/user-nav/sass/user-nav.scss +++ b/src/platform/site-wide/user-nav/sass/user-nav.scss @@ -218,15 +218,6 @@ } .login.login-modal { - // temporary solution until DST can fix va-modal large property - margin-left: -1rem; - margin-right: 4rem; - - @include media($medium-screen) { - margin-left: unset; - margin-right: unset; - } - .downtime-notification.row { margin: 0 0 1em; }