Skip to content

Commit b2b550e

Browse files
committed
feat(useSort): adds new sortToggleType to choose between Alternate and AlternateWithReset
1 parent 7f9b7e8 commit b2b550e

File tree

4 files changed

+98
-7
lines changed

4 files changed

+98
-7
lines changed

.storybook/stories/Features/sort.story.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
useSort,
2323
HeaderCellSort,
2424
SortIconPositions,
25+
SortToggleType,
2526
} from '@table-library/react-table-library/sort';
2627

2728
import { nodes } from '../data';
@@ -161,6 +162,66 @@ storiesOf('Features/Sort', module)
161162
</Table>
162163
);
163164
})
165+
.add('include reset', () => {
166+
const data = { nodes };
167+
168+
const sort = useSort(
169+
data,
170+
{
171+
onChange: onSortChange,
172+
},
173+
{
174+
sortToggleType: SortToggleType.AlternateWithReset,
175+
sortFns: {
176+
TASK: (array) => array.sort((a, b) => a.name.localeCompare(b.name)),
177+
DEADLINE: (array) => array.sort((a, b) => a.deadline - b.deadline),
178+
TYPE: (array) => array.sort((a, b) => a.type.localeCompare(b.type)),
179+
COMPLETE: (array) => array.sort((a, b) => a.isComplete - b.isComplete),
180+
TASKS: (array) => array.sort((a, b) => (a.nodes || []).length - (b.nodes || []).length),
181+
},
182+
},
183+
);
184+
185+
function onSortChange(action, state) {
186+
console.log(action, state);
187+
}
188+
189+
return (
190+
<Table data={data} sort={sort}>
191+
{(tableList) => (
192+
<>
193+
<Header>
194+
<HeaderRow>
195+
<HeaderCellSort sortKey="TASK">Task</HeaderCellSort>
196+
<HeaderCellSort sortKey="DEADLINE">Deadline</HeaderCellSort>
197+
<HeaderCellSort sortKey="TYPE">Type</HeaderCellSort>
198+
<HeaderCellSort sortKey="COMPLETE">Complete</HeaderCellSort>
199+
<HeaderCellSort sortKey="TASKS">Tasks</HeaderCellSort>
200+
</HeaderRow>
201+
</Header>
202+
203+
<Body>
204+
{tableList.map((item) => (
205+
<Row item={item} key={item.id}>
206+
<Cell>{item.name}</Cell>
207+
<Cell>
208+
{item.deadline.toLocaleDateString('en-US', {
209+
year: 'numeric',
210+
month: '2-digit',
211+
day: '2-digit',
212+
})}
213+
</Cell>
214+
<Cell>{item.type}</Cell>
215+
<Cell>{item.isComplete.toString()}</Cell>
216+
<Cell>{item.nodes?.length}</Cell>
217+
</Row>
218+
))}
219+
</Body>
220+
</>
221+
)}
222+
</Table>
223+
);
224+
})
164225
.add('sort icon size ', () => {
165226
const data = { nodes };
166227

.storybook/stories/Types/sort.story.mdx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ export enum SortIconPositions {
1515
Suffix,
1616
}
1717

18+
export enum SortToggleType {
19+
Alternate,
20+
AlternateWithReset,
21+
}
22+
1823
export type SortOptionsIcon = {
1924
position?: SortIconPositions;
2025
margin?: string;
@@ -29,6 +34,7 @@ export type SortFn = (node: TableNode[]) => TableNode[];
2934
export type SortOptions = {
3035
sortFns: Record<string, SortFn>;
3136
isServer?: boolean;
37+
sortToggleType?: SortToggleType;
3238
sortIcon?: SortOptionsIcon;
3339
isRecursive?: boolean;
3440
};
@@ -45,6 +51,7 @@ export type SortOptionsIconSound = {
4551
export type SortOptionsSound = {
4652
sortFns: Record<string, SortFn>;
4753
isServer: boolean;
54+
sortToggleType: SortToggleType;
4855
sortIcon: SortOptionsIconSound;
4956
isRecursive: boolean;
5057
};
@@ -66,7 +73,7 @@ export type HeaderCellSortProps = {
6673
index?: number;
6774
sortKey: string;
6875
sortIcon?: SortOptionsIcon;
69-
children: React.ReactNode;
76+
children?: React.ReactNode;
7077
} & Record<string, any>;
7178

7279
export type Sort = {
@@ -90,4 +97,4 @@ Access **all** types:
9097

9198
```javascript
9299
import * as TYPES from '@table-library/react-table-library/types';
93-
```
100+
```

src/sort/useSort.tsx

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
Sort,
1414
SortOptions,
1515
SortIconPositions,
16+
SortToggleType,
1617
} from '@table-library/react-table-library/types/sort';
1718

1819
import { HeaderCellSort } from './HeaderCellSort';
@@ -21,11 +22,25 @@ const TOGGLE_SORT = 'TOGGLE_SORT';
2122
const SET = 'SET';
2223

2324
const toggleSort = (state: State, action: Action) => {
24-
const reverse = action.payload.sortKey === state.sortKey && !state.reverse;
25+
const isPreviousSort = action.payload.value.sortKey === state.sortKey;
26+
const isPreviousReverse = state.reverse;
27+
28+
if (
29+
isPreviousSort &&
30+
isPreviousReverse &&
31+
action.payload.options.sortToggleType === SortToggleType.AlternateWithReset
32+
) {
33+
return {
34+
sortKey: 'NONE',
35+
reverse: false,
36+
};
37+
}
38+
39+
const isReverse = isPreviousSort && !isPreviousReverse;
2540

2641
return {
27-
...action.payload,
28-
reverse,
42+
...action.payload.value,
43+
reverse: isReverse,
2944
};
3045
};
3146

@@ -63,6 +78,7 @@ const DEFAULT_SORT_ICON = {
6378

6479
const DEFAULT_OPTIONS = {
6580
isServer: false,
81+
sortToggleType: SortToggleType.Alternate,
6682
sortIcon: DEFAULT_SORT_ICON,
6783
isRecursive: true,
6884
};
@@ -91,9 +107,9 @@ const useSort = (
91107
(value) =>
92108
dispatchWithMiddleware({
93109
type: TOGGLE_SORT,
94-
payload: value,
110+
payload: { value, options },
95111
}),
96-
[dispatchWithMiddleware],
112+
[options, dispatchWithMiddleware],
97113
);
98114

99115
useSyncControlledState(controlledState, state, () =>

src/types/sort.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ export enum SortIconPositions {
88
Suffix,
99
}
1010

11+
export enum SortToggleType {
12+
Alternate,
13+
AlternateWithReset,
14+
}
15+
1116
export type SortOptionsIcon = {
1217
position?: SortIconPositions;
1318
margin?: string;
@@ -22,6 +27,7 @@ export type SortFn = (node: TableNode[]) => TableNode[];
2227
export type SortOptions = {
2328
sortFns: Record<string, SortFn>;
2429
isServer?: boolean;
30+
sortToggleType?: SortToggleType;
2531
sortIcon?: SortOptionsIcon;
2632
isRecursive?: boolean;
2733
};
@@ -38,6 +44,7 @@ export type SortOptionsIconSound = {
3844
export type SortOptionsSound = {
3945
sortFns: Record<string, SortFn>;
4046
isServer: boolean;
47+
sortToggleType: SortToggleType;
4148
sortIcon: SortOptionsIconSound;
4249
isRecursive: boolean;
4350
};

0 commit comments

Comments
 (0)