<%= title %>

Manage camp activities and programs

Total Activities

<%= pagination.total %>

Active

<%= typeof activeCount !== 'undefined' ? activeCount : (items.filter(i => i.isActive).length) %>

Inactive

<%= (typeof activeCount !== 'undefined' && typeof pagination !== 'undefined') ? (pagination.total - activeCount) : items.filter(i => !i.isActive).length %>

Pages

<%= pagination.totalPages %>

<% if (items && items.length > 0 && items[0].hero) { %>
Hero Section
Activities Hero
Booking Hero
<% if (items[0].hero && (items[0].hero.bannerImageActivities || items[0].hero.bannerImage)) { %> Activities banner preview <% } %>
<% if (items[0].hero && (items[0].hero.bannerImageBooking || items[0].hero.bannerImage)) { %> Booking banner preview <% } %>
<% } %>
Activities List
<% if (items && items.length> 0) { %>
<% items.forEach((item, index) => { %> <% }) %>
# Image Name Price Season Locations Rating Bookings Status Actions
<%= (pagination.page - 1) * pagination.limit + index + 1 %> <% if (item.image) { %> <% let imgSrc = item.image; if (!imgSrc.startsWith('http') && !imgSrc.startsWith('/')) { imgSrc = '/uploads/' + imgSrc; } %> <%= item.name %> <% } else { %>
<% } %>
<%= item.name %> <% if (item.link) { %>
<%= item.link %> <% } %>
$<%= item.price %> <% if (item.priceText) { %>
<%= item.priceText %> <% } %>
<% if (item.season && item.season.length> 0) { %> <% item.season.forEach(s => { %> <%= s %> <% }) %> <% } else { %> - <% } %> <% if (item.locations && item.locations.length> 0) { %> <%= item.locations.join(', ') %> <% } else { %> - <% } %> <% for (let i = 0; i < 5; i++) { %> <% } %> <% if (item.bookingCount > 0) { %> <%= item.bookingCount %> <% if (item.bookingSessions && item.bookingSessions.length > 0) { %> <% } %> <% } else { %> 0 <% } %>
>
<% if (pagination.totalPages> 1) { %> <% } %> <% } else { %>
No activities found

Get started by creating your first activity

Add First Activity
<% } %>
Filter Settings
<% if (filters && filters.length > 0) { %> <% filters.forEach((f, idx) => { %>
Filter: <%= f.label || 'Untitled' %>
Value
Label
<% (f.items || []).forEach((item, itemIdx) => { %>
<% }) %>
<% }) %> <% } %>
<% if (!filters || filters.length === 0) { %>
No filters configured yet.
<% } %>

<%= allBookingsStats ? allBookingsStats.total : 0 %>

Total Bookings

<%= allBookingsStats ? allBookingsStats.confirmed : 0 %>

Confirmed

<%= allBookingsStats ? allBookingsStats.pending : 0 %>

Pending

<%= allBookingsStats ? allBookingsStats.cancelled : 0 %>

Cancelled

<%= allBookingsStats ? allBookingsStats.completed : 0 %>

Completed

$<%= allBookingsStats ? allBookingsStats.totalRevenue.toLocaleString() : 0 %>

Revenue
All Booking Submissions
<% if (allBookings && allBookings.length > 0) { %>
<% allBookings.forEach((booking, index) => { %> <% }) %>
# Date Activity Session Participant Parent/Guardian Contact Gender/Age Status Payment Actions
<%= index + 1 %> <%= new Date(booking.createdAt).toLocaleDateString('en-GB', {day:'2-digit', month:'short', year:'2-digit'}) %> <% if (booking.activityId) { %> <%= booking.activityId.name %> <% } else { %> Unknown <% } %> <%= booking.sessionId ? booking.sessionId.substring(0, 15) + '...' : '-' %> <%= booking.participantFirstName %> <%= booking.participantLastName %> DOB: <%= new Date(booking.participantBirthDate).toLocaleDateString('en-GB') %> <%= booking.parentFirstName %> <%= booking.parentLastName %> <%= booking.email %> <%= booking.phone %> <%= booking.participantGender %> <% const today = new Date(); const birth = new Date(booking.participantBirthDate); let age = today.getFullYear() - birth.getFullYear(); const monthDiff = today.getMonth() - birth.getMonth(); if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) age--; %> <%= age %>y <%= booking.status %> <%= booking.paymentStatus %>
<% if (booking.activityId) { %> <% } %>
<% } else { %>
No bookings yet

Booking submissions will appear here when customers book activities.

<% } %>