UNPKG

ssc-grid

Version:

React grid component for SSC 3.0

333 lines (276 loc) 9.38 kB
'use strict'; exports.__esModule = true; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); 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 _FormGroup = require('react-bootstrap/lib/FormGroup'); var _FormGroup2 = _interopRequireDefault(_FormGroup); var _HelpBlock = require('react-bootstrap/lib/HelpBlock'); var _HelpBlock2 = _interopRequireDefault(_HelpBlock); var _validation = require('./utils/validation'); var validationUtils = _interopRequireWildcard(_validation); var _sscRefer = require('ssc-refer'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } /** * 带有校验功能的文本框控件 */ var ValidateRefers = function (_Component) { (0, _inherits3['default'])(ValidateRefers, _Component); function ValidateRefers(props) { (0, _classCallCheck3['default'])(this, ValidateRefers); var _this = (0, _possibleConstructorReturn3['default'])(this, _Component.call(this, props)); _this.renderlabelKey = function (option) { var label = ''; if (option) { if (option.code) { label = option.code; } if (option.name) { label += ' ' + option.name; } } return label; }; _this.state = { /** * 帮助信息文本 * @type {String} */ helpText: '', /** * Set validationState to one of 'success', 'warning' or 'error' to show * validation state. Set validationState to null (or undefined) to hide * validation state * @type {String} */ validationState: null }; _this.handleBlur = _this.handleBlur.bind(_this); _this.handleChange = _this.handleChange.bind(_this); _this.handleFocus = _this.handleFocus.bind(_this); return _this; } /** * 重置参照组件,重置校验状态 * @public */ ValidateRefers.prototype.reset = function reset() { this.refers.getInstance().clear(); this.setState({ helpText: '', validationState: null }); }; /** * 父级组件主动校验 * @public * @return {booean} 校验成功还是失败 */ ValidateRefers.prototype.doValidate = function doValidate() { return this.setValidationState(this.getRefersDisplayValue()); }; /** * 获取参照的值,这里只处理第一个被选中的值 * @return {Object} 比如 * ```js * { * id: '', * code: '', * name: '', * } * ``` * 如果没有一个被选中,则返回null */ ValidateRefers.prototype.getRefersValue = function getRefersValue(selected) { if (!selected) { selected = this.refers.getInstance().getData(); } return selected.length > 0 ? selected[0] : null; }; /** * 获取参照的值,这里只处理第一个被选中的值 * @return {Object} 比如 * ```js * { * id: '', * code: '', * name: '', * } * ``` */ ValidateRefers.prototype.getRefersDisplayValue = function getRefersDisplayValue(selected) { var value = this.getRefersValue(selected); // 这里假设参照值的结构中`name`字段是用于显示的值 return value ? value.name : ''; }; /** * 校验状态并设置组件状态 * @param {String} value 文本框内的值 * @return {boolean} 校验成功还是失败 */ ValidateRefers.prototype.setValidationState = function setValidationState(value) { var _validationUtils$calc = validationUtils.calcValidationState(value, this.props.validators), validationState = _validationUtils$calc.validationState, helpText = _validationUtils$calc.helpText; this.setState({ helpText: helpText, validationState: validationState }); return validationState === 'success'; }; ValidateRefers.prototype.handleBlur = function handleBlur(event) { this.setValidationState(this.getRefersDisplayValue()); if (this.props.onBlur) { this.props.onBlur(event); } }; ValidateRefers.prototype.handleChange = function handleChange(selected) { this.setState({ selected: selected }); this.setValidationState(this.getRefersDisplayValue(selected)); if (this.props.onChange) { this.props.onChange(selected); } }; ValidateRefers.prototype.handleFocus = function handleFocus(event) { if (this.props.onFocus) { this.props.onFocus(event); } }; ValidateRefers.prototype._renderMenuItemChildren = function _renderMenuItemChildren(option, props, index) { var label = option.code + ' ' + option.name; return _react2['default'].createElement( 'span', { title: label, key: index }, label, ' ' ); }; ValidateRefers.prototype.render = function render() { var _this2 = this; return _react2['default'].createElement( _FormGroup2['default'], { controlId: this.props.controlId, validationState: this.state.validationState }, _react2['default'].createElement(_sscRefer.Refers, (0, _extends3['default'])({ ref: function ref(c) { return _this2.refers = c; } }, this.props, { labelKey: this.props.labelKey || 'name' // labelKey={this.renderlabelKey.bind(this)} , disabled: this.props.disabled === true, minLength: 0, align: 'justify', emptyLabel: '', multiple: this.props.multiple || false, onChange: this.handleChange, onBlur: this.handleBlur, onFocus: this.handleFocus, placeholder: this.props.placeholder || '请选择...', referType: 'list', selected: this.props.selected, renderMenuItemChildren: this.props.renderMenuItemChildren || this._renderMenuItemChildren })), _react2['default'].createElement( _HelpBlock2['default'], null, this.state.helpText ) ); }; return ValidateRefers; }(_react.Component); /** * 控件(control/widget)分类 * Command input: Button, Drop-down list, ... * Data input-output: Checkbox Color picker Combo box Cycle button Date Picker Grid view List box List builder Radio button Scrollbar Search box Slider Spinner Text box * 来源:https://en.wikipedia.org/wiki/Widget_(GUI) * 第二来源:https://docs.joomla.org/Standard_form_field_types * Joomla的名称和Web更贴切,wikipedia不区分Web还是Client */ ValidateRefers.displayName = 'ValidateRefers'; exports['default'] = ValidateRefers; ValidateRefers.propTypes = { /** * To ensure accessibility, set controlId on <FormGroup> * https://react-bootstrap.github.io/components.html#forms */ controlId: _propTypes2['default'].string, /** * 是否禁用输入框 */ disabled: _propTypes2['default'].bool, /** * 是否多选 */ multiple: _propTypes2['default'].bool, /** * 请参照参照文档https://ssc-refer.github.io/ */ labelKey: _propTypes2['default'].string, /** * 当光标离开输入框 */ onBlur: _propTypes2['default'].func, /** * 当文本框内容被修改时候调用 */ onChange: _propTypes2['default'].func, /** * 当文本框被聚焦 */ onFocus: _propTypes2['default'].func, /** * 文本框占位字符 */ placeholder: _propTypes2['default'].string, /** * 参照配置参数 * ```js * referConfig = { * referConditions: {"refCode":"dept","refType":"tree","rootName":"部门"}; * } * ``` */ referConditions: _propTypes2['default'].shape({ refCode: _propTypes2['default'].string, refType: _propTypes2['default'].string, rootName: _propTypes2['default'].string }).isRequired, /** * referDataUrl: "http://172.20.4.220/ficloud/refbase_ctr/queryRefJSON"; */ referDataUrl: _propTypes2['default'].string.isRequired, /** * 参照初始值 */ selected: _propTypes2['default'].arrayOf(_propTypes2['default'].shape({ id: _propTypes2['default'].string, code: _propTypes2['default'].string, name: _propTypes2['default'].string })).isRequired, /** * 带有校验功能的输入框 */ validators: _propTypes2['default'].arrayOf(_propTypes2['default'].shape({ type: _propTypes2['default'].string })), /** * 自定义参照下拉列表 */ renderMenuItemChildren: _propTypes2['default'].func }; ValidateRefers.defaultProps = { selected: [], validators: [] }; module.exports = exports['default'];