tingle-number-field
Version:
tingle-number-field component for tingle.
105 lines (91 loc) • 2.62 kB
JavaScript
/**
* NumberField Component for tingle
* @author gnosaij
*
* Copyright 2014-2015, Tingle Team, Alinw.
* All rights reserved.
*/
let classnames = require('classnames');
let Context = require('tingle-context');
let TextField = require('tingle-text-field');
let numberRegExp = /^(\d+\.\d*)|(\d+\.)|\d+/;
/**
* NumberField Component for Tingle
*/
class NumberField extends React.Component {
constructor(props) {
super(props);
}
handleChange(newValue) {
this.props.onChange(newValue);
}
numberFilter(newValue) {
/* reset seperator charactor */
if (this.category === 'number') {
newValue = newValue.replace(/\s/g, '');
} else if (this.category === 'money') {
newValue = newValue.replace(/\,/g, '');
}
let matches = newValue.match(numberRegExp);
let number = '';
if (matches) {
number = matches[0];
}
/* by seperator type for output */
if (this.category === 'number') {
return number.replace(/(\d{4})(?=\d)/g, "$1 ");
} else if (this.category === 'money') {
return number.replace(/(\d{3})(?=\d)/g, "$1,");
} else {
return number;
}
}
handleBlur(newValue) {
let cleanedNewValue = newValue.replace(/\.$/, '').replace(/^0*([0-9]+)/, '$1');
if (cleanedNewValue !== newValue) {
this.props.onChange(cleanedNewValue);
}
this.props.onBlur(cleanedNewValue);
}
render() {
let t = this;
return (
<TextField {...t.props}
type={"text"}
filter={t.numberFilter}
onBlur={t.handleBlur.bind(t)}
onChange={t.handleChange.bind(t)}/>
);
}
}
NumberField.defaultProps = {
className: '',
filter: function (v) {
return v;
},
label: '',
onChange: Context.noop,
onFocus: Context.noop,
onBlur: Context.noop,
placeholder: '',
readOnly: false,
multiLine: false,
type: 'text',
value: '',
category: ''
};
NumberField.propTypes = {
className: React.PropTypes.string,
filter: React.PropTypes.func,
label: React.PropTypes.string,
onChange: React.PropTypes.func,
onFocus: React.PropTypes.func,
onBlur: React.PropTypes.func,
placeholder: React.PropTypes.string,
readOnly: React.PropTypes.bool,
multiLine: React.PropTypes.bool,
type: React.PropTypes.string,
category: React.PropTypes.string
};
NumberField.displayName = 'NumberField';
module.exports = NumberField;