UNPKG

uxcore-mention

Version:

Mention anywhere with this component

203 lines (172 loc) 7.27 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _Panel = require('./Panel'); var _Panel2 = _interopRequireDefault(_Panel); var _mentionMixin = require('./mentionMixin'); var _mentionMixin2 = _interopRequireDefault(_mentionMixin); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return 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) : _defaults(subClass, superClass); } /** * @author: vincent.bian */ /** * Mention Component */ var Mention = function (_BaseMention) { _inherits(Mention, _BaseMention); function Mention(props) { _classCallCheck(this, Mention); var _this = _possibleConstructorReturn(this, _BaseMention.call(this, props)); _this.state = { mentionList: [], cursorPosition: { x: 0, y: 0 }, panelVisible: false, panelIdx: 0 }; return _this; } Mention.prototype.componentDidMount = function componentDidMount() { this.activeEditor = null; }; Mention.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { if (prevState.mentionList.length !== this.state.mentionList.length) { this.setState({ panelVisible: this.state.mentionList.length > 0 }); } if (!prevState.panelVisible && this.state.panelVisible) { this.setState({ panelIdx: 0 }); } }; /** * description of onfocus * @i18n {zh-CN} 测试api文档 * @i18n {en-US} test api doc */ Mention.prototype.onFocus = function onFocus(editorInstance) { this.activeEditor = editorInstance; }; /** * description of setPanelPos */ Mention.prototype.setPanelPos = function setPanelPos(pos) { var position = { x: pos.x, y: pos.y }; this.setState({ cursorPosition: position }); }; Mention.prototype.selectItem = function selectItem(data) { this.setState({ mentionList: [] }); this.activeEditor.insertMentionData(data); }; Mention.prototype.render = function render() { var _this2 = this; var panelPosition = { left: this.state.cursorPosition.x || 0, top: this.state.cursorPosition.y || 0 }; var _props = this.props, prefixCls = _props.prefixCls, onChange = _props.onChange, children = _props.children, panelFormatter = _props.panelFormatter, matchRange = _props.matchRange; return _react2["default"].createElement( 'div', { onKeyUp: this.onPanelKeyup.bind(this) }, _react2["default"].Children.map(children, function (Comp) { return _react2["default"].cloneElement(Comp, { prefixCls: prefixCls, panelVisible: _this2.state.panelVisible, matcher: _this2.runMatcher.bind(_this2), setCursorPos: _this2.setPanelPos.bind(_this2), onChange: onChange, onFocus: _this2.onFocus.bind(_this2), matchRange: matchRange }); }), _react2["default"].createElement(_Panel2["default"], { prefixCls: prefixCls, visible: this.state.panelVisible, idx: this.state.panelIdx, list: this.state.mentionList, onSelect: this.selectItem.bind(this), formatter: panelFormatter, style: panelPosition }) ); }; return Mention; }(_mentionMixin2["default"]); Mention.displayName = 'Mention'; Mention.propTypes = { /** * @i18n {zh-CN} class前缀 * @i18n {en-US} class prefix */ prefixCls: _propTypes2["default"].string, /** * @i18n {zh-CN} 定义数据源 * @i18n {en-US} data source for mention content */ source: _propTypes2["default"].oneOfType([_propTypes2["default"].array, _propTypes2["default"].func]), /** * @i18n {zh-CN} 数据源查询延时 * @i18n {en-US} debounce of the request to data source */ delay: _propTypes2["default"].number, /** * @i18n {zh-CN} 匹配字符区间 * @i18n {en-US} only match the string after delimiter which the length in this range */ matchRange: _propTypes2["default"].arrayOf(_propTypes2["default"].number), /** * @i18n {zh-CN} 数据源格式化匹配 * @i18n {en-US} format the data form source */ formatter: _propTypes2["default"].func, /** * @i18n {zh-CN} 自定义选择列表 * @i18n {en-US} customize the panel display */ panelFormatter: _propTypes2["default"].func, /** * @i18n {zh-CN} 发生变化后的触发 * @i18n {en-US} trigger when editor content change */ onChange: _propTypes2["default"].func, children: _propTypes2["default"].any }; Mention.defaultProps = { prefixCls: 'kuma-mention', source: [], delay: 100, matchRange: [2, 8], formatter: function formatter(data) { return data; }, panelFormatter: function panelFormatter(data) { return '' + data.text; }, onChange: function onChange() {} }; exports["default"] = Mention; module.exports = exports['default'];