UNPKG

@randstad-design/orbit-multitheme

Version:

multitheme Front-end code based on Randstad Human Forward components

90 lines (76 loc) 2.08 kB
/** * character-count.js * Script to count characters on input field and at styling to it */ import ElementHelpers from '../helpers/element-helpers'; /** * Declare constants */ const attributeBase = 'data-rs-character-counter'; export class CharacterCounter { constructor(element) { this.element = element; this.counterOutput = ElementHelpers.getElementByAttribute( this.attributes.output, this.element.getAttribute(attributeBase) ); this.maxLength = this.element.getAttribute(this.attributes.maxLength); this.labels = this.element.getAttribute(this.attributes.labels); this.setCounterOutput(); this.addEventHandlers(); } /** * Declare attribute constants */ get attributes() { return { output: `${attributeBase}-output`, maxLength: `${attributeBase}-maxlength`, labels: `${attributeBase}-labels` }; } /** * Declare classes */ get classes() { return { textNegative: 'text--negative' }; } /** * Add event handlers */ addEventHandlers() { this.element.addEventListener('input', () => { this.setCounterOutput(); }); } /** * Set counter output */ setCounterOutput() { const defaultLabels = { characters: 'characters', charactersLeft: '@characters characters left' }; const labels = this.labels ? JSON.parse(this.labels) : defaultLabels; if (this.counterOutput) { let { characters, charactersLeft } = labels; const characterCount = this.maxLength - this.element.value.length; if (characterCount >= 0) { charactersLeft = charactersLeft.replace('@characters', characterCount); this.counterOutput.classList.remove(this.classes.textNegative); this.counterOutput.innerText = charactersLeft; } else { this.counterOutput.classList.add(this.classes.textNegative); this.counterOutput.innerText = `${characterCount} ${characters}`; } } } /** * Get selector */ static getSelector() { return `[${attributeBase}]`; } }