UNPKG

ssc-grid

Version:

React grid component for SSC 3.0

280 lines (222 loc) 8.64 kB
'use strict'; exports.__esModule = true; 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 _FormControl = require('react-bootstrap/lib/FormControl'); var _FormControl2 = _interopRequireDefault(_FormControl); var _HelpBlock = require('react-bootstrap/lib/HelpBlock'); var _HelpBlock2 = _interopRequireDefault(_HelpBlock); var _validation = require('./utils/validation'); var validationUtils = _interopRequireWildcard(_validation); var _TextField = require('./TextField'); var _TextField2 = _interopRequireDefault(_TextField); 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 propTypes = { /** * To ensure accessibility, set controlId on <FormGroup> * https://react-bootstrap.github.io/components.html#forms */ controlId: _propTypes2['default'].string, /** * 是否禁用输入框 */ disabled: _propTypes2['default'].bool, /** * 当光标离开输入框 */ onBlur: _propTypes2['default'].func, /** * 当文本框内容被修改时候调用 */ onChange: _propTypes2['default'].func, /** * 当文本框被聚焦 */ onFocus: _propTypes2['default'].func, /** * 文本框占位字符 */ placeholder: _propTypes2['default'].string, /** * 带有校验功能的输入框 * 场景1:使用内置校验(定义在`src/utils/validation.js`) * 比如`email`为校验邮件地址格式 * ```js * { * type: 'email' * } * ``` * `type`可以是: * - `currency` 货币金额格式 * - `decimal` 十进制数字格式 * - `email` 电子邮件格式 * - `int` 整数类型 * - `length` 输入文本的长度 * - `mobilePhone` 手机号码格式,比如18911112222 * - `required` 必输字段 * 场景2:使用自定义校验 * 比如校验用户输入数字的范围 * ```js * { * type: 'custom', * matchFunc: (value, validator) => parseInt(value, 10) <= 100 && parseInt(value, 10) >= 0, * helpText: (value, validator) => '残值率不能大于100%,小于0%' * } * ``` * 回调函数`matchFunc(string, Object) => boolean`用于对文本框中的文字进行校验,返回false则校验失败,显示`helpText`定义的错误信息 * 回调函数`helpText(string, Object) => string`用于显示校验错误时候的错误提示信息 */ validators: _propTypes2['default'].arrayOf(_propTypes2['default'].oneOfType([_propTypes2['default'].shape({ type: _propTypes2['default'].oneOf(['currency', 'decimal', 'email', 'int', 'mobilePhone', 'required']).isRequired }), _propTypes2['default'].shape({ type: _propTypes2['default'].oneOf(['length']).isRequired, options: _propTypes2['default'].shape({ min: _propTypes2['default'].number.isRequired, max: _propTypes2['default'].number.isRequired }) }), _propTypes2['default'].shape({ type: _propTypes2['default'].oneOf(['custom']), matchFunc: _propTypes2['default'].func.isRequired, helpText: _propTypes2['default'].func.isRequired })])).isRequired, /** * 文本框中显示的值 * 注意:由于文本框是完全自由输入的,所以value的类型,以及在matchFunc回调函数的value参数的类型 * 都是string,具体参照https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement * 文档中关于`value`属性的定义 */ value: _propTypes2['default'].string }; /** * 控件(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 */ var defaultProps = { validators: [], value: '' }; /** * 带有校验功能的文本框控件 */ var ValidateInput = function (_Component) { (0, _inherits3['default'])(ValidateInput, _Component); function ValidateInput(props) { (0, _classCallCheck3['default'])(this, ValidateInput); var _this = (0, _possibleConstructorReturn3['default'])(this, _Component.call(this, props)); _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; } /** * @param {Object} nextProps */ ValidateInput.prototype.componentWillReceiveProps = function componentWillReceiveProps() {}; // 提供父组件可以清空校验状态 ValidateInput.prototype.reset = function reset() { this.setState({ helpText: '', validationState: null }); }; /** * 父级组件主动校验 * @return {booean} 校验成功还是失败 */ ValidateInput.prototype.doValidate = function doValidate() { return this.setValidationState(this.textFieldRef.state.value); }; /** * 校验状态并设置组件状态 * @param {String} value 文本框内的值 * @return {boolean} 校验成功还是失败 */ ValidateInput.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'; }; ValidateInput.prototype.handleBlur = function handleBlur(event) { var value = event.target.value; this.setValidationState(value); if (this.props.onBlur) { this.props.onBlur(event); } }; ValidateInput.prototype.handleChange = function handleChange(event) { var value = event.target.value; // this.setState({ value }); this.setValidationState(value); if (this.props.onChange) { this.props.onChange(value); } }; ValidateInput.prototype.handleFocus = function handleFocus(event) { if (this.props.onFocus) { this.props.onFocus(event); } }; ValidateInput.prototype.render = function render() { var _this2 = this; return _react2['default'].createElement( _FormGroup2['default'], { controlId: this.props.controlId, validationState: this.state.validationState }, _react2['default'].createElement(_TextField2['default'], { ref: function ref(c) { return _this2.textFieldRef = c; }, value: this.props.value, disabled: this.props.disabled, onBlur: this.handleBlur, onChange: this.handleChange, onFocus: this.handleFocus }), _react2['default'].createElement(_FormControl2['default'].Feedback, null), _react2['default'].createElement( _HelpBlock2['default'], null, this.state.helpText ) ); }; return ValidateInput; }(_react.Component); ValidateInput.displayName = 'ValidateInput'; exports['default'] = ValidateInput; ValidateInput.propTypes = propTypes; ValidateInput.defaultProps = defaultProps; module.exports = exports['default'];