(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 + '