react-mentions
Version:
React mentions input
233 lines (182 loc) • 6.86 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
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 _substyle = require('substyle');
var _utils = require('./utils');
var _utils2 = _interopRequireDefault(_utils);
var _Suggestion = require('./Suggestion');
var _Suggestion2 = _interopRequireDefault(_Suggestion);
var _LoadingIndicator = require('./LoadingIndicator');
var _LoadingIndicator2 = _interopRequireDefault(_LoadingIndicator);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var SuggestionsOverlay = function (_Component) {
(0, _inherits3.default)(SuggestionsOverlay, _Component);
function SuggestionsOverlay() {
(0, _classCallCheck3.default)(this, SuggestionsOverlay);
return (0, _possibleConstructorReturn3.default)(this, (SuggestionsOverlay.__proto__ || (0, _getPrototypeOf2.default)(SuggestionsOverlay)).apply(this, arguments));
}
(0, _createClass3.default)(SuggestionsOverlay, [{
key: 'componentDidUpdate',
value: function componentDidUpdate() {
var suggestions = this.refs.suggestions;
if (!suggestions || suggestions.offsetHeight >= suggestions.scrollHeight || !this.props.scrollFocusedIntoView) {
return;
}
var scrollTop = suggestions.scrollTop;
var _suggestions$children = suggestions.children[this.props.focusIndex].getBoundingClientRect(),
top = _suggestions$children.top,
bottom = _suggestions$children.bottom;
var _suggestions$getBound = suggestions.getBoundingClientRect(),
topContainer = _suggestions$getBound.top;
top = top - topContainer + scrollTop;
bottom = bottom - topContainer + scrollTop;
if (top < scrollTop) {
suggestions.scrollTop = top;
} else if (bottom > suggestions.offsetHeight) {
suggestions.scrollTop = bottom - suggestions.offsetHeight;
}
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
suggestions = _props.suggestions,
isLoading = _props.isLoading,
style = _props.style,
onMouseDown = _props.onMouseDown;
// do not show suggestions until there is some data
if (_utils2.default.countSuggestions(suggestions) === 0 && !isLoading) {
return null;
}
return _react2.default.createElement(
'div',
(0, _extends3.default)({}, style, {
onMouseDown: onMouseDown
}),
_react2.default.createElement(
'ul',
(0, _extends3.default)({
ref: 'suggestions'
}, style("list")),
this.renderSuggestions()
),
this.renderLoadingIndicator()
);
}
}, {
key: 'renderSuggestions',
value: function renderSuggestions() {
var _this2 = this;
return _utils2.default.getSuggestions(this.props.suggestions).reduce(function (result, _ref) {
var suggestions = _ref.suggestions,
descriptor = _ref.descriptor;
return [].concat((0, _toConsumableArray3.default)(result), (0, _toConsumableArray3.default)(suggestions.map(function (suggestion, index) {
return _this2.renderSuggestion(suggestion, descriptor, result.length + index);
})));
}, []);
}
}, {
key: 'renderSuggestion',
value: function renderSuggestion(suggestion, descriptor, index) {
var _this3 = this;
var id = this.getID(suggestion);
var isFocused = index === this.props.focusIndex;
var mentionDescriptor = descriptor.mentionDescriptor,
query = descriptor.query;
return _react2.default.createElement(_Suggestion2.default, {
style: this.props.style("item"),
key: id,
id: id,
ref: isFocused ? "focused" : null,
query: query,
index: index,
descriptor: mentionDescriptor,
suggestion: suggestion,
focused: isFocused,
onClick: function onClick() {
return _this3.select(suggestion, descriptor);
},
onMouseEnter: function onMouseEnter() {
return _this3.handleMouseEnter(index);
} });
}
}, {
key: 'getID',
value: function getID(suggestion) {
if (suggestion instanceof String) {
return suggestion;
}
return suggestion.id;
}
}, {
key: 'renderLoadingIndicator',
value: function renderLoadingIndicator() {
if (!this.props.isLoading) {
return;
}
return _react2.default.createElement(_LoadingIndicator2.default, this.props.style("loadingIndicator"));
}
}, {
key: 'handleMouseEnter',
value: function handleMouseEnter(index, ev) {
if (this.props.onMouseEnter) {
this.props.onMouseEnter(index);
}
}
}, {
key: 'select',
value: function select(suggestion, descriptor) {
this.props.onSelect(suggestion, descriptor);
}
}]);
return SuggestionsOverlay;
}(_react.Component);
SuggestionsOverlay.propTypes = {
suggestions: _propTypes2.default.object.isRequired,
focusIndex: _propTypes2.default.number,
scrollFocusedIntoView: _propTypes2.default.bool,
isLoading: _propTypes2.default.bool,
onSelect: _propTypes2.default.func
};
SuggestionsOverlay.defaultProps = {
suggestions: {},
onSelect: function onSelect() {
return null;
}
};
var styled = (0, _substyle.defaultStyle)(function (_ref2) {
var position = _ref2.position;
return (0, _extends3.default)({
position: "absolute",
zIndex: 1,
backgroundColor: "white",
marginTop: 14,
minWidth: 100
}, position, {
list: {
margin: 0,
padding: 0,
listStyleType: "none"
}
});
});
exports.default = styled(SuggestionsOverlay);