{"version":3,"file":"DatumTicketNumber.min.js","sources":["../../../../Business/Components/DatumTicketNumber/DatumTicketNumber.js"],"sourcesContent":["(function () {\n window.kombiApp = window.kombiApp || {};\n window.kombiApp.Components = window.kombiApp.Components || {};\n \n window.kombiApp.Components.DatumTicketNumber = function (element, type, ticketNumberFormInputSelector) {\n validTypes = ['DATUM_YYMMDD', 'DATUM_YYMM']\n if (!validTypes.includes(type)) {\n throw new Error(\"Invlaid datum ticker number type: \" + type);\n }\n\n const yearEl = element.querySelector('.select-date-lottery-number-container #year');\n const monthEl = element.querySelector('.select-date-lottery-number-container #month');\n const dayEl = element.querySelector('.select-date-lottery-number-container #day');\n const displayNumberEl = element.querySelector('.select-date-lottery-number-container .number')\n const errorContainerEl = element.querySelector('.date-ticket-number-error-container');\n const errorMissingPartsEl = element.querySelector('.missing-parts-error-message');\n const ticketNumberFormInputEl = !!ticketNumberFormInputSelector ? document.querySelector(ticketNumberFormInputSelector) : null;\n const includeDay = type === 'DATUM_YYMMDD';\n\n showErrorContainer = false;\n \n function initEventListeners() {\n yearEl.addEventListener('change', setTicketNumber);\n monthEl.addEventListener('change', setTicketNumber);\n if (includeDay) {\n dayEl.addEventListener('change', setTicketNumber);\n }\n // it is possible to trigger the validation from other components. This can be usefull if you want to run validation on form submit\n // trigger the validation with : document.dispatch(new Event('kombi.datumticketnumber.validate'))\n document.addEventListener('kombi.datumticketnumber.validate', validateAndShowAllErrors);\n }\n\n // initialise the selects based on the value in the form input.\n // needed when the page reloads\n function initStartValue() {\n if (ticketNumberFormInputEl) {\n const ticketNumber = ticketNumberFormInputEl.value;\n if (includeDay && ticketNumber && ticketNumber.length === 6) {\n yearEl.value = ticketNumber.substring(0, 2);\n monthEl.value = ticketNumber.substring(2, 4);\n dayEl.value = ticketNumber.substring(4, 6);\n }\n else if (!includeDay && ticketNumber && ticketNumber.length === 4) {\n yearEl.value = ticketNumber.substring(0, 2);\n monthEl.value = ticketNumber.substring(2, 4);\n }\n validate();\n }\n }\n\n // returns the value from the select element\n function getValue(selectEl) {\n const hasValue = selectEl && !!selectEl.value && selectEl.value != '0';\n if (hasValue) {\n return selectEl.value;\n }\n return null; \n }\n\n // validates the select and adds css classes to the row element\n function validateSelect(selectEl) {\n var selectRowEl = selectEl.parentElement;\n const value = getValue(selectEl);\n if (!!value) {\n selectRowEl.classList.add('is-valid')\n selectRowEl.classList.remove('is-invalid')\n }\n else {\n selectRowEl.classList.add('is-invalid')\n selectRowEl.classList.remove('is-valid')\n }\n return !!value;\n }\n\n // Validates all selects\n function validate() {\n var missingParts = [];\n var day = includeDay ? validateSelect(dayEl) : true;\n var month = validateSelect(monthEl);\n var year = validateSelect(yearEl);\n if (!year) { \n missingParts.push(\"år\");\n } \n if (!month) {\n missingParts.push(\"månad\");\n }\n if (includeDay && !day) {\n missingParts.push(\"dag\");\n }\n\n var isValidNumber = missingParts.length === 0;\n if (showErrorContainer && !isValidNumber) {\n errorMissingPartsEl.innerHTML = missingParts.join(\", \");\n errorContainerEl.classList.remove('hide');\n }\n else {\n errorMissingPartsEl.innerHTML = '';\n errorContainerEl.classList.add('hide');\n }\n\n return isValidNumber;\n }\n\n // validates and shows the error text message. \n // will also show the error message container\n function validateAndShowAllErrors() {\n if (includeDay) {\n dayEl.parentElement.classList.add('is-dirty');\n }\n monthEl.parentElement.classList.add('is-dirty');\n yearEl.parentElement.classList.add('is-dirty');\n showErrorContainer = true;\n validate();\n }\n\n function createOption(value, text) {\n const option = document.createElement(\"option\");\n option.value = value;\n option.textContent = text;\n return option;\n }\n\n function getDaysInMonth(year, month) {\n if (month === 2) {\n // February has 28 days in a common year, 29 in a leap year\n const isLeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return isLeapYear ? 29 : 28;\n } else {\n // All other months have either 30 or 31 days\n const thirtyOneDayMonths = [1, 3, 5, 7, 8, 10, 12];\n return thirtyOneDayMonths.includes(month) ? 31 : 30;\n }\n }\n\n // updates the number of days available in the day dropdown based on year and month\n function updateDayOptions(currentDayValue) {\n var month = getValue(monthEl);\n var year = getValue(yearEl);\n let daysInMonth = 31;\n if (year && month) {\n daysInMonth = getDaysInMonth(parseInt(year), parseInt(month)) + 1;\n }\n dayEl.innerHTML = '';\n dayEl.appendChild(createOption('0', 'Ej vald'));\n for (let i = 1; i < daysInMonth; i++) {\n const val = i.toString().padStart(2, '0');\n dayEl.appendChild(createOption(val, val));\n }\n\n // the value is reset when the options as removed and added\n // this will restore the value if possible\n if (currentDayValue && currentDayValue <= daysInMonth) {\n dayEl.value = currentDayValue;\n }\n else {\n dayEl.value = '0';\n }\n\n // get selected value again. If 31 was selected and the february, the select should be reseted.\n return getValue(dayEl);\n }\n\n function setTicketNumber(evt) {\n evt.target.parentElement.classList.add('is-dirty');\n let day = getValue(dayEl);\n const month = getValue(monthEl);\n const year = getValue(yearEl);\n\n if (includeDay) {\n day = updateDayOptions(day);\n }\n validate();\n\n if (ticketNumberFormInputEl) {\n var isValidNumber = validate();\n if (isValidNumber) {\n var datumLott = year + '' + month + '' + (includeDay ? day : '');\n ticketNumberFormInputEl.value = datumLott;\n }\n else {\n ticketNumberFormInputEl.value = null;\n }\n }\n var datumLott = (year || '--') + \"\" + (month || '--') + \"\" + (includeDay ? (day || '--') : '');\n displayNumberEl.innerHTML = datumLott;\n }\n\n initStartValue();\n initEventListeners();\n }\n})()"],"names":["window","kombiApp","Components","DatumTicketNumber","element","type","ticketNumberFormInputSelector","validTypes","includes","Error","yearEl","querySelector","monthEl","dayEl","displayNumberEl","errorContainerEl","errorMissingPartsEl","ticketNumberFormInputEl","document","includeDay","getValue","selectEl","value","validateSelect","selectRowEl","parentElement","classList","add","remove","validate","missingParts","day","month","isValidNumber","push","length","showErrorContainer","innerHTML","join","validateAndShowAllErrors","createOption","text","option","createElement","textContent","setTicketNumber","evt","target","let","year","datumLott","currentDayValue","daysInMonth","parseInt","appendChild","i","val","toString","padStart","ticketNumber","substring","addEventListener"],"mappings":"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"}