customer-riverside/web/modules/custom/riverside_pt/js/calendar.js

106 lines
3.9 KiB
JavaScript
Raw Normal View History

2026-05-12 16:28:47 -08:00
(function (drupalSettings) {
document.addEventListener('DOMContentLoaded', function () {
const el = document.getElementById('riverside-calendar');
if (!el) return;
const calendar = new FullCalendar.Calendar(el, {
2026-05-12 17:33:59 -08:00
initialView: 'dayGridMonth',
headerToolbar: { left: 'prev', center: 'title', right: 'next' },
validRange: function (now) {
return {
start: new Date(now.getFullYear(), now.getMonth(), 1),
end: new Date(now.getFullYear(), now.getMonth() + 7, 1),
};
},
fixedWeekCount: false,
height: 'auto',
2026-05-12 16:28:47 -08:00
events: drupalSettings.riversidePt.eventsUrl,
2026-05-12 17:33:59 -08:00
eventBackgroundColor: '#3b82f6',
eventBorderColor: '#3b82f6',
dayMaxEvents: 0,
moreLinkContent: function (arg) {
return arg.num + ' slot' + (arg.num !== 1 ? 's' : '');
},
dayCellClassNames: function (arg) {
const date = arg.date.toISOString().substring(0, 10);
if (drupalSettings.riversidePt.holidays[date]) return ['is-holiday'];
},
dayCellDidMount: function (arg) {
const date = arg.date.toISOString().substring(0, 10);
const holiday = drupalSettings.riversidePt.holidays[date];
if (!holiday) return;
const label = document.createElement('div');
label.className = 'riverside-holiday-label';
label.textContent = holiday;
2026-05-13 13:55:52 -08:00
const dayTop = arg.el.querySelector('.fc-daygrid-day-top');
if (dayTop) {
dayTop.insertAdjacentElement('afterend', label);
} else {
arg.el.appendChild(label);
}
2026-05-12 17:33:59 -08:00
},
moreLinkClick: function (arg) {
arg.jsEvent.preventDefault();
arg.jsEvent.stopPropagation();
const date = arg.date.toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
panelDate.textContent = date;
panelSlots.innerHTML = '';
arg.allSegs.forEach(function (seg) {
const li = document.createElement('li');
2026-05-13 14:26:33 -08:00
const startLabel = seg.event.start.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
const endLabel = seg.event.end.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
2026-05-13 13:55:52 -08:00
const a = document.createElement('a');
2026-05-13 14:26:33 -08:00
a.href = '#';
a.textContent = startLabel + ' ' + endLabel;
a.addEventListener('click', function (e) {
e.preventDefault();
fetch(drupalSettings.riversidePt.storeSlotUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
start: seg.event.startStr,
end: seg.event.endStr,
}),
}).then(function (res) {
if (res.ok) {
window.location.href = drupalSettings.riversidePt.bookingUrl;
} else {
a.textContent += ' (no longer available)';
a.style.pointerEvents = 'none';
a.style.opacity = '0.5';
}
});
});
2026-05-13 13:55:52 -08:00
li.appendChild(a);
2026-05-12 17:33:59 -08:00
panelSlots.appendChild(li);
});
openPanel();
return false;
},
});
const panel = document.getElementById('riverside-booking-panel');
const backdrop = document.getElementById('riverside-booking-backdrop');
const panelDate = document.getElementById('riverside-booking-date');
const panelSlots = document.getElementById('riverside-booking-slots');
function closePanel() {
panel.hidden = true;
backdrop.hidden = true;
}
function openPanel() {
backdrop.hidden = false;
panel.hidden = false;
}
document.getElementById('riverside-booking-close').addEventListener('click', closePanel);
backdrop.addEventListener('click', closePanel);
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') closePanel();
2026-05-12 16:28:47 -08:00
});
calendar.render();
});
})(drupalSettings);