react-widgets
Version:
An à la carte set of polished, extensible, and accessible inputs built for React
233 lines (201 loc) • 7.69 kB
JavaScript
;
exports.__esModule = true;
exports.normalizeComponent = normalizeComponent;
exports.defaultGetDataState = defaultGetDataState;
exports.default = listDataManager;
var _react = _interopRequireDefault(require("react"));
var _reactComponentManagers = require("react-component-managers");
var _Filter = require("./Filter");
var _ = require("./_");
var _accessorManager = _interopRequireDefault(require("./accessorManager"));
var _jsxFileName = "src/util/listDataManager.js";
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _extends() { _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; }; return _extends.apply(this, arguments); }
var EMPTY_VALUE = {};
function normalizeComponent(Component) {
return function (itemProps) {
return Component ? _react.default.createElement(Component, _extends({}, itemProps, {
__source: {
fileName: _jsxFileName,
lineNumber: 13
},
__self: this
})) : itemProps.text || itemProps.item;
};
}
function defaultGetDataState(data, _ref, lastState) {
var groupBy = _ref.groupBy;
if (lastState === void 0) {
lastState = {};
}
if (lastState.data !== data || lastState.groupBy !== groupBy) {
if (!groupBy) return {};
var keys = [];
var groups = (0, _.groupBySortedKeys)(groupBy, data, keys);
return {
data: data,
groupBy: groupBy,
groups: groups,
sortedKeys: keys,
sequentialData: Object.keys(groups).reduce(function (flat, grp) {
return flat.concat(groups[grp]);
}, [])
};
}
return lastState;
}
function defaultGetStateGetterFromList(_ref2) {
var listComponent = _ref2.listComponent;
return listComponent && listComponent.getDataState;
}
function listDataManager(component, _temp) {
var _ref3 = _temp === void 0 ? {} : _temp,
getDataState = _ref3.getDataState,
getStateGetterFromProps = _ref3.getStateGetterFromProps,
_ref3$accessors = _ref3.accessors,
accessors = _ref3$accessors === void 0 ? (0, _accessorManager.default)(component) : _ref3$accessors;
var listData;
var listState;
var needsUpdate = true;
var currentProps = component.props;
if (getDataState) getStateGetterFromProps = null;else {
if (!getStateGetterFromProps) getStateGetterFromProps = defaultGetStateGetterFromList;
getDataState = getStateGetterFromProps(currentProps) || defaultGetDataState;
}
(0, _reactComponentManagers.spyOnComponent)(component, {
componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
if (!needsUpdate) needsUpdate = nextProps !== currentProps;
currentProps = nextProps;
if (needsUpdate && getStateGetterFromProps) {
getDataState = getStateGetterFromProps(currentProps) || defaultGetDataState;
}
},
componentWillUnmount: function componentWillUnmount() {
listData = null;
listState = null;
currentProps = null;
getDataState = null;
getStateGetterFromProps = null;
}
});
function isDisabled(item) {
var disabled = currentProps.disabled;
if (!Array.isArray(disabled)) return false;
return disabled.some(function (disabled) {
return accessors.value(item) === accessors.value(disabled);
});
}
function getMatcher(word) {
if (!word) return function () {
return true;
};
word = word.toLowerCase();
return function (item) {
return _Filter.presets.startsWith(accessors.text(item).toLowerCase(), word);
};
}
function getSequentialData() {
var state = manager.getState();
return state && state.sequentialData || listData;
}
var renderItem = function renderItem(_ref4) {
var item = _ref4.item,
rest = _objectWithoutProperties(_ref4, ["item"]);
// eslint-disable-line react/prop-types
var Component = currentProps.itemComponent;
return Component ? _react.default.createElement(Component, _extends({
item: item,
value: accessors.value(item),
text: accessors.text(item),
disabled: isDisabled(item)
}, rest, {
__source: {
fileName: _jsxFileName,
lineNumber: 109
},
__self: this
})) : accessors.text(item);
};
var renderGroup = function renderGroup(_ref5) {
var group = _ref5.group;
// eslint-disable-line react/prop-types
var Component = currentProps.groupComponent;
return Component ? _react.default.createElement(Component, {
item: group,
__source: {
fileName: _jsxFileName,
lineNumber: 121
},
__self: this
}) : group;
};
var manager = {
isDisabled: isDisabled,
first: function first() {
return manager.next(EMPTY_VALUE);
},
last: function last() {
var data = getSequentialData();
return manager.prevEnabled(data[data.length - 1]);
},
prevEnabled: function prevEnabled(item) {
return isDisabled(item) ? manager.prev(item) : item;
},
prev: function prev(item, word) {
var data = getSequentialData();
var matches = getMatcher(word);
var nextIdx = data.indexOf(item);
if (nextIdx < 0 || nextIdx == null) nextIdx = 0;
nextIdx--;
while (nextIdx > -1 && (isDisabled(data[nextIdx]) || !matches(data[nextIdx]))) {
nextIdx--;
}
if (nextIdx >= 0) return data[nextIdx];
if (!manager.isDisabled(item)) return item;
},
next: function next(item, word) {
var data = getSequentialData();
var matches = getMatcher(word);
var nextIdx = data.indexOf(item) + 1;
var len = data.length;
while (nextIdx < len && (isDisabled(data[nextIdx]) || !matches(data[nextIdx]))) {
nextIdx++;
}
if (nextIdx < len) return data[nextIdx];
if (!manager.isDisabled(item)) return item;
},
nextEnabled: function nextEnabled(item) {
return isDisabled(item) ? manager.next(item) : item;
},
setData: function setData(data) {
if (!needsUpdate) needsUpdate = data !== listData;
listData = data;
},
getState: function getState() {
if (needsUpdate) {
needsUpdate = false;
listState = getDataState(listData, currentProps, listState);
}
return listState;
},
defaultProps: function defaultProps() {
var _currentProps = currentProps,
groupBy = _currentProps.groupBy,
optionComponent = _currentProps.optionComponent,
searchTerm = _currentProps.searchTerm;
return _extends({
groupBy: groupBy,
renderItem: renderItem,
renderGroup: renderGroup,
searchTerm: searchTerm,
optionComponent: optionComponent,
isDisabled: isDisabled
}, currentProps.listProps, {
data: listData,
dataState: manager.getState()
});
}
};
return manager;
}