Skip to content

Commit 7729eff

Browse files
authored
Merge pull request ucfopen#1062 from mbusch3/text-descriptions-and-integration
Finished text summaries and descriptions, adds ability to link text from other issues when it's repeated.
2 parents 4beabef + 20b7fc1 commit 7729eff

File tree

7 files changed

+887
-395
lines changed

7 files changed

+887
-395
lines changed

assets/js/Components/Forms/FormClarification.js

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,31 @@ export default function FormClarification({
1616

1717
// Compute what additional clarification text to show, if any.
1818
// First priority: Rule-specific descriptions from the translation file.
19-
const clarificationTag = 'rule.desc.' + activeIssue.scanRuleId
19+
const clarificationTag = 'rule.info.' + activeIssue.scanRuleId
2020
let messageArgs = {}
2121
if(activeIssue?.issueData?.metadata) {
2222
let metadata = JSON.parse(activeIssue.issueData.metadata)
23-
if(activeIssue.scanRuleId === 'text_quoted_correctly') {
24-
let quoteList = metadata.messageArgs.join(', ')
25-
messageArgs = { 'potentialQuotes': quoteList }
26-
}
27-
if(activeIssue.scanRuleId === 'aria_role_valid') {
28-
messageArgs = { 'tagName': metadata.messageArgs[1], 'ariaRole': metadata.messageArgs[0] }
23+
switch(activeIssue.scanRuleId) {
24+
case 'aria_child_valid':
25+
messageArgs = { 'parentRole': metadata.messageArgs[0], 'childRole': metadata.messageArgs[1] }
26+
break
27+
case 'aria_parent_required':
28+
messageArgs = { 'childRole': metadata.messageArgs[0], 'parentRole': metadata.messageArgs[1] }
29+
break
30+
case 'aria_role_valid':
31+
messageArgs = { 'ariaRole': metadata.messageArgs[0], 'tagName': metadata.messageArgs[1] }
32+
break
33+
case 'aria_attribute_redundant':
34+
messageArgs = { 'ariaAttribute': metadata.messageArgs[0], 'htmlAttribute': metadata.messageArgs[1] }
35+
break
36+
case 'rule.info.aria_attribute_conflict':
37+
messageArgs = { 'ariaAttribute': metadata.messageArgs[0], 'tagName': metadata.messageArgs[1] }
38+
break
39+
case 'text_quoted_correctly':
40+
messageArgs = { 'potentialQuotes': metadata.messageArgs.join(', ') }
41+
break
42+
default:
43+
messageArgs = {}
2944
}
3045
}
3146

@@ -36,16 +51,6 @@ export default function FormClarification({
3651
return
3752
}
3853

39-
// If there isn't a specific description from us, check for one in the
40-
const formName = formNameFromRule(activeIssue.scanRuleId)
41-
if(formName === 'review_only') {
42-
// There may be specific (ENGLISH-ONLY) text from the Equal Access scan.
43-
const metadata = activeIssue?.issueData?.metadata ? JSON.parse(activeIssue.issueData.metadata) : {}
44-
if(metadata.message && metadata.message !== "") {
45-
setClarification(metadata.message)
46-
return
47-
}
48-
}
4954
setClarification('')
5055

5156
}, [activeIssue])
@@ -59,7 +64,7 @@ export default function FormClarification({
5964
<InfoIcon className="icon-lg udoit-suggestion" alt="" />
6065
</div>
6166
<div className="flex-column justify-content-center">
62-
<div className="clarification-text">{clarification}</div>
67+
<div className="clarification-text" dangerouslySetInnerHTML={{__html: clarification}} />
6368
</div>
6469
</div>
6570
</div>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React from 'react';
2+
3+
export default function DisabilityLanguageIcon(props) {
4+
return (
5+
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" {...props}><path d="m603-202-34 97q-4 11-14 18t-22 7q-20 0-32.5-16.5T496-133l152-402q5-11 15-18t22-7h30q12 0 22 7t15 18l152 403q8 19-4 35.5T868-80q-13 0-22.5-7T831-106l-34-96H603ZM362-401 188-228q-11 11-27.5 11.5T132-228q-11-11-11-28t11-28l174-174q-35-35-63.5-80T190-640h84q20 39 40 68t48 58q33-33 68.5-92.5T484-720H80q-17 0-28.5-11.5T40-760q0-17 11.5-28.5T80-800h240v-40q0-17 11.5-28.5T360-880q17 0 28.5 11.5T400-840v40h240q17 0 28.5 11.5T680-760q0 17-11.5 28.5T640-720h-76q-21 72-63 148t-83 116l96 98-30 82-122-125Zm266 129h144l-72-204-72 204Z"/></svg>
6+
)
7+
}

assets/js/Components/Widgets/UfixitWidget.css

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,15 @@
2727
text-transform: uppercase;
2828
}
2929

30-
.dialog-indicator-container {
30+
.dialog-indicator-background {
3131
background-color: var(--gray-darker);
3232
margin: 0 -1rem;
3333
padding: .5rem 1rem;
34+
}
35+
36+
.dialog-indicator-container {
37+
max-width: calc(40em / .9);
38+
margin: 0 auto;
3439
color: var(--white);
3540
font-size: .9em;
3641
font-weight: 600;
@@ -212,7 +217,8 @@
212217
}
213218

214219
.ufixit-learn-container {
215-
max-width: 600px;
220+
max-width: 40em;
221+
margin: 0 auto;
216222

217223
a {
218224
color: var(--link-color);
@@ -252,8 +258,8 @@
252258
tbody tr {
253259
color: var(--text-color);
254260

255-
&:nth-child(odd) {
256-
background-color: var(--white);
261+
&:nth-child(even) {
262+
background-color: var(--background-color);
257263
}
258264

259265
td {
@@ -289,7 +295,7 @@
289295
}
290296

291297
.url-container {
292-
background-color: var(--gray-lighter);
298+
background-color: var(--gray-light);
293299
padding: .25em .5em;
294300
border-radius: 8px;
295301
}
@@ -321,7 +327,7 @@
321327

322328
dialog {
323329
width: 90vw;
324-
max-width: 70ch;
330+
max-width: 50em;
325331
overflow-y: auto;
326332
box-sizing: border-box;
327333
border: none;
@@ -336,6 +342,11 @@ dialog {
336342
height: 70vh;
337343
max-height: 650px;
338344
overflow-y: auto;
345+
346+
h4 {
347+
font-weight: 600;
348+
margin-top: .25em;
349+
}
339350
}
340351

341352
.ufixit-widget-dialog-header {
@@ -373,6 +384,11 @@ dialog {
373384
color: var(--white);
374385
border-radius: 4px;
375386
font-size: 0.9em;
387+
388+
strong {
389+
font-weight: 400;
390+
text-decoration: underline;
391+
}
376392
}
377393

378394
dialog::backdrop {

assets/js/Components/Widgets/UfixitWidget.js

Lines changed: 80 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import React, { useState, useEffect } from 'react'
22
import CloseIcon from '../Icons/CloseIcon'
33
import DisabilityCognitiveIcon from '../Icons/DisabilityCognitiveIcon'
44
import DisabilityHearingIcon from '../Icons/DisabilityHearingIcon'
5+
import DisabilityLanguageIcon from '../Icons/DisabilityLanguageIcon'
56
import DisabilityMotorIcon from '../Icons/DisabilityMotorIcon'
67
import DisabilityVisualIcon from '../Icons/DisabilityVisualIcon'
78
import FormClarification from '../Forms/FormClarification'
89
import FileForm from '../Forms/FileForm'
9-
import { disabilityTypes, disabilitiesFromRule, formFromIssue, formNameFromRule } from '../../Services/Ufixit'
10+
import { disabilityTypes, disabilitiesFromRule, formFromIssue, formNameFromRule, sharedRuleDescriptions, sharedRuleSummaries } from '../../Services/Ufixit'
1011
import './UfixitWidget.css'
1112

1213

@@ -31,8 +32,6 @@ export default function UfixitWidget({
3132
const [UfixitForm, setUfixitForm] = useState(null)
3233
const [formSummary, setFormSummary] = useState('')
3334
const [formLearnMore, setFormLearnMore] = useState('')
34-
const [showClarification, setShowClarification] = useState(false)
35-
const [showLearnMore, setShowLearnMore] = useState(false)
3635
const [disabilities, setDisabilities] = useState([])
3736
const [markAsReviewed, setMarkAsReviewed] = useState(false)
3837

@@ -73,37 +72,53 @@ export default function UfixitWidget({
7372
setUfixitForm(() => { return FileForm })
7473
setFormSummary(t('form.file.summary'))
7574
setFormLearnMore(t(`form.file.${tempActiveIssue.fileData.fileType}.learn_more`))
76-
setShowClarification(false)
77-
setShowLearnMore(true)
7875
setDisabilities([disabilityTypes.COGNITIVE, disabilityTypes.VISUAL])
7976
}
8077
else {
8178
setUfixitForm(() => formFromIssue(tempActiveIssue.issueData))
8279
setDisabilities(disabilitiesFromRule(tempActiveIssue.scanRuleId))
8380
let tempFormName = formNameFromRule(tempActiveIssue.scanRuleId)
84-
if(tempFormName === 'review_only') {
85-
setShowClarification(false)
86-
let ruleSummary = t(`rule.summary.${tempActiveIssue.scanRuleId}`)
87-
if(ruleSummary === `rule.summary.${tempActiveIssue.scanRuleId}`) {
88-
ruleSummary = formatEqualAccessMessage()
89-
}
90-
setFormSummary(ruleSummary)
81+
let tempSummaryKey = ''
82+
let tempDescriptionKey = ''
83+
84+
// ALL complete forms should have a summary and 'learn more' description.
85+
if(tempFormName !== 'review_only') {
86+
tempSummaryKey = `form.${tempFormName}.summary`
87+
tempDescriptionKey = `form.${tempFormName}.learn_more`
88+
}
89+
else {
90+
tempSummaryKey = `rule.summary.${tempActiveIssue.scanRuleId}`
91+
tempDescriptionKey = `rule.desc.${tempActiveIssue.scanRuleId}`
92+
}
93+
94+
let tempSummary = t(tempSummaryKey)
95+
let tempDescription = t(tempDescriptionKey)
9196

92-
let ruleLearnMore = t(`rule.desc.${tempActiveIssue.scanRuleId}`)
93-
if(ruleLearnMore === `rule.desc.${tempActiveIssue.scanRuleId}`) {
94-
setShowLearnMore(false)
97+
// If there isn't a specific summary for this rule, it may be using a shared summary.
98+
if(tempSummary === tempSummaryKey) {
99+
if(sharedRuleSummaries.hasOwnProperty(tempActiveIssue.scanRuleId)) {
100+
tempSummary = t(sharedRuleSummaries[tempActiveIssue.scanRuleId])
95101
}
102+
103+
// If there STILL isn't a specific summary for this rule, check to see if there's something in the metadata from Equal Access.
104+
// THIS IS NOT TRANSLATED, so it will only work in English.
96105
else {
97-
setShowLearnMore(true)
106+
tempSummary = formatEqualAccessMessage()
98107
}
99-
setFormLearnMore(ruleLearnMore)
100108
}
101-
else {
102-
setFormSummary(t(`form.${tempFormName}.summary`))
103-
setFormLearnMore(t(`form.${tempFormName}.learn_more`))
104-
setShowClarification(true)
105-
setShowLearnMore(true)
109+
110+
// If there isn't a specific description for this rule, it may be using a shared description.
111+
if(tempDescription === tempDescriptionKey) {
112+
if(sharedRuleDescriptions.hasOwnProperty(tempActiveIssue.scanRuleId)) {
113+
tempDescription = t(sharedRuleDescriptions[tempActiveIssue.scanRuleId])
114+
}
115+
else {
116+
tempDescription = ''
117+
}
106118
}
119+
120+
setFormSummary(tempSummary)
121+
setFormLearnMore(tempDescription)
107122
}
108123
}, [tempActiveIssue])
109124

@@ -159,19 +174,17 @@ export default function UfixitWidget({
159174
<div className="ufixit-instructions"
160175
dangerouslySetInnerHTML={{__html: formSummary}}
161176
/>
162-
{ showLearnMore && (
177+
{ formLearnMore !== "" && (
163178
<div className="flex-row justify-content-end mt-2">
164179
<button className="btn-link btn-small p-0" onClick={() => setShowLongDesc(true)}>
165180
<div>{t('fix.button.learn_more')}</div>
166181
</button>
167182
</div>
168183
)}
169-
{ showClarification && (
170-
<FormClarification
171-
t={t}
172-
activeIssue={tempActiveIssue}
173-
/>
174-
)}
184+
<FormClarification
185+
t={t}
186+
activeIssue={tempActiveIssue}
187+
/>
175188
</div>
176189

177190
<div className="ufixit-widget-label primary mb-1">{t('fix.label.barrier_repair')}</div>
@@ -217,37 +230,47 @@ export default function UfixitWidget({
217230
</div>
218231
</div>
219232
<div className="ufixit-widget-dialog-content flex-column flex-grow-1">
220-
{ disabilities.length > 0 && (<div className="dialog-indicator-container flex-row gap-2">
221-
<div className="flex-column align-self-center flex-shrink-0">
222-
{t('fix.label.affected')}
223-
</div>
224-
<div className="flex-row flex-wrap gap-1">
225-
{disabilities.includes(disabilityTypes.VISUAL) && (
226-
<div className='indicator-container active'>
227-
<DisabilityVisualIcon className="icon-md pe-2" alt=""/>
228-
<div className="flex-column align-self-center">{t('fix.label.disability.visual')}</div>
229-
</div>
230-
)}
231-
{disabilities.includes(disabilityTypes.HEARING) && (
232-
<div className='indicator-container active'>
233-
<DisabilityHearingIcon className="icon-md pe-2" alt=""/>
234-
<div className="flex-column align-self-center">{t('fix.label.disability.hearing')}</div>
233+
{ disabilities.length > 0 && (
234+
<div className="dialog-indicator-background">
235+
<div className="dialog-indicator-container flex-row gap-2">
236+
<div className="flex-column align-self-center flex-shrink-0">
237+
{t('fix.label.affected')}
235238
</div>
236-
)}
237-
{disabilities.includes(disabilityTypes.MOTOR) && (
238-
<div className='indicator-container active'>
239-
<DisabilityMotorIcon className="icon-md pe-2" alt=""/>
240-
<div className="flex-column align-self-center">{t('fix.label.disability.motor')}</div>
239+
<div className="flex-row flex-wrap gap-1">
240+
{disabilities.includes(disabilityTypes.VISUAL) && (
241+
<div className='indicator-container active'>
242+
<DisabilityVisualIcon className="icon-md pe-2" alt=""/>
243+
<div className="flex-column align-self-center">{t('fix.label.disability.visual')}</div>
244+
</div>
245+
)}
246+
{disabilities.includes(disabilityTypes.HEARING) && (
247+
<div className='indicator-container active'>
248+
<DisabilityHearingIcon className="icon-md pe-2" alt=""/>
249+
<div className="flex-column align-self-center">{t('fix.label.disability.hearing')}</div>
250+
</div>
251+
)}
252+
{disabilities.includes(disabilityTypes.LANGUAGE) && (
253+
<div className='indicator-container active'>
254+
<DisabilityLanguageIcon className="icon-md pe-2" alt=""/>
255+
<div className="flex-column align-self-center">{t('fix.label.disability.language')}</div>
256+
</div>
257+
)}
258+
{disabilities.includes(disabilityTypes.MOTOR) && (
259+
<div className='indicator-container active'>
260+
<DisabilityMotorIcon className="icon-md pe-2" alt=""/>
261+
<div className="flex-column align-self-center">{t('fix.label.disability.motor')}</div>
262+
</div>
263+
)}
264+
{disabilities.includes(disabilityTypes.COGNITIVE) && (
265+
<div className='indicator-container active'>
266+
<DisabilityCognitiveIcon className="icon-md pe-2" alt=""/>
267+
<div className="flex-column align-self-center">{t('fix.label.disability.cognitive')}</div>
268+
</div>
269+
)}
241270
</div>
242-
)}
243-
{disabilities.includes(disabilityTypes.COGNITIVE) && (
244-
<div className='indicator-container active'>
245-
<DisabilityCognitiveIcon className="icon-md pe-2" alt=""/>
246-
<div className="flex-column align-self-center">{t('fix.label.disability.cognitive')}</div>
247-
</div>
248-
)}
271+
</div>
249272
</div>
250-
</div>)}
273+
)}
251274
<div className="flex-grow-1 flex-column ufixit-learn-container pt-3 pb-3"
252275
dangerouslySetInnerHTML={{__html: formLearnMore }} />
253276
<div className="flex-row justify-content-center mb-3">

0 commit comments

Comments
 (0)