Skip to content

Commit 2c54bb4

Browse files
authored
Merge pull request #1624 from w3c/releases
November 6, 2025 Production Release [v1.25.0] Includes changes recently included in the [releases branch](https://github.com/w3c/aria-at-app/tree/releases) through #1623. [Latest CHANGELOG.md update: v1.25.0](https://github.com/w3c/aria-at-app/blob/development/CHANGELOG.md#1250-2025-11-06).
2 parents 284ae40 + efe4acd commit 2c54bb4

Some content is hidden

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

49 files changed

+1437
-444
lines changed

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
## [1.25.0](https://github.com/w3c/aria-at-app/compare/v1.24.0...v1.25.0) (2025-11-06)
2+
3+
4+
### Features
5+
6+
* open new tab, close tab and return to open queue on save ([#1605](https://github.com/w3c/aria-at-app/issues/1605)) ([ed52cfe](https://github.com/w3c/aria-at-app/commit/ed52cfe4c438c0d85ac1f27c379b7e63e5650636))
7+
* Support for subfolders in `/aria-at/tests/*` ([#1613](https://github.com/w3c/aria-at-app/issues/1613)) ([849301d](https://github.com/w3c/aria-at-app/commit/849301d58ad6f800eeba71427f5c5725b9147f41))
8+
9+
10+
### Bug Fixes
11+
12+
* Consistent column order for ARIA and HTML Features tabs ([#1620](https://github.com/w3c/aria-at-app/issues/1620)) ([eabc6e0](https://github.com/w3c/aria-at-app/commit/eabc6e04aa250e25e18f03726a8d2232161c1190))
13+
* Prefer "No Data" instead of "None" on reports pages ([#1622](https://github.com/w3c/aria-at-app/issues/1622)) ([9e89b8a](https://github.com/w3c/aria-at-app/commit/9e89b8ad228ea96cf11422a13ddf254c77f5cf3a))
14+
* Support dynamic renames of `aria-at/support.json/references` properties ([#1617](https://github.com/w3c/aria-at-app/issues/1617)) ([f5d92fe](https://github.com/w3c/aria-at-app/commit/f5d92fe3fc9d1692af0e3ec5ec86ca9587980696)), closes [#1618](https://github.com/w3c/aria-at-app/issues/1618)
15+
116
## [1.24.0](https://github.com/w3c/aria-at-app/compare/v1.23.0...v1.24.0) (2025-11-04)
217

318

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

0 commit comments

Comments
 (0)