(#3) - templating

This commit is contained in:
Martin Slachta
2026-06-14 07:16:13 +02:00
parent f4d3972d07
commit 8e264b8892
32 changed files with 870 additions and 126 deletions
+44 -16
View File
@@ -56,24 +56,14 @@ export const RsvFormSender = {
svg.appendChild(path);
const icon = document.createElement('div');
icon.className = 'success-icon';
icon.className = 'rsv-success-icon';
icon.appendChild(svg);
const title = document.createElement('div');
title.className = 'success-title';
title.textContent = s.success_title;
const subtitle = document.createElement('p');
subtitle.className = 'success-msg';
subtitle.textContent = s.success_subtitle;
const reset_btn = document.createElement('button');
reset_btn.className = 'reset-btn';
reset_btn.textContent = s.new_reservation;
const body = this.build_success_body(form, s);
const state = document.createElement('div');
state.className = 'success-state';
state.append(icon, title, subtitle, reset_btn);
state.className = 'rsv-success-state';
state.append(icon, body);
const msg = document.createElement('div');
msg.appendChild(state);
@@ -81,12 +71,50 @@ export const RsvFormSender = {
existing.forEach(child => child.style.display = 'none');
wrapper.appendChild(msg);
reset_btn.addEventListener('click', () => {
// The form catches every data-rsv-reset button in the card and links it to
// its cleanup — so new buttons just need the marker, no wiring here.
const reset = () => {
msg.remove();
form.reset();
// Native reset leaves custom controls untouched; reset the reservation
// selectors so their slots, hidden inputs and the summary clear, the date
// stays selected and availability reloads with the just-booked slots.
form.querySelectorAll('rsv-reservation-selector').forEach(sel => sel.reset());
this.clear_feedback(form);
existing.forEach(child => child.style.display = '');
});
};
state.querySelectorAll('[data-rsv-reset]').forEach(btn => btn.addEventListener('click', reset));
},
// Body of the success card. Uses the admin-configured template when the form
// ships one, filling the .rsv-success-summary placeholder (expanded server-side
// from <reservation-summary>) with a snapshot of the selected slots; otherwise
// falls back to the default text.
build_success_body(form, strings) {
const tpl = form.parentElement?.querySelector('template.rsv-form-success');
if (!tpl) {
const subtitle = document.createElement('p');
subtitle.className = 'rsv-success-msg';
subtitle.textContent = strings.success_subtitle;
return subtitle;
}
const body = document.createElement('div');
body.className = 'rsv-success-msg';
body.appendChild(tpl.content.cloneNode(true));
const placeholder = body.querySelector('.rsv-success-summary');
if (placeholder) {
const summary = form.querySelector('rsv-reservation-summary');
if (summary && typeof summary.snapshot === 'function') {
placeholder.replaceWith(summary.snapshot());
} else {
placeholder.remove();
}
}
return body;
},
set_loading(form, is_loading) {