diff --git a/src/runtime/components/TableHeader.vue b/src/runtime/components/TableHeader.vue index 7a39692..75ccb32 100644 --- a/src/runtime/components/TableHeader.vue +++ b/src/runtime/components/TableHeader.vue @@ -17,7 +17,11 @@ :key="`${props.id}-DT-header-${header.id}`" scope="col" :class="header.thClass" + :tabindex="header.sortable || header.filtering ? 0 : undefined" + :aria-sort="header.sortable ? getAriaSort(header.id) : undefined" @click="onHeaderClicked(header.id)" + @keydown.enter="header.sortable ? onHeaderClicked(header.id) : null" + @keydown.space="header.sortable ? onHeaderClicked(header.id) : null" > {{ header.label }}
@@ -49,6 +55,8 @@ class="creat-datatable-header-input" :class="props.filtersClass" :value="filtersModel[header.id] ?? ''" + :aria-label="`Filter ${header.label}`" + :placeholder="`Filter ${header.label}`" @input="onFilterInput(header.id, $event)" > @@ -97,6 +105,13 @@ const sortDirection = computed(() => sortModel.value ? sortModel.value[1] : null ); +function getAriaSort(headerId: string): "ascending" | "descending" | undefined { + if (!sortModel.value || sortModel.value[0] !== headerId) { + return undefined; + } + return sortModel.value[1] === "asc" ? "ascending" : "descending"; +} + function onHeaderClicked(headerId: string) { const header = props.headers.find((h) => h.id === headerId); if (!header?.sortable) {