-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVersionTableHeaderSortableCell.tsx
More file actions
98 lines (88 loc) · 2.73 KB
/
Copy pathVersionTableHeaderSortableCell.tsx
File metadata and controls
98 lines (88 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { TFunction } from 'i18next';
import { AriaAttributes, Dispatch, FC, SetStateAction } from 'react';
import { useTranslation } from 'react-i18next';
import { twJoin } from 'tailwind-merge';
import { SortOrder } from '../../../types';
import { ExpandButton } from '../../../uiComponents';
import { VersionTableSortingInfo } from './useVersionContainerControls';
import { VersionTableColumn } from './VersionTableColumn';
function getAriaSortValue(
active: boolean,
ascending: boolean,
): AriaAttributes['aria-sort'] {
if (active) {
return ascending ? 'ascending' : 'descending';
}
return undefined;
}
function trColumnName(t: TFunction, columnType: VersionTableColumn) {
switch (columnType) {
case 'CHANGED':
return t(($) => $.versions.header.changed);
case 'CHANGED_BY':
return t(($) => $.versions.header.changed_by);
case 'STATUS':
return t(($) => $.versions.header.status);
case 'VALIDITY_END':
return t(($) => $.versions.header.validity_end);
case 'VALIDITY_START':
return t(($) => $.versions.header.validity_start);
case 'VERSION_COMMENT':
return t(($) => $.versions.header.version_comment);
default:
return '';
}
}
type VersionTableHeaderSortableCellProps = {
readonly className?: string;
readonly tdClassName?: string;
readonly columnType: VersionTableColumn;
readonly sortingInfo: VersionTableSortingInfo;
readonly setSortingInfo: Dispatch<SetStateAction<VersionTableSortingInfo>>;
readonly testIdPrefix?: string;
};
export const VersionTableHeaderSortableCell: FC<
VersionTableHeaderSortableCellProps
> = ({
className,
tdClassName,
columnType,
sortingInfo,
setSortingInfo,
testIdPrefix = 'VersionTableHeaderSortableCell',
}) => {
const { t } = useTranslation();
const active = sortingInfo.sortBy === columnType;
const ascending = sortingInfo.sortOrder === SortOrder.ASCENDING;
const onClick = () => {
setSortingInfo((prevState) => {
if (prevState.sortBy === columnType) {
return {
...prevState,
sortOrder:
prevState.sortOrder === SortOrder.ASCENDING
? SortOrder.DESCENDING
: SortOrder.ASCENDING,
};
}
return { ...prevState, sortBy: columnType };
});
};
return (
<td
aria-sort={getAriaSortValue(active, ascending)}
className={tdClassName}
data-testid={`${testIdPrefix}::${columnType.toLowerCase()}`}
>
<ExpandButton
forSorting
className={twJoin(active ? 'underline' : '', className)}
iconClassName="text-base"
expanded={!ascending}
expandedText={trColumnName(t, columnType)}
onClick={onClick}
testId={`${testIdPrefix}::sortButton`}
/>
</td>
);
};