(function () { /* ----------------------------- */ /* Utilities */ /* ----------------------------- */ try { /* ----------------------------- */ /* handleDismiss */ /* ----------------------------- */ (function() { const DISMISS_DURATION = 24 * 60 * 60 * 1000; function hideAlert(el) { if (el) { el.style.display = 'none'; } } function handleDismissClick(e) { const alertElem = e.target.closest('.dismissable'); if (!alertElem) return; const dismissId = alertElem.getAttribute('data-dismiss-id'); if (!dismissId) return; localStorage.setItem("dismissed_" + dismissId, Date.now().toString()); hideAlert(alertElem); } function initDismissableAlerts() { const dismissableAlerts = document.querySelectorAll('.dismissable'); dismissableAlerts.forEach(alertElem => { const dismissId = alertElem.getAttribute('data-dismiss-id'); if (!dismissId) return; // Retrieve stored dismissal timestamp. const storedTime = localStorage.getItem("dismissed_" + dismissId); if (storedTime) { const dismissedTime = parseInt(storedTime, 10); const now = Date.now(); if (now - dismissedTime < DISMISS_DURATION) { hideAlert(alertElem); } else { localStorage.removeItem("dismissed_" + dismissId); } } }); const dismissButtons = document.querySelectorAll('.alert-dismiss-btn'); dismissButtons.forEach(button => { button.addEventListener('click', handleDismissClick); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initDismissableAlerts); } else { initDismissableAlerts(); } })(); } catch {} try { /* ---------------------------- FORMAT CURRENCY FIELDS ------------------------------------ - Apply currency format on blur of field - It will also display the custom error message on the currency fields */ (function () { const saniziteNumber = function(value) { return parseInt(value.replaceAll(',','').replaceAll('.','').replaceAll(' ','')); } const convertToCurrency = function(_amount) { const amount = replaceCharacters(String(_amount).trim()); const options = { currency: currencySelected, maximumFractionDigits: 0}; const numberFormat = new Intl.NumberFormat(languageSelected, options); return numberFormat.format(amount); } const replaceCharacters = function(variable) { return variable.replace('$','').replaceAll(',','').replace(/\s/g,''); } var currencySelected = null; var languageSelected = null; // Get selected language on portal and set currency if (LANG == 'en') { currencySelected = 'CAD'; languageSelected = 'en-US'; } else { currencySelected = 'USD'; languageSelected = 'fr-CA'; } var regex = /^(?!,$)[\d,.]+$/; ['currency','money'].forEach((currencyType) => { // to apply formatting on blur for currency field or money if (currencyType == 'currency') var selector = document.querySelectorAll(currencyType); if (currencyType == 'money' || currencyType == 'decimal') var selector = document.querySelectorAll('input.' + currencyType); selector.forEach((currencyField) => { // to apply formatting on load //currencyField.value = convertToCurrency(currencyField.value); currencyField.addEventListener('input', function(e) { let fieldLabel = document.querySelector('#' + currencyField.id + '_label'); fieldLabel.querySelector('strong.customError')?.remove(); if (e.target.value != '') { if (regex.test(saniziteNumber(e.target.value))) { // e.target.value = convertToCurrency(saniziteNumber(e.target.value)); e.target.value = convertToCurrency(e.target.value); } else { LANG == 'en'? $('#' + currencyField.id + '_label').append('Error: This input is not accepted.') : $('#' + currencyField.id + '_label').append('Error: Le montant doit être saisi sous forme de nombre. N’utilisez pas le signe dollar.'); } } }); }); }) //This works only at the level of EN/FR for the page with built in controls. Still needs to be aligned and intergrated with inline-editing const toFloatLocaleAware = (value) => { const str = String(value).trim(); if (!str) return NaN; let cleaned = str; if (LANG === 'fr') { cleaned = cleaned.replace(/\s/g, '').replace(',', '.'); } else { cleaned = cleaned.replace(/,/g, ''); } return parseFloat(cleaned); }; function validateDecimal(input) { let value = input.value; // Allow only one dot or comma const parts = value.split(/[.,]/); if (parts.length > 2) { value = parts[0] + '.' + parts.slice(1).join(''); } input.value = value.replace(/[^0-9.,]/g, ''); } document.querySelectorAll('.money input').forEach((input)=>{ input.addEventListener("keydown", (e) => { const key = e.key; const value = input.value; // Allow control keys if ( key === "Backspace" || key === "Delete" || key === "ArrowLeft" || key === "ArrowRight" || key === "Tab" ) return; // Allow digits if (/\d/.test(key)) return; // Allow comma (multiple commas are fine) if (key === ",") return; // Allow one dot (decimal point) — block if already present if (key === "." && !value.includes(".")) return; // Block everything else e.preventDefault(); }); input.addEventListener("input", () => { // Clean up any characters that aren't digits, dot, or comma input.value = input.value.replace(/[^0-9.,\s]/g, ''); }); }); const CURRENCY_ID2ISO_MAPPING = { }; const CURRENCY_ISO2DIGITS_MAPPING = { }; window.validateDecimal = validateDecimal; window.toFloatLocaleAware = toFloatLocaleAware; window.CURRENCY_ID2ISO_MAPPING = CURRENCY_ID2ISO_MAPPING; window.CURRENCY_ISO2DIGITS_MAPPING = CURRENCY_ISO2DIGITS_MAPPING; }) () } catch {} try { /* ----------------------------- */ /* injectDeleteText */ /* ----------------------------- */ const injectDeleteText = function(grid, typeOfRecord) { grid.querySelectorAll('a.delete-link').forEach((deleteLink) => { deleteLink.addEventListener('click', function(link) { var lineName = link.target.closest('tr').querySelector('td').textContent == '' ? "BLANK" : link.target.closest('tr').querySelector('td').textContent; var contentWithName = modalBodyOriginalHtml + '
'; var contentFinal = contentWithName + `
You will lose all the information entered for this ${typeOfRecord}.`; document.querySelector('section.modal-delete>div.modal-dialog>div.modal-content>div.modal-body').innerHTML = contentFinal; }) }); } } catch {} })();