Skip to content

Commit 206f523

Browse files
committed
Allow to provide initial order per DataTable column
1 parent 2a2c6ab commit 206f523

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

src/components/data/DataTable.tsx

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useCallback, useContext, useEffect, useMemo } from 'preact/hooks';
44
import { useArrowKeyNavigation } from '../../hooks/use-arrow-key-navigation';
55
import { useStableCallback } from '../../hooks/use-stable-callback';
66
import { useSyncedRef } from '../../hooks/use-synced-ref';
7-
import type { CompositeProps, Order } from '../../types';
7+
import type { CompositeProps, Order, OrderDirection } from '../../types';
88
import { downcastRef } from '../../util/typing';
99
import { ArrowDownIcon, ArrowUpIcon, SpinnerSpokesIcon } from '../icons';
1010
import { Button } from '../input';
@@ -67,6 +67,11 @@ type ComponentProps<Row> = Pick<
6767
/** Current sort order */
6868
order?: Order<keyof Row>;
6969

70+
/**
71+
* The initial order direction to set when a column becomes the ordered one.
72+
*/
73+
initialColumnsOrderDir?: Partial<Record<keyof Row, OrderDirection>>;
74+
7075
/**
7176
* Callback invoked when user clicks a column header to change the sort order.
7277
* When a header is clicked, if that's not the active order, it is set with
@@ -98,9 +103,13 @@ function defaultRenderItem<Row>(r: Row, field: keyof Row): ComponentChildren {
98103
function calculateNewOrder<T extends string | number | symbol>(
99104
newField: T,
100105
prevOrder?: Order<T>,
106+
initialColumnsOrderDir?: Partial<Record<T, OrderDirection>>,
101107
): Order<T> {
102108
if (newField !== prevOrder?.field) {
103-
return { field: newField, direction: 'ascending' };
109+
return {
110+
field: newField,
111+
direction: initialColumnsOrderDir?.[newField] ?? 'ascending',
112+
};
104113
}
105114

106115
const newDirection =
@@ -151,6 +160,7 @@ export default function DataTable<Row>({
151160
order,
152161
onOrderChange,
153162
orderableColumns = [],
163+
initialColumnsOrderDir,
154164

155165
// Forwarded to Table
156166
title,
@@ -164,10 +174,14 @@ export default function DataTable<Row>({
164174
const scrollContext = useContext(ScrollContext);
165175
const updateOrder = useCallback(
166176
(newField: keyof Row) => {
167-
const newOrder = calculateNewOrder(newField, order);
177+
const newOrder = calculateNewOrder(
178+
newField,
179+
order,
180+
initialColumnsOrderDir,
181+
);
168182
onOrderChange?.(newOrder);
169183
},
170-
[onOrderChange, order],
184+
[initialColumnsOrderDir, onOrderChange, order],
171185
);
172186

173187
const noContent = loading || (!rows.length && emptyMessage);

src/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ export type TransitionComponent = FunctionComponent<{
5959
onTransitionEnd?: (direction: 'in' | 'out') => void;
6060
}>;
6161

62+
export type OrderDirection = 'ascending' | 'descending';
63+
6264
export type Order<Field extends string | number | symbol> = {
6365
field: Field;
64-
direction: 'ascending' | 'descending';
66+
direction: OrderDirection;
6567
};

0 commit comments

Comments
 (0)