Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
## [1.25.0](https://github.com/w3c/aria-at-app/compare/v1.24.0...v1.25.0) (2025-11-06)


### Features

* 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))
* 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))


### Bug Fixes

* 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))
* 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))
* 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)

## [1.24.0](https://github.com/w3c/aria-at-app/compare/v1.23.0...v1.24.0) (2025-11-04)


Expand Down
5 changes: 4 additions & 1 deletion client/components/App/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ const App = () => {
<Nav.Link
as={Link}
to="/reports"
aria-current={location.pathname.startsWith('/report')}
aria-current={
location.pathname.startsWith('/report') ||
location.pathname.startsWith('/aria-html-feature')
}
>
AT Interoperability Reports
</Nav.Link>
Expand Down
19 changes: 9 additions & 10 deletions client/components/Reports/AriaHtmlFeatureDetailReport.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import PageStatus from '../common/PageStatus';
import { ARIA_HTML_FEATURE_DETAIL_REPORT_QUERY } from './queries';

const AriaHtmlFeatureDetailReport = () => {
const { atId, browserId, refId } = useParams();
const { atId, browserId, refId, refType } = useParams();

const { loading, data, error } = useQuery(
ARIA_HTML_FEATURE_DETAIL_REPORT_QUERY,
{
variables: { refId, atId, browserId },
variables: { refId, refType, atId, browserId },
fetchPolicy: 'cache-and-network'
}
);
Expand Down Expand Up @@ -57,6 +57,12 @@ const AriaHtmlFeatureDetailReport = () => {
return nameA.localeCompare(nameB);
});

let downloadURI = `/api/metrics/aria-html-features/details.csv?refId=${refId}&at=${encodeURIComponent(
at.name
)}&browser=${encodeURIComponent(browser.name)}`;
if (refType)
downloadURI = `${downloadURI}&refType=${encodeURIComponent(refType)}`;

return (
<>
<Helmet>
Expand Down Expand Up @@ -135,14 +141,7 @@ const AriaHtmlFeatureDetailReport = () => {
</tbody>
</Table>

<Button
href={`/api/metrics/aria-html-features/details.csv?refId=${refId}&at=${encodeURIComponent(
at.name
)}&browser=${encodeURIComponent(browser.name)}`}
download
variant="primary"
className="mb-3"
>
<Button href={downloadURI} download variant="primary" className="mb-3">
Download CSV
</Button>

Expand Down
13 changes: 7 additions & 6 deletions client/components/Reports/FeatureSupportTable.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,20 @@ import ProgressBar from '@components/common/ProgressBar';
import { None } from '@components/common/None';

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

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

const dataByFeature = {};
const links = {};
for (const row of featureData) {
if (!dataByFeature[row.refId]) {
dataByFeature[row.refId] = {};
if (!dataByFeature[row.rawValue]) {
dataByFeature[row.rawValue] = {};
}
links[row.refId] = { href: row.value, text: row.linkText };
dataByFeature[row.refId][columnName(row)] = row;
links[row.rawValue] = { href: row.value, text: row.linkText };
dataByFeature[row.rawValue][columnName(row)] = row;
}

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

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

const detailLink = `/aria-html-feature/${row.atId}/${row.browserId}/${key}`;
const detailLink = `/aria-html-feature/${row.atId}/${row.browserId}/${key}/${row.type}`;
return (
<td key={key + col}>
<Link
Expand Down
2 changes: 1 addition & 1 deletion client/components/Reports/Reports.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const Reports = () => {
<KeyMetricsBanner />
<section className={clsx(reportsStyles.contentSection)}>
<h1>Assistive Technology Interoperability Reports</h1>
<p>Loading...</p>
<p>Loading ...</p>
</section>
</Container>
);
Expand Down
2 changes: 1 addition & 1 deletion client/components/Reports/SummarizeTestPlanReport.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ const SummarizeTestPlanReport = ({ testPlanVersion, testPlanReports }) => {
atVersion: recommendedAtVersion
};

const none = None();
const none = None('No Data');

const renderVersionsSummaryTable = () => {
if (testPlanVersion.phase !== 'RECOMMENDED') return null;
Expand Down
84 changes: 41 additions & 43 deletions client/components/Reports/SummarizeTestPlanReports.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { Helmet } from 'react-helmet';
import { Link } from 'react-router-dom';
import { Container, Table } from 'react-bootstrap';
import clsx from 'clsx';
import alphabetizeObjectBy from '../../utils/alphabetizeObjectBy';
import { derivePhaseName } from '../../utils/aria';
import { None } from '@components/common/None';
import { getTestPlanTargetTitle, getTestPlanVersionTitle } from './getTitles';
Expand Down Expand Up @@ -50,11 +49,14 @@ const SummarizeTestPlanReports = ({
testPlanTargetsById[testPlanTarget.id] = testPlanTarget;
});
});
testPlanTargetsById = alphabetizeObjectBy(testPlanTargetsById, keyValue =>
getTestPlanTargetTitle(keyValue[1])
const orderedColumns = Object.entries(testPlanTargetsById).map(
([, data]) => data
);
orderedColumns.sort((a, b) =>
getTestPlanTargetTitle(a).localeCompare(getTestPlanTargetTitle(b))
);

const none = None();
const none = None('No Data');

return (
<Container
Expand Down Expand Up @@ -92,13 +94,11 @@ const SummarizeTestPlanReports = ({
<thead>
<tr>
<th>Test Plan</th>
{Object.values(testPlanTargetsById).map(
testPlanTarget => (
<th key={testPlanTarget.id}>
{getTestPlanTargetTitle(testPlanTarget)}
</th>
)
)}
{orderedColumns.map(testPlanTarget => (
<th key={testPlanTarget.id}>
{getTestPlanTargetTitle(testPlanTarget)}
</th>
))}
</tr>
</thead>
<tbody>
Expand Down Expand Up @@ -128,43 +128,41 @@ const SummarizeTestPlanReports = ({
{derivePhaseName(phase)}
</span>
</td>
{Object.values(testPlanTargetsById).map(
testPlanTarget => {
const testPlanReport = testPlanReports.find(
testPlanReport =>
testPlanReport.at.id ===
testPlanTarget.at.id &&
testPlanReport.browser.id ===
testPlanTarget.browser.id
);
{orderedColumns.map(testPlanTarget => {
const testPlanReport = testPlanReports.find(
testPlanReport =>
testPlanReport.at.id ===
testPlanTarget.at.id &&
testPlanReport.browser.id ===
testPlanTarget.browser.id
);

if (!testPlanReport) {
return (
<td
key={`${testPlanVersion.id}-${testPlanTarget.id}`}
>
{none}
</td>
);
}
const metrics = testPlanReport.metrics;
if (!testPlanReport) {
return (
<td key={testPlanReport.id}>
<Link
to={
`/report/${testPlanVersion.id}` +
`/targets/${testPlanReport.id}`
}
aria-label={`${metrics.supportPercent}%`}
>
<ProgressBar
progress={metrics.supportPercent}
/>
</Link>
<td
key={`${testPlanVersion.id}-${testPlanTarget.id}`}
>
{none}
</td>
);
}
)}
const metrics = testPlanReport.metrics;
return (
<td key={testPlanReport.id}>
<Link
to={
`/report/${testPlanVersion.id}` +
`/targets/${testPlanReport.id}`
}
aria-label={`${metrics.supportPercent}%`}
>
<ProgressBar
progress={metrics.supportPercent}
/>
</Link>
</td>
);
})}
</tr>
);
})}
Expand Down
2 changes: 1 addition & 1 deletion client/components/Reports/SummarizeTestPlanVersion.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const SummarizeTestPlanVersion = ({ testPlanVersion, testPlanReports }) => {
return 0;
});

const none = None();
const none = None('No Data');

return (
<Container
Expand Down
11 changes: 10 additions & 1 deletion client/components/Reports/queries.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ export const REPORTS_PAGE_QUERY = gql`
}
}
}

ariaHtmlFeaturesMetrics {
ariaFeaturesPassedCount
ariaFeaturesCount
Expand All @@ -49,7 +48,9 @@ export const REPORTS_PAGE_QUERY = gql`
refId
type
linkText
rawLinkText
value
rawValue
total
passed
failed
Expand All @@ -61,7 +62,9 @@ export const REPORTS_PAGE_QUERY = gql`
refId
type
linkText
rawLinkText
value
rawValue
total
passed
failed
Expand All @@ -73,7 +76,9 @@ export const REPORTS_PAGE_QUERY = gql`
refId
type
linkText
rawLinkText
value
rawValue
total
passed
failed
Expand All @@ -89,7 +94,9 @@ export const REPORTS_PAGE_QUERY = gql`
refId
type
linkText
rawLinkText
value
rawValue
total
passed
failed
Expand Down Expand Up @@ -186,11 +193,13 @@ export const ARIA_HTML_FEATURE_DETAIL_REPORT_QUERY = gql`
${BROWSER_FIELDS}
query AriaHtmlFeatureDetailReport(
$refId: String!
$refType: String
$atId: ID!
$browserId: ID!
) {
ariaHtmlFeatureDetailReport(
refId: $refId
refType: $refType
atId: $atId
browserId: $browserId
) {
Expand Down
11 changes: 8 additions & 3 deletions client/components/TestPlanVersionsPage/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { useMemo, useRef } from 'react';
import { useQuery } from '@apollo/client';
import { TEST_PLAN_VERSIONS_PAGE_QUERY } from './queries';
import PageStatus from '../common/PageStatus';
import { useParams } from 'react-router-dom';
import { useParams, Navigate } from 'react-router-dom';
import { Helmet } from 'react-helmet';
import { Container, Table } from 'react-bootstrap';
import VersionString from '../common/VersionString';
Expand All @@ -23,7 +23,8 @@ import styles from './TestPlanVersionsPage.module.css';
import commonStyles from '../common/styles.module.css';

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

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

if (data && !data.testPlan) {
return <Navigate to="/404" replace />;
}

if (error) {
return (
<PageStatus
Expand Down
26 changes: 26 additions & 0 deletions client/components/TestQueue/Actions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,20 @@ const Actions = ({
variant="primary"
disabled={!selfAssignedRun}
href={selfAssignedRun ? `/run/${selfAssignedRun.id}` : undefined}
target={selfAssignedRun ? '_blank' : undefined}
onClick={e => {
if (!selfAssignedRun) {
e.preventDefault();
e.stopPropagation();
return;
}
e.preventDefault();
if (window.PUPPETEER_TESTING) {
window.location.href = `/run/${selfAssignedRun.id}`;
} else {
window.open(`/run/${selfAssignedRun.id}`, '_blank');
}
}}
>
{selfAssignedRun?.testResultsLength
? 'Continue Testing'
Expand All @@ -260,6 +274,18 @@ const Actions = ({
key={testPlanRun.id}
role="menuitem"
href={`/run/${testPlanRun.id}?user=${testPlanRun.tester.id}`}
target="_blank"
onClick={e => {
e.preventDefault();
if (window.PUPPETEER_TESTING) {
window.location.href = `/run/${testPlanRun.id}?user=${testPlanRun.tester.id}`;
} else {
window.open(
`/run/${testPlanRun.id}?user=${testPlanRun.tester.id}`,
'_blank'
);
}
}}
>
{testPlanRun.tester.username}
</Dropdown.Item>
Expand Down
Loading