@@ -9,8 +9,11 @@ export interface SortByConfig {
9
9
initialSortKeys ?: SortKey [ ] ;
10
10
disableMultiSort ?: boolean ;
11
11
isMultiSortEvent ?: ( event : Event ) => boolean ;
12
+ toggleOrder ?: ( 'asc' | 'desc' | undefined ) [ ] ;
12
13
}
13
14
15
+ const DEFAULT_TOGGLE_ORDER : ( 'asc' | 'desc' | undefined ) [ ] = [ 'asc' , 'desc' , undefined ] ;
16
+
14
17
export interface SortByState < Item > {
15
18
sortKeys : WritableSortKeys ;
16
19
preSortedRows : Readable < BodyRow < Item > [ ] > ;
@@ -42,31 +45,34 @@ export interface SortKey {
42
45
43
46
export const createSortKeysStore = ( initKeys : SortKey [ ] ) : WritableSortKeys => {
44
47
const { subscribe, update, set } = writable ( initKeys ) ;
45
- const toggleId = ( id : string , { multiSort = true } : ToggleOptions = { } ) => {
48
+ const toggleId = (
49
+ id : string ,
50
+ { multiSort = true , toggleOrder = DEFAULT_TOGGLE_ORDER } : ToggleOptions = { }
51
+ ) => {
46
52
update ( ( $sortKeys ) => {
47
53
const keyIdx = $sortKeys . findIndex ( ( key ) => key . id === id ) ;
54
+ const key = $sortKeys [ keyIdx ] ;
55
+ const order = key ?. order ;
56
+ const orderIdx = toggleOrder . findIndex ( ( o ) => o === order ) ;
57
+ const nextOrderIdx = ( orderIdx + 1 ) % toggleOrder . length ;
58
+ const nextOrder = toggleOrder [ nextOrderIdx ] ;
48
59
if ( ! multiSort ) {
49
- if ( keyIdx === - 1 ) {
50
- return [ { id, order : 'asc' } ] ;
51
- }
52
- const key = $sortKeys [ keyIdx ] ;
53
- if ( key . order === 'asc' ) {
54
- return [ { id, order : 'desc' } ] ;
60
+ if ( nextOrder === undefined ) {
61
+ return [ ] ;
55
62
}
56
- return [ ] ;
63
+ return [ { id , order : nextOrder } ] ;
57
64
}
58
- if ( keyIdx === - 1 ) {
59
- return [ ...$sortKeys , { id, order : 'asc' } ] ;
65
+ if ( keyIdx === - 1 && nextOrder !== undefined ) {
66
+ return [ ...$sortKeys , { id, order : nextOrder } ] ;
60
67
}
61
- const key = $sortKeys [ keyIdx ] ;
62
- if ( key . order === 'asc' ) {
63
- return [
64
- ...$sortKeys . slice ( 0 , keyIdx ) ,
65
- { id, order : 'desc' } ,
66
- ...$sortKeys . slice ( keyIdx + 1 ) ,
67
- ] ;
68
+ if ( nextOrder === undefined ) {
69
+ return [ ...$sortKeys . slice ( 0 , keyIdx ) , ...$sortKeys . slice ( keyIdx + 1 ) ] ;
68
70
}
69
- return [ ...$sortKeys . slice ( 0 , keyIdx ) , ...$sortKeys . slice ( keyIdx + 1 ) ] ;
71
+ return [
72
+ ...$sortKeys . slice ( 0 , keyIdx ) ,
73
+ { id, order : nextOrder } ,
74
+ ...$sortKeys . slice ( keyIdx + 1 ) ,
75
+ ] ;
70
76
} ) ;
71
77
} ;
72
78
const clearId = ( id : string ) => {
@@ -89,6 +95,7 @@ export const createSortKeysStore = (initKeys: SortKey[]): WritableSortKeys => {
89
95
90
96
interface ToggleOptions {
91
97
multiSort ?: boolean ;
98
+ toggleOrder ?: ( 'asc' | 'desc' | undefined ) [ ] ;
92
99
}
93
100
94
101
export type WritableSortKeys = Writable < SortKey [ ] > & {
@@ -160,6 +167,7 @@ export const addSortBy =
160
167
initialSortKeys = [ ] ,
161
168
disableMultiSort = false ,
162
169
isMultiSortEvent = isShiftClick ,
170
+ toggleOrder,
163
171
} : SortByConfig = { } ) : TablePlugin < Item , SortByState < Item > , SortByColumnOptions , SortByPropSet > =>
164
172
( { columnOptions } ) => {
165
173
const disabledSortIds = Object . entries ( columnOptions )
@@ -198,6 +206,7 @@ export const addSortBy =
198
206
if ( disabled ) return ;
199
207
sortKeys . toggleId ( cell . id , {
200
208
multiSort : disableMultiSort ? false : isMultiSortEvent ( event ) ,
209
+ toggleOrder,
201
210
} ) ;
202
211
} ;
203
212
const clear = ( ) => {
0 commit comments