From add304849554d63767494bd1f0bfd6bd2c9537b8 Mon Sep 17 00:00:00 2001 From: Viktor Kratz Date: Sat, 19 Oct 2024 04:32:53 +0200 Subject: [PATCH] feat(VDataTable): Screenreader suport for sorting --- .../VDataTable/VDataTableHeaders.tsx | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx b/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx index 0702a348976..0784c75a451 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx @@ -22,7 +22,7 @@ import { convertToUnit, genericComponent, propsFactory, useRender } from '@/util // Types import type { CSSProperties, PropType, UnwrapRef } from 'vue' import type { provideSelection } from './composables/select' -import type { provideSort } from './composables/sort' +import type { provideSort, SortItem } from './composables/sort' import type { InternalDataTableHeader } from './types' import type { ItemProps } from '@/composables/list-items' import type { LoaderSlotProps } from '@/composables/loader' @@ -100,14 +100,38 @@ export const VDataTableHeaders = genericComponent()({ } } + function getSortEntryForColumn (column: InternalDataTableHeader): SortItem|undefined { + return sortBy.value.find(item => item.key === column.key) + } + function getSortIcon (column: InternalDataTableHeader) { - const item = sortBy.value.find(item => item.key === column.key) + const item = getSortEntryForColumn(column) if (!item) return props.sortAscIcon return item.order === 'asc' ? props.sortAscIcon : props.sortDescIcon } + function getAriaSort (column: InternalDataTableHeader) { + const item = getSortEntryForColumn(column) + + if (!item) return undefined + switch (item.order) { + case 'asc': + return 'ascending' + case 'desc': + return 'descending' + case true: + return 'other' + default: + return undefined + } + } + + function getAriaRole (column: InternalDataTableHeader): string|undefined { + if (column.sortable) return 'link' + return undefined + } const { backgroundColorClasses, backgroundColorStyles } = useBackgroundColor(props, 'color') const { displayClasses, mobile } = useDisplay(props) @@ -140,7 +164,10 @@ export const VDataTableHeaders = genericComponent()({ return ( ()({ } return ( -
+
{ column.title } { column.sortable && !props.disableSort && (