-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathuseTableSort.ts
104 lines (87 loc) · 3.12 KB
/
useTableSort.ts
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
99
100
101
102
103
104
import React from 'react';
import type {OrderType, SortOrder} from '@gravity-ui/react-data-table';
import isEqual from 'lodash/isEqual';
type HandleSort = (rawValue: SortOrder | SortOrder[] | undefined) => void;
interface TableSortProps {
initialSortColumn?: string;
initialSortOrder?: OrderType;
multiple?: boolean;
fixedOrderType?: OrderType;
onSort?: (params: SortOrder[] | undefined) => void;
}
export function useTableSort({
initialSortColumn,
initialSortOrder = -1,
fixedOrderType,
multiple,
onSort,
}: TableSortProps): [SortOrder[] | undefined, HandleSort] {
const [sortOrder, setSortOrder] = React.useState<SortOrder[] | undefined>(() => {
if (!initialSortColumn) {
return undefined;
}
return [
{
columnId: initialSortColumn,
order: fixedOrderType ? fixedOrderType : initialSortOrder,
},
];
});
const handleTableSort: HandleSort = React.useCallback(
(rawValue) => {
if (!rawValue || (Array.isArray(rawValue) && !rawValue.length)) {
// In case we have fixedOrderType, we should not reset table sort to undefined, but use previously set order
if (!fixedOrderType) {
onSort?.(undefined);
setSortOrder(undefined);
}
return;
}
let newSortOrder: SortOrder[] = Array.isArray(rawValue) ? rawValue : [rawValue];
if (fixedOrderType) {
newSortOrder = newSortOrder.map((value) => {
return {
columnId: value.columnId,
order: fixedOrderType,
};
});
}
if (!multiple) {
newSortOrder = newSortOrder.slice(0, 1);
}
setSortOrder((currentSortOrder) => {
if (newSortOrder && !isEqual(currentSortOrder, newSortOrder)) {
onSort?.(newSortOrder);
return newSortOrder;
}
return currentSortOrder;
});
},
[fixedOrderType, multiple, onSort],
);
return [sortOrder, handleTableSort];
}
export function prepareBackendSortFieldsFromTableSort(
sortOrder: SortOrder[] = [],
getSortFieldFromColumnId: (columnId: string) => string | undefined,
): SortOrder[] | undefined {
const preparedSort = sortOrder
.map((value) => {
return {
columnId: getSortFieldFromColumnId(value.columnId),
order: value.order,
};
})
.filter((value): value is SortOrder => Boolean(value.columnId));
if (preparedSort.length) {
return preparedSort;
}
return undefined;
}
function formatSortOrderToQuerySort({columnId, order}: SortOrder) {
const queryOrder = order === -1 ? 'DESC' : 'ASC';
return `${columnId} ${queryOrder}`;
}
export function prepareOrderByFromTableSort(sortOrder?: SortOrder[]) {
return sortOrder ? `ORDER BY ${sortOrder.map(formatSortOrderToQuerySort).join(', ')}` : '';
}