diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a68854e..4e995146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to ### Changed - 💫(frontend) fix the help button to the bottom in tree #2073 +- ♿️(frontend) improve version history list accessibility #2033 ## [v4.8.2] - 2026-03-19 diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts index a7fddb39..1ccc34bb 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts @@ -25,7 +25,7 @@ test.describe('Doc Version', () => { await expect(page.getByText('History', { exact: true })).toBeVisible(); const modal = page.getByRole('dialog', { name: 'Version history' }); - const panel = modal.getByLabel('version list'); + const panel = modal.getByLabel('Version list'); await expect(panel).toBeVisible(); await expect(modal.getByText('No versions')).toBeVisible(); @@ -155,11 +155,11 @@ test.describe('Doc Version', () => { await getMenuItem(page, 'Version history').click(); const modal = page.getByRole('dialog', { name: 'Version history' }); - const panel = modal.getByLabel('version list'); + const panel = modal.getByLabel('Version list'); await expect(panel).toBeVisible(); await expect(page.getByText('History', { exact: true })).toBeVisible(); - await panel.getByRole('button', { name: 'version item' }).click(); + await panel.locator('.version-item').first().click(); await expect(modal.getByText('World')).toBeHidden(); diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionItem.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionItem.tsx index eba6a3da..aea0b071 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionItem.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionItem.tsx @@ -1,7 +1,8 @@ import dynamic from 'next/dynamic'; import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; -import { Box, Text } from '@/components'; +import { Box, BoxButton, Text } from '@/components'; import { useCunninghamTheme } from '@/cunningham'; import { Doc } from '@/docs/doc-management'; @@ -18,54 +19,69 @@ const ModalConfirmationVersion = dynamic( interface VersionItemProps { docId: Doc['id']; text: string; - versionId?: Versions['version_id']; isActive: boolean; + onSelect?: () => void; } export const VersionItem = ({ docId, versionId, text, - isActive, + onSelect, }: VersionItemProps) => { + const { t } = useTranslation(); const { colorsTokens, spacingsTokens } = useCunninghamTheme(); const [isModalVersionOpen, setIsModalVersionOpen] = useState(false); return ( <> - - - - {text} - + + + + {text} + + - + {isModalVersionOpen && versionId && ( setIsModalVersionOpen(false)} diff --git a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionList.tsx b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionList.tsx index 3f6ee14c..37bda466 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionList.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-versioning/components/VersionList.tsx @@ -3,14 +3,7 @@ import { DateTime } from 'luxon'; import { useTranslation } from 'react-i18next'; import { APIError } from '@/api'; -import { - Box, - BoxButton, - Icon, - InfiniteScroll, - Text, - TextErrors, -} from '@/components'; +import { Box, Icon, InfiniteScroll, Text, TextErrors } from '@/components'; import { Doc } from '@/docs/doc-management'; import { useDate } from '@/hooks'; @@ -49,23 +42,24 @@ const VersionListState = ({ return ( - {versions?.map((version) => ( - { - onSelectVersion?.(version.version_id); - }} - > - - - ))} + {versions?.map((version) => { + const formattedDate = formatDate( + version.last_modified, + DateTime.DATETIME_MED, + ); + const isSelected = version.version_id === selectedVersionId; + return ( + + onSelectVersion?.(version.version_id)} + /> + + ); + })} {error && ( { const { t } = useTranslation(); + const { formatDate } = useDate(); const { data, @@ -112,6 +107,12 @@ export const VersionList = ({ const versions = data?.pages.reduce((acc, page) => { return acc.concat(page.versions); }, [] as Versions[]); + const selectedVersion = versions?.find( + (version) => version.version_id === selectedVersionId, + ); + const selectedVersionDate = selectedVersion + ? formatDate(selectedVersion.last_modified, DateTime.DATETIME_MED) + : null; return ( {versions?.length === 0 && ( @@ -145,6 +146,11 @@ export const VersionList = ({ selectedVersionId={selectedVersionId} /> + + {selectedVersionDate + ? t('Selected version {{date}}', { date: selectedVersionDate }) + : ''} + ); };