department-of-veterans-affairs / va.gov-team

Public resources for building on and in support of VA.gov. Visit complete Knowledge Hub:
https://depo-platform-documentation.scrollhelp.site/index.html
282 stars 200 forks source link

PW intake: Content audit from Sitewide CAIA #57925

Closed laurwill closed 8 months ago

laurwill commented 1 year ago

Indicate if you need front-end engineering support for

Describe your request

A new unified terms of use will be launching on all VA sites and tools. As part of this effort, we need to audit both auth and unauth content on VA.gov to identify existing terms of use-type content.

We'd like to talk about the best way to approach this—we may need to query a set of related terms like "terms of use," "terms of service," "terms and conditions," and "rules of use" in order to capture all the existing content.

Time constraints / launch deadlines

We don't have a confirmed launch date yet (lots of different teams and approvals involved), but aiming to be ready to launch in June. We'll need to do content work after the audit based on the results. Is it possible to fit the audit in May?

Your team name

Sitewide CAIA

Your product/team Slack channel

sitewide-content-ia

Your DEPO product owner

@DanielleThierryUSDSVA, Danielle Thierry

Your Product Manager

@RLHecht, Randi Hecht

Your designer(s)

No response

Your Front-end engineer(s)

No response

Other launch decision makers

@blacktm, Tom Black

Collateral for Front-end support

No response

Additional Information

No response

Notify Sitewide Public Websites of this issue, and tag @Wes Rowe & @jilladams.

jilladams commented 1 year ago

Did some quick searches, for the terms: terms of use terms of service terms and conditions rules of use terms & conditions

Some of these are test references, just making sure we flag it as those tests will fail if we change language they're verifying and they'll need updated as well. Also some are MHV. Not sure if their T&C is separate T&C or the same.

vets-website

Searching 8026 files for "terms of use"

~/code/vets-website/src/platform/user/authentication/components/FedWarning.jsx:
    4    return (
    5      <div className="vads-u-padding-bottom--2p5 fed-warning--v2 vads-u-color--gray-dark">
    6:       <h2 className="vads-u-margin-top--0">Terms of use</h2>
    7        <p className="vads-u-font-size--base">
    8          When you sign in to VA.gov, you’re using a United States federal

~/code/vets-website/src/platform/user/tests/authentication/components/FedWarning.unit.spec.js:
    7    it('should render content as expected', () => {
    8      const wrapper = shallow(<FedWarning />);
    9:     expect(wrapper.find('h2').text()).to.contains('Terms of use');
   10      expect(wrapper.find('p').length).to.eql(4);
   11      wrapper.unmount();

2 matches across 2 files
Searching 8026 files for "terms of service"

~/code/vets-website/src/applications/facility-locator/constants/mock-failed-location.json:
    5    ],
    6    "features": [],
    7:   "attribution": "NOTICE: © 2020 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained. POI(s) provided by Foursquare."
    8  }

~/code/vets-website/src/applications/facility-locator/constants/mock-geocoding-data.json:
  224          }
  225      ],
  226:     "attribution": "NOTICE: © 2020 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained. POI(s) provided by Foursquare."
  227  }

~/code/vets-website/src/applications/facility-locator/constants/mock-la-location.json:
   51      }
   52    ],
   53:   "attribution": "NOTICE: © 2020 Mapbox and its suppliers. All rights reserved. Use of this data is subject to the Mapbox Terms of Service (https://www.mapbox.com/about/maps/). This response and the information it contains may not be retained. POI(s) provided by Foursquare."
   54  }

~/code/vets-website/src/applications/third-party-app-directory/components/SearchResult/index.jsx:
  129                target="_blank"
  130              >
  131:               {`View the ${item.name} terms of service`}
  132              </a>
  133              <a

T&C returns some null results from various yarn modules that I didn't list here, but for the ones that weren't clearly irrelevant, I went ahead and included.

Searching 8026 files for "terms and conditions"

~/code/vets-website/src/applications/dhp-connected-devices/components/TermsAndConditions.jsx:
   44              rel="noreferrer"
   45            >
   46:             VA.gov Terms and Conditions,
   47            </a>{' '}
   48            in addition to the following terms.

~/code/vets-website/src/applications/dhp-connected-devices/tests/components/TermsAndConditions.spec.jsx:
    4  import { TermsAndConditions } from '../../components/TermsAndConditions';
    5  
    6: describe('Terms and Conditions', () => {
    7    const deviceNoTsAndCs = {
    8      name: 'Test Vendor',
    .
   15    };
   16  
   17:   it('Renders vendor terms and conditions', () => {
   18      const screen = render(<TermsAndConditions device={fitbitDevice} />);
   19      expect(screen.getByTestId('fitbit-terms-and-conditions')).to.exist;

~/code/vets-website/src/applications/fry-dea/config/form.js:
 1064                            target="_blank"
 1065                          >
 1066:                           View Terms and Conditions and Privacy Policy.
 1067                          </a>
 1068                        </>

~/code/vets-website/src/applications/my-education-benefits/components/TextNotificationsDisclaimer.jsx:
   25            target="_blank"
   26          >
   27:           Read our text notification terms and conditions
   28          </a>
   29        </p>
~/code/vets-website/src/applications/my-education-benefits/config/form.js:
  998                        target="_blank"
  999                      >
 1000:                       View Terms and Conditions and Privacy Policy.
 1001                      </a>
 1002                    </>

~/code/vets-website/src/applications/terms-and-conditions/manifest.json:
    1  {
    2:   "appName": "Terms and Conditions",
    3    "entryFile": "./terms-and-conditions-entry.js",
    4    "entryName": "terms-and-conditions",

~/code/vets-website/src/applications/terms-and-conditions/containers/MhvTermsAndConditions.jsx:
   72        ? {
   73            headline:
   74:             'You’ve accepted the Terms and Conditions for using VA.gov health tools',
   75            content: '',
   76            status: 'success',
   ..
   78        : {
   79            headline:
   80:             'Accept our terms and conditions to use VA.gov health tools',
   81            content: (
   82              <>
   83                <p>
   84                  Before you can use the health tools on VA.gov, you’ll need to
   85:                 read and agree to the terms and conditions below. This will give
   86                  us permission to share your VA medical information with you so
   87                  you can:
   ..
  124          disabled={loading.acceptance}
  125        >
  126:         Accept terms and conditions
  127        </button>
  128      );
  ...
  134        return (
  135          <AlertBox
  136:           headline="We failed to process the terms and conditions"
  137            content="We’re sorry. Something went wrong on our end. Please try again later."
  138            isVisible
  ...
  148          <LoadingIndicator
  149            setFocus
  150:           message="Accepting terms and conditions..."
  151          />
  152        );
  ...
  155      if (loading.tc || loading.acceptance) {
  156        return (
  157:         <LoadingIndicator setFocus message="Loading terms and conditions..." />
  158        );
  159      }
  ...
  163      return (
  164        <>
  165:         <h1>Terms and conditions for medical information</h1>
  166          {this.renderBanner()}
  167          <form onSubmit={this.handleSubmit}>
  168:           <h2>Terms and conditions</h2>
  169            <div
  170              dangerouslySetInnerHTML={{ __html: termsContent }}
  ...
  186                className="columns medium-9"
  187                role="region"
  188:               aria-label="Terms and Conditions"
  189              >
  190                {this.renderTermsAndConditions()}

~/code/vets-website/src/applications/terms-and-conditions/tests/00.terms-and-conditions.cypress.spec.js:
    1  import manifest from '../manifest.json';
    2  
    3: describe('Terms and Conditions test', () => {
    4    it('Page loads and passes accessibility check', () => {
    5      cy.visit(manifest.rootUrl);

~/code/vets-website/src/applications/terms-and-conditions/tests/containers/MhvTermsAndConditions.unit.spec.jsx:
   19        title: 'T&C',
   20        headerContent: 'header',
   21:       termsContent: 'terms and conditions',
   22        yesContent: 'agree',
   23      },
   ..
   56    });
   57  
   58:   it('should show a loading indicator when fetching terms and conditions', () => {
   59      const newProps = set('loading.tc', true, props);
   60      const wrapper = shallow(<MhvTermsAndConditions {...newProps} />);
   61      const loader = wrapper.find('LoadingIndicator');
   62      expect(loader.exists()).to.be.true;
   63:     expect(loader.prop('message')).to.eq('Loading terms and conditions...');
   64      wrapper.unmount();
   65    });
   ..
   70      const loader = wrapper.find('LoadingIndicator');
   71      expect(loader.exists()).to.be.true;
   72:     expect(loader.prop('message')).to.eq('Loading terms and conditions...');
   73      wrapper.unmount();
   74    });
   75  
   76:   it('should show a loading indicator when accepting terms and conditions', () => {
   77      const newProps = set('loading.acceptance', true, props);
   78      const wrapper = shallow(<MhvTermsAndConditions {...newProps} />);
   ..
   80      const loader = wrapper.find('LoadingIndicator');
   81      expect(loader.exists()).to.be.true;
   82:     expect(loader.prop('message')).to.eq('Accepting terms and conditions...');
   83      wrapper.unmount();
   84    });
   ..
   92      expect(alertBox.prop('status')).to.eq('success');
   93      expect(alertBox.prop('headline')).to.eq(
   94:       'You’ve accepted the Terms and Conditions for using VA.gov health tools',
   95      );
   96      wrapper.unmount();

~/code/vets-website/src/applications/terms-and-conditions/tests/reducers/index.unit.spec.js:
   15  } from '../../actions';
   16  
   17: describe('Terms and conditions reducer', () => {
   18    it('should be loading when accepting terms', () => {
   19      const state = reducer(undefined, { type: ACCEPTING_LATEST_TERMS });

~/code/vets-website/src/applications/toe/config/form.js:
 1047                          target="_blank"
 1048                        >
 1049:                         Read our text notifications terms and conditions
 1050                        </a>
 1051                      </p>

~/code/vets-website/src/applications/toe/tests/fixtures/data/form-submission-test-data.js:
 2215                                    rel: 'noopener noreferrer',
 2216                                    target: '_blank',
 2217:                                   children: 'View Terms and Conditions',
 2218                                  },
 2219                                  _owner: null,

~/code/vets-website/src/platform/forms/selectors/review/index.js:
   22        required: false,
   23        field: 'AGREED',
   24:       label: 'I agree to the terms and conditions.',
   25        error: 'You must accept the agreement before submitting.',
   26        ...preSubmitInfo,

~/code/vets-website/src/platform/forms-system/src/js/review/SubmitController.jsx:
   36      required: false,
   37      field: 'AGREED',
   38:     label: 'I agree to the terms and conditions.',
   39      error: 'You must accept the agreement before submitting.',
   40      ...formConfig.preSubmitInfo,

~/code/vets-website/src/platform/forms-system/test/js/review/SubmitController.unit.spec.jsx:
  710      const customComponent = tree.getByText('Hello from CustomComponent!');
  711      const defaultComponent = tree.queryAllByText(
  712:       'I agree to the terms and conditions.',
  713      );
  714  
  ...
  758      const customComponent = tree.queryAllByText('Hello from CustomComponent!');
  759      const defaultComponent = tree.container.querySelector(
  760:       'va-checkbox[label="I agree to the terms and conditions."]',
  761      );
  762  

~/code/vets-website/src/platform/static-data/error-messages.jsx:
   61              <li>
   62                <strong>
   63:                 Did you forget to accept My HealtheVet's terms and conditions?
   64                </strong>{' '}
   65                You need to sign in to My HealtheVet and accept their terms and

~/code/vets-website/src/platform/user/authorization/components/AcceptTermsPrompt.jsx:
  109            className="small-12 columns usa-content"
  110            role="region"
  111:           aria-label="Terms and Conditions"
  112            tabIndex="0"
  113          >
  ...
  116            <div className="terms-box">
  117              <div className="terms-head">
  118:               Scroll to read the full terms and conditions to continue
  119              </div>
  120              <div className="terms-scroller" onScroll={this.handleScroll}>

~/code/vets-website/src/platform/user/authorization/containers/MHVApp.jsx:
  176  
  177      const alertProps = {
  178:       headline: `Thank you for accepting the Terms and Conditions for using VA.gov health tools`,
  179        content: <p>You can now access health tools on VA.gov.</p>,
  180        onCloseAlert: this.closeTcAcceptanceMessage,
  ...
  316            <LoadingIndicator
  317              setFocus
  318:             message="Redirecting to terms and conditions..."
  319            />
  320          );

~/code/vets-website/src/platform/user/tests/authorization/containers/MHVApp.unit.spec.jsx:
   89        wrapper,
   90        'success',
   91:       'Thank you for accepting the Terms and Conditions for using VA.gov health tools',
   92      );
   93      wrapper.unmount();

47 matches across 22 files
Searching 8026 files for "rules of use"

0 matches
Searching 8026 files for "terms"
~/code/vets-website/babel.config.json:
  134:           "@department-of-veterans-affairs/platform-user/AcceptTermsPrompt": "./src/platform/user/authorization/components/AcceptTermsPrompt.jsx",
  137:           "@department-of-veterans-affairs/platform-user/RequiredTermsAcceptanceView": "./src/platform/user/authorization/container/RequiredTermsAcceptanceView.jsx",

~/code/vets-website/src/applications/dhp-connected-devices/components/DeviceDisconnectionCard.jsx:
    3  import environment from 'platform/utilities/environment';
    4  import { DisconnectModal } from './DisconnectModal';
    5: import { TermsAndConditions } from './TermsAndConditions';
    6  
    7  export const DeviceDisconnectionCard = ({ device }) => {
    .
   33            <span className="connected-header-text"> - Connected</span>{' '}
   34          </h3>
   35:         <TermsAndConditions device={device} />
   36          <p className="vads-u-margin-y--0">
   37            <button

Content-build

Searching 1142 files for "terms of use"

0 matches
Searching 1142 files for "terms of service"

0 matches
Searching 1142 files for "terms and conditions"
~/code/content-build/src/applications/registry.json:
  138    },
  139    {
  140:     "appName": "Terms and Conditions",
  141      "entryName": "terms-and-conditions",
  142      "rootUrl": "/health-care/medical-information-terms-conditions",
  143      "template": {
  144:       "title": "Terms and Conditions for Medical Information",
  145        "layout": "page-react.html",
  146        "includeBreadcrumbs": true

2 matches in 1 file
Searching 1142 files for "rules of use"

0 matches
Searching 1142 files for "Terms & Conditions"

0 matches
jilladams commented 1 year ago

This can be a starting point for us to get a check from devs, but in general, @jtmst if you have a few mins to take a look as a pre-refinement thing, we might be done here, or can pull in for whatever add'l work we may need.

laurwill commented 1 year ago

Hi @jilladams , the unified terms of use product just went through design intent, and they're aiming to launch end of September. Would it be possible to slot in this audit work before the end of August, so our team has time to adjust the pages you identify? Thank you!

jilladams commented 1 year ago

@laurwill ack. I do think my notes above are sufficient, but I'll prioritize getting a 2nd opinion on that and confirming. Thanks for reminding!

jilladams commented 1 year ago

@laurwill confirmed, the code level audit is good.

CMS-wise:

Terms & Conditions / terms and conditions:

Terms of use:

Terms of Service:

Let me know if you need more info here!

laurwill commented 1 year ago

Thanks so much @jilladams ! This is great — I'll move these hits into an epic for our team to assess each one for updates.

laurwill commented 1 year ago

@jilladams your note above says "CMS-wise" — so is the list in your last comment only the unauthenticated pages? Is there a separate list of hits in the authenticated experience?

jilladams commented 1 year ago

Oh sorry, no -- I just meant: audits look in 2 places: In the content-build/vets-website code, and within CMS content. We've covered both here, as far as I'm aware. But: we don't much deal with the authenticated experience, so I will check with @davidconlon for further info on what the auth experience might entail if anything additional.

laurwill commented 1 year ago

Ah okay — one place I know is missing from the "Terms of use" list is the sign-in modal. Would this type of audit not pick up mentions in modals or other specific types of content outside the CMS?

jilladams commented 1 year ago

That one is covered in the top vets-website result, in ~/code/vets-website/src/platform/user/authentication/components/FedWarning.jsx. That file contains the header and the content for the Terms of Use language that gets used in the auth modal.

To clarify my open question for Dave (that I'll follow up on today): In theory: everything not CMS related and veteran facing should be captured in the vets-website search, I think. But there may be authed apps with different front-ends you can reach via va.gov that our team doesnt know about / know where the code lives. But I guess: any instances like that would also fall outside your scope? Your team is involved on va.gov specifically, and not any other subdomains, right?

jilladams commented 1 year ago

@laurwill discussed with Dave today, and he flagged that Public Websites can really only speak to the unauthed experience. Questions about the authed experience should go to the Authenticated or Benefits teams, just to make sure that our scan of vets-website includes any front-end Veteran experience that might be happening within the VA.gov authed experience.

laurwill commented 1 year ago

Hi @jilladams , thanks for that clarification! I thought this audit process included auth content, so this is great to know. Just to clarify, is there a separate audit process through Auth and Benefits teams, or are you saying to show those teams this audit and ask if it's missing anything?

jilladams commented 1 year ago

I don't know about an audit process for those teams, so would probably need to ask them, and also sharing our list would be a great starting point for them to confirm if vets-website does / doesn't cover all of their veteran-facing code.

FranECross commented 8 months ago

@jilladams Do you know what the status of this ticket is? Something we should address and pull into Next Refinement, or icebox? Thanks in advance!

jilladams commented 8 months ago

We can close this ticket, as the audit is complete, and CAIA would let us know if they needed more here. thanks for checking.