department-of-veterans-affairs/vets-website

View on GitHub
src/applications/edu-benefits/1995/pages/servicePeriodsUpdate.js

Summary

Maintainability
A
0 mins
Test Coverage
import fullSchema1995 from 'vets-json-schema/dist/22-1995-schema.json';
import set from 'platform/utilities/data/set';
import get from 'platform/utilities/data/get';
import * as toursOfDuty from '../../definitions/toursOfDuty';

const { applicantServed, isActiveDuty } = fullSchema1995.properties;

export const schema = {
  type: 'object',
  properties: {
    applicantServed,
    isActiveDuty,
    'view:newService': {
      type: 'boolean',
    },
    toursOfDuty: toursOfDuty.schema(fullSchema1995, {
      fields: ['serviceBranch', 'dateRange'],
      required: ['serviceBranch', 'dateRange.from', 'dateRange.to'],
    }),
  },
};

export const isFieldRequired = formData => {
  return formData.applicantServed === 'Yes';
};

export const isFieldHidden = formData => {
  return formData.applicantServed !== 'Yes';
};

export const setDateRangeRequired = (formData, _schema) => {
  if (isFieldRequired(formData) && get('isActiveDuty', formData)) {
    return set(
      'additionalItems.properties.dateRange.required',
      ['from'],
      _schema,
    );
  }
  if (isFieldRequired(formData) && get('isActiveDuty', formData) === false) {
    return set(
      'additionalItems.properties.dateRange.required',
      ['from', 'to'],
      _schema,
    );
  }
  return set('additionalItems.properties.dateRange.required', [], _schema);
};

export const setServiceBranchRequired = (formData, _schema) => {
  if (isFieldRequired(formData)) {
    return set('additionalItems.required', ['serviceBranch'], _schema);
  }
  return set('additionalItems.required', [], _schema);
};

export const uiSchema = {
  applicantServed: {
    'ui:widget': 'radio',
    'ui:title': 'Have you ever served in the armed forces?',
    'ui:required': formData => formData,
  },
  isActiveDuty: {
    'ui:title': 'Are you on active duty now?',
    'ui:widget': 'yesNo',
    'ui:required': formData => isFieldRequired(formData),
    'ui:options': {
      hideIf: formData => isFieldHidden(formData),
    },
  },
  'view:newService': {
    'ui:title':
      'Do you have any new periods of service to record since you last applied for education benefits?',
    'ui:widget': 'yesNo',
    'ui:required': formData => isFieldRequired(formData),
    'ui:options': {
      hideIf: formData => isFieldHidden(formData),
      widgetProps: {
        Y: { 'data-info': 'yes' },
        N: { 'data-info': 'no' },
      },
      // Only added to the radio when it is selected
      // a11y requirement: aria-describedby ID's *must* exist on the page;
      // and we conditionally add content based on the selection
      selectedProps: {
        Y: {
          'aria-describedby': 'root_view:newService-label',
        },
        // this ID doesn't exist, setting this would cause an axe error
        // N: { 'aria-describedby': 'different_id' },
      },
    },
  },
  toursOfDuty: {
    ...toursOfDuty.uiSchema,
    'ui:options': {
      ...toursOfDuty.uiSchema['ui:options'],
      expandUnder: 'view:newService',
      updateSchema: (formData, _schema) => {
        let finalSchema = { ..._schema };
        finalSchema = setDateRangeRequired(formData, finalSchema);
        finalSchema = setServiceBranchRequired(formData, finalSchema);
        return finalSchema;
      },
    },
    'ui:required': formData => get('view:newService', formData),
  },
};