Completed
Push — master ( 05e3e8...72dd2b )
by Alejandro
16s queued 12s
created

src/utils/SortingDropdown.js   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 68
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 90.91%

Importance

Changes 0
Metric Value
wmc 3
eloc 57
mnd 3
bc 3
fnc 0
dl 0
loc 68
ccs 10
cts 11
cp 0.9091
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
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