UNPKG

sematable

Version:

Client side sorting, pagination, and text filter for redux/react based apps

184 lines (156 loc) 6.64 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _behaviours; 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 _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _reduxActions = require('redux-actions'); var _actions = require('./actions.js'); var _common = require('./common'); var _PageSize = require('./PageSize'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } var defaultState = function defaultState() { var configs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return { page: 0, pageSize: configs.defaultPageSize || 5, pageSizes: configs.defaultPageSizes || [5, 10, 15, 20, 50, 100, _PageSize.PAGE_SIZE_ALL_VALUE], filter: [], filterText: null, sortKey: configs.sortKey, direction: configs.sortDirection || 'asc', selectAll: false, userSelection: [], configs: configs }; }; var filterValueToFilter = function filterValueToFilter() { var filterValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var columnMap = arguments[1]; return filterValue.map(function (f) { if (_lodash2.default.isString(f)) { return (0, _common.createTextFilter)(f); } var column = columnMap[f.key]; return (0, _common.createValueFilter)(column, f.value); }); }; var behaviours = (_behaviours = {}, _defineProperty(_behaviours, _actions.TABLE_INITIALIZE, function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _ref = arguments[1]; var payload = _ref.payload; var nextState = _extends({}, defaultState(payload.configs), state, payload, { userSelection: payload.initialUserSelection || [] }); var primaryKeyCol = _lodash2.default.find(nextState.columns, 'primaryKey'); var columnMap = _lodash2.default.keyBy(nextState.columns, 'key'); var filter = payload.filterValue ? filterValueToFilter(payload.filterValue, columnMap) : nextState.filter; if (!primaryKeyCol) { var msg = 'One column must be marked as primary with "primaryKey" for' + (' data table ' + nextState.tableName + '.'); throw new Error(msg); } return _extends({}, nextState, { filter: filter, primaryKey: primaryKeyCol.key }); }), _defineProperty(_behaviours, _actions.TABLE_NEW_DATA, function (state, _ref2) { var payload = _ref2.payload; return _extends({}, state, { initialData: payload.data }); }), _defineProperty(_behaviours, _actions.EDITING_TABLE, function (state, _ref3) { var payload = _ref3.payload; return _extends({}, state, { editing: payload.editing }); }), _defineProperty(_behaviours, _actions.TABLE_SET_FILTER, function (state, _ref4) { var payload = _ref4.payload; var columnMap = _lodash2.default.keyBy(state.columns, 'key'); var filter = filterValueToFilter(payload.filterValue, columnMap); return _extends({}, state, { filter: filter }); }), _defineProperty(_behaviours, _actions.TABLE_PAGE_CHANGED, function (state, _ref5) { var payload = _ref5.payload; return _extends({}, state, { page: payload.page }); }), _defineProperty(_behaviours, _actions.TABLE_PAGE_SIZE_CHANGED, function (state, _ref6) { var payload = _ref6.payload; return _extends({}, state, { page: 0, pageSize: payload.pageSize }); }), _defineProperty(_behaviours, _actions.TABLE_SORT_CHANGED, function (state, _ref7) { var payload = _ref7.payload; var sortKey = state.sortKey, direction = state.direction; if (sortKey === payload.sortKey) { return _extends({}, state, { direction: direction === 'asc' ? 'desc' : 'asc' }); } return _extends({}, state, { sortKey: payload.sortKey, direction: 'asc' }); }), _defineProperty(_behaviours, _actions.TABLE_FILTER_CHANGED, function (state, _ref8) { var payload = _ref8.payload; return _extends({}, state, { page: 0, filter: payload.filter, // don't clear filterText when a single filter is removed // see: https://react-select.com/advanced#action-meta filterText: payload.action === 'remove-value' ? state.filterText : null }); }), _defineProperty(_behaviours, _actions.TABLE_FILTER_TEXT_CHANGED, function (state, _ref9) { var payload = _ref9.payload; return _extends({}, state, { page: 0, filterText: payload.filterText }); }), _defineProperty(_behaviours, _actions.TABLE_SELECT_ALL_CHANGED, function (state) { return _extends({}, state, { selectAll: !state.selectAll, userSelection: [] }); }), _defineProperty(_behaviours, _actions.TABLE_ROW_CHECKED_CHANGED, function (state, _ref10) { var payload = _ref10.payload; var userSelection = state.userSelection, primaryKey = state.primaryKey; var row = payload.row; var idx = _lodash2.default.indexOf(userSelection, _lodash2.default.get(row, primaryKey)); if (idx !== -1) { return _extends({}, state, { userSelection: [].concat(_toConsumableArray(userSelection.slice(0, idx)), _toConsumableArray(userSelection.slice(idx + 1))) }); } return _extends({}, state, { userSelection: [].concat(_toConsumableArray(userSelection), [_lodash2.default.get(row, primaryKey)]) }); }), _defineProperty(_behaviours, _actions.TABLE_USER_SELECTION, function (state, _ref11) { var payload = _ref11.payload; return _extends({}, state, { userSelection: payload.userSelection || [] }); }), _defineProperty(_behaviours, _actions.TABLE_DESTROY_STATE, function (state) { if (!state) { return state; } return _extends({}, state, defaultState(state.configs)); }), _behaviours); var tableReducer = (0, _reduxActions.handleActions)(behaviours, {}); exports.default = function (state, action) { if (!state) { return {}; } if (_lodash2.default.has(behaviours, action.type)) { var tableName = action.payload.tableName; return _extends({}, state, _defineProperty({}, tableName, tableReducer(state[tableName], action))); } return state; };