Skip to content

Commit 18ac69e

Browse files
authored
Merge pull request #1623 from w3c/development
Create November 6, 2025 Release Includes the following changes: * #1620, which addresses #1611 * #1605 * #1622, which addresses comment from #1603 * #1613, which addresses #1521 * #1618, which addresses #1610 * #1617
2 parents adb1745 + f5d92fe commit 18ac69e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1421
-443
lines changed

client/components/App/App.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ const App = () => {
7171
<Nav.Link
7272
as={Link}
7373
to="/reports"
74-
aria-current={location.pathname.startsWith('/report')}
74+
aria-current={
75+
location.pathname.startsWith('/report') ||
76+
location.pathname.startsWith('/aria-html-feature')
77+
}
7578
>
7679
AT Interoperability Reports
7780
</Nav.Link>

client/components/Reports/AriaHtmlFeatureDetailReport.jsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import PageStatus from '../common/PageStatus';
1010
import { ARIA_HTML_FEATURE_DETAIL_REPORT_QUERY } from './queries';
1111

1212
const AriaHtmlFeatureDetailReport = () => {
13-
const { atId, browserId, refId } = useParams();
13+
const { atId, browserId, refId, refType } = useParams();
1414

1515
const { loading, data, error } = useQuery(
1616
ARIA_HTML_FEATURE_DETAIL_REPORT_QUERY,
1717
{
18-
variables: { refId, atId, browserId },
18+
variables: { refId, refType, atId, browserId },
1919
fetchPolicy: 'cache-and-network'
2020
}
2121
);
@@ -57,6 +57,12 @@ const AriaHtmlFeatureDetailReport = () => {
5757
return nameA.localeCompare(nameB);
5858
});
5959

60+
let downloadURI = `/api/metrics/aria-html-features/details.csv?refId=${refId}&at=${encodeURIComponent(
61+
at.name
62+
)}&browser=${encodeURIComponent(browser.name)}`;
63+
if (refType)
64+
downloadURI = `${downloadURI}&refType=${encodeURIComponent(refType)}`;
65+
6066
return (
6167
<>
6268
<Helmet>
@@ -135,14 +141,7 @@ const AriaHtmlFeatureDetailReport = () => {
135141
</tbody>
136142
</Table>
137143

138-
<Button
139-
href={`/api/metrics/aria-html-features/details.csv?refId=${refId}&at=${encodeURIComponent(
140-
at.name
141-
)}&browser=${encodeURIComponent(browser.name)}`}
142-
download
143-
variant="primary"
144-
className="mb-3"
145-
>
144+
<Button href={downloadURI} download variant="primary" className="mb-3">
146145
Download CSV
147146
</Button>
148147

client/components/Reports/FeatureSupportTable.jsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@ import ProgressBar from '@components/common/ProgressBar';
66
import { None } from '@components/common/None';
77

88
const columnName = ({ atName, browserName }) => `${atName} and ${browserName}`;
9-
const none = None();
9+
const none = None('No Data');
1010

1111
const FeatureSupportTable = ({ featureData, featureLabel }) => {
1212
const supportCombos = [...new Set(featureData.map(columnName))];
13+
supportCombos.sort((a, b) => a.localeCompare(b));
1314

1415
const dataByFeature = {};
1516
const links = {};
1617
for (const row of featureData) {
17-
if (!dataByFeature[row.refId]) {
18-
dataByFeature[row.refId] = {};
18+
if (!dataByFeature[row.rawValue]) {
19+
dataByFeature[row.rawValue] = {};
1920
}
20-
links[row.refId] = { href: row.value, text: row.linkText };
21-
dataByFeature[row.refId][columnName(row)] = row;
21+
links[row.rawValue] = { href: row.value, text: row.linkText };
22+
dataByFeature[row.rawValue][columnName(row)] = row;
2223
}
2324

2425
const keys = Object.keys(dataByFeature).sort();
@@ -54,7 +55,7 @@ const FeatureSupportTable = ({ featureData, featureLabel }) => {
5455

5556
if (!row) return <td key={key + col}>{none}</td>;
5657

57-
const detailLink = `/aria-html-feature/${row.atId}/${row.browserId}/${key}`;
58+
const detailLink = `/aria-html-feature/${row.atId}/${row.browserId}/${key}/${row.type}`;
5859
return (
5960
<td key={key + col}>
6061
<Link

client/components/Reports/Reports.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const Reports = () => {
4444
<KeyMetricsBanner />
4545
<section className={clsx(reportsStyles.contentSection)}>
4646
<h1>Assistive Technology Interoperability Reports</h1>
47-
<p>Loading...</p>
47+
<p>Loading ...</p>
4848
</section>
4949
</Container>
5050
);

client/components/Reports/SummarizeTestPlanReport.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const SummarizeTestPlanReport = ({ testPlanVersion, testPlanReports }) => {
5353
atVersion: recommendedAtVersion
5454
};
5555

56-
const none = None();
56+
const none = None('No Data');
5757

5858
const renderVersionsSummaryTable = () => {
5959
if (testPlanVersion.phase !== 'RECOMMENDED') return null;

client/components/Reports/SummarizeTestPlanReports.jsx

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { Helmet } from 'react-helmet';
44
import { Link } from 'react-router-dom';
55
import { Container, Table } from 'react-bootstrap';
66
import clsx from 'clsx';
7-
import alphabetizeObjectBy from '../../utils/alphabetizeObjectBy';
87
import { derivePhaseName } from '../../utils/aria';
98
import { None } from '@components/common/None';
109
import { getTestPlanTargetTitle, getTestPlanVersionTitle } from './getTitles';
@@ -50,11 +49,14 @@ const SummarizeTestPlanReports = ({
5049
testPlanTargetsById[testPlanTarget.id] = testPlanTarget;
5150
});
5251
});
53-
testPlanTargetsById = alphabetizeObjectBy(testPlanTargetsById, keyValue =>
54-
getTestPlanTargetTitle(keyValue[1])
52+
const orderedColumns = Object.entries(testPlanTargetsById).map(
53+
([, data]) => data
54+
);
55+
orderedColumns.sort((a, b) =>
56+
getTestPlanTargetTitle(a).localeCompare(getTestPlanTargetTitle(b))
5557
);
5658

57-
const none = None();
59+
const none = None('No Data');
5860

5961
return (
6062
<Container
@@ -92,13 +94,11 @@ const SummarizeTestPlanReports = ({
9294
<thead>
9395
<tr>
9496
<th>Test Plan</th>
95-
{Object.values(testPlanTargetsById).map(
96-
testPlanTarget => (
97-
<th key={testPlanTarget.id}>
98-
{getTestPlanTargetTitle(testPlanTarget)}
99-
</th>
100-
)
101-
)}
97+
{orderedColumns.map(testPlanTarget => (
98+
<th key={testPlanTarget.id}>
99+
{getTestPlanTargetTitle(testPlanTarget)}
100+
</th>
101+
))}
102102
</tr>
103103
</thead>
104104
<tbody>
@@ -128,43 +128,41 @@ const SummarizeTestPlanReports = ({
128128
{derivePhaseName(phase)}
129129
</span>
130130
</td>
131-
{Object.values(testPlanTargetsById).map(
132-
testPlanTarget => {
133-
const testPlanReport = testPlanReports.find(
134-
testPlanReport =>
135-
testPlanReport.at.id ===
136-
testPlanTarget.at.id &&
137-
testPlanReport.browser.id ===
138-
testPlanTarget.browser.id
139-
);
131+
{orderedColumns.map(testPlanTarget => {
132+
const testPlanReport = testPlanReports.find(
133+
testPlanReport =>
134+
testPlanReport.at.id ===
135+
testPlanTarget.at.id &&
136+
testPlanReport.browser.id ===
137+
testPlanTarget.browser.id
138+
);
140139

141-
if (!testPlanReport) {
142-
return (
143-
<td
144-
key={`${testPlanVersion.id}-${testPlanTarget.id}`}
145-
>
146-
{none}
147-
</td>
148-
);
149-
}
150-
const metrics = testPlanReport.metrics;
140+
if (!testPlanReport) {
151141
return (
152-
<td key={testPlanReport.id}>
153-
<Link
154-
to={
155-
`/report/${testPlanVersion.id}` +
156-
`/targets/${testPlanReport.id}`
157-
}
158-
aria-label={`${metrics.supportPercent}%`}
159-
>
160-
<ProgressBar
161-
progress={metrics.supportPercent}
162-
/>
163-
</Link>
142+
<td
143+
key={`${testPlanVersion.id}-${testPlanTarget.id}`}
144+
>
145+
{none}
164146
</td>
165147
);
166148
}
167-
)}
149+
const metrics = testPlanReport.metrics;
150+
return (
151+
<td key={testPlanReport.id}>
152+
<Link
153+
to={
154+
`/report/${testPlanVersion.id}` +
155+
`/targets/${testPlanReport.id}`
156+
}
157+
aria-label={`${metrics.supportPercent}%`}
158+
>
159+
<ProgressBar
160+
progress={metrics.supportPercent}
161+
/>
162+
</Link>
163+
</td>
164+
);
165+
})}
168166
</tr>
169167
);
170168
})}

client/components/Reports/SummarizeTestPlanVersion.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const SummarizeTestPlanVersion = ({ testPlanVersion, testPlanReports }) => {
3636
return 0;
3737
});
3838

39-
const none = None();
39+
const none = None('No Data');
4040

4141
return (
4242
<Container

client/components/Reports/queries.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export const REPORTS_PAGE_QUERY = gql`
3535
}
3636
}
3737
}
38-
3938
ariaHtmlFeaturesMetrics {
4039
ariaFeaturesPassedCount
4140
ariaFeaturesCount
@@ -49,7 +48,9 @@ export const REPORTS_PAGE_QUERY = gql`
4948
refId
5049
type
5150
linkText
51+
rawLinkText
5252
value
53+
rawValue
5354
total
5455
passed
5556
failed
@@ -61,7 +62,9 @@ export const REPORTS_PAGE_QUERY = gql`
6162
refId
6263
type
6364
linkText
65+
rawLinkText
6466
value
67+
rawValue
6568
total
6669
passed
6770
failed
@@ -73,7 +76,9 @@ export const REPORTS_PAGE_QUERY = gql`
7376
refId
7477
type
7578
linkText
79+
rawLinkText
7680
value
81+
rawValue
7782
total
7883
passed
7984
failed
@@ -89,7 +94,9 @@ export const REPORTS_PAGE_QUERY = gql`
8994
refId
9095
type
9196
linkText
97+
rawLinkText
9298
value
99+
rawValue
93100
total
94101
passed
95102
failed
@@ -186,11 +193,13 @@ export const ARIA_HTML_FEATURE_DETAIL_REPORT_QUERY = gql`
186193
${BROWSER_FIELDS}
187194
query AriaHtmlFeatureDetailReport(
188195
$refId: String!
196+
$refType: String
189197
$atId: ID!
190198
$browserId: ID!
191199
) {
192200
ariaHtmlFeatureDetailReport(
193201
refId: $refId
202+
refType: $refType
194203
atId: $atId
195204
browserId: $browserId
196205
) {

client/components/TestPlanVersionsPage/index.jsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useMemo, useRef } from 'react';
22
import { useQuery } from '@apollo/client';
33
import { TEST_PLAN_VERSIONS_PAGE_QUERY } from './queries';
44
import PageStatus from '../common/PageStatus';
5-
import { useParams } from 'react-router-dom';
5+
import { useParams, Navigate } from 'react-router-dom';
66
import { Helmet } from 'react-helmet';
77
import { Container, Table } from 'react-bootstrap';
88
import VersionString from '../common/VersionString';
@@ -23,7 +23,8 @@ import styles from './TestPlanVersionsPage.module.css';
2323
import commonStyles from '../common/styles.module.css';
2424

2525
const TestPlanVersionsPage = () => {
26-
const { testPlanDirectory } = useParams();
26+
const params = useParams();
27+
const testPlanDirectory = params['*']?.replace(/\/$/, '') || '';
2728

2829
const { loading, data, error } = useQuery(TEST_PLAN_VERSIONS_PAGE_QUERY, {
2930
variables: { testPlanDirectory },
@@ -37,9 +38,13 @@ const TestPlanVersionsPage = () => {
3738
// GraphQL results are read only so they need to be cloned
3839
// before passing to SortableIssuesTable
3940
const issues = useMemo(() => {
40-
return data ? [...data.testPlan.issues] : [];
41+
return data?.testPlan?.issues ? [...data.testPlan.issues] : [];
4142
}, [data]);
4243

44+
if (data && !data.testPlan) {
45+
return <Navigate to="/404" replace />;
46+
}
47+
4348
if (error) {
4449
return (
4550
<PageStatus

client/components/TestQueue/Actions.jsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,20 @@ const Actions = ({
240240
variant="primary"
241241
disabled={!selfAssignedRun}
242242
href={selfAssignedRun ? `/run/${selfAssignedRun.id}` : undefined}
243+
target={selfAssignedRun ? '_blank' : undefined}
244+
onClick={e => {
245+
if (!selfAssignedRun) {
246+
e.preventDefault();
247+
e.stopPropagation();
248+
return;
249+
}
250+
e.preventDefault();
251+
if (window.PUPPETEER_TESTING) {
252+
window.location.href = `/run/${selfAssignedRun.id}`;
253+
} else {
254+
window.open(`/run/${selfAssignedRun.id}`, '_blank');
255+
}
256+
}}
243257
>
244258
{selfAssignedRun?.testResultsLength
245259
? 'Continue Testing'
@@ -260,6 +274,18 @@ const Actions = ({
260274
key={testPlanRun.id}
261275
role="menuitem"
262276
href={`/run/${testPlanRun.id}?user=${testPlanRun.tester.id}`}
277+
target="_blank"
278+
onClick={e => {
279+
e.preventDefault();
280+
if (window.PUPPETEER_TESTING) {
281+
window.location.href = `/run/${testPlanRun.id}?user=${testPlanRun.tester.id}`;
282+
} else {
283+
window.open(
284+
`/run/${testPlanRun.id}?user=${testPlanRun.tester.id}`,
285+
'_blank'
286+
);
287+
}
288+
}}
263289
>
264290
{testPlanRun.tester.username}
265291
</Dropdown.Item>

0 commit comments

Comments
 (0)