← back to NationalPaperHangers
views/public/booking.ejs
59 lines
<%- include('../partials/head', { title }) %>
<%- include('../partials/header') %>
<section class="booking-confirmation">
<header>
<p class="kicker">Booking · <%= booking.business_name %></p>
<h1 class="display-sm">
<% if (booking.status === 'confirmed') { %>You're confirmed.<% } else if (booking.status === 'pending') { %>Booking received.<% } else if (booking.status === 'canceled' || booking.status === 'declined') { %>Booking canceled.<% } else if (booking.status === 'completed') { %>Project complete.<% } else { %>Your booking<% } %>
</h1>
</header>
<div class="booking-card">
<dl>
<dt>Studio</dt>
<dd><a href="/installer/<%= booking.installer_slug %>"><%= booking.business_name %></a><% if (booking.installer_phone) { %> · <%= booking.installer_phone %><% } %></dd>
<dt>When</dt>
<dd><%= new Date(booking.scheduled_start).toLocaleString('en-US', { weekday: 'long', month: 'long', day: 'numeric', hour: 'numeric', minute: '2-digit' }) %></dd>
<dt>Type</dt>
<dd><%= (booking.project_type || 'consultation').replace(/_/g,' ') %></dd>
<dt>Status</dt>
<dd><span class="status-badge status-<%= booking.status %>"><%= booking.status %></span></dd>
<% if (booking.address_line1) { %>
<dt>Address</dt>
<dd><%= [booking.address_line1, booking.city, booking.state, booking.zip].filter(Boolean).join(', ') %></dd>
<% } %>
<% if (booking.customer_notes) { %>
<dt>Notes</dt>
<dd><%= booking.customer_notes %></dd>
<% } %>
</dl>
</div>
<p>Need to reschedule or cancel? Reply to your confirmation email or write to <a href="mailto:info@nationalpaperhangers.com">info@nationalpaperhangers.com</a>.</p>
</section>
<%- include('../partials/footer') %>
<% if (booking.status === 'confirmed') { %>
<%
// Script-context values must be JSON-serialised, not HTML-escaped: inside a
// script block HTML entities are not decoded, so the old escaped-output tag
// left raw apostrophes mangled and a newline / trailing backslash in
// business_name produced a JS SyntaxError that broke the whole inline
// script. JSON.stringify yields a valid JS string literal; the angle-bracket
// escape neutralises a literal closing script tag.
function jsLit(v) {
return JSON.stringify(String(v == null ? '' : v))
.replace(/</g, '\\u003c').replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029');
}
%>
<script>
// GA4 conversion: booking_confirmed
gtag('event', 'booking_confirmed', {
booking_uuid: <%- jsLit(booking.uuid) %>,
installer_slug: <%- jsLit(booking.installer_slug) %>,
installer_name: <%- jsLit(booking.business_name) %>
});
</script>
<% } %>