Merge pull request #8298 from keithjgrant/7677-a11y-text

Add accessibility labels to job status/cloud sync icons

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
This commit is contained in:
softwarefactory-project-zuul[bot]
2020-10-05 21:54:01 +00:00
committed by GitHub
4 changed files with 29 additions and 15 deletions

View File

@@ -93,42 +93,43 @@ SkippedBottom.displayName = 'SkippedBottom';
const StatusIcon = ({ status, ...props }) => { const StatusIcon = ({ status, ...props }) => {
return ( return (
<div {...props} data-job-status={status}> <div {...props} data-job-status={status} aria-label={status}>
{status === 'running' && <RunningJob />} {status === 'running' && <RunningJob aria-hidden="true" />}
{(status === 'new' || {(status === 'new' ||
status === 'pending' || status === 'pending' ||
status === 'waiting' || status === 'waiting' ||
status === 'never updated') && <WaitingJob />} status === 'never updated') && <WaitingJob aria-hidden="true" />}
{(status === 'failed' || status === 'error' || status === 'canceled') && ( {(status === 'failed' || status === 'error' || status === 'canceled') && (
<FinishedJob> <FinishedJob aria-hidden="true">
<FailedTop /> <FailedTop />
<FailedBottom /> <FailedBottom />
</FinishedJob> </FinishedJob>
)} )}
{(status === 'successful' || status === 'ok') && ( {(status === 'successful' || status === 'ok') && (
<FinishedJob> <FinishedJob aria-hidden="true">
<SuccessfulTop /> <SuccessfulTop />
<SuccessfulBottom /> <SuccessfulBottom />
</FinishedJob> </FinishedJob>
)} )}
{status === 'changed' && ( {status === 'changed' && (
<FinishedJob> <FinishedJob aria-hidden="true">
<ChangedTop /> <ChangedTop />
<ChangedBottom /> <ChangedBottom />
</FinishedJob> </FinishedJob>
)} )}
{status === 'skipped' && ( {status === 'skipped' && (
<FinishedJob> <FinishedJob aria-hidden="true">
<SkippedTop /> <SkippedTop />
<SkippedBottom /> <SkippedBottom />
</FinishedJob> </FinishedJob>
)} )}
{status === 'unreachable' && ( {status === 'unreachable' && (
<FinishedJob> <FinishedJob aria-hidden="true">
<UnreachableTop /> <UnreachableTop />
<UnreachableBottom /> <UnreachableBottom />
</FinishedJob> </FinishedJob>
)} )}
<span className="pf-screen-reader"> {status} </span>
</div> </div>
); );
}; };

View File

@@ -29,13 +29,21 @@ export default function SyncStatusIndicator({ status, title }) {
if (status === 'syncing') { if (status === 'syncing') {
return ( return (
<PulseWrapper> <>
<CloudIcon color={`var(${color})`} title={title} /> <PulseWrapper aria-hidden="true">
</PulseWrapper> <CloudIcon color={`var(${color})`} title={title} />
</PulseWrapper>
<span className="pf-screen-reader">{status}</span>
</>
); );
} }
return <CloudIcon color={`var(${color})`} title={title} />; return (
<>
<CloudIcon color={`var(${color})`} title={title} aria-hidden="true" />
<span className="pf-screen-reader">{status}</span>
</>
);
} }
SyncStatusIndicator.propTypes = { SyncStatusIndicator.propTypes = {
status: oneOf(['success', 'error', 'disabled', 'syncing']).isRequired, status: oneOf(['success', 'error', 'disabled', 'syncing']).isRequired,

View File

@@ -28,14 +28,18 @@ describe('<JobDetail />', () => {
expect(wrapper.find(`Detail[label="${label}"] dd`).text()).toBe(value); expect(wrapper.find(`Detail[label="${label}"] dd`).text()).toBe(value);
} }
assertDetail('Status', 'Successful'); // StatusIcon adds visibly hidden accessibility text " successful "
assertDetail('Status', ' successful Successful');
assertDetail('Started', '8/8/2019, 7:24:18 PM'); assertDetail('Started', '8/8/2019, 7:24:18 PM');
assertDetail('Finished', '8/8/2019, 7:24:50 PM'); assertDetail('Finished', '8/8/2019, 7:24:50 PM');
assertDetail('Job Template', mockJobData.summary_fields.job_template.name); assertDetail('Job Template', mockJobData.summary_fields.job_template.name);
assertDetail('Job Type', 'Run'); assertDetail('Job Type', 'Run');
assertDetail('Launched By', mockJobData.summary_fields.created_by.username); assertDetail('Launched By', mockJobData.summary_fields.created_by.username);
assertDetail('Inventory', mockJobData.summary_fields.inventory.name); assertDetail('Inventory', mockJobData.summary_fields.inventory.name);
assertDetail('Project', mockJobData.summary_fields.project.name); assertDetail(
'Project',
` successful ${mockJobData.summary_fields.project.name}`
);
assertDetail('Revision', mockJobData.scm_revision); assertDetail('Revision', mockJobData.scm_revision);
assertDetail('Playbook', mockJobData.playbook); assertDetail('Playbook', mockJobData.playbook);
assertDetail('Verbosity', '0 (Normal)'); assertDetail('Verbosity', '0 (Normal)');

View File

@@ -103,7 +103,8 @@ describe('HostEventModal', () => {
expect(wrapper.find(`Detail[label="${label}"] dd`).text()).toBe(value); expect(wrapper.find(`Detail[label="${label}"] dd`).text()).toBe(value);
} }
assertDetail('Host Name', 'foo'); // StatusIcon adds visibly hidden accessibility text " changed "
assertDetail('Host Name', ' changed foo');
assertDetail('Play', 'all'); assertDetail('Play', 'all');
assertDetail('Task', 'command'); assertDetail('Task', 'command');
assertDetail('Module', 'command'); assertDetail('Module', 'command');