2021-05-19 04:39:27 +02:00
|
|
|
function delegate(eventType, selector, handler, root) {
|
|
|
|
(root || document).addEventListener(eventType, function(event) {
|
2021-12-04 21:12:15 +01:00
|
|
|
const target = event.target.closest(selector)
|
2021-05-19 04:39:27 +02:00
|
|
|
if (target) {
|
2021-12-04 21:12:15 +01:00
|
|
|
event.target = target
|
2021-10-30 13:57:24 +09:00
|
|
|
if (handler.call(this, event) === false) {
|
2021-12-04 21:12:15 +01:00
|
|
|
event.preventDefault()
|
2021-10-30 13:57:24 +09:00
|
|
|
}
|
2021-05-19 04:39:27 +02:00
|
|
|
}
|
2021-12-04 21:12:15 +01:00
|
|
|
})
|
2021-05-19 04:39:27 +02:00
|
|
|
}
|
2023-11-02 08:12:28 +01:00
|
|
|
|
|
|
|
const DEBOUNCE_TIMERS = {}
|
|
|
|
function debounce(key, fn, delay = 250) {
|
|
|
|
clearTimeout(DEBOUNCE_TIMERS[key])
|
|
|
|
DEBOUNCE_TIMERS[key] = setTimeout(fn, delay)
|
|
|
|
}
|
2024-04-24 10:22:00 +02:00
|
|
|
|
|
|
|
function formatDateTimes(format) {
|
|
|
|
// select only elements which haven't been initialized before, those without data-localized
|
|
|
|
document.querySelectorAll("time[datetime]:not([data-localized])").forEach($el => {
|
|
|
|
const date = new Date($el.getAttribute("datetime"));
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat
|
|
|
|
const { dateStyle = 'short', timeStyle = 'short' } = $el.dataset;
|
|
|
|
// initialize and set localized attribute
|
|
|
|
$el.dataset.localized = new Intl.DateTimeFormat('default', { dateStyle, timeStyle }).format(date);
|
|
|
|
// set text to chosen mode
|
|
|
|
const mode = format || $el.dataset.initial;
|
|
|
|
if ($el.dataset[mode]) $el.innerText = $el.dataset[mode];
|
|
|
|
});
|
|
|
|
}
|