Project import generated by Copybara.
GitOrigin-RevId: 63746295f1a5ab5a619056791995793d65529e62
diff --git a/node_modules/mdl-ext/es/formatfield/formatfield.js b/node_modules/mdl-ext/es/formatfield/formatfield.js
new file mode 100644
index 0000000..271da23
--- /dev/null
+++ b/node_modules/mdl-ext/es/formatfield/formatfield.js
@@ -0,0 +1,306 @@
+'use strict';
+
+var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
+
+var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
+
+var _createClass2 = require('babel-runtime/helpers/createClass');
+
+var _createClass3 = _interopRequireDefault(_createClass2);
+
+var _jsonUtils = require('../utils/json-utils');
+
+var _constants = require('../utils/constants');
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * @license
+ * Copyright 2016-2017 Leif Olsen. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This code is built with Google Material Design Lite,
+ * which is Licensed under the Apache License, Version 2.0
+ */
+
+var JS_FORMAT_FIELD = 'mdlext-js-formatfield';
+var FORMAT_FIELD_COMPONENT = 'MaterialExtFormatfield';
+
+/**
+ * Detect browser locale
+ * @returns {string} the locale
+ * @see http://stackoverflow.com/questions/1043339/javascript-for-detecting-browser-language-preference
+ */
+var browserLanguage = function browserLanguage() {
+ return navigator.languages ? navigator.languages[0] : navigator.language || navigator.userLanguage;
+};
+
+/**
+ * The formatfield formats an input field using language sensitive number formatting.
+ */
+
+var FormatField = function () {
+ function FormatField(element) {
+ var _this = this;
+
+ (0, _classCallCheck3.default)(this, FormatField);
+ this.options_ = {};
+
+ this.clickHandler = function () {
+ clearTimeout(FormatField.timer);
+ };
+
+ this.focusInHandler = function () {
+ if (!(_this.input.readOnly || _this.input.disabled)) {
+ _this.input.value = _this.unformatInput();
+ //setTimeout(() => this.input.setSelectionRange(0, this.input.value.length), 20);
+ FormatField.timer = setTimeout(function () {
+ return _this.input.select();
+ }, 200);
+ }
+ };
+
+ this.focusOutHandler = function () {
+ clearTimeout(FormatField.timer);
+
+ if (!(_this.input.readOnly || _this.input.disabled)) {
+ _this.formatValue();
+ }
+ };
+
+ this.element_ = element;
+ this.init();
+ }
+
+ (0, _createClass3.default)(FormatField, [{
+ key: 'stripSeparatorsFromValue',
+ value: function stripSeparatorsFromValue() {
+ var _this2 = this;
+
+ var doReplace = function doReplace() {
+ return _this2.input.value.replace(/\s/g, '').replace(new RegExp(_this2.options.groupSeparator, 'g'), '').replace(_this2.options.decimalSeparator, '.');
+ };
+ //.replace(this.intlGroupSeparator_, ''),
+ //.replace(this.intlDecimalSeparator_, '.');
+
+ return this.input.value ? doReplace() : this.input.value;
+ }
+ }, {
+ key: 'fixSeparators',
+ value: function fixSeparators(value) {
+ var _this3 = this;
+
+ var doReplace = function doReplace() {
+ return value.replace(new RegExp(_this3.intlGroupSeparator_, 'g'), _this3.options.groupSeparator).replace(_this3.intlDecimalSeparator_, _this3.options.decimalSeparator);
+ };
+
+ return value ? doReplace() : value;
+ }
+ }, {
+ key: 'formatValue',
+ value: function formatValue() {
+ if (this.input.value) {
+ var v = new Intl.NumberFormat(this.options.locales, this.options).format(this.stripSeparatorsFromValue());
+
+ if ('NaN' !== v) {
+ this.input.value = this.fixSeparators(v);
+ }
+ }
+ }
+ }, {
+ key: 'unformat',
+ value: function unformat() {
+ var _this4 = this;
+
+ var doReplace = function doReplace() {
+ return _this4.input.value.replace(/\s/g, '').replace(new RegExp(_this4.options.groupSeparator, 'g'), '').replace(_this4.options.decimalSeparator, '.');
+ };
+
+ return this.input.value ? doReplace() : this.input.value;
+ }
+ }, {
+ key: 'unformatInput',
+ value: function unformatInput() {
+ var _this5 = this;
+
+ var doReplace = function doReplace() {
+ return _this5.input.value.replace(/\s/g, '').replace(new RegExp(_this5.options.groupSeparator, 'g'), '');
+ };
+
+ return this.input.value ? doReplace() : this.input.value;
+ }
+ }, {
+ key: 'removeListeners',
+ value: function removeListeners() {
+ this.input.removeEventListener('click', this.clickHandler);
+ this.input.removeEventListener('focusin', this.focusInHandler);
+ this.input.removeEventListener('focusout', this.focusOutHandler);
+ }
+ }, {
+ key: 'init',
+ value: function init() {
+ var _this6 = this;
+
+ var addListeners = function addListeners() {
+ _this6.input.addEventListener('click', _this6.clickHandler);
+ _this6.input.addEventListener('focusin', _this6.focusInHandler);
+ _this6.input.addEventListener('focusout', _this6.focusOutHandler);
+ };
+
+ var addOptions = function addOptions() {
+ var opts = _this6.element.getAttribute('data-formatfield-options') || _this6.input.getAttribute('data-formatfield-options');
+ if (opts) {
+ _this6.options_ = (0, _jsonUtils.jsonStringToObject)(opts, _this6.options);
+ }
+ };
+
+ var addLocale = function addLocale() {
+ if (!_this6.options.locales) {
+ _this6.options.locales = browserLanguage() || 'en-US'; //'nb-NO', //'en-US',
+ }
+ };
+
+ var addGrouping = function addGrouping() {
+ var s = 1234.5.toLocaleString(_this6.options.locales, {
+ style: 'decimal',
+ useGrouping: true,
+ minimumFractionDigits: 1,
+ maximumFractionDigits: 1
+ });
+
+ _this6.intlGroupSeparator_ = s.charAt(1);
+ _this6.intlDecimalSeparator_ = s.charAt(s.length - 2);
+ _this6.options.groupSeparator = _this6.options.groupSeparator || _this6.intlGroupSeparator_;
+ _this6.options.decimalSeparator = _this6.options.decimalSeparator || _this6.intlDecimalSeparator_;
+
+ if (_this6.options.groupSeparator === _this6.options.decimalSeparator) {
+ var e = 'Error! options.groupSeparator, "' + _this6.options.groupSeparator + '" ' + 'and options.decimalSeparator, ' + ('"' + _this6.options.decimalSeparator + '" should not be equal');
+ throw new Error(e);
+ }
+ };
+
+ this.input_ = this.element.querySelector('input') || this.element;
+
+ addOptions();
+ addLocale();
+ addGrouping();
+ this.formatValue();
+ addListeners();
+ }
+ }, {
+ key: 'downgrade',
+ value: function downgrade() {
+ this.removeListeners();
+ }
+ }, {
+ key: 'element',
+ get: function get() {
+ return this.element_;
+ }
+ }, {
+ key: 'input',
+ get: function get() {
+ return this.input_;
+ }
+ }, {
+ key: 'options',
+ get: function get() {
+ return this.options_;
+ }
+ }]);
+ return FormatField;
+}();
+
+FormatField.timer = null;
+
+
+(function () {
+ 'use strict';
+
+ /**
+ * @constructor
+ * @param {HTMLElement} element The element that will be upgraded.
+ */
+
+ var MaterialExtFormatfield = function MaterialExtFormatfield(element) {
+ this.element_ = element;
+ this.formatField_ = null;
+
+ // Initialize instance.
+ this.init();
+ };
+ window['MaterialExtFormatfield'] = MaterialExtFormatfield;
+
+ /**
+ * Initialize component
+ */
+ MaterialExtFormatfield.prototype.init = function () {
+ if (this.element_) {
+ this.element_.classList.add(_constants.IS_UPGRADED);
+ this.formatField_ = new FormatField(this.element_);
+
+ // Listen to 'mdl-componentdowngraded' event
+ this.element_.addEventListener('mdl-componentdowngraded', this.mdlDowngrade_.bind(this));
+ }
+ };
+
+ /**
+ * Get options object
+ *
+ * @public
+ *
+ * @returns {Object} the options object
+ */
+ MaterialExtFormatfield.prototype.getOptions = function () {
+ return this.formatField_.options;
+ };
+ MaterialExtFormatfield.prototype['getOptions'] = MaterialExtFormatfield.prototype.getOptions;
+
+ /**
+ * A unformatted value is a string value where the locale specific decimal separator
+ * is replaced with a '.' separator and group separators are stripped.
+ * The returned value is suitable for parsing to a JavaScript numerical value.
+ *
+ * @example
+ * input.value = '1 234,5';
+ * inputElement.MaterialExtFormatfield.getUnformattedValue();
+ * // Returns '1234.5'
+ *
+ * @public
+ *
+ * @returns {String} the unformatted value
+ */
+ MaterialExtFormatfield.prototype.getUnformattedValue = function () {
+ return this.formatField_.unformat();
+ };
+ MaterialExtFormatfield.prototype['getUnformattedValue'] = MaterialExtFormatfield.prototype.getUnformattedValue;
+
+ /*
+ * Downgrade component
+ * E.g remove listeners and clean up resources
+ */
+ MaterialExtFormatfield.prototype.mdlDowngrade_ = function () {
+ this.formatField_.downgrade();
+ };
+
+ // The component registers itself. It can assume componentHandler is available
+ // in the global scope.
+ /* eslint no-undef: 0 */
+ componentHandler.register({
+ constructor: MaterialExtFormatfield,
+ classAsString: FORMAT_FIELD_COMPONENT,
+ cssClass: JS_FORMAT_FIELD,
+ widget: true
+ });
+})();
\ No newline at end of file