diff --git a/bower.json b/bower.json index fcb3ee75..67088215 100644 --- a/bower.json +++ b/bower.json @@ -8,7 +8,7 @@ "form", "input" ], - "version": "1.0.8", + "version": "1.0.9", "author": { "name": "Max Huang", "email": "risonhuang@gmail.com", diff --git a/dist/cleave-angular.min.js b/dist/cleave-angular.min.js index 0c1ade2d..407f4ca7 100644 --- a/dist/cleave-angular.min.js +++ b/dist/cleave-angular.min.js @@ -1,5 +1,5 @@ /*! - * cleave.js - 1.0.7 + * cleave.js - 1.0.9 * https://github.com/nosir/cleave.js * Apache License Version 2.0 * diff --git a/dist/cleave-react-node.js b/dist/cleave-react-node.js new file mode 100644 index 00000000..85b3f8f4 --- /dev/null +++ b/dist/cleave-react-node.js @@ -0,0 +1,2357 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("react")); + else if(typeof define === 'function' && define.amd) + define(["react"], factory); + else if(typeof exports === 'object') + exports["Cleave"] = factory(require("react")); + else + root["Cleave"] = factory(root["React"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + + 'use strict'; + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } + + var React = __webpack_require__(1); // eslint-disable-line no-unused-vars + var CreateReactClass = __webpack_require__(2); + + var NumeralFormatter = __webpack_require__(9); + var DateFormatter = __webpack_require__(10); + var PhoneFormatter = __webpack_require__(11); + var CreditCardDetector = __webpack_require__(12); + var Util = __webpack_require__(13); + var DefaultProperties = __webpack_require__(14); + + var Cleave = CreateReactClass({ + componentDidMount: function componentDidMount() { + this.init(); + }, + + componentDidUpdate: function componentDidUpdate() { + var owner = this; + + if (!owner.state.updateCursorPosition) { + return; + } + + owner.setCurrentSelection(owner.state.cursorPosition); + }, + + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + var owner = this, + phoneRegionCode = (nextProps.options || {}).phoneRegionCode, + newValue = nextProps.value; + + if (newValue !== undefined) { + newValue = newValue.toString(); + + if (newValue !== owner.state.value && newValue !== owner.properties.result) { + owner.properties.initValue = newValue; + owner.onInput(newValue, true); + } + } + + // update phone region code + if (phoneRegionCode && phoneRegionCode !== owner.properties.phoneRegionCode) { + owner.properties.phoneRegionCode = phoneRegionCode; + owner.initPhoneFormatter(); + owner.onInput(owner.properties.result); + } + }, + + getInitialState: function getInitialState() { + var owner = this, + _owner$props = owner.props, + value = _owner$props.value, + options = _owner$props.options, + onKeyDown = _owner$props.onKeyDown, + onChange = _owner$props.onChange, + onFocus = _owner$props.onFocus, + onBlur = _owner$props.onBlur, + onInit = _owner$props.onInit; + + + owner.registeredEvents = { + onInit: onInit || Util.noop, + onChange: onChange || Util.noop, + onFocus: onFocus || Util.noop, + onBlur: onBlur || Util.noop, + onKeyDown: onKeyDown || Util.noop + }; + + if (!options) { + options = {}; + } + options.initValue = value; + + owner.properties = DefaultProperties.assign({}, options); + + return { + value: owner.properties.result, + cursorPosition: 0, + updateCursorPosition: false + }; + }, + + init: function init() { + var owner = this, + pps = owner.properties; + + // so no need for this lib at all + if (!pps.numeral && !pps.phone && !pps.creditCard && !pps.date && pps.blocksLength === 0 && !pps.prefix) { + owner.onInput(pps.initValue); + owner.registeredEvents.onInit(owner); + + return; + } + + pps.maxLength = Util.getMaxLength(pps.blocks); + + owner.isAndroid = Util.isAndroid(); + + owner.initPhoneFormatter(); + owner.initDateFormatter(); + owner.initNumeralFormatter(); + + owner.onInput(pps.initValue); + + owner.registeredEvents.onInit(owner); + }, + + initNumeralFormatter: function initNumeralFormatter() { + var owner = this, + pps = owner.properties; + + if (!pps.numeral) { + return; + } + + pps.numeralFormatter = new NumeralFormatter(pps.numeralDecimalMark, pps.numeralIntegerScale, pps.numeralDecimalScale, pps.numeralThousandsGroupStyle, pps.numeralPositiveOnly, pps.stripLeadingZeroes, pps.delimiter); + }, + + initDateFormatter: function initDateFormatter() { + var owner = this, + pps = owner.properties; + + if (!pps.date) { + return; + } + + pps.dateFormatter = new DateFormatter(pps.datePattern); + pps.blocks = pps.dateFormatter.getBlocks(); + pps.blocksLength = pps.blocks.length; + pps.maxLength = Util.getMaxLength(pps.blocks); + }, + + initPhoneFormatter: function initPhoneFormatter() { + var owner = this, + pps = owner.properties; + + if (!pps.phone) { + return; + } + + // Cleave.AsYouTypeFormatter should be provided by + // external google closure lib + try { + pps.phoneFormatter = new PhoneFormatter(new pps.root.Cleave.AsYouTypeFormatter(pps.phoneRegionCode), pps.delimiter); + } catch (ex) { + throw new Error('Please include phone-type-formatter.{country}.js lib'); + } + }, + + setRawValue: function setRawValue(value) { + var owner = this, + pps = owner.properties; + + value = value !== undefined && value !== null ? value.toString() : ''; + + if (pps.numeral) { + value = value.replace('.', pps.numeralDecimalMark); + } + + pps.backspace = false; + + owner.onChange({ target: { value: value } }); + }, + + getRawValue: function getRawValue() { + var owner = this, + pps = owner.properties, + rawValue = pps.result; + + if (pps.rawValueTrimPrefix) { + rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength); + } + + if (pps.numeral) { + rawValue = pps.numeralFormatter.getRawValue(rawValue); + } else { + rawValue = Util.stripDelimiters(rawValue, pps.delimiter, pps.delimiters); + } + + return rawValue; + }, + + getISOFormatDate: function getISOFormatDate() { + var owner = this, + pps = owner.properties; + + return pps.date ? pps.dateFormatter.getISOFormatDate() : ''; + }, + + onInit: function onInit(owner) { + return owner; + }, + + onKeyDown: function onKeyDown(event) { + var owner = this, + pps = owner.properties, + charCode = event.which || event.keyCode; + + // hit backspace when last character is delimiter + if (charCode === 8 && Util.isDelimiter(pps.result.slice(-pps.delimiterLength), pps.delimiter, pps.delimiters)) { + pps.backspace = true; + } else { + pps.backspace = false; + } + + owner.registeredEvents.onKeyDown(event); + }, + + onFocus: function onFocus(event) { + var owner = this, + pps = owner.properties; + + event.target.rawValue = owner.getRawValue(); + event.target.value = pps.result; + + owner.registeredEvents.onFocus(event); + }, + + onBlur: function onBlur(event) { + var owner = this, + pps = owner.properties; + + event.target.rawValue = owner.getRawValue(); + event.target.value = pps.result; + + owner.registeredEvents.onBlur(event); + }, + + onChange: function onChange(event) { + var owner = this, + pps = owner.properties; + + owner.onInput(event.target.value); + + event.target.rawValue = owner.getRawValue(); + event.target.value = pps.result; + + owner.registeredEvents.onChange(event); + }, + + onInput: function onInput(value, fromProps) { + var owner = this, + pps = owner.properties; + + if (Util.isAndroidBackspaceKeydown(owner.lastInputValue, owner.element.value) && Util.isDelimiter(pps.result.slice(-pps.delimiterLength), pps.delimiter, pps.delimiters)) { + pps.backspace = true; + } + + // case 1: delete one more character "4" + // 1234*| -> hit backspace -> 123| + // case 2: last character is not delimiter which is: + // 12|34* -> hit backspace -> 1|34* + + if (!fromProps && !pps.numeral && pps.backspace && !Util.isDelimiter(value.slice(-pps.delimiterLength), pps.delimiter, pps.delimiters)) { + value = Util.headStr(value, value.length - pps.delimiterLength); + } + + // phone formatter + if (pps.phone) { + pps.result = pps.phoneFormatter.format(value); + owner.updateValueState(); + + return; + } + + // numeral formatter + if (pps.numeral) { + if (pps.prefix && (!pps.noImmediatePrefix || value.length)) { + pps.result = pps.prefix + pps.numeralFormatter.format(value); + } else { + pps.result = pps.numeralFormatter.format(value); + } + owner.updateValueState(); + + return; + } + + // date + if (pps.date) { + value = pps.dateFormatter.getValidatedDate(value); + } + + // strip delimiters + value = Util.stripDelimiters(value, pps.delimiter, pps.delimiters); + + // strip prefix + value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength); + + // strip non-numeric characters + value = pps.numericOnly ? Util.strip(value, /[^\d]/g) : value; + + // convert case + value = pps.uppercase ? value.toUpperCase() : value; + value = pps.lowercase ? value.toLowerCase() : value; + + // prefix + if (pps.prefix && (!pps.noImmediatePrefix || value.length)) { + value = pps.prefix + value; + + // no blocks specified, no need to do formatting + if (pps.blocksLength === 0) { + pps.result = value; + owner.updateValueState(); + + return; + } + } + + // update credit card props + if (pps.creditCard) { + owner.updateCreditCardPropsByValue(value); + } + + // strip over length characters + value = pps.maxLength > 0 ? Util.headStr(value, pps.maxLength) : value; + + // apply blocks + pps.result = Util.getFormattedValue(value, pps.blocks, pps.blocksLength, pps.delimiter, pps.delimiters); + + owner.updateValueState(); + }, + + updateCreditCardPropsByValue: function updateCreditCardPropsByValue(value) { + var owner = this, + pps = owner.properties, + creditCardInfo; + + // At least one of the first 4 characters has changed + if (Util.headStr(pps.result, 4) === Util.headStr(value, 4)) { + return; + } + + creditCardInfo = CreditCardDetector.getInfo(value, pps.creditCardStrictMode); + + pps.blocks = creditCardInfo.blocks; + pps.blocksLength = pps.blocks.length; + pps.maxLength = Util.getMaxLength(pps.blocks); + + // credit card type changed + if (pps.creditCardType !== creditCardInfo.type) { + pps.creditCardType = creditCardInfo.type; + + pps.onCreditCardTypeChanged.call(owner, pps.creditCardType); + } + }, + + getNextCursorPosition: function getNextCursorPosition(endPos, oldValue, newValue) { + // If cursor was at the end of value, just place it back. + // Because new value could contain additional chars. + if (oldValue.length === endPos) { + return newValue.length; + } + + return endPos; + }, + + setCurrentSelection: function setCurrentSelection(cursorPosition) { + var elem = this.element; + + this.setState({ + updateCursorPosition: false + }); + + if (elem === document.activeElement) { + if (elem.createTextRange) { + var range = elem.createTextRange(); + range.move('character', cursorPosition); + range.select(); + } else { + elem.setSelectionRange(cursorPosition, cursorPosition); + } + } + }, + + updateValueState: function updateValueState() { + var owner = this; + var endPos = owner.element.selectionEnd; + var oldValue = owner.element.value; + var newValue = owner.properties.result; + var nextCursorPosition = owner.getNextCursorPosition(endPos, oldValue, newValue); + + owner.lastInputValue = owner.properties.result; + + if (owner.isAndroid) { + window.setTimeout(function () { + owner.setState({ + value: owner.properties.result, + cursorPosition: nextCursorPosition, + updateCursorPosition: true + }); + }, 1); + + return; + } + + owner.setState({ + value: owner.properties.result, + cursorPosition: nextCursorPosition, + updateCursorPosition: true + }); + }, + + render: function render() { + var owner = this; + // eslint-disable-next-line + + var _owner$props2 = owner.props, + value = _owner$props2.value, + options = _owner$props2.options, + onKeyDown = _owner$props2.onKeyDown, + onFocus = _owner$props2.onFocus, + onBlur = _owner$props2.onBlur, + onChange = _owner$props2.onChange, + onInit = _owner$props2.onInit, + htmlRef = _owner$props2.htmlRef, + propsToTransfer = _objectWithoutProperties(_owner$props2, ['value', 'options', 'onKeyDown', 'onFocus', 'onBlur', 'onChange', 'onInit', 'htmlRef']); + + return React.createElement('input', _extends({ + type: 'text', + ref: function ref(_ref) { + owner.element = _ref; + + if (!htmlRef) { + return; + } + + htmlRef.apply(this, arguments); + }, + value: owner.state.value, + onKeyDown: owner.onKeyDown, + onChange: owner.onChange, + onFocus: owner.onFocus, + onBlur: owner.onBlur + }, propsToTransfer)); + } + }); + + module.exports = Cleave; + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_1__; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + + 'use strict'; + + var React = __webpack_require__(1); + var factory = __webpack_require__(3); + + if (typeof React === 'undefined') { + throw Error( + 'create-react-class could not find the React object. If you are using script tags, ' + + 'make sure that React is being loaded before create-react-class.' + ); + } + + // Hack to grab NoopUpdateQueue from isomorphic React + var ReactNoopUpdateQueue = new React.Component().updater; + + module.exports = factory( + React.Component, + React.isValidElement, + ReactNoopUpdateQueue + ); + + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + + 'use strict'; + + var _assign = __webpack_require__(4); + + var emptyObject = __webpack_require__(5); + var _invariant = __webpack_require__(6); + + if (process.env.NODE_ENV !== 'production') { + var warning = __webpack_require__(7); + } + + var MIXINS_KEY = 'mixins'; + + // Helper function to allow the creation of anonymous functions which do not + // have .name set to the name of the variable being assigned to. + function identity(fn) { + return fn; + } + + var ReactPropTypeLocationNames; + if (process.env.NODE_ENV !== 'production') { + ReactPropTypeLocationNames = { + prop: 'prop', + context: 'context', + childContext: 'child context' + }; + } else { + ReactPropTypeLocationNames = {}; + } + + function factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) { + /** + * Policies that describe methods in `ReactClassInterface`. + */ + + var injectedMixins = []; + + /** + * Composite components are higher-level components that compose other composite + * or host components. + * + * To create a new type of `ReactClass`, pass a specification of + * your new class to `React.createClass`. The only requirement of your class + * specification is that you implement a `render` method. + * + * var MyComponent = React.createClass({ + * render: function() { + * return