improve calendar features

This commit is contained in:
2026-03-18 14:17:38 +01:00
parent 14d4a2895a
commit 975e195ae3
13 changed files with 2274 additions and 138 deletions

View File

@@ -172,6 +172,57 @@
});
}
// ============================================================
// Calendar Sync Button (syntax widget)
// ============================================================
function initCalendarSyncButtons() {
document.addEventListener('click', function (e) {
var btn = e.target;
if (!btn || !btn.classList || !btn.classList.contains('luxtools-calendar-sync-btn')) return;
e.preventDefault();
var ajaxUrl = btn.getAttribute('data-luxtools-ajax-url') || '';
var sectok = btn.getAttribute('data-luxtools-sectok') || '';
if (!ajaxUrl) return;
var status = btn.parentNode ? btn.parentNode.querySelector('.luxtools-calendar-sync-status') : null;
btn.disabled = true;
if (status) {
status.textContent = 'Syncing...';
status.style.color = '';
}
var xhr = new XMLHttpRequest();
xhr.open('POST', ajaxUrl, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
btn.disabled = false;
try {
var r = JSON.parse(xhr.responseText);
if (status) {
status.textContent = r.message || (r.ok ? 'Done' : 'Failed');
status.style.color = r.ok ? 'green' : 'red';
}
} catch (ex) {
if (status) {
status.textContent = 'Error';
status.style.color = 'red';
}
}
};
xhr.onerror = function () {
btn.disabled = false;
if (status) {
status.textContent = 'Network error';
status.style.color = 'red';
}
};
xhr.send('call=luxtools_calendar_sync&sectok=' + encodeURIComponent(sectok));
}, false);
}
// ============================================================
// Initialize
// ============================================================
@@ -181,6 +232,7 @@
initChronologicalEventTimes();
if (CalendarWidget && CalendarWidget.init) CalendarWidget.init();
initPurgeCacheDialog();
initCalendarSyncButtons();
}, false);
document.addEventListener('DOMContentLoaded', function () {
if (Scratchpads && Scratchpads.init) Scratchpads.init();