{"version":3,"file":"100.6dc03f9e711592176c96.js","mappings":"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","sources":["webpack://iflyworld.web/./wwwroot/app/src/js/form-number-control.js"],"sourcesContent":["const event = new Event('formNumberControlUpdate');\r\nconst changeEvent = new Event('change');\r\n\r\nclass NumberControl {\r\n constructor(el) {\r\n this.el = el;\r\n this.inputField = el.querySelector('input');\r\n this.value = 0;\r\n this.minButton = el.querySelector('.decrease-btn');\r\n this.maxButton = el.querySelector('.increase-btn');\r\n this.min = parseInt(this.inputField.dataset.min);\r\n this.max = parseInt(this.inputField.dataset.max);\r\n this.threshold = null;\r\n this.snapToThreshold = false;\r\n if(this.inputField.hasAttribute('data-threshold')) {\r\n this.threshold = parseInt(this.inputField.dataset.threshold);\r\n this.snapToThreshold = this.threshold > this.min ? this.inputField.hasAttribute('data-snap-to-threshold') : false;\r\n }\r\n // is there an increment setting?\r\n this.incrementBy = 1; //default\r\n let inc = this.inputField.dataset.increment;\r\n if(typeof(inc) != 'undefined') {\r\n this.incrementBy = parseInt(inc);\r\n }\r\n // is there a range slider to tether to this control?\r\n this.hasSlider = false;\r\n let slider = this.inputField.dataset.sliderId;\r\n if(typeof(slider) != 'undefined') {\r\n this.slider = document.getElementById(slider);\r\n if(this.slider != null) this.hasSlider = true;\r\n }\r\n // validate number\r\n this.validateNumber();\r\n // behaviours\r\n this.minButton.onclick = (e) => {\r\n e.preventDefault();\r\n this.increment(false);\r\n };\r\n this.maxButton.onclick = (e) => {\r\n e.preventDefault();\r\n this.increment(true);\r\n };\r\n this.inputField.onblur = () => {\r\n this.validateNumber(false);\r\n };\r\n this.inputField.addEventListener('valueChange', (e) => {\r\n this.inputField.value = e.detail.Quantity;\r\n this.value = e.detail.Quantity;\r\n }, false);\r\n // slider behaviours\r\n if(this.hasSlider) {\r\n this.slider.addEventListener('input', () => {\r\n this.valueFromSlider();\r\n });\r\n this.slider.addEventListener('change', () => {\r\n this.valueFromSlider();\r\n });\r\n }\r\n // disabled return key on input field\r\n this.inputField.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n case 'Enter':\r\n case 'Return':\r\n e.preventDefault();\r\n this.validateNumber();\r\n break;\r\n }\r\n });\r\n }\r\n increment(mode) {\r\n if(mode && this.value < this.max) {\r\n this.value += this.incrementBy;\r\n // snap to threshold?\r\n if(this.snapToThreshold) {\r\n if(this.value > this.min && this.threshold > this.min) {\r\n if(this.value > this.min && this.value < this.threshold) this.value = this.threshold;\r\n }\r\n }\r\n } else if(!mode && this.value > this.min) {\r\n this.value -= this.incrementBy;\r\n // snap to threshold?\r\n if(this.snapToThreshold) {\r\n if(this.value > this.min && this.threshold > this.min) {\r\n if(this.value < this.threshold) this.value = this.min;\r\n }\r\n }\r\n }\r\n // update\r\n this.inputField.value = this.value;\r\n this.inputField.dispatchEvent(event);\r\n this.inputField.dispatchEvent(changeEvent);\r\n this.checkButtons();\r\n // update slider ?\r\n if(this.hasSlider) this.valueToSlider();\r\n }\r\n checkButtons() {\r\n if(this.value <= this.min) {\r\n this.minButton.setAttribute('disabled', 'disabled');\r\n } else {\r\n this.minButton.removeAttribute('disabled');\r\n }\r\n if(this.value >= this.max) {\r\n this.maxButton.setAttribute('disabled', 'disabled');\r\n } else {\r\n this.maxButton.removeAttribute('disabled');\r\n }\r\n }\r\n validateNumber() {\r\n this.value = parseInt(this.inputField.value);\r\n if(isNaN(this.value)) this.value = 0;\r\n // check value is a multiple of the incrementBy amount\r\n this.value = this.incrementBy * Math.round(this.value / this.incrementBy);\r\n // apply limits\r\n if(this.value < this.min) this.value = this.min;\r\n if(this.value > this.max) this.value = this.max;\r\n // snap to threshold?\r\n if(this.snapToThreshold) {\r\n if(this.value > this.min && this.threshold > this.min) {\r\n if(this.value > this.min && this.value < this.threshold) this.value = this.threshold;\r\n }\r\n }\r\n // update\r\n this.inputField.value = this.value;\r\n this.inputField.dispatchEvent(event);\r\n this.inputField.dispatchEvent(changeEvent);\r\n this.checkButtons();\r\n // update slider ?\r\n if(this.hasSlider) this.valueToSlider();\r\n }\r\n valueFromSlider() {\r\n let sliderValue = this.slider.value;\r\n if(sliderValue !== this.value) {\r\n this.inputField.value = this.slider.value;\r\n this.validateNumber();\r\n }\r\n }\r\n valueToSlider() {\r\n let sliderValue = parseInt(this.slider.value);\r\n if(sliderValue !== this.value) this.slider.value = this.value;\r\n }\r\n}\r\n\r\nexport function createFrom(wrappers) {\r\n wrappers.forEach((node) => {\r\n // if node is an element\r\n if (node.nodeType === 1) {\r\n new NumberControl(node);\r\n }\r\n });\r\n}\r\n"],"names":["event","Event","changeEvent","NumberControl","constructor","el","this","inputField","querySelector","value","minButton","maxButton","min","parseInt","dataset","max","threshold","snapToThreshold","hasAttribute","incrementBy","inc","increment","hasSlider","slider","sliderId","document","getElementById","validateNumber","onclick","e","preventDefault","onblur","addEventListener","detail","Quantity","valueFromSlider","key","mode","dispatchEvent","checkButtons","valueToSlider","setAttribute","removeAttribute","isNaN","Math","round","createFrom","wrappers","forEach","node","nodeType"],"sourceRoot":""}