{"version":3,"file":"TextField.js","names":["TextField","a","setters","AbstractField","default","ajax","deepMerge","Validators","on","off","trigger","execute","constructor","element","options","arguments","length","limitItems","limitSeparator","charCounter","restoreValueOnError","isConvertToUpper","autofocus","serverValidationOnChange","serverValidationErrorMessage","serverValidationURL","classNames","counter","bindEvents","field","onChangeText","bind","type","getAttribute","onMousedownReadonlyDate","initState","state","message","ariaDescribedBy","hasAttribute","id","trim","maxLength","parseInt","afterInit","initFieldState","rules","_validators","maxitems","setAttribute","showCounter","selectors","countElement","querySelector","focus","onNativeError","e","preventDefault","value","toUpperCase","substring","checkValidity","innerText","onValidation","errorElement","serverValidation","catch","onReset","setFieldState","classList","remove","classes","counterNode","document","createElement","add","innerHTML","dataset","customMessageCharcounter","appendChild","maxLengthElement","removeError","param","serverValidationUrl","Promise","reject","Error","separator","indexOf","url","serverValidationCustomAssetId","data","errorMessage","errorKey","onLeave","updateMessageLength","maxMessageLength","bubbles","destroy"],"sources":["components/global/TextField.js"],"sourcesContent":["import AbstractField from 'components/global/AbstractField';\nimport { ajax } from 'toolbox/ajax';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport Validators from 'toolbox/validators';\nimport { on, off, trigger } from 'toolbox/event';\n\n/**\n * This is a description of the TextField constructor function.\n * @class\n * @classdesc This is a description of the TextField class.\n * @extends AbstractField\n */\nexport default class TextField extends AbstractField {\n /**\n * Constructor of the class that mainly merge the options of the components\n * @param {HTMLElement} element HTMLElement of the component\n * @param {Object} options options that belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n limitItems: 0, // maximum items that can be introduced in the same field\n limitSeparator: ',', // default separator for items that can be introduced in the same field\n charCounter: false,\n restoreValueOnError: false,\n isConvertToUpper: false, // Convert input value to uppercase\n autofocus: false, // Focus on field after initialization\n serverValidationOnChange: false, // necessity of server-side validation on change\n serverValidationErrorMessage: null, // Error message of server-side validation\n serverValidationURL: null, // URL for server-side validation\n classNames: {\n counter: 'c-text-field__counter',\n },\n }, options));\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonyous function\n */\n bindEvents() {\n super.bindEvents();\n if (this.options.charCounter || this.options.isConvertToUpper) {\n on('input', this.field, this.onChangeText.bind(this));\n }\n // workaround to disable date picker on readonly date input on iOS devices\n if (this.field.type === 'date' && this.field.getAttribute('readonly')) {\n on('mousedown', this.field, this.onMousedownReadonlyDate.bind(this));\n }\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n super.initState();\n this.state.message = '';\n\n this.state.ariaDescribedBy = this.field.hasAttribute('aria-describedby') ? this.field.getAttribute('aria-describedby') : '';\n if (this.options.charCounter) {\n this.state.ariaDescribedBy = `${this.state.ariaDescribedBy} ${this.field.id}-counter`.trim();\n this.state.maxLength = parseInt(this.field.getAttribute('maxlength'), 10);\n }\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n super.afterInit();\n this.initFieldState();\n\n const rules = {\n limitItems: this.options.limitItems,\n limitSeparator: this.options.limitSeparator,\n };\n\n this._validators = deepMerge(this._validators, {\n maxitems: field => Validators.maxitems(field, rules),\n });\n\n if (this.options.charCounter) {\n this.field.setAttribute('aria-describedby', this.state.ariaDescribedBy);\n this.showCounter();\n this.selectors.countElement = this.element.querySelector('[data-js-count]');\n this.onChangeText();\n }\n\n if (this.options.autofocus) {\n this.field.focus();\n }\n }\n\n /**\n * Handler of 'invalid' field event\n * @param {Event} e event data\n * @returns {Boolean} false if field is alredy showing the same error, true otherwise\n */\n onNativeError(e) {\n if (this.options.restoreValueOnError) {\n e.preventDefault();\n this.field.value = this.state.message;\n return true;\n }\n\n return super.onNativeError(e);\n }\n\n /**\n * Handler message input\n */\n onChangeText() {\n if (this.options.isConvertToUpper && this.field.value) {\n this.field.value = this.field.value.toUpperCase();\n }\n\n if (this.options.charCounter && this.state.maxLength) {\n // Custom maxlength control to cover half-width symbols case\n this.field.value = this.field.value.substring(0, this.state.maxLength);\n }\n\n if (this.options.restoreValueOnError) {\n // native validation\n if (this.field.checkValidity()) {\n this.state.message = this.field.value;\n }\n } else {\n this.state.message = this.field.value;\n }\n\n if (this.options.charCounter) {\n this.selectors.countElement.innerText = this.field.value.length;\n }\n }\n\n /**\n * Handler for native field validation\n */\n onValidation() {\n super.onValidation();\n\n if (!this.errorElement && this.options.serverValidationOnChange) {\n this.serverValidation().catch(() => {});\n }\n }\n\n /**\n * Reset the field to empty & remove custom focus class\n */\n onReset() {\n super.onReset();\n this.element.value = '';\n this.setFieldState(false);\n this.element.classList.remove(this.classes.focus);\n }\n\n /**\n * Set chars counter message\n */\n showCounter() {\n const counterNode = document.createElement('span');\n counterNode.classList.add(this.options.classNames.counter);\n counterNode.setAttribute('data-js-counter', '');\n counterNode.setAttribute('id', `${this.field.id}-counter`);\n counterNode.innerHTML = this.field.dataset.customMessageCharcounter;\n this.element.appendChild(counterNode);\n\n this.selectors.maxLengthElement = this.element.querySelector('[data-js-max]');\n }\n\n /**\n * remove error to the field\n * put back the initial aria-describedby value if necessary\n */\n removeError() {\n super.removeError();\n if (this.state.ariaDescribedBy) {\n this.field.setAttribute('aria-describedby', this.state.ariaDescribedBy);\n }\n }\n\n /**\n * Handler for server-side validation via ajax\n * @param {String} param param\n * @returns {Promise} Result\n */\n serverValidation(param) {\n const urlParam = param || 'message';\n const serverValidationURL = this.field.dataset.serverValidationUrl || this.options.serverValidationURL;\n\n if (!serverValidationURL) {\n return Promise.reject(new Error('URL for server-side validation is not configured'));\n }\n\n const separator = serverValidationURL.indexOf('?') === -1 ? '?' : '&';\n let url = `${serverValidationURL}${separator}${urlParam}=${this.field.value}`;\n\n if (this.field.dataset.serverValidationCustomAssetId) {\n url += `&customassetid=${this.field.dataset.serverValidationCustomAssetId}`;\n }\n\n return ajax(url).catch((e) => {\n const message = this.options.serverValidationErrorMessage || e.data.errorMessage;\n\n trigger('field.invalidate', this.field, {\n errorMessage: message,\n errorKey: 'customError',\n });\n return Promise.reject(e);\n });\n }\n\n /**\n * Set initial field state depending on content\n */\n initFieldState() {\n if (this.field.value !== '') {\n this.setFieldState(true);\n }\n }\n\n /**\n * Onleave event handler\n */\n onLeave() {\n this.trim();\n\n super.onLeave();\n }\n\n /**\n * Change max message length\n * @param {Number} maxMessageLength new maxLength value\n */\n updateMessageLength(maxMessageLength) {\n if (maxMessageLength <= 0) {\n maxMessageLength = 0;\n }\n\n if (this.state.message && this.state.message.length > maxMessageLength) {\n this.state.message = this.state.message.substring(0, maxMessageLength);\n this.field.value = this.state.message;\n\n if (this.selectors.countElement) {\n this.selectors.countElement.innerText = this.state.message ? this.state.message.length : 0;\n }\n\n trigger('change', this.field, { bubbles: true });\n }\n\n if (this.selectors.maxLengthElement) {\n this.selectors.maxLengthElement.innerText = maxMessageLength;\n this.field.setAttribute('maxlength', maxMessageLength);\n this.state.maxLength = maxMessageLength;\n }\n }\n\n /**\n * Handles the mousedown action for a readonly input date field\n * to prevent the device's system datepicker from opening\n * @param {Event} e - the mousedown event object\n * @returns {boolean} - always returns false to prevent default action\n */\n onMousedownReadonlyDate(e) {\n e.preventDefault();\n return false;\n }\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n super.destroy();\n if (this.options.charCounter) {\n off('input', this.field);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}