UNPKG

6.03 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
9var _style = require('./style.css');
10
11var _style2 = _interopRequireDefault(_style);
12
13var _sortBy = require('lodash/sortBy');
14
15var _sortBy2 = _interopRequireDefault(_sortBy);
16
17var _tableItem = require('../table-item');
18
19var _tableItem2 = _interopRequireDefault(_tableItem);
20
21var _tableHeader = require('../table-header');
22
23var _tableHeader2 = _interopRequireDefault(_tableHeader);
24
25var _react = require('react');
26
27var _react2 = _interopRequireDefault(_react);
28
29function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
30
31function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
32
33function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
34
35function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
36
37var Table = function (_Component) {
38 _inherits(Table, _Component);
39
40 function Table() {
41 var _ref;
42
43 var _temp, _this, _ret;
44
45 _classCallCheck(this, Table);
46
47 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
48 args[_key] = arguments[_key];
49 }
50
51 return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Table.__proto__ || Object.getPrototypeOf(Table)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
52 orderByDesc: true,
53 sortBy: _this.props.headers[0]
54 }, _this.onHeaderClick = function (header) {
55 if (_this.state.sortBy === header.props.id) {
56 return _this.setState({ orderByDesc: !_this.state.orderByDesc });
57 }
58
59 return _this.setState({
60 sortBy: header.props.id,
61 orderByDesc: true
62 });
63 }, _temp), _possibleConstructorReturn(_this, _ret);
64 }
65
66 /**
67 * Define the types of props the component accepts.
68 *
69 * @type {Object}
70 */
71
72
73 /**
74 * Describe the state of the component.
75 *
76 * @type {Object}
77 */
78
79
80 /**
81 * Invoked when a header is clicked.
82 * When the same header is clicked as it's currently ordered by we reverse
83 * the other, otherwise we order by the header & set the default of DESC as
84 * order.
85 *
86 * @param {String} header
87 * @return {void}
88 */
89
90
91 _createClass(Table, [{
92 key: 'getEntries',
93
94
95 /**
96 * Get the entries for the table, ordered & sorted by as defined by the state.
97 *
98 * @return {Array}
99 */
100 value: function getEntries() {
101 var _this2 = this;
102
103 var entries = (0, _sortBy2.default)(this.props.entries, function (entry) {
104 var sorter = entry[_this2.state.sortBy];
105 return (0, _react.isValidElement)(sorter) ? sorter.props[sorter.props.sortBy] : sorter;
106 });
107 return this.state.orderByDesc ? entries : entries.reverse();
108 }
109
110 /**
111 * Render the headers of the table.
112 *
113 * @return {ReactElement}
114 */
115
116 }, {
117 key: 'renderHeaders',
118 value: function renderHeaders() {
119 var _this3 = this;
120
121 return this.props.headers.map(function (header) {
122 return _react2.default.createElement(
123 _tableHeader2.default,
124 {
125 id: header,
126 key: header,
127 onClick: _this3.onHeaderClick,
128 active: _this3.state.sortBy === header,
129 orderBy: _this3.state.orderByDesc ? 'DESC' : 'ASC'
130 },
131 header
132 );
133 });
134 }
135
136 /**
137 * Render the entries of the table.
138 *
139 * @return {ReactElement}
140 */
141
142 }, {
143 key: 'renderEntries',
144 value: function renderEntries() {
145 var headers = this.props.headers;
146
147
148 return this.getEntries().map(function (entry) {
149 return _react2.default.createElement(
150 'tr',
151 { key: entry.id, className: _style2.default.row },
152 headers.map(function (header) {
153 return _react2.default.createElement(
154 _tableItem2.default,
155 { key: header },
156 entry[header]
157 );
158 })
159 );
160 });
161 }
162
163 /**
164 * Render the component
165 *
166 * @return {ReactElement}
167 */
168
169 }, {
170 key: 'render',
171 value: function render() {
172 return _react2.default.createElement(
173 'table',
174 { className: _style2.default.component },
175 _react2.default.createElement(
176 'thead',
177 { className: _style2.default.head },
178 _react2.default.createElement(
179 'tr',
180 null,
181 this.renderHeaders()
182 )
183 ),
184 _react2.default.createElement(
185 'tbody',
186 null,
187 this.renderEntries()
188 )
189 );
190 }
191 }]);
192
193 return Table;
194}(_react.Component);
195
196Table.propTypes = {
197 headers: _react.PropTypes.array.isRequired,
198 entries: _react.PropTypes.array.isRequired
199};
200exports.default = Table;
\No newline at end of file