1
|
|
|
import React from 'react'; |
2
|
|
|
import { UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; |
3
|
|
|
import { toPairs } from 'ramda'; |
4
|
|
|
import PropTypes from 'prop-types'; |
5
|
|
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; |
6
|
|
|
import { faSortAmountUp as sortAscIcon, faSortAmountDown as sortDescIcon } from '@fortawesome/free-solid-svg-icons'; |
7
|
|
|
import classNames from 'classnames'; |
8
|
|
|
import { determineOrderDir } from './utils'; |
9
|
|
|
import './SortingDropdown.scss'; |
10
|
|
|
|
11
|
4 |
|
const propTypes = { |
12
|
|
|
items: PropTypes.object.isRequired, |
13
|
|
|
orderField: PropTypes.string, |
14
|
|
|
orderDir: PropTypes.oneOf([ 'ASC', 'DESC' ]), |
15
|
|
|
onChange: PropTypes.func.isRequired, |
16
|
|
|
isButton: PropTypes.bool, |
17
|
|
|
right: PropTypes.bool, |
18
|
|
|
}; |
19
|
4 |
|
const defaultProps = { |
20
|
|
|
isButton: true, |
21
|
|
|
right: false, |
22
|
|
|
}; |
23
|
|
|
|
24
|
4 |
|
const SortingDropdown = ({ items, orderField, orderDir, onChange, isButton, right }) => { |
25
|
15 |
|
const handleItemClick = (fieldKey) => () => { |
26
|
3 |
|
const newOrderDir = determineOrderDir(fieldKey, orderField, orderDir); |
27
|
|
|
|
28
|
3 |
|
onChange(newOrderDir ? fieldKey : undefined, newOrderDir); |
29
|
|
|
}; |
30
|
|
|
|
31
|
5 |
|
return ( |
32
|
|
|
<UncontrolledDropdown> |
33
|
|
|
<DropdownToggle |
34
|
|
|
caret |
35
|
|
|
color={isButton ? 'secondary' : 'link'} |
36
|
|
|
className={classNames({ 'btn-block': isButton, 'btn-sm p-0': !isButton })} |
37
|
|
|
> |
38
|
|
|
Order by |
39
|
|
|
</DropdownToggle> |
40
|
|
|
<DropdownMenu |
41
|
|
|
right={right} |
42
|
|
|
className={classNames('sorting-dropdown__menu', { 'sorting-dropdown__menu--link': !isButton })} |
43
|
|
|
> |
44
|
|
|
{toPairs(items).map(([ fieldKey, fieldValue ]) => ( |
45
|
15 |
|
<DropdownItem key={fieldKey} active={orderField === fieldKey} onClick={handleItemClick(fieldKey)}> |
46
|
|
|
{fieldValue} |
47
|
|
|
{orderField === fieldKey && ( |
48
|
|
|
<FontAwesomeIcon |
49
|
|
|
icon={orderDir === 'ASC' ? sortAscIcon : sortDescIcon} |
50
|
|
|
className="sorting-dropdown__sort-icon" |
51
|
|
|
/> |
52
|
|
|
)} |
53
|
|
|
</DropdownItem> |
54
|
|
|
))} |
55
|
|
|
<DropdownItem divider /> |
56
|
|
|
<DropdownItem disabled={!orderField} onClick={() => onChange()}> |
57
|
|
|
<i>Clear selection</i> |
58
|
|
|
</DropdownItem> |
59
|
|
|
</DropdownMenu> |
60
|
|
|
</UncontrolledDropdown> |
61
|
|
|
); |
62
|
|
|
}; |
63
|
|
|
|
64
|
4 |
|
SortingDropdown.propTypes = propTypes; |
65
|
4 |
|
SortingDropdown.defaultProps = defaultProps; |
66
|
|
|
|
67
|
|
|
export default SortingDropdown; |
68
|
|
|
|