By default, Table
assumes the sortable rows can be sorted in ascending or descending order.
Clicking a column header the first time will trigger the sort
callback with a suggested ordering of ascending.
Clicking it a second time will call sort
with a suggested ordering of descending.
Clicking a third time will suggest ascending.
This is often desirable but it has a subtle side effect:
Once you have sorted a Table
there is no way to return to an unsorted, "natural" order.
Fortunately Table
makes it easy for you to implement this functionality within your application code like so:
export default class NaturalSortTable extends Component {
constructor (props, context) {
super(props, context)
this.state = {
list: props.list // Naturally sorted list
}
}
componentWillUpdate (nextProps, nextState) {
const {
sortBy: prevSortBy,
sortDirection: prevSortDirection
} = this.state
if (
nextState.sortBy !== prevSortBy ||
nextState.sortDirection !== prevSortDirection
) {
const { sortBy, sortDirection } = nextState
let { list } = this.props
if (sortBy) {
list = list.sortBy(item => item[sortBy])
if (sortDirection === SortDirection.DESC) {
list = list.reverse()
}
}
}
}
render () {
const { list, sortBy, sortDirection } = this.state
return (
<Table
{...this.props}
sort={this._sort}
sortBy={sortBy}
sortDirection={sortDirection}
>
{/* <Column>s go here */}
</Table>
)
}
_sort ({ sortBy, sortDirection }) {
const {
sortBy: prevSortBy,
sortDirection: prevSortDirection
} = this.state
// If list was sorted DESC by this column.
// Rather than switch to ASC, return to "natural" order.
if (prevSortDirection === SortDirection.DESC) {
sortBy = null
sortDirection = null
}
this.setState({ sortBy, sortDirection })
}
}