react-filterable-table
Version:
Extendable table with filtering, sorting, paging, and more
1,190 lines (993 loc) • 64.9 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"));
else if(typeof define === 'function' && define.amd)
define(["react"], factory);
else if(typeof exports === 'object')
exports["FilterableTable"] = factory(require("react"));
else
root["FilterableTable"] = factory(root["react"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(1);
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var FilterableTable = __webpack_require__(2);
module.exports = FilterableTable;
exports.FilterableTable = FilterableTable;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
'use strict';
var _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; }; }();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _Table = __webpack_require__(4);
var _Table2 = _interopRequireDefault(_Table);
var _Header = __webpack_require__(7);
var _Header2 = _interopRequireDefault(_Header);
var _reactPager = __webpack_require__(10);
var _reactPager2 = _interopRequireDefault(_reactPager);
var _FilterAndSort = __webpack_require__(11);
var _FilterAndSort2 = _interopRequireDefault(_FilterAndSort);
var _isElementInViewport = __webpack_require__(12);
var _isElementInViewport2 = _interopRequireDefault(_isElementInViewport);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _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; }
function _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; }
var FilterableTable = function (_React$Component) {
_inherits(FilterableTable, _React$Component);
function FilterableTable(props) {
_classCallCheck(this, FilterableTable);
var _this = _possibleConstructorReturn(this, (FilterableTable.__proto__ || Object.getPrototypeOf(FilterableTable)).call(this, props));
_this.state = {
loading: false,
entries: _this.props.data || [],
sortFields: [{ name: _this.props.initialSort, reverse: typeof _this.props.initialSortDir === "boolean" ? !_this.props.initialSortDir : false }],
filter: '',
exactFilters: _this.props.initialExactFilters || [],
fieldFilters: _this.props.initialFieldFilters || [],
serverError: false,
totalPages: 1,
visiblePages: 5,
page: 0,
pageSize: +localStorage.getItem(_this.props.namespace + '.PageSize') || _this.props.pageSize || 10,
shiftDown: false
};
_this.tableRef = _react2.default.createRef();
_this.loadData = _this.loadData.bind(_this);
_this.setData = _this.setData.bind(_this);
_this.updateFilter = _this.updateFilter.bind(_this);
_this.addExactFilter = _this.addExactFilter.bind(_this);
_this.updateFieldFilter = _this.updateFieldFilter.bind(_this);
_this.updatePageSize = _this.updatePageSize.bind(_this);
_this.updatePage = _this.updatePage.bind(_this);
_this.filterInputChanged = _this.filterInputChanged.bind(_this);
_this.updateSort = _this.updateSort.bind(_this);
_this.scrollIntoView = _this.scrollIntoView.bind(_this);
_this.removeExactFilter = _this.removeExactFilter.bind(_this);
_this.keydownEventListener = function (e) {
if (e.which === 16) {
// Shift
if (!_this.state.shiftDown) {
_this.setState({ shiftDown: true });
}
}
};
_this.keyupEventListener = function (e) {
if (e.which === 16) {
// Shift
if (_this.state.shiftDown) {
_this.setState({ shiftDown: false });
}
}
};
return _this;
}
_createClass(FilterableTable, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.loadData();
// Keep track of shift key
window.addEventListener("keydown", this.keydownEventListener, false);
window.addEventListener("keyup", this.keyupEventListener, false);
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
window.removeEventListener("keydown", this.keydownEventListener, false);
window.removeEventListener("keyup", this.keyupEventListener, false);
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps) {
// If the `data` prop changes, make sure we run our onDataReceived callback (if supplied)
// and set our states
if (this.props.hasOwnProperty('data') && prevProps.data !== this.props.data) {
this.setData(this.props.data);
}
if (this.props.hasOwnProperty('sortFields') && prevProps.sortFields !== this.props.sortFields) {
this.setState({ sort: this.props.sortFields });
}
if (this.props.hasOwnProperty('loading') && prevProps.loading !== this.props.loading) {
this.setState({ loading: this.props.loading });
}
}
}, {
key: 'shouldComponentUpdate',
value: function shouldComponentUpdate(nextProps, nextState) {
if (nextState.hasOwnProperty("shiftDown") && nextState.shiftDown !== this.state.shiftDown) {
// Don't re-render when holding down shift
return false;
}
return true;
}
}, {
key: 'loadData',
value: function loadData(e) {
var _this2 = this;
if (e) {
e.preventDefault();
}
// Make sure either data was set or an endpoint was passed in
if (!Array.isArray(this.props.data) && !this.props.dataEndpoint) {
throw "No data was passed in and no data endpoint was set.";
}
// Set state to 'loading' to show the "Loading..." message
this.setState({
loading: true
});
if (Array.isArray(this.props.data)) {
this.setData(this.props.data);
} else {
// Load data from endpoint
fetch(this.props.dataEndpoint).then(function (r) {
if (r.status !== 200) {
throw r;
}
return r;
}).then(function (r) {
return r.json();
}).then(function (entries) {
_this2.setData(entries);
}).catch(function (error) {
_this2.setState({
serverError: true,
loading: false
});
console.log(error);
});
}
}
}, {
key: 'setData',
value: function setData(entries) {
if (this.props.onDataReceived) {
// Run callback if supplied
this.props.onDataReceived(entries);
}
this.setState({
entries: entries,
loading: false,
serverError: false,
page: this.props.maintainPageOnSetData ? this.state.page : 0
});
}
}, {
key: 'updateFilter',
value: function updateFilter(filter) {
// Set the state filter to what was passed in.
this.setState({
filter: filter,
page: 0
});
this.scrollIntoView();
}
}, {
key: 'addExactFilter',
value: function addExactFilter(value, fieldname) {
var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : fieldname;
// Exact filters are an array; grab the existing ones and push this one on it.
// Don't add it if value is null/undefined
if (value === undefined || value === null || value.toString().length === 0) {
return;
}
var exactFilters = this.state.exactFilters;
// Build our object to push onto the array
var thisFilter = {
value: value.toString(),
fieldname: fieldname,
name: name
// Don't add it if it's already in there
};var filterExists = exactFilters.some(function (f) {
// If field and value ar the same, we already have this filter.
return f.fieldname === thisFilter.fieldname && f.value === thisFilter.value;
});
if (filterExists) {
return;
}
exactFilters.push(thisFilter);
// Update state
this.setState({
exactFilters: exactFilters,
page: 0
});
// Call callback if supplied
if (this.props.onFilterAdded) {
this.props.onFilterAdded(thisFilter);
}
}
// Adds/updates a field filter
// fieldFilter: object { fieldname, value, exact }
}, {
key: 'updateFieldFilter',
value: function updateFieldFilter(fieldFilter) {
var fieldFilters = this.state.fieldFilters.slice();
var existingFilterIndex = fieldFilters.findIndex(function (f) {
return f.fieldname === fieldFilter.fieldname;
});
if (existingFilterIndex > -1) {
// Remove the filter if it exists
if (fieldFilter.value.length === 0) {
fieldFilters.splice(existingFilterIndex, 1);
} else {
fieldFilters[existingFilterIndex] = fieldFilter;
}
} else {
// Doesn't exist yet, add it
fieldFilters.push(fieldFilter);
}
this.setState({ fieldFilters: fieldFilters, page: 0 });
// Call callback if supplied
if (this.props.onFilterAdded) {
this.props.onFilterAdded(fieldFilter);
}
}
}, {
key: 'removeExactFilter',
value: function removeExactFilter(filter, e) {
var exactFilters = this.state.exactFilters;
var index = exactFilters.indexOf(filter);
var removedFilter = null;
if (index > -1) {
removedFilter = exactFilters.splice(index, 1).pop();
}
this.setState({
exactFilters: exactFilters,
page: 0
});
this.scrollIntoView();
// Call callback if supplied
if (this.props.onFilterRemoved) {
this.props.onFilterRemoved(removedFilter, e);
}
}
}, {
key: 'updatePage',
value: function updatePage(page) {
this.setState({ page: page });
this.scrollIntoView();
}
}, {
key: 'updatePageSize',
value: function updatePageSize(event) {
var pageSize = +event.target.value;
this.setState({ page: 0, pageSize: pageSize });
if (this.props.namespace) {
localStorage.setItem(this.props.namespace + '.PageSize', pageSize);
}
}
}, {
key: 'filterInputChanged',
value: function filterInputChanged(event) {
this.updateFilter(event.target.value);
this.setState({ page: 0 });
}
}, {
key: 'updateSort',
value: function updateSort(sort) {
var append = this.state.shiftDown;
var sortFields = this.state.sortFields.concat();
var sortField = sortFields.find(function (sf) {
return sf.name === sort;
});
var alreadyExists = sortField !== undefined;
if (alreadyExists) {
// Swap direction
sortField.reverse = !sortField.reverse;
} else {
// Add to sort
sortField = { name: sort, reverse: false };
}
if (append && !alreadyExists) {
sortFields.push(sortField);
}
if (!append) {
sortFields = [sortField];
}
this.setState({
sortFields: sortFields,
page: 0
});
}
}, {
key: 'scrollIntoView',
value: function scrollIntoView() {
// Make sure things are in view
if (this.tableRef && this.tableRef.current) {
var table = this.tableRef.current.table;
if (table && !(0, _isElementInViewport2.default)(table)) {
table.scrollIntoView();
}
}
}
}, {
key: 'render',
value: function render() {
var fields = this.props.fields || [];
// If fields prop was not specified, use object keys of first record as fieldnames
if (this.props.fields === undefined && this.state.entries.length > 0) {
fields = Object.keys(this.state.entries[0]).map(function (name) {
return { name: name };
});
}
var loading = this.state.loading && (this.props.loadingMessage || _react2.default.createElement(
'div',
{ className: 'well text-center' },
'Loading...'
));
var serverErrorMessage = this.state.serverError && (this.props.serverErrorMessage || _react2.default.createElement(
'div',
{ className: 'alert alert-danger text-center' },
'Something went wrong! Check console for error message(s).'
));
var noRecordsMessage = !this.state.serverError && !this.state.loading && this.state.entries.length === 0 && _react2.default.createElement(
'div',
null,
this.props.noRecordsMessage
);
var filteredEntries = (0, _FilterAndSort2.default)(this.state.entries, {
filter: this.state.filter,
exactFilters: this.state.exactFilters,
fieldFilters: this.state.fieldFilters,
sortFields: this.state.sortFields,
fields: fields
});
var table = !this.state.loading && this.state.entries.length > 0 && _react2.default.createElement(_Table2.default, {
records: filteredEntries,
allRecords: this.state.entries,
fields: fields,
filterExact: this.state.filterExact,
addExactFilter: this.addExactFilter,
updateFieldFilter: this.updateFieldFilter,
fieldFilters: this.state.fieldFilters,
updateSort: this.updateSort,
sortFields: this.state.sortFields,
iconSort: this.props.iconSort,
iconSortedAsc: this.props.iconSortedAsc,
iconSortedDesc: this.props.iconSortedDesc,
page: this.state.page,
pageSize: this.state.pageSize,
pagersVisible: this.props.pagersVisible,
noFilteredRecordsMessage: this.props.noFilteredRecordsMessage,
className: this.props.tableClassName,
tableProps: this.props.tableProps,
trClassName: this.props.trClassName,
trProps: this.props.trProps,
style: this.props.style,
showHeaderFilters: this.props.showHeaderFilters,
onRowClicked: this.props.onRowClicked,
ref: this.tableRef
});
var totalPages = filteredEntries && filteredEntries.length > 0 ? Math.ceil(filteredEntries.length / this.state.pageSize) : 0;
var topPager = this.state.loading || this.state.entries.length === 0 || this.props.pagersVisible === false || this.props.topPagerVisible === false ? '' : _react2.default.createElement(_reactPager2.default, { total: totalPages,
current: this.state.page,
visiblePages: this.state.visiblePages,
onPageChanged: this.updatePage,
className: this.props.pagerTopClassName || "pagination-sm pull-right",
titles: this.props.pagerTitles
});
var bottomPager = this.state.loading || this.state.entries.length === 0 || this.props.pagersVisible === false || this.props.bottomPagerVisible === false ? '' : _react2.default.createElement(_reactPager2.default, { total: totalPages,
current: this.state.page,
visiblePages: this.state.visiblePages,
onPageChanged: this.updatePage,
className: this.props.pagerBottomClassName,
titles: this.props.pagerTitles
});
return _react2.default.createElement(
'div',
{ className: "filterable-table-container" + (this.props.className ? ' ' + this.props.className : '') },
_react2.default.createElement(_Header2.default, {
loading: this.state.loading,
updateFilter: this.updateFilter,
updateSort: this.updateSort,
filter: this.state.filter,
exactFilters: this.state.exactFilters,
removeExactFilter: this.removeExactFilter,
pageSize: this.state.pageSize,
updatePageSize: this.updatePageSize,
pager: topPager,
recordCount: filteredEntries.length,
recordCountName: this.props.recordCountName,
recordCountNamePlural: this.props.recordCountNamePlural,
upperHeaderChildren: this.props.upperHeaderChildren,
lowerHeaderChildren: this.props.lowerHeaderChildren,
visible: this.props.headerVisible,
filterInputVisible: this.props.filterInputVisible,
pagersVisible: this.props.pagersVisible,
pageSizes: this.props.pageSizes,
autofocusFilter: this.props.autofocusFilter
}),
_react2.default.createElement(
'div',
{ className: 'table-container' },
loading,
serverErrorMessage,
noRecordsMessage,
table,
bottomPager
)
);
}
}], [{
key: 'defaultProps',
get: function get() {
// Set defaults if values weren't passed in
return {
noRecordsMessage: "There are no records to display",
tableClassName: "table table-condensed table-hover filterable-table",
pageSizes: [10, 20, 30, 50]
};
}
}]);
return FilterableTable;
}(_react2.default.Component);
module.exports = FilterableTable;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
module.exports = require("react");
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
'use strict';
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _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; }; }();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _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; }
function _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; }
var hasValue = __webpack_require__(5);
var getValue = __webpack_require__(6);
var Table = function (_React$Component) {
_inherits(Table, _React$Component);
function Table() {
_classCallCheck(this, Table);
return _possibleConstructorReturn(this, (Table.__proto__ || Object.getPrototypeOf(Table)).apply(this, arguments));
}
_createClass(Table, [{
key: 'headerSortElement',
value: function headerSortElement(field) {
// Return the prop element for the sort icon (if provided)
if (field.sortable) {
var sortField = this.props.sortFields.find(function (sf) {
return sf.name === field.name || sf.name === field.sortFieldName && field.sortFieldName != null;
});
if (sortField) {
if (!sortField.reverse) {
return this.props.iconSortedAsc || _react2.default.createElement('span', { className: 'fa fa-sort-asc' });
} else {
return this.props.iconSortedDesc || _react2.default.createElement('span', { className: 'fa fa-sort-desc' });
}
}
return this.props.iconSort || _react2.default.createElement('span', { className: 'fa fa-sort' });
}
return null;
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _props = this.props,
addExactFilter = _props.addExactFilter,
updateSort = _props.updateSort,
page = _props.page,
pageSize = _props.pageSize,
visible = _props.visible,
onRowClicked = _props.onRowClicked;
// Paging - determine indexes for where to slice the array
var startIndex = page * pageSize;
var endIndex = startIndex + pageSize;
// Slice array based on what should be shown on the current page
// if pagersVisible is false, don't slice it - all records should be shown
var records = this.props.records;
if (this.props.pagersVisible !== false) {
records = records.slice(startIndex, endIndex);
}
// If the field has the visible property set to false, ignore it
var fields = this.props.fields.filter(function (field) {
return field.visible !== false;
});
var headerRow = _react2.default.createElement(
'tr',
null,
fields.map(function (field, i) {
// Use the displayName property if supplied, otherwise use name
var fieldDisplayName = field.displayName !== undefined ? field.displayName : field.name;
var renderProps = _extends({ field: field }, _this2.props);
if (typeof field.thRender === "function") {
fieldDisplayName = field.thRender(renderProps);
}
var thProps = field.thProps || {};
if (typeof thProps === "function") {
thProps = thProps(renderProps);
}
return _react2.default.createElement(
'th',
_extends({ className: field.thClassName ? field.thClassName : null, key: i, title: field.title || null, onClick: field.sortable ? function () {
return updateSort(field.sortFieldName || field.name);
} : null }, thProps),
_react2.default.createElement(
'span',
{ className: field.sortable ? "sortable" : null },
fieldDisplayName
),
_this2.headerSortElement(field)
);
})
);
// Add filter textboxes above the table headers if the `showHeaderFilters` prop was set
var headerFilterRow = this.props.showHeaderFilters && _react2.default.createElement(
'tr',
null,
fields.map(function (field, i) {
var fieldFilter = _this2.props.fieldFilters.find(function (f) {
return f.fieldname === field.name;
});
return _react2.default.createElement(
'th',
{ key: 'fieldFilter_' + i, className: 'headerFilter' },
field.inputFilterable && _react2.default.createElement(
'span',
{ className: 'filter-container' },
_react2.default.createElement('input', {
className: 'form-control form-control-sm filter-input ' + (fieldFilter && fieldFilter.value.length ? "has-value" : ""),
placeholder: 'Filter',
value: fieldFilter ? fieldFilter.value : "",
onChange: function onChange(e) {
return _this2.props.updateFieldFilter({ fieldname: field.name, value: e.target.value, exact: field.fieldFilterExact || false });
}
}),
_react2.default.createElement(
'span',
{ className: 'close clear-filter', onClick: function onClick(e) {
_this2.props.updateFieldFilter({ fieldname: field.name, value: "" });
// Focus the text box
e.target.parentElement.firstElementChild.focus();
} },
'\xD7'
)
)
);
})
);
var rows = records.map(function (record, i) {
var trClassName = _this2.props.trClassName || null;
var trProps = _this2.props.trProps || {};
if (typeof trProps === "function") {
trProps = trProps(record, i);
}
if (typeof _this2.props.trClassName === "function") {
trClassName = _this2.props.trClassName(record, i);
}
var tableTds = fields.map(function (field, q) {
// Use the displayName property if supplied, otherwise use name
var fieldDisplayName = field.displayName !== undefined ? field.displayName : field.name;
var spanClassName = "";
var tdClassName = field.tdClassName || null;
// Build out the body of the <td>
var recordBody = getValue(record, field.name);
// If this field has a render function, call it with some props
var renderProps = _extends({
value: recordBody,
record: record,
recordIndex: i,
records: _this2.props.allRecords,
filteredRecords: records,
field: field
}, _this2.props);
if (field.render && typeof field.render === "function") {
recordBody = field.render(renderProps);
}
// If tdClassName is a function, call it with our renderProps
if (typeof field.tdClassName === "function") {
tdClassName = field.tdClassName(renderProps);
}
// Determine if the body is empty
var bodyIsEmpty = recordBody === null || recordBody === undefined || recordBody.toString().length === 0;
// If the body is empty and the field has something set for emptyDisplay, use that as the text.
if (field.emptyDisplay && bodyIsEmpty) {
recordBody = field.emptyDisplay;
}
// add the "empty" classname if record is empty
if (bodyIsEmpty) {
spanClassName = "empty";
}
if (!bodyIsEmpty && field.exactFilterable) {
spanClassName = "filterable";
}
var tdContent = hasValue(recordBody) ? _react2.default.createElement(
'span',
{ className: spanClassName, onClick: field.exactFilterable ? function () {
return addExactFilter(getValue(record, field.name), field.name, fieldDisplayName);
} : null },
recordBody
) : null;
var tdProps = {};
if (field.tdProps != null) {
tdProps = field.tdProps;
if (typeof tdProps === "function") {
tdProps = tdProps(renderProps);
}
}
return _react2.default.createElement(
'td',
_extends({ className: tdClassName }, tdProps, { key: q }),
tdContent
);
});
var rowClicked = onRowClicked ? function () {
return onRowClicked({ record: record, index: i });
} : null;
return _react2.default.createElement(
'tr',
_extends({ key: i, className: trClassName }, trProps, { onClick: rowClicked }),
tableTds
);
});
var tfoot = fields.some(function (f) {
return f.footerValue;
}) ? _react2.default.createElement(
'tfoot',
null,
_react2.default.createElement(
'tr',
{ className: this.props.footerTrClassName },
fields.map(function (field, i) {
var renderProps = _extends({
records: _this2.props.allRecords,
filteredRecords: _this2.props.records,
field: field
}, _this2.props);
return _react2.default.createElement(
'td',
{ key: i, className: field.footerTdClassName },
(typeof field.footerValue === "function" ? field.footerValue(renderProps) : field.footerValue) || ''
);
})
)
) : null;
var tableClassName = this.props.className;
if (tableClassName.indexOf('filterable-table') === -1) {
// Make sure class 'filterable-table' is included
tableClassName += " filterable-table";
}
var tableProps = this.props.tableProps ? this.props.tableProps : {};
return rows.length === 0 && this.props.fieldFilters.length === 0 ? _react2.default.createElement(
'div',
null,
this.props.noFilteredRecordsMessage || 'There are no records to display.'
) : _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'table',
_extends({ className: tableClassName, style: this.props.style }, tableProps),
_react2.default.createElement(
'thead',
null,
headerFilterRow,
headerRow
),
_react2.default.createElement(
'tbody',
null,
rows
),
tfoot
)
);
}
}]);
return Table;
}(_react2.default.Component);
module.exports = Table;
/***/ }),
/* 5 */
/***/ (function(module, exports) {
"use strict";
// Return true if it's not null or undefined, and length is > 0
module.exports = function (val) {
return val !== null && val !== undefined && val.toString().length > 0;
};
/***/ }),
/* 6 */
/***/ (function(module, exports) {
"use strict";
// If field has a dot in it, traverse object with dot notation to get the property value
// Otherwise just return the property of the record
module.exports = function getValue(record, field) {
if (field.indexOf(".") > 0) {
return field.split('.').reduce(function (o, i) {
return o ? o[i] : null;
}, record);
}
return record[field];
};
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
'use strict';
var _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; }; }();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
var _ExactFilters = __webpack_require__(8);
var _ExactFilters2 = _interopRequireDefault(_ExactFilters);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _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; }
function _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; }
var Header = function (_React$Component) {
_inherits(Header, _React$Component);
function Header(props) {
_classCallCheck(this, Header);
var _this = _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).call(this, props));
_this.filterChanged = _this.filterChanged.bind(_this);
_this.filterRef = _react2.default.createRef();
return _this;
}
_createClass(Header, [{
key: 'filterChanged',
value: function filterChanged(event) {
var newValue = event ? event.target.value : '';
if (newValue.length === 0) {
// When clearing filter, set focus in the text box
this.filterRef.current.focus();
}
this.props.updateFilter(newValue);
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
if (this.props.visible === false) {
return _react2.default.createElement('div', null);
}
var _props = this.props,
loading = _props.loading,
recordCount = _props.recordCount,
filter = _props.filter,
updateFilter = _props.updateFilter,
updatePageSize = _props.updatePageSize,
pageSizes = _props.pageSizes;
// Record count message -- the text at the top that says something like "4 records"
// text can be overridden using the recordCountName and recordCountNamePlural props.
var recordCountMessage = _react2.default.createElement(
'span',
null,
recordCount.toLocaleString(),
' ',
recordCount === 1 ? this.props.recordCountName : this.props.recordCountNamePlural
);
var filterInput = this.props.filterInputVisible !== false && _react2.default.createElement(
'span',
{ className: 'filter-container' },
_react2.default.createElement('input', { type: 'text', className: 'form-control filter-input', value: filter, onChange: this.filterChanged, ref: this.filterRef, placeholder: 'Filter', autoFocus: this.props.autofocusFilter }),
_react2.default.createElement(
'span',
{ className: 'close clear-filter', onClick: function onClick() {
return _this2.filterChanged('');
} },
'\xD7'
)
);
var perPageSelect = this.props.pagersVisible !== false && this.props.pageSizes && this.props.pageSizes.length > 0 && _react2.default.createElement(
'select',
{ className: 'form-control pull-sm-right pull-md-right pull-lg-right', onChange: updatePageSize, value: this.props.pageSize },
this.props.pageSizes.map(function (p, i) {
return _react2.default.createElement(
'option',
{ value: p, key: i },
p,
' per page'
);
})
);
return _react2.default.createElement(
'div',
null,
this.props.children,
this.props.upperHeaderChildren,
_react2.default.createElement(
'div',
{ className: 'row header-row' },
_react2.default.createElement(
'div',
{ className: 'col-sm-3 filter-container' },
filterInput
),
_react2.default.createElement(
'div',
{ className: 'col-sm-5 col-sm-push-4' },
perPageSelect
),
_react2.default.createElement(
'div',
{ className: 'col-sm-4 col-sm-pull-4 text-center text-muted record-count' },
loading || recordCountMessage
)
),
this.props.lowerHeaderChildren,
_react2.default.createElement(
'div',
{ className: 'row header-row' },
_react2.default.createElement(
'div',
{ className: 'col-sm-8' },
_react2.default.createElement(_ExactFilters2.default, {
exactFilters: this.props.exactFilters,
removeExactFilter: this.props.removeExactFilter
})
),
_react2.default.createElement(
'div',
{ className: 'col-sm-4 hidden-xs' },
this.props.pager
)
)
);
}
}], [{
key: 'defaultProps',
get: function get() {
// Set defaults if values weren't passed in
return {
recordCountName: "record",
recordCountNamePlural: "records"
};
}
}]);
return Header;
}(_react2.default.Component);
module.exports = Header;
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
'use strict';
var _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; }; }();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _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; }
function _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; }
var ExactFilter = __webpack_require__(9);
var ExactFilters = function (_React$Component) {
_inherits(ExactFilters, _React$Component);
function ExactFilters(props) {
_classCallCheck(this, ExactFilters);
return _possibleConstructorReturn(this, (ExactFilters.__proto__ || Object.getPrototypeOf(ExactFilters)).call(this, props));
}
_createClass(ExactFilters, [{
key: 'render',
value: function render() {
var _props = this.props,
exactFilters = _props.exactFilters,
removeExactFilter = _props.removeExactFilter;
var filters = exactFilters.map(function (filter, i) {
return _react2.default.createElement(ExactFilter, { filter: filter, removeFilter: removeExactFilter, key: i });
});
return _react2.default.createElement(
'div',
{ className: 'exact-filters' },
filters
);
}
}]);
return ExactFilters;
}(_react2.default.Component);
module.exports = ExactFilters;
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _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; }; }();
var _react = __webpack_require__(3);
var _react2 = _interopRequireDefault(_react);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _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; }
function _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; }
var ExactFilter = function (_React$Component) {
_inherits(ExactFilter, _React$Component);
function ExactFilter(props) {
_classCallCheck(this, ExactFilter);
return _possibleConstructorReturn(this, (ExactFilter.__proto__ || Object.getPrototypeOf(ExactFilter)).call(this, props));
}
_createClass(ExactFilter, [{
key: "render",
value: function render() {
var _props = this.props,
filter = _props.filter,
removeFilter = _props.removeFilter;
return _react2.default.createElement(
"span",
{ className: "filter-item" },
_react2.default.createElement(
"span",
{ className: "filter-item-title" },
_react2.default.createElement(
"span",
{ className: "filter-item-remove", onClick: function onClick(e) {
return removeFilter(filter, e);
} },
_react2.default.createElement("span", { className: "fa fa-times" })
),
filter.name
),
_react2.default.createElement(
"span",
{ className: "filter-item-value" },
filter.value
)
);
}
}]);
return ExactFilter;
}(_react2.default.Component);
module.exports = ExactFilter;
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
!function(e,t){ true?module.exports=t(__webpack_require__(3)):"function"==typeof define&&define.amd?define(["react"],t):"object"==typeof exports?exports.Pager=t(require("react")):e.Pager=t(e.react)}(this,function(e){return function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function a(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(f===clearTimeout)return clearTimeout(e);if((f===r||!f)&&clearTimeout)return f=clearTimeout,clearTimeout(e);try{return f(e)}catch(t){try{return f.call(null,e)}catch(t){return f.call(this,e)}}}function o(){y&&d&&(y=!1,d.length?h=d.concat(h):v=-1,h.length&&u())}function u(){if(!y){var e=a(o);y=!0;for(var t=h.length;t;){for(d=h,h=[];++v<t;)d&&d[v].run();v=-1,t=h.length}d=null,y=!1,i(e)}}function s(e,t){this.fun=e,this.array=t}function l(){}var c,f,p=e.exports={};!function(){try{c="function"==typeof setTimeout?setTimeout:n}catch(e){c=n}try{f="function"==typeof clearTimeout?clearTimeout:r}catch(e){f=r}}();var d,h=[],y=!1,v=-1;p.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];h.push(new s(e,t)),1!==h.length||y||a(u)},s.prototype.run=function(){this.fun.apply(null,this.array)},p.title="browser",p.browser=!0,p.env={},p.argv=[],p.version="",p.versions={},p.on=l,p.addListener=l,p.once=l,p.off=l,p.removeListener=l,p.removeAllListeners=l,p.emit=l,p.prependListener=l,p.prependOnceListener=l,p.listeners=function(e){return[]},p.binding=function(e){throw new Error("process.binding is not supported")},p.cwd=function(){return"/"},p.chdir=function(e){throw new Error("process.chdir is not supported")},p.umask=function(){return 0}},function(e,t,n){"use strict";function r(e){return function(){return e}}var a=function(){};a.thatReturns=r,a.thatReturnsFalse=r(!1),a.thatReturnsTrue=r(!0),a.thatReturnsNull=r(null),a.thatReturnsThis=function(){return this},a.thatReturnsArgument=function(e){return e},e.exports=a},function(e,t,n){"use strict";(function(t){function n(e,t,n,a,i,o,u,s){if(r(t),!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,a,i,o,u,s],f=0;l=new Error(t.replace(/%s/g,function(){return c[f++]})),l.name="Invariant Violation"}throw l.framesToPop=1,l}}var r=function(e){};"production"!==t.env.NODE_ENV&&(r=function(e){if(void 0===e)throw new Error("invariant requires an error message argument")}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";(function(t){var r=n(1),a=r;"production"!==t.env.NODE_ENV&&function(){var e=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];var a=0,i="Warning: "+e.replace(/%s/g,function(){return n[a++]});"undefined"!=typeof console&&console.error(i);try{throw new Error(i)}catch(e){}};a=function(t,n){if(void 0===n)throw new Error("`warning(condition, format, ...args)` requires a warning message argument");if(0!==n.indexOf("Failed Composite propType: ")&&!t){for(var r=arguments.length,a=Array(r>2?r-2:0),i=2;i<r;i++)a[i-2]=arguments[i];e.apply(void 0,[n].concat(a))}}}(),e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(e,t){for(var n=[],r=e;r<t;r++)n.push(r);return n}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=n(6),c=r(l),f=n(7),p=r(f),d={first:"First",prev:"«",prevSet:"...",nextSet:"...",next:"»",last:"Last"},h=function(e){function t(e){a(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleFirstPage=n.handleFirstPage.bind(n),n.handlePreviousPage=n.handlePreviousPage.bind(n),n.handleNextPage=n.handleNextPage.bind(n),n.handleLastPage=n.handleLastPage.bind(n),n.handleMorePrevPages=n.handleMorePrevPages.bind(n),n.handleMoreNextPages=n.handleMoreNextPages.bind(n),n.handlePageChanged=n.handlePageChanged.bind(n),n}return o(t,e),s(t,[{key:"getTitles",value:function(e){return this.props.titles[e]||d[e]}},{key:"calcBlocks",value:function(){var e=this.props,t=e.total,n=e.visiblePages,r=e.current+1;return{total:Math.ceil(t/n),current:Math.ceil(r/n)-1,size:n}}},{key:"isPrevDisabled",value:function(){return this.props.current<=0}},{key:"isNextDisabled",value:function(){return this.props.current>=this.props.total-1}},{key:"isPrevMoreHidden",value:function(){var e=this.calcBlocks();return 1===e.total||0===e.current}},{key:"isNextMoreHidden",value:function(){var e=this.calcBlocks();return 1===e.total||e.current===e.total-1}},{key:"visibleRange",value:function(){var e=this.calcBlocks(),t=e.current*e.size,n=this.props.total-t;return[t+1,t+(n>e.size?e.size:n)+1]}},{key:"handleFirstPage",value:function(){this.isPrevDisabled()||this.handlePageChanged(0)}},{key:"handlePreviousPage",value:function(){this.isPrevDisabled()||this.handlePageChanged(this.props.current-1)}},{key:"handleNextPage",value:function(){this.isNextDisabled()||this.handlePageChanged(this.props.current+1)}},{key:"handleLastPage",value:function(){this.isNextDisabled()||this.handlePageChanged(this.props.total-1)}},{key:"handleMorePrevPages",value:function(){var e=this.calcBlocks();this.handlePageChanged(e.current*e.size-1)}},{key:"handleMoreNextPages",value:function(){var e=this.calcBlocks();this.handlePageChanged((e.current+1)*e.size)}},{key:"handlePageChanged",value:function(e){var t=this.props.onPageChanged;t&&t(e)}},{key:"renderPages",value:function(e){var t=this;return u(e[0],e[1]).map(function(e,n){var r=e-1,a=t.handlePageChanged.bind(t,r),i=t.props.current===r;return c.default.createElement(y,{key:n,index:n,isActive:i,className:"btn-numbered-page",onClick:a},e)})}},{key:"render",value:function(){var e=this.getTitles.bind(this),t="pagination";return this.props.className&&(t+=" "+this.props.className),c.default.createElement("nav",null,c.default.createElement("ul",{className:t},c.default.createElement(y,{className:"btn-first-page",key:"btn-first-page",isDisabled:this.isPrevDisabled(),onClick:this.handleFirstPage},e("