ssc-grid
Version:
React grid component for SSC 3.0
432 lines (356 loc) • 12.5 kB
JavaScript
'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 _u = require('./utils/u.biz');
var _u2 = _interopRequireDefault(_u);
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 }; }
// // Support: Android<4.1, IE<9
// // Make sure we trim BOM and NBSP
// const rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
// // Support: Android<4.1, IE<9
// function $trim( text ) {
// return text == null ?
// '' :
// ( text + '' ).replace( rtrim, '' );
// }
// u.js::Validate.fn.isEmpty
/* eslint-disable no-var, curly, vars-on-top, func-names, one-var, no-unused-vars, guard-for-in */
function isEmpty(val) {
// return val === '' || val === undefined || val === null || val === $trim(this.$element.attr('tip'));
return val === '' || val === undefined || val === null;
}
/**
* 控件(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 regExp = /^-?\d+(\.\d+)?$/;
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,
/**
* 校验错误时候提示信息
*/
errorMsg: _propTypes2['default'].string,
max: _propTypes2['default'].number,
min: _propTypes2['default'].number,
/**
* 当文本框为空的显示的提示信息
*/
nullMsg: _propTypes2['default'].string,
/**
* 当光标离开输入框
*/
onBlur: _propTypes2['default'].func,
/**
* 当文本框内容被修改时候调用
*/
onChange: _propTypes2['default'].func,
/**
* 当文本框被聚焦
*/
onFocus: _propTypes2['default'].func,
/**
* 文本框占位字符
*/
placeholder: _propTypes2['default'].string,
/**
* Required field
*/
required: _propTypes2['default'].bool,
/**
* 文本框中显示的值
* 注意:由于文本框是完全自由输入的,所以value的类型,以及在matchFunc回调函数的value参数的类型
* 都是string,具体参照https://developer.mozilla.org/en/docs/Web/API/HTMLInputElement
* 文档中关于`value`属性的定义
*/
value: _propTypes2['default'].string
};
var defaultProps = {
errorMsg: '请填写数字!',
max: null,
min: null,
nullMsg: '不能为空!',
required: false,
value: ''
};
/**
* 带有校验功能的文本框控件
*/
var ValidateFloatInput = function (_Component) {
(0, _inherits3['default'])(ValidateFloatInput, _Component);
function ValidateFloatInput(props) {
(0, _classCallCheck3['default'])(this, ValidateFloatInput);
var _this = (0, _possibleConstructorReturn3['default'])(this, _Component.call(this, props));
_this.state = {
helpText: '',
showValue: props.value,
trueValue: '',
/**
* one of 'success', 'warning', 'error', null
*/
validationState: null
};
_this.handleBlur = _this.handleBlur.bind(_this);
_this.handleChange = _this.handleChange.bind(_this);
_this.handleFocus = _this.handleFocus.bind(_this);
_this.maskerMeta = {
precision: 2
};
_this.formater = new _u2['default'].NumberFormater(_this.maskerMeta.precision);
_this.masker = new _u2['default'].NumberMasker(_this.maskerMeta);
return _this;
}
/**
* @param {Object} nextProps
*/
ValidateFloatInput.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
// 只有当值改变的情况下才会更新状态
if (nextProps.value !== this.state.showValue) {
this.setValue(nextProps.value);
}
};
ValidateFloatInput.prototype.setValue = function setValue(val) {
var value = parseFloat(val);
// this.maskerMeta.precision = this.dataModel.getRowMeta(this.field, 'precision') || this.maskerMeta.precision;
// this.formater.precision = this.maskerMeta.precision;
// if (this.dataModel.getCurrentRow() == null) {
// return;
// }
// const mvalue = this.dataModel.getCurrentRow().getValue(this.field);
var mvalue = this.state.trueValue;
if (value === mvalue) {
this.setState({
showValue: this.masker.format(this.state.trueValue).value
});
} else {
var trueValue = this.formater.format(value);
this.setState({
trueValue: trueValue,
showValue: this.masker.format(trueValue).value
});
}
};
// u.js::Validate.fn.showMsg()
ValidateFloatInput.prototype.showMsg = function showMsg(msg) {
this.setState({
validationState: 'error',
helpText: msg
});
};
// u.js::Validate.fn.hideMsg()
ValidateFloatInput.prototype.hideMsg = function hideMsg() {
this.setState({
validationState: null,
helpText: ''
});
};
/**
* 提供给组件外面直接调用
* @param {any} [pValue] 当没有传递该值的时候,默认使用状态中的showValue来进行校验
* @returns
* @memberof ValidateFloatInput
*/
ValidateFloatInput.prototype.doValid = function doValid(pValue) {
this.setState({
needClean: false
});
// if (this.$element.attr("readonly")) return true
var value = null;
if (typeof pValue !== 'undefined') {
value = pValue;
} else {
value = this.state.showValue;
}
if (isEmpty(value) && this.props.required) {
this.showMsg(this.props.nullMsg);
return false;
} else if (isEmpty(value) && !this.props.required) {
return true;
}
if (regExp) {
var reg = new RegExp(regExp);
if (typeof value === 'number') {
value = value + '';
}
var r = value.match(reg);
if (r === null || r === false) {
this.showMsg(this.props.errorMsg);
this.setState({
needClean: true
});
return false;
}
}
if (this.props.max !== undefined && this.props.max != null) {
if (parseFloat(value) > this.props.max) {
this.showMsg('\u8F93\u5165\u503C\u4E0D\u80FD\u5927\u4E8E' + this.props.max);
return false;
}
}
if (this.props.min !== undefined && this.props.min != null) {
if (parseFloat(value) < this.props.min) {
this.showMsg('\u8F93\u5165\u503C\u4E0D\u80FD\u5C0F\u4E8E' + this.props.min);
return false;
}
}
return true;
};
/**
* 是否需要清除数据
*
* @returns {boolean}
* @memberof ValidateFloatInput
*/
ValidateFloatInput.prototype._needClean = function _needClean() {
return true;
};
ValidateFloatInput.prototype.handleBlur = function handleBlur(event) {
if (!this.doValid(event.target.value) && this._needClean()) {
if (this.props.required && (event.target.value === null || event.target.value === undefined || event.target.value === '')) {
// 因必输项清空导致检验没通过的情况
this.setValue('');
} else {
this.setState({
showValue: this.state.showValue
});
}
} else {
this.setValue(event.target.value);
}
if (this.props.onBlur) {
this.props.onBlur(event);
}
};
ValidateFloatInput.prototype.handleChange = function handleChange(event) {
var value = event.target.value;
this.hideMsg();
this.setState({
showValue: value
});
if (this.props.onChange) {
this.props.onChange(value);
}
};
ValidateFloatInput.prototype.handleFocus = function handleFocus(event) {
this.hideMsg();
var v = this.state.trueValue,
vstr = v + '',
focusValue = v;
if (_u2['default'].isNumber(v) && _u2['default'].isNumber(this.maskerMeta.precision)) {
if (vstr.indexOf('.') >= 0) {
var sub = vstr.substr(vstr.indexOf('.') + 1);
if (sub.length < this.maskerMeta.precision || parseInt(sub.substr(this.maskerMeta.precision), 10) === 0 || this.maskerMeta.precision === 0) {
focusValue = this.formater.format(v);
}
} else if (this.maskerMeta.precision > 0) {
focusValue = this.formater.format(v);
}
}
focusValue = parseFloat(focusValue) || '';
this.setState({
showValue: focusValue
});
if (this.props.onFocus) {
this.props.onFocus(event);
}
};
/**
* event.keyCode:
* - 48~57 数字0~9
* - 190 小数点
*
* @param {any} event
* @returns
* @memberof ValidateFloatInput
*/
ValidateFloatInput.prototype.handleKeyDown = function handleKeyDown(event) {
// copy from u.js
var tmp = event.target.value;
if (event.shiftKey) {
// event.returnValue = false;
event.preventDefault();
return false;
} else if (event.keyCode === 9 || event.keyCode === 37 || event.keyCode === 39 || event.keyCode === 46) {
// tab键 左箭头 右箭头 delete键
return true;
} else if (event.ctrlKey && (event.keyCode === 67 || event.keyCode === 86)) {
// 复制粘贴
return true;
} else if (!(event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode >= 96 && event.keyCode <= 105 || [8, 110, 190, 189, 109].indexOf(event.keyCode) > -1)) {
// event.returnValue = false;
event.preventDefault();
return false;
} else if ((!tmp || tmp.indexOf('.') > -1) && (event.keyCode === 190 || event.keyCode === 110)) {
// event.returnValue = false;
event.preventDefault();
return false;
}
if (tmp && (tmp + '').split('.')[0].length >= 25) {
return false;
}
};
ValidateFloatInput.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.state.showValue,
disabled: this.props.disabled,
onBlur: this.handleBlur,
onChange: this.handleChange,
onFocus: this.handleFocus,
onKeyDown: this.handleKeyDown
}),
_react2['default'].createElement(_FormControl2['default'].Feedback, null),
_react2['default'].createElement(
_HelpBlock2['default'],
null,
this.state.helpText
)
);
};
return ValidateFloatInput;
}(_react.Component);
ValidateFloatInput.displayName = 'ValidateFloatInput';
exports['default'] = ValidateFloatInput;
ValidateFloatInput.propTypes = propTypes;
ValidateFloatInput.defaultProps = defaultProps;
module.exports = exports['default'];