react-mapfilter
Version:
A React Component for viewing and filtering GeoJSON
327 lines (263 loc) • 9.49 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactAutosuggest = require('react-autosuggest');
var _reactAutosuggest2 = _interopRequireDefault(_reactAutosuggest);
var _TextField = require('@material-ui/core/TextField');
var _TextField2 = _interopRequireDefault(_TextField);
var _Paper = require('@material-ui/core/Paper');
var _Paper2 = _interopRequireDefault(_Paper);
var _MenuItem = require('@material-ui/core/MenuItem');
var _MenuItem2 = _interopRequireDefault(_MenuItem);
var _reactIsolatedScroll = require('react-isolated-scroll');
var _reactIsolatedScroll2 = _interopRequireDefault(_reactIsolatedScroll);
var _match = require('autosuggest-highlight/match');
var _match2 = _interopRequireDefault(_match);
var _parse = require('autosuggest-highlight/parse');
var _parse2 = _interopRequireDefault(_parse);
var _omit = require('lodash/omit');
var _omit2 = _interopRequireDefault(_omit);
var _isEqual = require('lodash/isEqual');
var _isEqual2 = _interopRequireDefault(_isEqual);
var _objectAssign = require('object-assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _styles = require('@material-ui/core/styles');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ITEM_HEIGHT = 48;
var styleSheet = function styleSheet(theme) {
return {
container: {
flexGrow: 1,
position: 'relative',
fontSize: 14
},
suggestionsContainerOpen: {
position: 'absolute',
marginTop: theme.spacing.unit,
marginBottom: theme.spacing.unit * 3,
left: 0,
right: 0,
zIndex: 99
},
suggestionsContainerInner: {
maxHeight: ITEM_HEIGHT * 6.5,
overflowY: 'auto'
},
suggestion: {
display: 'block',
fontSize: 14
},
suggestionsList: {
margin: 0,
padding: 0,
listStyleType: 'none'
},
textField: {
width: '100%'
},
input: {
fontSize: 'inherit'
}
};
};
function renderInput(props) {
var classes = props.classes,
home = props.home,
value = props.value,
inputRef = props.inputRef,
ref = props.ref,
style = props.style;
var inputProps = (0, _objectAssign2.default)({}, (0, _omit2.default)(props, ['classes', 'home', 'value', 'inputRef', 'ref', 'style']), { className: classes.input });
function callRef(el) {
inputRef(el);
ref(el);
}
return _react2.default.createElement(_TextField2.default, {
style: style,
autoFocus: home,
className: classes.textField,
value: value,
inputRef: callRef,
InputProps: inputProps
});
}
function renderSuggestion(suggestion, _ref) {
var query = _ref.query,
isHighlighted = _ref.isHighlighted;
var matches = (0, _match2.default)(suggestion, query);
var parts = (0, _parse2.default)(suggestion, matches);
return _react2.default.createElement(
_MenuItem2.default,
{ dense: true, selected: isHighlighted, component: 'div', style: { fontSize: 14 } },
_react2.default.createElement(
'div',
null,
parts.map(function (part, index) {
return part.highlight ? _react2.default.createElement(
'span',
{ key: index, style: { fontWeight: 500 } },
part.text
) : _react2.default.createElement(
'strong',
{ key: index, style: { fontWeight: 300 } },
part.text
);
})
)
);
}
function getSuggestionValue(suggestion) {
return suggestion;
}
function shouldRenderSuggestions() {
return true;
}
function getSuggestions(value, suggestions) {
var inputValue = value.trim().toLowerCase();
var inputLength = inputValue.length;
var count = 0;
return inputLength === 0 ? suggestions : suggestions.filter(function (suggestion) {
var keep = count < 5 && suggestion.toLowerCase().slice(0, inputLength) === inputValue;
if (keep) {
count += 1;
}
return keep;
});
}
var Select = function (_Component) {
(0, _inherits3.default)(Select, _Component);
function Select() {
var _ref2;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, Select);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref2 = Select.__proto__ || (0, _getPrototypeOf2.default)(Select)).call.apply(_ref2, [this].concat(args))), _this), _this.state = {
suggestions: _this.props.suggestions
}, _this.renderSuggestionsContainer = function (_ref3) {
var containerProps = _ref3.containerProps,
children = _ref3.children;
var callRef = function callRef(isolatedScroll) {
if (isolatedScroll !== null) {
containerProps.ref(isolatedScroll.component);
}
};
return _react2.default.createElement(
_Paper2.default,
containerProps,
_react2.default.createElement(
_reactIsolatedScroll2.default,
{ ref: callRef, className: _this.props.classes.suggestionsContainerInner },
children
)
);
}, _this.getSuggestions = function (_ref4) {
var value = _ref4.value;
_this.setState({
suggestions: _this.justFocussed ? _this.props.suggestions : getSuggestions(value, _this.props.suggestions)
});
}, _this.resetSuggestions = function () {
_this.setState({
suggestions: _this.props.suggestions
});
}, _this.selectInputText = function (e) {
e.target.select();
_this.justFocussed = true;
// Naughty? But it works... *WARNING* relies on an internal method of react-autosuggest
_this.autosuggest && _this.autosuggest.revealSuggestions();
}, _this.handleChange = function (e, d) {
_this.justFocussed = false;
_this.props.onChange(e, d);
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(Select, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if (!(0, _isEqual2.default)(nextProps.suggestions, this.props.suggestions)) {
this.setState({ suggestions: nextProps.suggestions });
}
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _props = this.props,
classes = _props.classes,
className = _props.className,
value = _props.value,
onSuggestionSelected = _props.onSuggestionSelected,
onKeyDown = _props.onKeyDown,
style = _props.style;
return _react2.default.createElement(_reactAutosuggest2.default, {
ref: function ref(el) {
return _this2.autosuggest = el;
},
theme: {
container: classes.container + ' ' + className,
suggestionsContainerOpen: classes.suggestionsContainerOpen,
suggestionsList: classes.suggestionsList,
suggestion: classes.suggestion
},
shouldRenderSuggestions: shouldRenderSuggestions,
renderInputComponent: renderInput,
suggestions: this.state.suggestions,
onSuggestionsFetchRequested: this.getSuggestions,
onSuggestionsClearRequested: this.resetSuggestions,
onSuggestionSelected: onSuggestionSelected,
renderSuggestionsContainer: this.renderSuggestionsContainer,
getSuggestionValue: getSuggestionValue,
renderSuggestion: renderSuggestion,
inputProps: {
inputRef: function inputRef(el) {
return _this2.input = el;
},
style: style,
classes: classes,
value: value,
onChange: this.handleChange,
onFocus: this.selectInputText,
onClick: this.selectInputText,
onKeyDown: onKeyDown
}
});
}
}]);
return Select;
}(_react.Component);
Select.propTypes = {
classes: _propTypes2.default.object.isRequired,
suggestions: _propTypes2.default.arrayOf(_propTypes2.default.string),
value: _propTypes2.default.string,
onChange: _propTypes2.default.func.isRequired,
onSuggestionSelected: _propTypes2.default.func,
onKeyDown: _propTypes2.default.func,
style: _propTypes2.default.object
};
Select.defaultProps = {
onSuggestionSelected: function onSuggestionSelected() {
return null;
},
onKeyDown: function onKeyDown() {
return null;
},
value: '',
classes: {}
};
exports.default = (0, _styles.withStyles)(styleSheet)(Select);
//# sourceMappingURL=Select.js.map