From 4ba3eb4a82f800173aa4d01ec8bca13a39583407 Mon Sep 17 00:00:00 2001 From: duyphan1410 Date: Thu, 23 Apr 2026 18:44:37 +0700 Subject: [PATCH] Refactor: remove unused APIs, controllers, models and data files. Update: icon picker all system, Dashboard, Main UI more respone, Change: Logo, favicon. --- controllers/aboutController.js | 9 +- controllers/activityController.js | 1616 ---- controllers/faqController.js | 154 - controllers/homeController.js | 3 + controllers/insuranceController.js | 539 -- controllers/safetyController.js | 197 - controllers/socialLinkController.js | 321 - controllers/termsController.js | 574 -- controllers/testimonialController.js | 138 - controllers/videoGalleryController.js | 119 - data/Countries.json | 114 - data/Countrydetails.json | 146 - data/activities.json | 6762 ----------------- data/appointment.json | 77 - data/booking.json | 690 -- data/dataheader.json | 61 - data/faq-data.json | 234 - data/header-menu.json | 159 - data/insurance.json | 75 - data/menu-header.json | 100 - data/pricing.json | 118 - data/safety.json | 212 - data/service.json | 363 - data/terms-conditions.json | 152 - data/travel.json | 34 - data/visa.json | 300 - models/activity.js | 194 - models/insurance.js | 302 - models/safety.js | 76 - models/terms.js | 519 -- models/travel.js | 45 - public/img/favicon.png | Bin 138103 -> 174569 bytes public/img/logo/logo.jpg | Bin 0 -> 139348 bytes public/js/icon-picker.js | 23 +- .../uploads/programmes/Student_Studying.png | Bin 0 -> 39113 bytes routes/admin.js | 216 +- routes/index.js | 42 - views/admin/about/index.ejs | 48 +- views/admin/contact/index.ejs | 35 +- views/admin/dashboard.ejs | 147 +- views/admin/footer/index.ejs | 2 +- views/admin/home/index.ejs | 116 +- views/admin/programme/edit.ejs | 68 +- views/admin/request-info/index.ejs | 38 +- views/admin/student-support/index.ejs | 68 +- views/auth/login.ejs | 4 +- views/index.ejs | 17 + views/layouts/main.ejs | 61 +- 48 files changed, 438 insertions(+), 14850 deletions(-) delete mode 100644 controllers/activityController.js delete mode 100644 controllers/faqController.js delete mode 100644 controllers/insuranceController.js delete mode 100644 controllers/safetyController.js delete mode 100644 controllers/socialLinkController.js delete mode 100644 controllers/termsController.js delete mode 100644 controllers/testimonialController.js delete mode 100644 controllers/videoGalleryController.js delete mode 100644 data/Countries.json delete mode 100644 data/Countrydetails.json delete mode 100644 data/activities.json delete mode 100644 data/appointment.json delete mode 100644 data/booking.json delete mode 100644 data/dataheader.json delete mode 100644 data/faq-data.json delete mode 100644 data/header-menu.json delete mode 100644 data/insurance.json delete mode 100644 data/menu-header.json delete mode 100644 data/pricing.json delete mode 100644 data/safety.json delete mode 100644 data/service.json delete mode 100644 data/terms-conditions.json delete mode 100644 data/travel.json delete mode 100644 data/visa.json delete mode 100644 models/activity.js delete mode 100644 models/insurance.js delete mode 100644 models/safety.js delete mode 100644 models/terms.js delete mode 100644 models/travel.js create mode 100644 public/img/logo/logo.jpg create mode 100644 public/uploads/programmes/Student_Studying.png diff --git a/controllers/aboutController.js b/controllers/aboutController.js index 1a71bf9..05fe270 100644 --- a/controllers/aboutController.js +++ b/controllers/aboutController.js @@ -65,10 +65,13 @@ exports.index = async (req, res) => { data[s] = data[s] || defaults[s]; }); + const frontendUrl = process.env.FRONTEND_URL || ""; + return res.render("admin/about/index", { layout: "layouts/main", title: "About Management", data, + frontendUrl, currentPath: req.path, user: req.session.user, }); @@ -114,17 +117,17 @@ exports.update = async (req, res) => { if (!hasChanges) { req.flash("info_msg", "No changes were made"); - return req.session.save(() => res.redirect("/admin/about-us")); + return req.session.save(() => res.redirect("/admin/about")); } await doc.save(); req.flash("success_msg", "About page configuration has been updated!"); - return req.session.save(() => res.redirect("/admin/about-us")); + return req.session.save(() => res.redirect("/admin/about")); } catch (err) { console.error("About update error:", err); req.flash("error_msg", `Update error: ${err.message}`); - return req.session.save(() => res.redirect("/admin/about-us")); + return req.session.save(() => res.redirect("/admin/about")); } }; diff --git a/controllers/activityController.js b/controllers/activityController.js deleted file mode 100644 index bb8455b..0000000 --- a/controllers/activityController.js +++ /dev/null @@ -1,1616 +0,0 @@ -const {addBaseUrlToImages} = require("../utils/imageHelper"); -const Activity = require("../models/activity"); -const mongoose = require('mongoose'); - -// -------------------- Public (API) exports -------------------- - -// API endpoint: return all active activities as JSON -exports.api = async (req, res) => { - try { - // Return structured response with filters and camps - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - - // Get filters document (single doc with isFiltersDoc:true) - const filtersDoc = await Activity.findOne({ isFiltersDoc: true }).lean(); - const filters = (filtersDoc && Array.isArray(filtersDoc.filters)) ? filtersDoc.filters : []; - - // Fetch camps (activities) excluding the filters doc - const activities = await Activity.find({ isFiltersDoc: { $ne: true }, isActive: true }) - .sort({ order: 1, createdAt: -1 }) - .lean(); - - const camps = (activities || []).map((activity) => addBaseUrlToImages(activity, baseUrl)); - - // Get hero data from the first activity (assuming all activities share the same hero) - const heroRaw = activities.length > 0 && activities[0].hero ? activities[0].hero : {}; - const hero = addBaseUrlToImages(heroRaw, baseUrl); - - return res.json({ hero, filter: filters, camps }); - } catch (err) { - console.error("activity.api error:", err); - return res.status(500).json({error: "Error loading activities data"}); - } -}; - -// API endpoint: return a single activity by ID or link -exports.apiDetail = async (req, res) => { - try { - const {id} = req.params; - - // Try to find by ID first, then by link - let activity; - if (id.match(/^[0-9a-fA-F]{24}$/)) { - activity = await Activity.findById(id).lean(); - } - - if (!activity) { - activity = await Activity.findOne({link: `/${id}`}).lean(); - } - - if (!activity) { - return res.status(404).json({error: "Activity not found"}); - } - - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processed = addBaseUrlToImages(activity, baseUrl); - - return res.json(processed); - } catch (err) { - console.error("activity.apiDetail error:", err); - return res.status(500).json({error: "Error loading activity data"}); - } -}; - -// -------------------- Admin exports -------------------- - -// Get default activity data for creating new activity -const getDefaultActivityData = () => ({ - hero: { - title: "", - bannerImage: "", - }, - name: "", - price: 0, - priceText: "", - season: [], - age: [12, 18], - locations: [], - image: "", - link: "", - program: "", - rating: 4, - isActive: true, - order: 0, -}); - -// Display activities management page (list) -exports.index = async (req, res) => { - try { - const page = parseInt(req.query.page) || 1; - const limit = parseInt(req.query.limit) || 20; - const skip = (page - 1) * limit; - - const activitiesPromise = Activity.find({ isFiltersDoc: { $ne: true } }) - .sort({order: 1, createdAt: -1}) - .skip(skip) - .limit(limit) - .lean(); - - const totalPromise = Activity.countDocuments({ isFiltersDoc: { $ne: true } }); - const activePromise = Activity.countDocuments({ isFiltersDoc: { $ne: true }, isActive: true }); - - // Fetch filters from the consolidated Activity document (isFiltersDoc:true) - const filtersPromise = Activity.findOne({isFiltersDoc: true}).lean(); - - // Get all activities with booking sessions for extracting all bookings - const allActivitiesForBookingsPromise = Activity.find({ - isFiltersDoc: { $ne: true }, - 'bookingSessions.bookingList': { $exists: true, $ne: [] } - }).lean(); - - const [activities, total, filtersDoc, activeCount, allActivitiesForBookings] = await Promise.all([ - activitiesPromise, - totalPromise, - filtersPromise, - activePromise, - allActivitiesForBookingsPromise, - ]); - - // Extract all bookings from bookingSessions.bookingList - const allBookings = []; - const bookingCountMap = {}; - const sessionBookingCountMap = {}; - - allActivitiesForBookings.forEach(activity => { - const actId = activity._id.toString(); - let activityBookingCount = 0; - sessionBookingCountMap[actId] = {}; - - if (activity.bookingSessions && Array.isArray(activity.bookingSessions)) { - activity.bookingSessions.forEach(session => { - if (session.bookingList && Array.isArray(session.bookingList)) { - const sessionBookingCount = session.bookingList.length; - activityBookingCount += sessionBookingCount; - sessionBookingCountMap[actId][session.sessionId] = sessionBookingCount; - - // Add each booking to allBookings array with activity info - session.bookingList.forEach(booking => { - const bookingWithActivityInfo = { - ...booking, - activityId: { - _id: activity._id, - name: activity.name, - link: activity.link - }, - sessionId: session.sessionId, - createdAt: booking.createdAt || booking.bookingDate || new Date(), - status: booking.status || booking.bookingStatus || 'pending', - paymentStatus: booking.paymentStatus || 'pending', - totalAmount: booking.totalAmount || 0, - paidAmount: booking.paidAmount || 0 - }; - allBookings.push(bookingWithActivityInfo); - }); - } - }); - } - - bookingCountMap[actId] = activityBookingCount; - }); - - // Sort all bookings by creation date (newest first) - allBookings.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); - - // Add booking counts to activities - const activitiesWithBookings = activities.map(activity => { - const actId = activity._id.toString(); - return { - ...activity, - bookingCount: bookingCountMap[actId] || 0, - sessionBookingCounts: sessionBookingCountMap[actId] || {} - }; - }); - - const filters = (filtersDoc && Array.isArray(filtersDoc.filters)) ? filtersDoc.filters : []; - - const totalPages = Math.ceil(total / limit); - - // Calculate all bookings stats - const allBookingsStats = { - total: allBookings.length, - confirmed: allBookings.filter(b => b.status === 'confirmed').length, - pending: allBookings.filter(b => b.status === 'pending').length, - cancelled: allBookings.filter(b => b.status === 'cancelled').length, - completed: allBookings.filter(b => b.status === 'completed').length, - totalRevenue: allBookings.filter(b => b.status !== 'cancelled').reduce((sum, b) => sum + (b.totalAmount || 0), 0) - }; - - res.render("admin/activity/index", { - layout: "layouts/main", - title: "Activities Management", - items: activitiesWithBookings, - filters: filters, // Pass filters to view - activeCount, - allBookings: allBookings, // All bookings for the All Bookings tab - allBookingsStats: allBookingsStats, // Stats for bookings - pagination: { - page, - limit, - total, - totalPages, - hasNext: page < totalPages, - hasPrev: page > 1, - }, - frontendUrl: - process.env.FRONTEND_URL || req.protocol + "://" + req.get("host"), - currentPath: req.path, - user: req.session.user, - }); - } catch (err) { - console.error(err); - req.flash("error_msg", "Error loading activities data"); - res.redirect("/admin/dashboard"); - } -}; - -// Update activity filters -exports.updateFilters = async (req, res) => { - try { - // Accept filters submitted as an array or as an object with numeric keys - let filters = req.body.filters; - - // If form submission uses `filters[0]`, `filters[1]` style names, Express/body-parser - // may produce an object with numeric keys rather than a true Array. Normalize it. - if (!filters) { - filters = []; - } else if (!Array.isArray(filters) && typeof filters === 'object') { - try { - filters = Object.keys(filters) - .sort((a, b) => (parseInt(a, 10) || 0) - (parseInt(b, 10) || 0)) - .map((k) => filters[k]); - } catch (e) { - filters = []; - } - } - - // Sanitize and normalize incoming filters robustly - const sanitizedFilters = []; - try { - const iterable = Array.isArray(filters) ? filters : Object.keys(filters || {}).map((k) => filters[k]); - for (let idx = 0; idx < iterable.length; idx++) { - const filterData = iterable[idx] || {}; - - // Items can be JSON string, array, or an object with numeric keys - let items = filterData.items; - if (typeof items === 'string') { - try { - items = JSON.parse(items); - } catch (e) { - items = []; - } - } - - if (!Array.isArray(items) && typeof items === 'object' && items !== null) { - // convert object with numeric keys to array - try { - items = Object.keys(items) - .sort((a, b) => (parseInt(a, 10) || 0) - (parseInt(b, 10) || 0)) - .map((k) => items[k]); - } catch (e) { - items = []; - } - } - - if (!Array.isArray(items)) items = []; - - const cleanedItems = items - .map((it) => ({ value: (it && it.value) ? it.value.toString().trim() : "", label: (it && it.label) ? it.label.toString().trim() : "" })) - .filter((it) => it.value && it.label); - - // normalize id to ObjectId when possible - let subId = filterData._id || filterData.id || undefined; - if (subId && typeof subId === 'string' && /^[0-9a-fA-F]{24}$/.test(subId)) { - try { - subId = mongoose.Types.ObjectId(subId); - } catch (e) { - subId = undefined; - } - } else { - subId = undefined; // don't set invalid ids - } - - const label = (filterData.label || '').toString().trim(); - const value = (filterData.value || '').toString().trim(); - const order = parseInt(filterData.order, 10) || idx + 1; - - if (!label || !value) continue; // skip invalid - - sanitizedFilters.push({ _id: subId, label, value, items: cleanedItems, order }); - } - } catch (e) { - console.error('Error normalizing filters payload:', e); - } - - if (!Array.isArray(sanitizedFilters)) { - req.flash('error_msg', 'Invalid filters payload'); - return res.redirect('/admin/activity'); - } - - // Upsert the single filters document in Activities collection - try { - // Provide minimal valid fields when inserting a new filters document so - // schema validators (e.g., age validator) do not fail on upsert. - const setOnInsert = { - name: "_filters_doc", - price: 0, - priceText: "", - season: [], - age: [12, 18], - locations: [], - image: "", - link: "", - program: "", - rating: 4, - isActive: false, - order: 0, - isFiltersDoc: true, - }; - - const upsertResult = await Activity.findOneAndUpdate( - { isFiltersDoc: true }, - { $set: { filters: sanitizedFilters }, $setOnInsert: setOnInsert }, - { upsert: true, new: true, setDefaultsOnInsert: true } - ); - - req.flash('success_msg', 'Filters updated successfully'); - return res.redirect('/admin/activity'); - } catch (e) { - console.error('Activity upsert filters error:', e); - req.flash('error_msg', `Error saving filters: ${e.message || 'Unknown'}`); - return res.redirect('/admin/activity'); - } - } catch (err) { - console.error("Update filters error:", err); - req.flash("error_msg", `Error updating filters: ${err.message || "Unknown error"}`); - res.redirect("/admin/activity"); - } -}; - -// Update global hero section (admin) - updates filters doc and all activities -exports.updateHero = async (req, res) => { - try { - const titleActivities = (req.body.titleActivities || '').toString().trim(); - const titleBooking = (req.body.titleBooking || '').toString().trim(); - const bannerImageActivities = (req.body.bannerImageActivities || '').toString().trim(); - const bannerImageBooking = (req.body.bannerImageBooking || '').toString().trim(); - - const hero = { - titleActivities: titleActivities || 'Activities', - titleBooking: titleBooking || 'Activities', - bannerImageActivities: bannerImageActivities || '/uploads/banner/b9.jpg', - bannerImageBooking: bannerImageBooking || '/uploads/banner/b9.jpg', - }; - - // Update all activity docs to keep hero consistent - await Activity.updateMany({ isFiltersDoc: { $ne: true } }, { $set: { hero } }); - - // Upsert hero into the filters document as well - const setOnInsert = { - name: "_filters_doc", - price: 0, - priceText: "", - season: [], - age: [12, 18], - locations: [], - image: "", - link: "", - program: "", - rating: 4, - isActive: false, - order: 0, - isFiltersDoc: true, - }; - - await Activity.findOneAndUpdate( - { isFiltersDoc: true }, - { $set: { hero }, $setOnInsert: setOnInsert }, - { upsert: true, new: true, setDefaultsOnInsert: true } - ); - - req.flash('success_msg', 'Hero updated successfully'); - return res.redirect('/admin/activity'); - } catch (e) { - console.error('Update hero error:', e); - req.flash('error_msg', `Error updating hero: ${e.message || 'Unknown'}`); - return res.redirect('/admin/activity'); - } -}; - -// Display create form -exports.createForm = async (req, res) => { - try { - const data = getDefaultActivityData(); - - res.render("admin/activity/form", { - layout: "layouts/main", - title: "Create Activity", - data, - isEdit: false, - currentPath: req.path, - user: req.session.user, - }); - } catch (err) { - console.error(err); - req.flash("error_msg", "Error loading create form"); - res.redirect("/admin/activity"); - } -}; - -// Create new activity -exports.create = async (req, res) => { - try { - const activityData = parseActivityFormData(req.body); - - const newActivity = new Activity(activityData); - await newActivity.save(); - - req.flash("success_msg", "Activity created successfully"); - res.redirect("/admin/activity"); - } catch (err) { - console.error("Create error:", err); - req.flash("error_msg", `Create error: ${err.message || "Unknown"}`); - res.redirect("/admin/activity/create"); - } -}; - -// Display edit form -exports.editForm = async (req, res) => { - try { - const activity = await Activity.findById(req.params.id).lean(); - - if (!activity) { - req.flash("error_msg", "Activity not found"); - return res.redirect("/admin/activity"); - } - - res.render("admin/activity/form", { - layout: "layouts/main", - title: "Edit Activity", - data: activity, - isEdit: true, - currentPath: req.path, - user: req.session.user, - }); - } catch (err) { - console.error(err); - req.flash("error_msg", "Error loading edit form"); - res.redirect("/admin/activity"); - } -}; - -// Update activity -exports.update = async (req, res) => { - try { - const activity = await Activity.findById(req.params.id); - - if (!activity) { - req.flash("error_msg", "Activity not found"); - return res.redirect("/admin/activity"); - } - - const activityData = parseActivityFormData(req.body, activity); - - // Force status to active on update (always set isActive true when editing) - activityData.isActive = true; - - await Activity.findByIdAndUpdate(req.params.id, activityData, {new: true}); - - req.flash("success_msg", "Activity updated successfully"); - return req.session.save(() => res.redirect("/admin/activity")); - } catch (err) { - console.error("Update error:", err); - req.flash("error_msg", `Update error: ${err.message || "Unknown"}`); - return req.session.save(() => - res.redirect(`/admin/activity/${req.params.id}/edit`) - ); - } -}; - -// Delete activity -exports.delete = async (req, res) => { - try { - const activity = await Activity.findById(req.params.id); - - if (!activity) { - req.flash("error_msg", "Activity not found"); - return res.redirect("/admin/activity"); - } - - await Activity.findByIdAndDelete(req.params.id); - - req.flash("success_msg", "Activity deleted successfully"); - res.redirect("/admin/activity"); - } catch (err) { - console.error("Delete error:", err); - req.flash("error_msg", `Delete error: ${err.message || "Unknown"}`); - res.redirect("/admin/activity"); - } -}; - -// Toggle activity status (active/inactive) -exports.toggleStatus = async (req, res) => { - try { - const activity = await Activity.findById(req.params.id); - - if (!activity) { - return res.status(404).json({error: "Activity not found"}); - } - - activity.isActive = !activity.isActive; - await activity.save(); - - // Return updated global counts so front-end widgets can reflect totals - const total = await Activity.countDocuments({ isFiltersDoc: { $ne: true } }); - const activeCount = await Activity.countDocuments({ isFiltersDoc: { $ne: true }, isActive: true }); - - return res.json({ - success: true, - isActive: activity.isActive, - message: `Activity ${ - activity.isActive ? "activated" : "deactivated" - } successfully`, - total, - activeCount, - }); - } catch (err) { - console.error("Toggle status error:", err); - return res.status(500).json({error: "Error toggling activity status"}); - } -}; - -// Update activity order (for drag & drop reordering) -exports.updateOrder = async (req, res) => { - try { - const {items} = req.body; // Array of { id, order } - - if (!Array.isArray(items)) { - return res.status(400).json({error: "Invalid data format"}); - } - - const bulkOps = items.map((item) => ({ - updateOne: { - filter: {_id: item.id}, - update: {$set: {order: item.order}}, - }, - })); - - await Activity.bulkWrite(bulkOps); - - return res.json({success: true, message: "Order updated successfully"}); - } catch (err) { - console.error("Update order error:", err); - return res.status(500).json({error: "Error updating order"}); - } -}; - -// Preview activity -exports.preview = async (req, res) => { - try { - const activity = await Activity.findById(req.params.id).lean(); - - if (!activity) { - return res.status(404).json({error: "Activity not found"}); - } - - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processed = addBaseUrlToImages(activity, baseUrl); - - res.json(processed); - } catch (err) { - console.error("Preview error:", err); - res.status(500).json({error: "Error loading preview data"}); - } -}; - -// -------------------- Helper functions -------------------- - -function parseActivityFormData(body, existingActivity = null) { - // Parse season (can be string or array) - let season = body.season || []; - if (typeof season === "string") { - season = season - .split(",") - .map((s) => s.trim()) - .filter(Boolean); - } - - // Parse age range - let age = [12, 18]; - if (body.ageMin && body.ageMax) { - age = [parseInt(body.ageMin) || 12, parseInt(body.ageMax) || 18]; - } else if (body.age) { - try { - age = JSON.parse(body.age); - } catch (e) { - // Keep default - } - } - - // Parse locations (can be string or array) - let locations = body.locations || []; - if (typeof locations === "string") { - locations = locations - .split(",") - .map((s) => s.trim()) - .filter(Boolean); - } - - // Parse campDetail from form data - let campDetail = {}; - try { - if (body.campDetail) { - if (typeof body.campDetail === "string") { - campDetail = JSON.parse(body.campDetail); - } else { - campDetail = body.campDetail; - } - } - - // Handle individual campDetail fields if sent separately - // Hero section - if (body.campDetailHeroTitle || body.campDetailHeroBgImage) { - campDetail.hero = campDetail.hero || {}; - if (body.campDetailHeroTitle) campDetail.hero.title = body.campDetailHeroTitle.trim(); - if (body.campDetailHeroBgImage) campDetail.hero.bgImage = body.campDetailHeroBgImage.trim(); - } - - // Basic Info section - if (body.campDetailBasicInfoLocation || body.campDetailBasicInfoAgeRange || - body.campDetailBasicInfoAccommodationType || body.campDetailBasicInfoCareLevel || - body.campDetailBasicInfoLanguages) { - campDetail.basicInfo = campDetail.basicInfo || {}; - if (body.campDetailBasicInfoLocation) campDetail.basicInfo.location = body.campDetailBasicInfoLocation.trim(); - if (body.campDetailBasicInfoAgeRange) campDetail.basicInfo.ageRange = body.campDetailBasicInfoAgeRange.trim(); - if (body.campDetailBasicInfoAccommodationType) campDetail.basicInfo.accommodationType = body.campDetailBasicInfoAccommodationType.trim(); - if (body.campDetailBasicInfoCareLevel) campDetail.basicInfo.careLevel = body.campDetailBasicInfoCareLevel.trim(); - if (body.campDetailBasicInfoLanguages) campDetail.basicInfo.languages = body.campDetailBasicInfoLanguages.trim(); - } - - // Sidebar section - if (body.campDetailSidebarContactPhone || body.campDetailSidebarContactEmail || - body.campDetailSidebarMenuItems || body.campDetailSidebarUpcomingTours) { - campDetail.sidebar = campDetail.sidebar || {}; - - // Contact info - if (body.campDetailSidebarContactPhone || body.campDetailSidebarContactEmail) { - campDetail.sidebar.contact = campDetail.sidebar.contact || {}; - if (body.campDetailSidebarContactPhone) campDetail.sidebar.contact.phone = body.campDetailSidebarContactPhone.trim(); - if (body.campDetailSidebarContactEmail) campDetail.sidebar.contact.email = body.campDetailSidebarContactEmail.trim(); - } - - // Menu items (JSON array) - if (body.campDetailSidebarMenuItems) { - try { - campDetail.sidebar.menuItems = JSON.parse(body.campDetailSidebarMenuItems); - } catch (e) { - console.warn("Error parsing sidebar menuItems:", e); - } - } - - // Upcoming tours (JSON array) - if (body.campDetailSidebarUpcomingTours) { - try { - campDetail.sidebar.upcomingTours = JSON.parse(body.campDetailSidebarUpcomingTours); - } catch (e) { - console.warn("Error parsing sidebar upcomingTours:", e); - } - } - } - - // Main Gallery section - if (body.campDetailMainGallerySlides || body.campDetailMainGalleryOverlayLocation || - body.campDetailMainGalleryOverlaySeason || body.campDetailMainGalleryOverlayLanguages) { - campDetail.mainGallery = campDetail.mainGallery || {}; - - // Gallery slides (JSON array) - if (body.campDetailMainGallerySlides) { - try { - campDetail.mainGallery.slides = JSON.parse(body.campDetailMainGallerySlides); - } catch (e) { - console.warn("Error parsing mainGallery slides:", e); - } - } - - // Overlay info - if (body.campDetailMainGalleryOverlayLocation || body.campDetailMainGalleryOverlaySeason || - body.campDetailMainGalleryOverlayLanguages) { - campDetail.mainGallery.overlayInfo = campDetail.mainGallery.overlayInfo || {}; - if (body.campDetailMainGalleryOverlayLocation) campDetail.mainGallery.overlayInfo.location = body.campDetailMainGalleryOverlayLocation.trim(); - if (body.campDetailMainGalleryOverlaySeason) campDetail.mainGallery.overlayInfo.season = body.campDetailMainGalleryOverlaySeason.trim(); - if (body.campDetailMainGalleryOverlayLanguages) campDetail.mainGallery.overlayInfo.languages = body.campDetailMainGalleryOverlayLanguages.trim(); - } - } - - // Event Schedule section - if (body.campDetailEventScheduleStartDate || body.campDetailEventScheduleDuration || - body.campDetailEventScheduleTickets) { - campDetail.eventSchedule = campDetail.eventSchedule || {}; - if (body.campDetailEventScheduleStartDate) campDetail.eventSchedule.startDate = body.campDetailEventScheduleStartDate.trim(); - if (body.campDetailEventScheduleDuration) campDetail.eventSchedule.duration = body.campDetailEventScheduleDuration.trim(); - if (body.campDetailEventScheduleTickets) campDetail.eventSchedule.tickets = body.campDetailEventScheduleTickets.trim(); - } - - // Sections - handle both overview individual fields and complete sections JSON - if (body.campDetailSectionsOverviewIntro || body.campDetailSectionsOverviewMainText || - body.campDetailSectionsOverviewFeatures || body.campDetailSectionsOverviewFeatureImage || - body.campDetailSections) { - - // If complete sections JSON is provided, use it - if (body.campDetailSections) { - try { - campDetail.sections = JSON.parse(body.campDetailSections); - } catch (e) { - console.warn("Error parsing complete sections JSON:", e); - } - } - - // Handle individual overview fields (will override sections JSON if both provided) - if (body.campDetailSectionsOverviewIntro || body.campDetailSectionsOverviewMainText || - body.campDetailSectionsOverviewFeatures || body.campDetailSectionsOverviewFeatureImage) { - campDetail.sections = campDetail.sections || {}; - campDetail.sections.overview = campDetail.sections.overview || {}; - - if (body.campDetailSectionsOverviewIntro) campDetail.sections.overview.intro = body.campDetailSectionsOverviewIntro.trim(); - if (body.campDetailSectionsOverviewMainText) campDetail.sections.overview.mainText = body.campDetailSectionsOverviewMainText.trim(); - if (body.campDetailSectionsOverviewFeatureImage) campDetail.sections.overview.featureImage = body.campDetailSectionsOverviewFeatureImage.trim(); - - // Features array - if (body.campDetailSectionsOverviewFeatures) { - try { - campDetail.sections.overview.features = JSON.parse(body.campDetailSectionsOverviewFeatures); - } catch (e) { - console.warn("Error parsing overview features:", e); - } - } - } - } - - // Map tipsImage (sidebar) into campDetail.hero.bgImage when provided - if (body.tipsImage && typeof body.tipsImage === 'string' && body.tipsImage.trim()) { - campDetail.hero = campDetail.hero || {}; - campDetail.hero.bgImage = body.tipsImage.trim(); - } - } catch (e) { - console.warn("Error parsing campDetail:", e); - campDetail = {}; - } - - // Parse hero section (activities + booking variants) - const existingHero = existingActivity?.hero || {}; - const hero = { - titleActivities: body.titleActivities?.trim() || existingHero.titleActivities || "", - titleBooking: body.titleBooking?.trim() || existingHero.titleBooking || "", - bannerImageActivities: body.bannerImageActivities?.trim() || existingHero.bannerImageActivities || "", - bannerImageBooking: body.bannerImageBooking?.trim() || existingHero.bannerImageBooking || "", - }; - - // Parse bookingSessions - let bookingSessions = []; - try { - if (body.bookingSessions) { - if (typeof body.bookingSessions === "string") { - bookingSessions = JSON.parse(body.bookingSessions); - } else if (Array.isArray(body.bookingSessions)) { - bookingSessions = body.bookingSessions; - } else if (typeof body.bookingSessions === "object") { - bookingSessions = Object.keys(body.bookingSessions) - .sort((a, b) => parseInt(a) - parseInt(b)) - .map(k => body.bookingSessions[k]); - } - } - - // Validate và clean sessions - bookingSessions = bookingSessions - .filter(s => s && s.startDate && s.endDate) - .map((s, index) => ({ - // Auto generate sessionId if not provided - sessionId: s.sessionId?.trim() || `session-${Date.now()}-${index}`, - startDate: new Date(s.startDate), - endDate: new Date(s.endDate), - overnightStays: parseInt(s.overnightStays) || 14, - // Spots theo giới tính - totalMaleSpots: parseInt(s.totalMaleSpots) || 25, - totalFemaleSpots: parseInt(s.totalFemaleSpots) || 25, - bookedMaleSpots: parseInt(s.bookedMaleSpots) || 0, - bookedFemaleSpots: parseInt(s.bookedFemaleSpots) || 0, - price: s.price ? parseFloat(s.price) : null, - isActive: s.isActive === true || s.isActive === "true" || s.isActive === "on" - })); - } catch (e) { - console.warn("Error parsing bookingSessions:", e); - bookingSessions = existingActivity?.bookingSessions || []; - } - - // Determine final image value from various input sources - const finalImageValue = (function(){ - const img = body.image?.trim() || (body.sidebarImage?.trim() || '') || (body.tipsImage?.trim() || ''); - return img || ""; - })(); - - // Đồng bộ campDetail.hero.bgImage với main image - 2 trường này luôn giống nhau - if (finalImageValue && campDetail && campDetail.hero) { - campDetail.hero.bgImage = finalImageValue; - } else if (finalImageValue) { - // Tạo campDetail.hero nếu chưa có và gán bgImage - campDetail = campDetail || {}; - campDetail.hero = campDetail.hero || {}; - campDetail.hero.bgImage = finalImageValue; - } - - return { - hero, - name: body.name?.trim() || "", - price: Math.max(0, parseFloat(body.price) || 0), - priceText: body.priceText?.trim() || `from ${body.price || 0} USD`, - season, - age, - locations, - image: finalImageValue, - link: body.link?.trim() ? (body.link.trim().startsWith('/') ? body.link.trim() : '/' + body.link.trim()) : "", - program: body.program?.trim() || "", - rating: Math.max(1, Math.min(5, parseInt(body.rating) || 4)), - isActive: - body.isActive === "true" || - body.isActive === true || - body.isActive === "on" || - body.isActive === 1, - order: Math.max(0, parseInt(body.order) || 0), - campDetail: campDetail, - bookingSessions: bookingSessions, - }; -} - -// -------------------- Booking Submissions Management -------------------- - -// Get booking count for an activity -exports.getBookingCount = async (req, res) => { - try { - const { id } = req.params; - const BookingSubmission = require('../models/bookingSubmission'); - - let count = await BookingSubmission.countDocuments({ activityId: id }); - - // Fallback to embedded bookingList in Activity if no separate BookingSubmission docs - if (!count) { - const activity = await Activity.findById(id).lean(); - if (activity && Array.isArray(activity.bookingSessions)) { - count = activity.bookingSessions.reduce((sum, s) => { - return sum + (Array.isArray(s.bookingList) ? s.bookingList.length : 0); - }, 0); - } - } - - return res.json({ count }); - } catch (err) { - console.error("getBookingCount error:", err); - return res.status(500).json({ error: "Error loading booking count" }); - } -}; - -// Get booking submissions for an activity with stats -exports.getBookingSubmissions = async (req, res) => { - try { - const { id } = req.params; - const BookingSubmission = require('../models/bookingSubmission'); - - // Get activity with sessions - const activity = await Activity.findById(id).lean(); - if (!activity) { - return res.status(404).json({ error: "Activity not found" }); - } - - // Get all booking submissions for this activity (separate collection) - let bookings = await BookingSubmission.find({ activityId: id }) - .sort({ createdAt: -1 }) - .lean(); - - // Fallback: if there are no BookingSubmission documents, attempt to read embedded bookingList from Activity.bookingSessions - if ((!bookings || bookings.length === 0) && Array.isArray(activity.bookingSessions)) { - bookings = []; - activity.bookingSessions.forEach((session) => { - if (Array.isArray(session.bookingList)) { - session.bookingList.forEach((b) => { - // normalize embedded booking fields to match BookingSubmission shape - const item = Object.assign({}, b); - item.sessionId = session.sessionId || item.sessionDate || item.sessionId; - item.createdAt = item.bookingDate || item.createdAt || new Date(); - // normalize status/payment field names - item.status = item.status || item.bookingStatus || 'pending'; - item.paymentStatus = item.paymentStatus || item.paymentStatus || 'pending'; - // ensure participantBirthDate is Date - if (item.participantBirthDate && typeof item.participantBirthDate === 'string') { - item.participantBirthDate = new Date(item.participantBirthDate); - } - bookings.push(item); - }); - } - }); - // sort by createdAt desc - bookings.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); - } - - // Calculate statistics - const stats = { - total: bookings.length, - confirmed: bookings.filter(b => b.status === 'confirmed').length, - pending: bookings.filter(b => b.status === 'pending').length, - cancelled: bookings.filter(b => b.status === 'cancelled').length, - completed: bookings.filter(b => b.status === 'completed').length, - totalRevenue: bookings.filter(b => b.status !== 'cancelled').reduce((sum, b) => sum + (b.totalAmount || 0), 0) - }; - - // Create session breakdown - const sessionBreakdown = {}; - const sessions = activity.bookingSessions || []; - - sessions.forEach(session => { - const sessionBookings = bookings.filter(b => b.sessionId === session.sessionId); - const totalCapacity = session.totalMaleSpots + session.totalFemaleSpots; - const bookedCount = sessionBookings.length; - - sessionBreakdown[session.sessionId] = { - sessionName: `${new Date(session.startDate).toLocaleDateString()} - ${new Date(session.endDate).toLocaleDateString()}`, - dateRange: `${new Date(session.startDate).toLocaleDateString()} - ${new Date(session.endDate).toLocaleDateString()}`, - totalCapacity, - bookedCount, - bookings: sessionBookings.length - }; - }); - - // Format sessions for filter dropdown - const sessionsForFilter = sessions.map(s => ({ - sessionId: s.sessionId, - sessionName: `${new Date(s.startDate).toLocaleDateString()} - ${new Date(s.endDate).toLocaleDateString()}` - })); - - return res.json({ - bookings, - stats, - sessionBreakdown, - sessions: sessionsForFilter - }); - - } catch (err) { - console.error("getBookingSubmissions error:", err); - return res.status(500).json({ error: "Error loading booking submissions" }); - } -}; - -// Export booking data as CSV -exports.exportBookingData = async (req, res) => { - try { - const { id } = req.params; - const BookingSubmission = require('../models/bookingSubmission'); - - const bookings = await BookingSubmission.find({ activityId: id }) - .populate('activityId', 'name') - .sort({ createdAt: -1 }) - .lean(); - - if (bookings.length === 0) { - return res.status(404).json({ error: "No bookings found" }); - } - - // CSV headers - const headers = [ - 'Date Submitted', - 'Activity', - 'Session ID', - 'Participant Name', - 'Participant Gender', - 'Participant Birth Date', - 'Parent Name', - 'Email', - 'Phone', - 'Address', - 'City', - 'Country', - 'Postal Code', - 'Number of Participants', - 'Medical Conditions', - 'Dietary Restrictions', - 'Special Requests', - 'Emergency Contact', - 'Emergency Phone', - 'Status', - 'Payment Status', - 'Total Amount', - 'Paid Amount' - ]; - - // Convert bookings to CSV rows - const rows = bookings.map(booking => [ - new Date(booking.createdAt).toISOString().split('T')[0], - booking.activityId?.name || 'Unknown Activity', - booking.sessionId, - `${booking.participantFirstName} ${booking.participantLastName}`, - booking.participantGender, - new Date(booking.participantBirthDate).toISOString().split('T')[0], - `${booking.parentFirstName} ${booking.parentLastName}`, - booking.email, - booking.phone, - booking.address, - booking.city, - booking.country, - booking.postalCode, - booking.numberOfParticipants, - booking.medicalConditions || '', - booking.dietaryRestrictions || 'none', - booking.specialRequests || '', - booking.emergencyContact, - booking.emergencyPhone, - booking.status, - booking.paymentStatus, - booking.totalAmount || 0, - booking.paidAmount || 0 - ]); - - // Generate CSV content - const csvContent = [headers, ...rows] - .map(row => row.map(field => `"${(field || '').toString().replace(/"/g, '""')}"`).join(',')) - .join('\n'); - - // Set response headers for CSV download - res.setHeader('Content-Type', 'text/csv'); - res.setHeader('Content-Disposition', `attachment; filename="bookings_${id}_${new Date().toISOString().split('T')[0]}.csv"`); - - return res.send(csvContent); - - } catch (err) { - console.error("exportBookingData error:", err); - return res.status(500).json({ error: "Error exporting booking data" }); - } -}; - -// Export ALL booking data as CSV (across all activities) -exports.exportAllBookingsData = async (req, res) => { - try { - // Get all activities with booking sessions - const allActivities = await Activity.find({ - isFiltersDoc: { $ne: true }, - 'bookingSessions.bookingList': { $exists: true, $ne: [] } - }).lean(); - - // Extract all bookings from bookingSessions.bookingList - const allBookings = []; - - allActivities.forEach(activity => { - if (activity.bookingSessions && Array.isArray(activity.bookingSessions)) { - activity.bookingSessions.forEach(session => { - if (session.bookingList && Array.isArray(session.bookingList)) { - session.bookingList.forEach(booking => { - const bookingWithActivityInfo = { - ...booking, - activityName: activity.name, - sessionId: session.sessionId, - createdAt: booking.createdAt || booking.bookingDate || new Date(), - status: booking.status || booking.bookingStatus || 'pending', - paymentStatus: booking.paymentStatus || 'pending', - totalAmount: booking.totalAmount || 0, - paidAmount: booking.paidAmount || 0 - }; - allBookings.push(bookingWithActivityInfo); - }); - } - }); - } - }); - - if (allBookings.length === 0) { - return res.status(404).json({ error: "No bookings found" }); - } - - // Sort by creation date (newest first) - allBookings.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); - - // CSV headers - const headers = [ - 'Date Submitted', - 'Activity', - 'Session ID', - 'Participant Name', - 'Participant Gender', - 'Participant Birth Date', - 'Parent Name', - 'Email', - 'Phone', - 'Address', - 'City', - 'Country', - 'Postal Code', - 'Number of Participants', - 'Medical Conditions', - 'Dietary Restrictions', - 'Special Requests', - 'Emergency Contact', - 'Emergency Phone', - 'Status', - 'Payment Status', - 'Total Amount', - 'Paid Amount' - ]; - - // Convert bookings to CSV rows - const rows = allBookings.map(booking => [ - new Date(booking.createdAt).toISOString().split('T')[0], - booking.activityName || 'Unknown Activity', - booking.sessionId, - `${booking.participantFirstName} ${booking.participantLastName}`, - booking.participantGender, - booking.participantBirthDate ? new Date(booking.participantBirthDate).toISOString().split('T')[0] : '', - `${booking.parentFirstName} ${booking.parentLastName}`, - booking.email, - booking.phone, - booking.address, - booking.city, - booking.country, - booking.postalCode, - booking.numberOfParticipants, - booking.medicalConditions || '', - booking.dietaryRestrictions || 'none', - booking.specialRequests || '', - booking.emergencyContact, - booking.emergencyPhone, - booking.status, - booking.paymentStatus, - booking.totalAmount || 0, - booking.paidAmount || 0 - ]); - - // Generate CSV content - const csvContent = [headers, ...rows] - .map(row => row.map(field => `"${(field || '').toString().replace(/"/g, '""')}"`).join(',')) - .join('\n'); - - // Set response headers for CSV download - res.setHeader('Content-Type', 'text/csv'); - res.setHeader('Content-Disposition', `attachment; filename="all_bookings_${new Date().toISOString().split('T')[0]}.csv"`); - - return res.send(csvContent); - - } catch (err) { - console.error("exportAllBookingsData error:", err); - return res.status(500).json({ error: "Error exporting all booking data" }); - } -}; - -// Delete a booking submission -exports.deleteBookingSubmission = async (req, res) => { - try { - const { bookingId } = req.params; - const BookingSubmission = require('../models/bookingSubmission'); - - const booking = await BookingSubmission.findById(bookingId); - if (!booking) { - return res.status(404).json({ error: "Booking not found" }); - } - - await BookingSubmission.findByIdAndDelete(bookingId); - - return res.json({ message: "Booking deleted successfully" }); - - } catch (err) { - console.error("deleteBookingSubmission error:", err); - return res.status(500).json({ error: "Error deleting booking" }); - } -}; - -// -------------------- Camp Session Booking Management -------------------- - -// Create a new booking directly into camp session -exports.createSessionBooking = async (req, res) => { - try { - const { activityId, sessionId } = req.params; - const bookingData = req.body; - - // Validate required fields - const requiredFields = [ - 'address', 'agreeTerms', 'city', 'country', 'email', 'emergencyContact', - 'emergencyPhone', 'numberOfParticipants', 'parentFirstName', 'parentLastName', - 'participantBirthDate', 'participantFirstName', 'participantGender', - 'participantLastName', 'phone', 'postalCode' - ]; - - for (let field of requiredFields) { - if (!bookingData[field]) { - return res.status(400).json({ - error: `Missing required field: ${field}` - }); - } - } - - // Validate email format - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(bookingData.email)) { - return res.status(400).json({ error: "Invalid email format" }); - } - - // Find the activity - const activity = await Activity.findById(activityId); - if (!activity) { - return res.status(404).json({ error: "Activity not found" }); - } - - // Find the specific session - const sessionIndex = activity.bookingSessions.findIndex(s => s.sessionId === sessionId); - if (sessionIndex === -1) { - return res.status(404).json({ error: "Session not found" }); - } - - const session = activity.bookingSessions[sessionIndex]; - - // Check if session is active - if (!session.isActive) { - return res.status(400).json({ error: "Session is not active for booking" }); - } - - // Check availability based on participant gender - const participantGender = bookingData.participantGender; - const numberOfParticipants = parseInt(bookingData.numberOfParticipants) || 1; - - let availableSpots = 0; - if (participantGender === 'male') { - availableSpots = session.totalMaleSpots - session.bookedMaleSpots; - } else if (participantGender === 'female') { - availableSpots = session.totalFemaleSpots - session.bookedFemaleSpots; - } else { - // For 'other' gender, check both male and female availability - const maleAvailable = session.totalMaleSpots - session.bookedMaleSpots; - const femaleAvailable = session.totalFemaleSpots - session.bookedFemaleSpots; - availableSpots = Math.max(maleAvailable, femaleAvailable); - } - - if (availableSpots < numberOfParticipants) { - return res.status(400).json({ - error: `Not enough spots available. Only ${availableSpots} spots left for ${participantGender} participants.`, - availableSpots - }); - } - - // Generate unique confirmation code - const confirmationCode = `GG${Date.now()}${Math.random().toString(36).substr(2, 5).toUpperCase()}`; - - // Calculate total amount - const pricePerParticipant = session.price || activity.price || 0; - const totalAmount = pricePerParticipant * numberOfParticipants; - - // Create booking object - const newBooking = { - address: bookingData.address.trim(), - agreeNewsletter: bookingData.agreeNewsletter === true || bookingData.agreeNewsletter === 'true', - agreeTerms: bookingData.agreeTerms === true || bookingData.agreeTerms === 'true', - city: bookingData.city.trim(), - country: bookingData.country.trim(), - dietaryRestrictions: bookingData.dietaryRestrictions || 'none', - email: bookingData.email.toLowerCase().trim(), - emergencyContact: bookingData.emergencyContact.trim(), - emergencyPhone: bookingData.emergencyPhone.trim(), - medicalConditions: bookingData.medicalConditions || '', - numberOfParticipants: numberOfParticipants, - parentFirstName: bookingData.parentFirstName.trim(), - parentLastName: bookingData.parentLastName.trim(), - participantBirthDate: new Date(bookingData.participantBirthDate), - participantFirstName: bookingData.participantFirstName.trim(), - participantGender: participantGender, - participantLastName: bookingData.participantLastName.trim(), - phone: bookingData.phone.trim(), - postalCode: bookingData.postalCode.trim(), - sessionDate: sessionId, - specialRequests: bookingData.specialRequests || '', - bookingStatus: 'pending', - paymentStatus: 'pending', - totalAmount: totalAmount, - paidAmount: 0, - bookingDate: new Date(), - confirmationCode: confirmationCode, - adminNotes: '' - }; - - // Add booking to session - if (!activity.bookingSessions[sessionIndex].bookingList) { - activity.bookingSessions[sessionIndex].bookingList = []; - } - activity.bookingSessions[sessionIndex].bookingList.push(newBooking); - - // Update booked spots count - if (participantGender === 'male') { - activity.bookingSessions[sessionIndex].bookedMaleSpots += numberOfParticipants; - } else if (participantGender === 'female') { - activity.bookingSessions[sessionIndex].bookedFemaleSpots += numberOfParticipants; - } else { - // For 'other' gender, distribute to the gender with more availability - const maleAvailable = session.totalMaleSpots - session.bookedMaleSpots; - const femaleAvailable = session.totalFemaleSpots - session.bookedFemaleSpots; - if (maleAvailable >= femaleAvailable) { - activity.bookingSessions[sessionIndex].bookedMaleSpots += numberOfParticipants; - } else { - activity.bookingSessions[sessionIndex].bookedFemaleSpots += numberOfParticipants; - } - } - - // Save the updated activity - await activity.save(); - - // Return success response with booking details - return res.status(201).json({ - message: "Booking created successfully", - booking: { - id: activity.bookingSessions[sessionIndex].bookingList[activity.bookingSessions[sessionIndex].bookingList.length - 1]._id, - confirmationCode: confirmationCode, - activityName: activity.name, - sessionId: sessionId, - participantName: `${bookingData.participantFirstName} ${bookingData.participantLastName}`, - parentName: `${bookingData.parentFirstName} ${bookingData.parentLastName}`, - email: bookingData.email, - totalAmount: totalAmount, - numberOfParticipants: numberOfParticipants, - status: 'pending', - sessionDetails: { - startDate: session.startDate, - endDate: session.endDate, - overnightStays: session.overnightStays - } - } - }); - - } catch (err) { - console.error("createSessionBooking error:", err); - return res.status(500).json({ error: "Error creating booking" }); - } -}; - -// Create booking by program (wrapper) - find activity by `program` then delegate -exports.createSessionBookingByProgram = async (req, res) => { - try { - const { program, sessionId } = req.params; - // Find activity by program field - const activity = await Activity.findOne({ program: program }); - if (!activity) return res.status(404).json({ error: 'Activity not found for program: ' + program }); - - // Inject activityId into params and call existing handler - req.params.activityId = activity._id.toString(); - req.params.sessionId = sessionId; - return await exports.createSessionBooking(req, res); - } catch (err) { - console.error('createSessionBookingByProgram error:', err); - return res.status(500).json({ error: 'Error creating booking by program' }); - } -}; - -// Get all bookings for a specific session -exports.getSessionBookings = async (req, res) => { - try { - const { activityId, sessionId } = req.params; - const page = parseInt(req.query.page) || 1; - const limit = parseInt(req.query.limit) || 20; - const status = req.query.status; - const search = req.query.search; - - // Find the activity - const activity = await Activity.findById(activityId); - if (!activity) { - return res.status(404).json({ error: "Activity not found" }); - } - - // Find the specific session - const session = activity.bookingSessions.find(s => s.sessionId === sessionId); - if (!session) { - return res.status(404).json({ error: "Session not found" }); - } - - let bookings = session.bookingList || []; - - // Apply filters - if (status) { - bookings = bookings.filter(b => b.bookingStatus === status); - } - - if (search) { - const searchLower = search.toLowerCase(); - bookings = bookings.filter(b => - b.participantFirstName.toLowerCase().includes(searchLower) || - b.participantLastName.toLowerCase().includes(searchLower) || - b.parentFirstName.toLowerCase().includes(searchLower) || - b.parentLastName.toLowerCase().includes(searchLower) || - b.email.toLowerCase().includes(searchLower) || - b.confirmationCode.toLowerCase().includes(searchLower) - ); - } - - // Calculate pagination - const totalBookings = bookings.length; - const totalPages = Math.ceil(totalBookings / limit); - const startIndex = (page - 1) * limit; - const endIndex = startIndex + limit; - const paginatedBookings = bookings.slice(startIndex, endIndex); - - // Calculate statistics - const stats = { - total: session.bookingList?.length || 0, - pending: bookings.filter(b => b.bookingStatus === 'pending').length, - confirmed: bookings.filter(b => b.bookingStatus === 'confirmed').length, - cancelled: bookings.filter(b => b.bookingStatus === 'cancelled').length, - completed: bookings.filter(b => b.bookingStatus === 'completed').length, - totalRevenue: bookings.filter(b => b.bookingStatus !== 'cancelled').reduce((sum, b) => sum + b.totalAmount, 0), - paidAmount: bookings.reduce((sum, b) => sum + b.paidAmount, 0) - }; - - return res.json({ - bookings: paginatedBookings, - pagination: { - currentPage: page, - totalPages: totalPages, - totalBookings: totalBookings, - limit: limit - }, - session: { - sessionId: session.sessionId, - startDate: session.startDate, - endDate: session.endDate, - totalMaleSpots: session.totalMaleSpots, - totalFemaleSpots: session.totalFemaleSpots, - bookedMaleSpots: session.bookedMaleSpots, - bookedFemaleSpots: session.bookedFemaleSpots, - isActive: session.isActive - }, - stats: stats, - activity: { - id: activity._id, - name: activity.name, - price: activity.price - } - }); - - } catch (err) { - console.error("getSessionBookings error:", err); - return res.status(500).json({ error: "Error retrieving session bookings" }); - } -}; - -// Get session bookings by program (wrapper) -exports.getSessionBookingsByProgram = async (req, res) => { - try { - const { program, sessionId } = req.params; - const activity = await Activity.findOne({ program: program }); - if (!activity) return res.status(404).json({ error: 'Activity not found for program: ' + program }); - - req.params.activityId = activity._id.toString(); - req.params.sessionId = sessionId; - return await exports.getSessionBookings(req, res); - } catch (err) { - console.error('getSessionBookingsByProgram error:', err); - return res.status(500).json({ error: 'Error retrieving session bookings by program' }); - } -}; - -// Update a specific booking in a session -exports.updateSessionBooking = async (req, res) => { - try { - const { activityId, sessionId, bookingId } = req.params; - const updateData = req.body; - - // Find the activity - const activity = await Activity.findById(activityId); - if (!activity) { - return res.status(404).json({ error: "Activity not found" }); - } - - // Find the specific session - const sessionIndex = activity.bookingSessions.findIndex(s => s.sessionId === sessionId); - if (sessionIndex === -1) { - return res.status(404).json({ error: "Session not found" }); - } - - // Find the specific booking - const bookingIndex = activity.bookingSessions[sessionIndex].bookingList.findIndex( - b => b._id.toString() === bookingId - ); - if (bookingIndex === -1) { - return res.status(404).json({ error: "Booking not found" }); - } - - const currentBooking = activity.bookingSessions[sessionIndex].bookingList[bookingIndex]; - - // Update allowed fields - const allowedUpdates = [ - 'bookingStatus', 'paymentStatus', 'paidAmount', 'adminNotes', - 'emergencyContact', 'emergencyPhone', 'medicalConditions', - 'specialRequests', 'dietaryRestrictions' - ]; - - for (let field of allowedUpdates) { - if (updateData[field] !== undefined) { - activity.bookingSessions[sessionIndex].bookingList[bookingIndex][field] = updateData[field]; - } - } - - // Handle status changes that might affect spot counts - if (updateData.bookingStatus && updateData.bookingStatus !== currentBooking.bookingStatus) { - const numberOfParticipants = currentBooking.numberOfParticipants; - const participantGender = currentBooking.participantGender; - - // If booking is being cancelled, free up spots - if (updateData.bookingStatus === 'cancelled' && currentBooking.bookingStatus !== 'cancelled') { - if (participantGender === 'male') { - activity.bookingSessions[sessionIndex].bookedMaleSpots = Math.max(0, - activity.bookingSessions[sessionIndex].bookedMaleSpots - numberOfParticipants); - } else if (participantGender === 'female') { - activity.bookingSessions[sessionIndex].bookedFemaleSpots = Math.max(0, - activity.bookingSessions[sessionIndex].bookedFemaleSpots - numberOfParticipants); - } - } - - // If booking is being restored from cancelled, book spots again - if (currentBooking.bookingStatus === 'cancelled' && updateData.bookingStatus !== 'cancelled') { - if (participantGender === 'male') { - const totalMale = activity.bookingSessions[sessionIndex].totalMaleSpots; - const currentMale = activity.bookingSessions[sessionIndex].bookedMaleSpots; - if (currentMale + numberOfParticipants > totalMale) { - return res.status(400).json({ - error: "Not enough male spots available to restore this booking", - availableSpots: totalMale - currentMale - }); - } - activity.bookingSessions[sessionIndex].bookedMaleSpots += numberOfParticipants; - } else if (participantGender === 'female') { - const totalFemale = activity.bookingSessions[sessionIndex].totalFemaleSpots; - const currentFemale = activity.bookingSessions[sessionIndex].bookedFemaleSpots; - if (currentFemale + numberOfParticipants > totalFemale) { - return res.status(400).json({ - error: "Not enough female spots available to restore this booking", - availableSpots: totalFemale - currentFemale - }); - } - activity.bookingSessions[sessionIndex].bookedFemaleSpots += numberOfParticipants; - } - } - } - - // Save the updated activity - await activity.save(); - - return res.json({ - message: "Booking updated successfully", - booking: activity.bookingSessions[sessionIndex].bookingList[bookingIndex] - }); - - } catch (err) { - console.error("updateSessionBooking error:", err); - return res.status(500).json({ error: "Error updating booking" }); - } -}; - -// Delete a specific booking from a session -exports.deleteSessionBooking = async (req, res) => { - try { - const { activityId, sessionId, bookingId } = req.params; - - // Find the activity - const activity = await Activity.findById(activityId); - if (!activity) { - return res.status(404).json({ error: "Activity not found" }); - } - - // Find the specific session - const sessionIndex = activity.bookingSessions.findIndex(s => s.sessionId === sessionId); - if (sessionIndex === -1) { - return res.status(404).json({ error: "Session not found" }); - } - - // Find the specific booking - const bookingIndex = activity.bookingSessions[sessionIndex].bookingList.findIndex( - b => b._id.toString() === bookingId - ); - if (bookingIndex === -1) { - return res.status(404).json({ error: "Booking not found" }); - } - - const bookingToDelete = activity.bookingSessions[sessionIndex].bookingList[bookingIndex]; - - // Free up spots if booking is not cancelled - if (bookingToDelete.bookingStatus !== 'cancelled') { - const numberOfParticipants = bookingToDelete.numberOfParticipants; - const participantGender = bookingToDelete.participantGender; - - if (participantGender === 'male') { - activity.bookingSessions[sessionIndex].bookedMaleSpots = Math.max(0, - activity.bookingSessions[sessionIndex].bookedMaleSpots - numberOfParticipants); - } else if (participantGender === 'female') { - activity.bookingSessions[sessionIndex].bookedFemaleSpots = Math.max(0, - activity.bookingSessions[sessionIndex].bookedFemaleSpots - numberOfParticipants); - } - } - - // Remove the booking from the array - activity.bookingSessions[sessionIndex].bookingList.splice(bookingIndex, 1); - - // Save the updated activity - await activity.save(); - - return res.json({ - message: "Booking deleted successfully", - deletedBooking: { - id: bookingId, - confirmationCode: bookingToDelete.confirmationCode, - participantName: `${bookingToDelete.participantFirstName} ${bookingToDelete.participantLastName}` - } - }); - - } catch (err) { - console.error("deleteSessionBooking error:", err); - return res.status(500).json({ error: "Error deleting booking" }); - } -}; diff --git a/controllers/faqController.js b/controllers/faqController.js deleted file mode 100644 index ffec4b7..0000000 --- a/controllers/faqController.js +++ /dev/null @@ -1,154 +0,0 @@ -const Home = require("../models/home"); -const writeAuditLog = require("../audit/writeAuditLog"); -const diffObject = require("../audit/diffObject"); -const AUDIT_ACTIONS = require("../constants/auditAction"); - -// Helper to get FAQ data from Home model -const getFaqData = async () => { - const home = await Home.findOne().sort({ updatedAt: -1 }); - if (!home || !home.faq) { - return { - heading: "", - subheading: "", - description: "", - items: [], - ctaButton: { label: "", href: "" }, - }; - } - return home.faq.toObject ? home.faq.toObject() : home.faq; -}; - -// API to get FAQ data for frontend -exports.api = async (req, res) => { - try { - const faqData = await getFaqData(); - return res.json(faqData); - } catch (err) { - console.error("API Error:", err); - res.status(500).json({ error: "Error loading FAQ data" }); - } -}; - -// Method for legacy route compatibility or internal use -exports.getFAQData = async (req, res) => { - return exports.api(req, res); -}; - -// Render admin view -exports.index = async (req, res) => { - try { - const data = await getFaqData(); - // Ensure default structure if data is partial - const safeData = { - heading: data.heading || "", - subheading: data.subheading || "", - description: data.description || "", - ctaButton: data.ctaButton || { label: "", href: "" }, - items: data.items || [], - }; - - const frontendUrl = process.env.FRONTEND_URL; - - res.render("admin/home/faq/index", { - title: "FAQ Section Management", - layout: "layouts/main", - data: safeData, - frontendUrl, - currentPath: req.path, - user: req.session.user, - }); - } catch (error) { - console.error("Error in FAQ index:", error); - req.flash("error_msg", "An error occurred while loading the page"); - res.redirect("/admin/dashboard"); - } -}; - -// Update FAQ data -exports.update = async (req, res) => { - try { - const { heading, subheading, description, ctaLabel, ctaHref, items } = - req.body; - - let parsedItems = []; - if (items) { - try { - parsedItems = typeof items === "string" ? JSON.parse(items) : items; - } catch (e) { - console.error("Error parsing items JSON:", e); - parsedItems = []; - } - } - - let home = await Home.findOne().sort({ updatedAt: -1 }); - if (!home) { - home = new Home({}); - } - - // ✅ Capture BEFORE state - const beforeData = home.faq - ? JSON.parse( - JSON.stringify(home.faq.toObject ? home.faq.toObject() : home.faq), - ) - : {}; - - const updatedFaqData = { - heading: heading || "", - subheading: subheading || "", - description: description || "", - ctaButton: { - label: ctaLabel || "", - href: ctaHref || "", - }, - items: parsedItems.map((item) => ({ - question: item.question || "", - answer: item.answer || "", - })), - }; - - home.faq = updatedFaqData; - await home.save(); - - // ✅ Capture AFTER state - const afterData = JSON.parse(JSON.stringify(updatedFaqData)); - - // ✅ AUDIT LOGGING - FAQ Updated - const changes = diffObject(beforeData, afterData); - if (changes.length > 0) { - await writeAuditLog({ - model: "Home", - documentId: home._id, - action: AUDIT_ACTIONS.UPDATE_FAQ, - before: beforeData, - after: afterData, - changes, - req, - }); - } - - req.flash("success_msg", "FAQ section updated successfully"); - res.redirect("/admin/home/faq"); - } catch (err) { - console.error("Error updating FAQ:", err); - req.flash("error_msg", err.message || "Error updating FAQ"); - res.redirect("/admin/home/faq"); - } -}; - -// Placeholder methods to prevent route crashes if routes are not cleaned up immediately -exports.addFAQ = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.updateFAQItem = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.deleteFAQItem = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.addFAQSection = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.updateFAQSection = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.deleteFAQSection = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.reorderFAQSection = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); -exports.updateSidebarNav = (req, res) => - res.status(404).json({ error: "Endpoint deprecated" }); diff --git a/controllers/homeController.js b/controllers/homeController.js index dc7534b..33ff785 100644 --- a/controllers/homeController.js +++ b/controllers/homeController.js @@ -54,10 +54,13 @@ exports.index = async (req, res) => { data[s] = data[s] || defaults[s]; }); + const frontendUrl = process.env.FRONTEND_URL || ""; + return res.render("admin/home/index", { layout: "layouts/main", title: "Home Management", data, + frontendUrl, currentPath: req.path, user: req.session.user, }); diff --git a/controllers/insuranceController.js b/controllers/insuranceController.js deleted file mode 100644 index 5978dbd..0000000 --- a/controllers/insuranceController.js +++ /dev/null @@ -1,539 +0,0 @@ -const Insurance = require("../models/insurance"); -const { addBaseUrlToImages } = require("../utils/imageHelper"); -const writeAuditLog = require("../audit/writeAuditLog"); -const diffObject = require("../audit/diffObject"); -const AUDIT_ACTIONS = require("../constants/auditAction"); - -// API để lấy insurance data (cho frontend) -exports.api = async (req, res) => { - try { - const language = req.query.lang || "en"; - - // Sử dụng getDefault để đảm bảo luôn có data - const insurance = await Insurance.getDefault(language); - - // Trả về data với cấu trúc mới - const insuranceData = insurance.toObject(); - - // Sử dụng helper để thêm base URL vào đường dẫn ảnh - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(insuranceData, baseUrl); - - // Trả về trực tiếp hero, page, content (không wrap trong object) - res.json({ - hero: processedData.hero, - page: processedData.page, - content: processedData.content, - }); - } catch (error) { - console.error("API Error:", error); - res.status(500).json({ - success: false, - error: "Error loading insurance data", - message: error.message, - }); - } -}; - -// API để lấy toàn bộ insurance data (cho admin) -exports.getInsuranceData = async (req, res) => { - try { - const language = req.query.lang || "en"; - const insurance = await Insurance.findOne({ - name: "default", - language: language, - }); - - if (!insurance) { - return res.status(404).json({ - success: false, - error: "Insurance data not found", - }); - } - - const insuranceData = insurance.toObject(); - - // Thêm base URL vào đường dẫn ảnh - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(insuranceData, baseUrl); - - res.json({ - success: true, - data: processedData, - }); - } catch (error) { - console.error("Error getting insurance data:", error); - res.status(500).json({ - success: false, - error: "Error loading insurance data", - }); - } -}; - -// API để lấy data theo ngôn ngữ -exports.getByLanguage = async (req, res) => { - try { - const language = req.params.lang || "en"; - - const insurance = await Insurance.findOne({ - name: "default", - language: language, - }); - - if (!insurance) { - return res.status(404).json({ - success: false, - error: "Insurance data not found", - }); - } - - const insuranceData = insurance.toObject(); - - // Thêm base URL vào đường dẫn ảnh - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(insuranceData, baseUrl); - - res.json({ - success: true, - data: { - hero: processedData.hero, - page: processedData.page, - content: processedData.content, - }, - }); - } catch (error) { - console.error("Error getting insurance by language:", error); - res.status(500).json({ - success: false, - error: "Error loading insurance data", - }); - } -}; - -// Render admin view -exports.index = async (req, res) => { - try { - // Luôn đảm bảo có default data - const insurance = await Insurance.getDefault("en"); - const data = insurance.toObject(); - - const frontendUrl = process.env.FRONTEND_URL || "http://localhost:3000"; - - res.render("admin/insurance/index", { - title: "Insurance Management", - layout: "layouts/main", - data, - frontendUrl, - currentPath: req.path, - user: req.session.user, - }); - } catch (error) { - console.error("Error in insurance index:", error); - req.flash("error_msg", "An error occurred while loading the page"); - res.redirect("/admin/dashboard"); - } -}; - -// Seed data từ JSON file (cấu trúc mới) -exports.seed = async (req, res) => { - try { - const fs = require("fs").promises; - const path = require("path"); - - // Đọc file JSON - const jsonPath = path.join(__dirname, "../data/insurance.json"); - const jsonData = JSON.parse(await fs.readFile(jsonPath, "utf8")); - - console.log("Seeding insurance from JSON..."); - - // Migrate từ cấu trúc cũ sang mới - const insurance = await Insurance.migrateFromJson(jsonData, "en"); - - res.json({ - success: true, - message: "Insurance data seeded successfully", - data: { - id: insurance._id, - hero: insurance.hero, - page: insurance.page, - content: insurance.content, - }, - }); - } catch (error) { - console.error("Error seeding insurance:", error); - res.status(500).json({ - success: false, - error: error.message || "Error seeding insurance data", - }); - } -}; - -// API preview cho admin (tạo HTML preview) -exports.preview = async (req, res) => { - try { - const { hero, page, content } = req.body; - - // Parse JSON strings - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - console.error("JSON parse error:", e); - return null; - } - } - return data; - }; - - const heroData = parseJson(hero) || {}; - const pageData = parseJson(page) || {}; - const contentData = parseJson(content) || {}; - - // Thêm base URL vào đường dẫn ảnh cho preview - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedHeroData = addBaseUrlToImages(heroData, baseUrl); - - // Render preview HTML - const html = ` - - - - - - ${pageData.title || "Insurance Preview"} - - - - - -
-

${heroData.title || "Insurance"}

-

${heroData.subtitle || ""}

-
- - - - - -
-
- ${renderContentItems(contentData.content || [])} -
-
- - - `; - - res.send(html); - } catch (error) { - console.error("Error generating preview:", error); - res.status(500).send("Error generating preview"); - } -}; - -// Helper function để render content items -function renderContentItems(contentItems) { - if (!Array.isArray(contentItems) || contentItems.length === 0) { - return "

No content available.

"; - } - - return contentItems - .map((item) => { - switch (item.type) { - case "header": - return `${item.text}`; - - case "paragraph": - return `

${item.text}

`; - - case "section": - return ` -
-

${item.title}

-

${item.content}

-
- `; - - case "list": - const listItems = (item.items || []) - .map((li) => `
  • ${li}
  • `) - .join(""); - return ``; - - case "note": - return `
    ${item.text}
    `; - - case "embed": - if (item.source === "youtube") { - return ` -
    - - ${item.caption ? `

    ${item.caption}

    ` : ""} -
    - `; - } - return ""; - - default: - return ""; - } - }) - .join(""); -} - -// API để tạo insurance mới (cho các ngôn ngữ khác) -exports.create = async (req, res) => { - try { - const { hero, page, content, language } = req.body; - - if (!language) { - return res.status(400).json({ - success: false, - error: "Language is required", - }); - } - - // Kiểm tra đã tồn tại chưa - const existing = await Insurance.findOne({ - name: "default", - language: language, - }); - if (existing) { - return res.status(400).json({ - success: false, - error: "Insurance already exists for this language", - }); - } - - // Parse JSON nếu cần - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - console.error("JSON parse error:", e); - return null; - } - } - return data; - }; - - const insurance = new Insurance({ - name: "default", - language: language, - hero: parseJson(hero) || {}, - page: parseJson(page) || {}, - content: parseJson(content) || {}, - version: "2.0.0", - isActive: true, - migratedFromOldStructure: false, - }); - - await insurance.save(); - - res.json({ - success: true, - message: "Insurance created successfully for language: " + language, - data: insurance, - }); - } catch (error) { - console.error("Error creating insurance:", error); - res.status(500).json({ - success: false, - error: error.message || "Error creating insurance", - }); - } -}; - -// Cập nhật dữ liệu insurance (CẬP NHẬT CẤU TRÚC MỚI) -exports.update = async (req, res) => { - try { - const { hero, page, content } = req.body; - - // Parse JSON strings - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - console.error("JSON parse error:", e); - return null; - } - } - return data; - }; - - // Parse all data với cấu trúc mới - const heroData = parseJson(hero) || {}; - const pageData = parseJson(page) || {}; - const contentData = parseJson(content) || {}; - - // Normalize embed blocks (convert YouTube watch URLs to /embed/ URLs) - function extractYouTubeId(url) { - const regex = - /(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([^"&?\/\s]{11})/; - const match = url.match(regex); - return match ? match[1] : null; - } - - if (contentData && Array.isArray(contentData.content)) { - contentData.content.forEach((item) => { - if (item.type === "embed" && item.source === "youtube") { - if (item.url && item.url.includes("watch?v=")) { - const videoId = extractYouTubeId(item.url); - if (videoId) { - item.url = `https://www.youtube.com/embed/${videoId}`; - item.videoId = videoId; - } - } - if (item.embed && item.embed.includes("watch?v=")) { - const videoId = extractYouTubeId(item.embed); - if (videoId) { - item.embed = `https://www.youtube.com/embed/${videoId}`; - item.videoId = videoId; - } - } - } - }); - } - - // Tìm hoặc tạo insurance - let insurance = await Insurance.findOne({ - name: "default", - language: "en", - }); - - // ✅ Capture BEFORE state - const beforeData = insurance - ? JSON.parse( - JSON.stringify(insurance.toObject ? insurance.toObject() : insurance), - ) - : {}; - - if (!insurance) { - insurance = new Insurance({ - name: "default", - language: "en", - hero: heroData, - page: pageData, - content: contentData, - version: "2.0.0", - isActive: true, - }); - } else { - insurance.hero = heroData; - insurance.page = pageData; - insurance.content = contentData; - insurance.version = "2.0.0"; - } - - await insurance.save(); - - // ✅ Capture AFTER state - const afterData = JSON.parse( - JSON.stringify(insurance.toObject ? insurance.toObject() : insurance), - ); - - // ✅ AUDIT LOGGING - Insurance Updated - const changes = diffObject(beforeData, afterData); - if (changes.length > 0) { - await writeAuditLog({ - model: "Insurance", - documentId: insurance._id, - action: AUDIT_ACTIONS.UPDATE_INSURANCE, - before: beforeData, - after: afterData, - changes, - req, - }); - } - - req.flash("success_msg", "Insurance updated successfully"); - res.redirect("/admin/insurance"); - } catch (err) { - console.error("Error updating insurance:", err); - req.flash("error_msg", err.message || "Error updating insurance"); - res.redirect("/admin/insurance"); - } -}; - -// API để xóa insurance (theo ngôn ngữ) -exports.delete = async (req, res) => { - try { - const language = req.params.lang; - - if (!language) { - return res.status(400).json({ - success: false, - error: "Language parameter is required", - }); - } - - // Không cho phép xóa tiếng Anh mặc định - if (language === "en") { - return res.status(400).json({ - success: false, - error: "Cannot delete default English insurance data", - }); - } - - const result = await Insurance.deleteOne({ - name: "default", - language: language, - }); - - if (result.deletedCount === 0) { - return res.status(404).json({ - success: false, - error: "Insurance not found for this language", - }); - } - - res.json({ - success: true, - message: "Insurance deleted successfully for language: " + language, - }); - } catch (error) { - console.error("Error deleting insurance:", error); - res.status(500).json({ - success: false, - error: error.message || "Error deleting insurance", - }); - } -}; diff --git a/controllers/safetyController.js b/controllers/safetyController.js deleted file mode 100644 index 1cf4315..0000000 --- a/controllers/safetyController.js +++ /dev/null @@ -1,197 +0,0 @@ -const Safety = require("../models/safety"); -const { addBaseUrlToImages } = require("../utils/imageHelper"); -const writeAuditLog = require("../audit/writeAuditLog"); -const diffObject = require("../audit/diffObject"); -const AUDIT_ACTIONS = require("../constants/auditAction"); - -// Lấy dữ liệu Safety từ MongoDB -const getSafetyData = async () => { - const safety = await Safety.findOne().sort({ updatedAt: -1 }); - if (!safety) { - return null; - } - return safety.toObject(); -}; - -// API endpoint cho frontend -exports.api = async (req, res) => { - try { - const safety = await getSafetyData(); - if (!safety) { - return res.status(404).json({ error: "Safety data not found" }); - } - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(safety, baseUrl); - res.json(processedData); - } catch (err) { - console.error("Safety API error:", err); - res.status(500).json({ error: "Error loading safety data" }); - } -}; - -// Hiển thị danh sách Safety cho admin -exports.index = async (req, res) => { - try { - const items = await Safety.find().sort({ updatedAt: -1 }).limit(10); - // Lấy bản ghi mới nhất hoặc object rỗng nếu chưa có dữ liệu - const latest = items && items.length > 0 ? items[0] : null; - const data = latest - ? latest.toObject - ? latest.toObject() - : latest - : { - hero: { title: "", banner: "" }, - approach: {}, - approachImgs: [], - approachStats: [], - approachFeatures: [], - approachCards: [], - philosophy: {}, - philosophyCards: [], - security: {}, - securityCards: [], - }; - res.render("admin/safety/index", { - layout: "layouts/main", - title: "Safety Management", - items, - data, - frontendUrl: - process.env.FRONTEND_URL || req.protocol + "://" + req.get("host"), - currentPath: req.path, - user: req.session.user, - }); - } catch (err) { - console.error(err); - req.flash("error_msg", "Error loading Safety data"); - res.redirect("/admin/dashboard"); - } -}; - -// Hiển thị form tạo mới Safety -exports.createForm = async (req, res) => { - try { - res.render("admin/safety/create", { - layout: "layouts/main", - title: "Create Safety", - currentPath: req.path, - user: req.session.user, - }); - } catch (err) { - console.error(err); - req.flash("error_msg", "Error loading create form"); - res.redirect("/admin/safety"); - } -}; - -// Tạo mới Safety -exports.create = async (req, res) => { - try { - const safetyData = req.body; // Tùy chỉnh parse nếu cần - const newSafety = new Safety(safetyData); - await newSafety.save(); - req.flash("success_msg", "Safety created successfully"); - res.redirect("/admin/safety"); - } catch (err) { - console.error("Create error:", err); - req.flash("error_msg", `Create error: ${err.message || "Unknown"}`); - res.redirect("/admin/safety/create"); - } -}; - -// Cập nhật Safety -exports.update = async (req, res) => { - try { - const { hero, approach, philosophy, security } = req.body; - - // Parse JSON strings - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - return null; - } - } - return data; - }; - - const heroData = parseJson(hero); - const approachData = parseJson(approach); - const philosophyData = parseJson(philosophy); - const securityData = parseJson(security); - - // Tìm hoặc tạo safety record - const items = await Safety.find().sort({ updatedAt: -1 }).limit(1); - let safety = items && items.length > 0 ? items[0] : null; - - // ✅ Capture BEFORE state - const beforeData = safety - ? JSON.parse(JSON.stringify(safety.toObject ? safety.toObject() : safety)) - : {}; - - if (!safety) { - // Tạo mới - safety = new Safety({ - hero: heroData || { title: "", banner: "" }, - approach: approachData || {}, - philosophy: philosophyData || {}, - security: securityData || {}, - }); - } else { - // Cập nhật - if (heroData) safety.hero = heroData; - if (approachData) safety.approach = approachData; - if (philosophyData) safety.philosophy = philosophyData; - if (securityData) safety.security = securityData; - } - - await safety.save(); - - // ✅ Capture AFTER state - const afterData = JSON.parse( - JSON.stringify(safety.toObject ? safety.toObject() : safety), - ); - - // ✅ AUDIT LOGGING - Safety Updated - const changes = diffObject(beforeData, afterData); - if (changes.length > 0) { - await writeAuditLog({ - model: "Safety", - documentId: safety._id, - action: AUDIT_ACTIONS.UPDATE_SAFETY, - before: beforeData, - after: afterData, - changes, - req, - }); - } - - req.flash("success_msg", "Safety updated successfully"); - res.redirect("/admin/safety"); - } catch (err) { - console.error("Update error:", err); - req.flash("error_msg", `Update error: ${err.message || "Unknown"}`); - res.redirect("/admin/safety"); - } -}; - -// Xóa Safety -exports.delete = async (req, res) => { - try { - const safety = await Safety.findById(req.params.id); - if (!safety) { - req.flash("error_msg", "Safety record not found"); - return res.redirect("/admin/safety"); - } - await Safety.findByIdAndDelete(req.params.id); - req.flash("success_msg", "Safety record deleted successfully"); - res.redirect("/admin/safety"); - } catch (err) { - console.error("Delete error:", err); - req.flash("error_msg", `Delete error: ${err.message || "Unknown"}`); - res.redirect("/admin/safety"); - } -}; diff --git a/controllers/socialLinkController.js b/controllers/socialLinkController.js deleted file mode 100644 index 4308cf3..0000000 --- a/controllers/socialLinkController.js +++ /dev/null @@ -1,321 +0,0 @@ -const Header = require("../models/header"); - -// Get all social links -exports.index = async (req, res) => { - try { - const header = await Header.findOne({ status: "active" }).sort({ order: 1 }); - - if (!header) { - return res.status(404).json({ - success: false, - message: "No active header found", - }); - } - - res.json({ - success: true, - data: header.top?.socialLinks || [], - }); - } catch (error) { - res.status(500).json({ - success: false, - message: error.message, - }); - } -}; - -// Get single social link by platform -exports.show = async (req, res) => { - try { - const { platform } = req.params; - const header = await Header.findOne({ status: "active" }).sort({ order: 1 }); - - if (!header) { - return res.status(404).json({ - success: false, - message: "No active header found", - }); - } - - const socialLink = header.top?.socialLinks?.find((link) => link.platform === platform); - - if (!socialLink) { - return res.status(404).json({ - success: false, - message: "Social link not found", - }); - } - - res.json({ - success: true, - data: socialLink, - }); - } catch (error) { - res.status(500).json({ - success: false, - message: error.message, - }); - } -}; - -// Create social link -exports.store = async (req, res) => { - try { - let { platform, url, icon } = req.body; - - // Convert platform to lowercase - platform = platform.toLowerCase().trim(); - url = url.trim(); - icon = icon ? icon.trim() : null; - - console.log("Creating social link:", { platform, url, icon }); - - // Validate required fields - if (!platform || !url) { - console.log("Validation failed: platform or url missing"); - return res.status(400).json({ - success: false, - message: "Platform and URL are required", - }); - } - - // Validate platform is in enum - const validPlatforms = ["linkedin", "twitter", "instagram", "youtube", "facebook"]; - if (!validPlatforms.includes(platform)) { - console.log("Invalid platform:", platform); - return res.status(400).json({ - success: false, - message: `Invalid platform. Must be one of: ${validPlatforms.join(", ")}`, - }); - } - - // Find header - let header = await Header.findOne({ status: "active" }).sort({ order: 1 }); - - if (!header) { - console.log("No active header found"); - return res.status(404).json({ - success: false, - message: "No active header found", - }); - } - - console.log("Found header:", header._id); - - // Check if platform already exists - const existingLink = header.top?.socialLinks?.find((link) => link.platform === platform); - - if (existingLink) { - console.log("Platform already exists:", platform); - return res.status(400).json({ - success: false, - message: `Social link for ${platform} already exists`, - }); - } - - // Add new social link - if (!header.top) { - header.top = {}; - } - if (!header.top.socialLinks) { - header.top.socialLinks = []; - } - - // Calculate next order number - const maxOrder = - header.top.socialLinks.length > 0 ? Math.max(...header.top.socialLinks.map((link) => link.order || 0)) : 0; - - header.top.socialLinks.push({ - platform, - url, - icon: icon || `fa-brands fa-${platform}`, - order: maxOrder + 1, - }); - - console.log("Saving header with new social link"); - await header.save(); - - console.log("Social link created successfully"); - res.status(201).json({ - success: true, - message: "Social link created successfully", - data: header.top.socialLinks[header.top.socialLinks.length - 1], - }); - } catch (error) { - console.error("Error creating social link:", error); - res.status(400).json({ - success: false, - message: error.message, - }); - } -}; - -// Update social link -exports.update = async (req, res) => { - try { - let { platform } = req.params; - let { url, icon } = req.body; - - // Convert to lowercase - platform = platform.toLowerCase().trim(); - url = url.trim(); - icon = icon ? icon.trim() : null; - - // Validate required fields - if (!url) { - return res.status(400).json({ - success: false, - message: "URL is required", - }); - } - - // Find header - const header = await Header.findOne({ status: "active" }).sort({ order: 1 }); - - if (!header) { - return res.status(404).json({ - success: false, - message: "No active header found", - }); - } - - // Find and update social link - const socialLink = header.top?.socialLinks?.find((link) => link.platform === platform); - - if (!socialLink) { - return res.status(404).json({ - success: false, - message: "Social link not found", - }); - } - - socialLink.url = url; - if (icon) { - socialLink.icon = icon; - } - - await header.save(); - - res.json({ - success: true, - message: "Social link updated successfully", - data: socialLink, - }); - } catch (error) { - res.status(400).json({ - success: false, - message: error.message, - }); - } -}; - -// Delete social link -exports.destroy = async (req, res) => { - try { - let { platform } = req.params; - - // Convert to lowercase - platform = platform.toLowerCase().trim(); - - console.log("Deleting social link:", platform); - - // Find header - const header = await Header.findOne({ status: "active" }).sort({ order: 1 }); - - if (!header) { - console.log("No active header found"); - return res.status(404).json({ - success: false, - message: "No active header found", - }); - } - - // Find and remove social link - const index = header.top?.socialLinks?.findIndex((link) => link.platform === platform); - - if (index === -1 || index === undefined) { - console.log("Social link not found:", platform); - return res.status(404).json({ - success: false, - message: "Social link not found", - }); - } - - const deletedLink = header.top.socialLinks.splice(index, 1); - - console.log("Saving header after delete"); - await header.save(); - - console.log("Social link deleted successfully"); - res.json({ - success: true, - message: "Social link deleted successfully", - data: deletedLink[0], - }); - } catch (error) { - console.error("Error deleting social link:", error); - res.status(500).json({ - success: false, - message: error.message, - }); - } -}; - -// Bulk update social links (used for reordering and batch updates) -exports.reorder = async (req, res) => { - try { - const { socialLinks } = req.body; - - if (!Array.isArray(socialLinks)) { - return res.status(400).json({ - success: false, - message: "socialLinks must be an array", - }); - } - - // Find header - let header = await Header.findOne({ status: "active" }).sort({ order: 1 }); - - if (!header) { - return res.status(404).json({ - success: false, - message: "No active header found", - }); - } - - // Validate all social links - for (const link of socialLinks) { - if (!link.platform || !link.url) { - return res.status(400).json({ - success: false, - message: "Each social link must have platform and url", - }); - } - } - - // Update social links with order field - if (!header.top) { - header.top = {}; - } - - header.top.socialLinks = socialLinks.map((link, index) => ({ - platform: link.platform, - url: link.url, - icon: link.icon || `fa-brands fa-${link.platform}`, - order: link.order || index + 1, // Use provided order or calculate from index - })); - - await header.save(); - - res.json({ - success: true, - message: "Social links updated successfully", - data: header.top.socialLinks, - }); - } catch (error) { - res.status(400).json({ - success: false, - message: error.message, - }); - } -}; diff --git a/controllers/termsController.js b/controllers/termsController.js deleted file mode 100644 index e170790..0000000 --- a/controllers/termsController.js +++ /dev/null @@ -1,574 +0,0 @@ -// controllers/termsController.js -const Terms = require("../models/terms"); -const { addBaseUrlToImages } = require("../utils/imageHelper"); // Import helper -const writeAuditLog = require("../audit/writeAuditLog"); -const diffObject = require("../audit/diffObject"); -const AUDIT_ACTIONS = require("../constants/auditAction"); - -// API để lấy terms data (cho frontend) -exports.api = async (req, res) => { - try { - const language = req.query.lang || "en"; - - // Sử dụng getDefault để đảm bảo luôn có data - const terms = await Terms.getDefault(language); - - // Trả về data với cấu trúc mới - const termsData = terms.toObject(); - - // Sử dụng helper để thêm base URL vào đường dẫn ảnh - // Truyền baseUrl từ request hoặc từ environment - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(termsData, baseUrl); - - res.json({ - success: true, - data: { - hero: processedData.hero, - page: processedData.page, - content: processedData.content, - }, - }); - } catch (error) { - console.error("API Error:", error); - res.status(500).json({ - success: false, - error: "Error loading terms data", - message: error.message, - }); - } -}; - -// API để lấy toàn bộ terms data (cho admin) -exports.getTermsData = async (req, res) => { - try { - const language = req.query.lang || "en"; - const terms = await Terms.findOne({ name: "default", language: language }); - - if (!terms) { - return res.status(404).json({ - success: false, - error: "Terms data not found", - }); - } - - const termsData = terms.toObject(); - - // Thêm base URL vào đường dẫn ảnh - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(termsData, baseUrl); - - res.json({ - success: true, - data: processedData, - }); - } catch (error) { - console.error("Error getting terms data:", error); - res.status(500).json({ - success: false, - error: "Error loading terms data", - }); - } -}; - -// API để lấy data theo ngôn ngữ -exports.getByLanguage = async (req, res) => { - try { - const language = req.params.lang || "en"; - - const terms = await Terms.findOne({ name: "default", language: language }); - - if (!terms) { - return res.status(404).json({ - success: false, - error: "Terms data not found for language: " + language, - }); - } - - const termsData = terms.toObject(); - - // Thêm base URL vào đường dẫn ảnh - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(termsData, baseUrl); - - res.json({ - success: true, - data: { - hero: processedData.hero, - page: processedData.page, - content: processedData.content, - }, - }); - } catch (error) { - console.error("Error getting terms by language:", error); - res.status(500).json({ - success: false, - error: "Error loading terms data", - }); - } -}; - -// Render admin view (không cần thêm baseUrl ở đây vì dùng trong CMS) -exports.index = async (req, res) => { - try { - // Luôn đảm bảo có default data - const terms = await Terms.getDefault("en"); - const data = terms.toObject(); - - const frontendUrl = process.env.FRONTEND_URL || "http://localhost:3000"; - - res.render("admin/terms/index", { - title: "Terms & Conditions Management", - layout: "layouts/main", - data, // Không cần addBaseUrlToImages cho admin view - frontendUrl, - currentPath: req.path, - user: req.session.user, - }); - } catch (error) { - console.error("Error in terms index:", error); - req.flash("error_msg", "An error occurred while loading the page"); - res.redirect("/admin/dashboard"); - } -}; - -// Cập nhật dữ liệu terms (CẬP NHẬT CẤU TRÚC MỚI) -exports.update = async (req, res) => { - try { - const { hero, page, content } = req.body; - - // Parse JSON strings - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - console.error("JSON parse error:", e); - return null; - } - } - return data; - }; - - // Parse all data với cấu trúc mới - const heroData = parseJson(hero) || {}; - const pageData = parseJson(page) || {}; - const contentData = parseJson(content) || {}; - - // Normalize embed blocks (convert YouTube watch URLs to /embed/ URLs) - function extractYouTubeId(url) { - if (!url || typeof url !== "string") return null; - // common YouTube URL patterns - const m = url.match( - /(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:watch\?v=|embed\/|v\/|shorts\/))([A-Za-z0-9_-]{11})/, - ); - return m ? m[1] : null; - } - - // Trong exports.update - if (contentData && Array.isArray(contentData.content)) { - contentData.content = contentData.content.map((item) => { - if (item && item.type === "embed") { - let embedUrl = item.embed || item.url || item.source || ""; - - // Luôn chuyển đổi sang embed URL nếu là watch URL - if (embedUrl.includes("youtube.com/watch")) { - const videoId = extractYouTubeId(embedUrl); - if (videoId) { - item.embed = `https://www.youtube.com/embed/${videoId}`; - item.videoId = videoId; - } - } - // Đảm bảo có videoId - else if (embedUrl && !item.videoId) { - const videoId = extractYouTubeId(embedUrl); - if (videoId) { - item.videoId = videoId; - } - } - } - return item; - }); - } - - // Tìm hoặc tạo terms - let terms = await Terms.findOne({ name: "default", language: "en" }); - - // ✅ Capture BEFORE state - const beforeData = terms - ? JSON.parse(JSON.stringify(terms.toObject ? terms.toObject() : terms)) - : {}; - - if (!terms) { - // Tạo mới với cấu trúc mới - terms = new Terms({ - name: "default", - language: "en", - hero: heroData, - page: pageData, - content: contentData, - version: "2.0.0", - isActive: true, - migratedFromOldStructure: false, - }); - } else { - // Update existing với cấu trúc mới - terms.hero = heroData; - terms.page = pageData; - terms.content = contentData; - terms.version = "2.0.0"; - terms.migratedFromOldStructure = false; - terms.updatedAt = new Date(); - } - - await terms.save(); - - // ✅ Capture AFTER state - const afterData = JSON.parse( - JSON.stringify(terms.toObject ? terms.toObject() : terms), - ); - - // ✅ AUDIT LOGGING - Terms Updated - const changes = diffObject(beforeData, afterData); - if (changes.length > 0) { - await writeAuditLog({ - model: "Terms", - documentId: terms._id, - action: AUDIT_ACTIONS.UPDATE_TERMS, - before: beforeData, - after: afterData, - changes, - req, - }); - } - - req.flash("success_msg", "Terms & Conditions updated successfully"); - res.redirect("/admin/terms-conditions"); - } catch (err) { - console.error("Error updating terms:", err); - req.flash("error_msg", err.message || "Error updating terms"); - res.redirect("/admin/terms-conditions"); - } -}; - -// Seed data từ JSON file mới (cấu trúc mới) -exports.seed = async (req, res) => { - try { - const fs = require("fs").promises; - const path = require("path"); - - // Đọc file JSON - const jsonPath = path.join(__dirname, "../data/terms-conditions.json"); - const jsonData = JSON.parse(await fs.readFile(jsonPath, "utf8")); - - console.log("Seeding from JSON..."); - console.log("JSON structure keys:", Object.keys(jsonData)); - - // Kiểm tra cấu trúc JSON - let terms; - if (jsonData.hero && jsonData.page && jsonData.content) { - // Cấu trúc mới - console.log("Using new structure (hero, page, content)"); - terms = await Terms.migrateFromNewJson(jsonData, "en"); - } else if (jsonData.hero && jsonData.termsHeader && jsonData.sections) { - // Cấu trúc cũ - console.log("Using old structure, converting to new..."); - terms = await Terms.migrateFromJson(jsonData, "en"); - } else { - throw new Error("Unknown JSON structure"); - } - - res.json({ - success: true, - message: "Terms data seeded successfully", - data: { - id: terms._id, - hero: terms.hero, - page: terms.page, - content: terms.content, - }, - }); - } catch (error) { - console.error("Error seeding terms:", error); - res.status(500).json({ - success: false, - error: error.message || "Error seeding terms data", - }); - } -}; - -// API preview cho admin (tạo HTML preview) -exports.preview = async (req, res) => { - try { - const { hero, page, content } = req.body; - - // Parse JSON strings - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - console.error("JSON parse error:", e); - return null; - } - } - return data; - }; - - const heroData = parseJson(hero) || {}; - const pageData = parseJson(page) || {}; - const contentData = parseJson(content) || {}; - - // Thêm base URL vào đường dẫn ảnh cho preview - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedHeroData = addBaseUrlToImages(heroData, baseUrl); - - // Render preview HTML - const html = ` - - - - - - ${pageData.title || "Terms & Conditions Preview"} - - - - - -
    -

    ${heroData.title || "Terms & Conditions"}

    -
    - - - - - -
    -
    - ${renderContentItems(contentData.content || [])} -
    -
    - - - `; - - res.send(html); - } catch (error) { - console.error("Error generating preview:", error); - res.status(500).send("Error generating preview"); - } -}; - -// Helper function để render content items -function renderContentItems(contentItems) { - if (!Array.isArray(contentItems) || contentItems.length === 0) { - return "

    No content available.

    "; - } - - return contentItems - .map((item) => { - switch (item.type) { - case "paragraph": - return `

    ${item.text || ""}

    `; - - case "section": - let html = `
    `; - html += `

    ${item.title || ""}

    `; - html += `

    ${item.content || ""}

    `; - - if (item.subsections && item.subsections.length > 0) { - item.subsections.forEach((subsection) => { - if (subsection.type === "cancellation_table") { - html += `

    ${subsection.title || ""}

    `; - if (subsection.items && subsection.items.length > 0) { - html += ""; - } - } else if (subsection.type === "cancellation_section") { - html += `

    ${subsection.title || ""}

    `; - if (subsection.items && subsection.items.length > 0) { - html += ""; - } - } else if (subsection.type === "note") { - html += `
    ${subsection.text || ""}
    `; - } - }); - } - - html += `
    `; - return html; - - case "note": - return `
    ${item.text || ""}
    `; - case "embed": - // Support several embed shapes: { embed }, { url }, { source }, { videoId } - const embedSrc = - item.embed || - item.url || - item.source || - (item.videoId - ? `https://www.youtube.com/embed/${item.videoId}` - : ""); - if (!embedSrc) return `
    Invalid embed
    `; - return `
    -
    - -
    -
    `; - - default: - return `
    Unknown content type: ${item.type}
    `; - } - }) - .join(""); -} - -// API để tạo terms mới (cho các ngôn ngữ khác) -exports.create = async (req, res) => { - try { - const { hero, page, content, language } = req.body; - - if (!language) { - return res.status(400).json({ - success: false, - error: "Language is required", - }); - } - - // Kiểm tra đã tồn tại chưa - const existing = await Terms.findOne({ - name: "default", - language: language, - }); - if (existing) { - return res.status(400).json({ - success: false, - error: "Terms already exists for language: " + language, - }); - } - - // Parse JSON nếu cần - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - console.error("JSON parse error:", e); - return null; - } - } - return data; - }; - - const terms = new Terms({ - name: "default", - language: language, - hero: parseJson(hero) || {}, - page: parseJson(page) || {}, - content: parseJson(content) || {}, - version: "2.0.0", - isActive: true, - migratedFromOldStructure: false, - }); - - await terms.save(); - - res.json({ - success: true, - message: "Terms created successfully for language: " + language, - data: terms, - }); - } catch (error) { - console.error("Error creating terms:", error); - res.status(500).json({ - success: false, - error: error.message || "Error creating terms", - }); - } -}; - -// API để xóa terms (theo ngôn ngữ) -exports.delete = async (req, res) => { - try { - const language = req.params.lang; - - if (!language) { - return res.status(400).json({ - success: false, - error: "Language is required", - }); - } - - // Không cho phép xóa tiếng Anh mặc định - if (language === "en") { - return res.status(400).json({ - success: false, - error: "Cannot delete default English terms", - }); - } - - const result = await Terms.deleteOne({ - name: "default", - language: language, - }); - - if (result.deletedCount === 0) { - return res.status(404).json({ - success: false, - error: "Terms not found for language: " + language, - }); - } - - res.json({ - success: true, - message: "Terms deleted successfully for language: " + language, - }); - } catch (error) { - console.error("Error deleting terms:", error); - res.status(500).json({ - success: false, - error: error.message || "Error deleting terms", - }); - } -}; diff --git a/controllers/testimonialController.js b/controllers/testimonialController.js deleted file mode 100644 index cb447cc..0000000 --- a/controllers/testimonialController.js +++ /dev/null @@ -1,138 +0,0 @@ -const { addBaseUrlToImages } = require("../utils/imageHelper"); -const Home = require("../models/home"); -const writeAuditLog = require("../audit/writeAuditLog"); -const diffObject = require("../audit/diffObject"); -const AUDIT_ACTIONS = require("../constants/auditAction"); - -// Get testimonial data from Home model -const getTestimonialData = async () => { - const home = await Home.findOne().sort({ updatedAt: -1 }); - if (!home || !home.testimonials) { - return null; - } - return home.testimonials.toObject - ? home.testimonials.toObject() - : home.testimonials; -}; - -// API to get testimonial data -exports.api = async (req, res) => { - try { - const testimonial = await getTestimonialData(); - if (!testimonial) { - return res.status(404).json({ error: "Testimonial data not found" }); - } - const baseUrl = - process.env.BACKEND_URL || `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(testimonial, baseUrl); - res.json(processedData); - } catch (err) { - console.error("API Error:", err); - res.status(500).json({ error: "Error loading testimonial data" }); - } -}; - -// Render admin view -exports.index = async (req, res) => { - try { - const data = (await getTestimonialData()) || { - heading: "Student Reviews & Testimonials", - subheading: "What Our Students Say", - videoUrl: "", - videoThumbnail: "", - items: [], - }; - - const frontendUrl = process.env.FRONTEND_URL; - - res.render("admin/home/testimonial/index", { - title: "Testimonials Management", - layout: "layouts/main", - data, - frontendUrl, - currentPath: req.path, - user: req.session.user, - }); - } catch (error) { - console.error("Error in testimonial index:", error); - req.flash("error_msg", "An error occurred while loading the page"); - res.redirect("/admin/dashboard"); - } -}; - -// Cập nhật dữ liệu testimonial (chỉ update phần testimonials của Home) -exports.update = async (req, res) => { - try { - const { heading, subheading, videoUrl, videoThumbnail, items } = req.body; - - // Parse JSON strings nếu cần - const parseJson = (data) => { - if (!data) return null; - if (typeof data === "string") { - try { - return JSON.parse(data); - } catch (e) { - return null; - } - } - return data; - }; - - const itemsData = parseJson(items); - - // Tìm hoặc tạo Home document - let home = await Home.findOne().sort({ updatedAt: -1 }); - - if (!home) { - home = new Home({}); - } - - // ✅ Capture BEFORE state - const beforeData = home.testimonials - ? JSON.parse( - JSON.stringify( - home.testimonials.toObject - ? home.testimonials.toObject() - : home.testimonials, - ), - ) - : {}; - - const updatedTestimonialData = { - heading: heading || "Student Reviews & Testimonials", - subheading: subheading || "What Our Students Say", - videoUrl: videoUrl || "", - videoThumbnail: videoThumbnail || "", - items: itemsData || [], - }; - - // Cập nhật chỉ phần testimonials - home.testimonials = updatedTestimonialData; - - await home.save(); - - // ✅ Capture AFTER state - const afterData = JSON.parse(JSON.stringify(updatedTestimonialData)); - - // ✅ AUDIT LOGGING - Testimonial Updated - const changes = diffObject(beforeData, afterData); - if (changes.length > 0) { - await writeAuditLog({ - model: "Home", - documentId: home._id, - action: AUDIT_ACTIONS.UPDATE_TESTIMONIAL, - before: beforeData, - after: afterData, - changes, - req, - }); - } - - req.flash("success_msg", "Testimonials updated successfully"); - res.redirect("/admin/home/testimonials"); - } catch (err) { - console.error("Error updating testimonials:", err); - req.flash("error_msg", err.message || "Error updating testimonials"); - res.redirect("/admin/home/testimonials"); - } -}; diff --git a/controllers/videoGalleryController.js b/controllers/videoGalleryController.js deleted file mode 100644 index c18297a..0000000 --- a/controllers/videoGalleryController.js +++ /dev/null @@ -1,119 +0,0 @@ -const { addBaseUrlToImages } = require("../utils/imageHelper"); -const Home = require("../models/home"); -const writeAuditLog = require("../audit/writeAuditLog"); -const diffObject = require("../audit/diffObject"); -const AUDIT_ACTIONS = require("../constants/auditAction"); - -// Get videoGallery data from Home model -const getVideoGalleryData = async () => { - const home = await Home.findOne().sort({ updatedAt: -1 }); - if (!home || !home.videoGallery) { - return null; - } - return home.videoGallery.toObject - ? home.videoGallery.toObject() - : home.videoGallery; -}; - -// API to get videoGallery data -exports.api = async (req, res) => { - try { - const videoGallery = await getVideoGalleryData(); - if (!videoGallery) { - return res.status(404).json({ error: "Video Gallery data not found" }); - } - const baseUrl = - process.env.BACKEND_URL ?? `${req.protocol}://${req.get("host")}`; - const processedData = addBaseUrlToImages(videoGallery, baseUrl); - res.json(processedData); - } catch (err) { - console.error("API Error:", err); - res.status(500).json({ error: "Error loading video gallery data" }); - } -}; - -// Render admin view -exports.index = async (req, res) => { - try { - const data = (await getVideoGalleryData()) || { - heading: "", - videoUrl: "", - thumbnail: "", - }; - - const frontendUrl = process.env.FRONTEND_URL; - - res.render("admin/home/videoGallery/index", { - title: "Video Gallery Management", - layout: "layouts/main", - data, - frontendUrl, - currentPath: req.path, - user: req.session.user, - }); - } catch (error) { - console.error("Error in videoGallery index:", error); - req.flash("error_msg", "An error occurred while loading the page"); - res.redirect("/admin/dashboard"); - } -}; - -// Cập nhật dữ liệu videoGallery -exports.update = async (req, res) => { - try { - const { heading, videoUrl, thumbnail } = req.body; - - // Tìm hoặc tạo Home document - let home = await Home.findOne().sort({ updatedAt: -1 }); - - if (!home) { - home = new Home({}); - } - - // ✅ Capture BEFORE state - const beforeData = home.videoGallery - ? JSON.parse( - JSON.stringify( - home.videoGallery.toObject - ? home.videoGallery.toObject() - : home.videoGallery, - ), - ) - : {}; - - const updatedVideoGalleryData = { - heading: heading || "", - videoUrl: videoUrl || "", - thumbnail: thumbnail || "", - }; - - // Cập nhật chỉ phần videoGallery - home.videoGallery = updatedVideoGalleryData; - - await home.save(); - - // ✅ Capture AFTER state - const afterData = JSON.parse(JSON.stringify(updatedVideoGalleryData)); - - // ✅ AUDIT LOGGING - Video Gallery Updated - const changes = diffObject(beforeData, afterData); - if (changes.length > 0) { - await writeAuditLog({ - model: "Home", - documentId: home._id, - action: AUDIT_ACTIONS.UPDATE_VIDEO_GALLERY, - before: beforeData, - after: afterData, - changes, - req, - }); - } - - req.flash("success_msg", "Video Gallery updated successfully"); - res.redirect("/admin/home/video-gallery"); - } catch (err) { - console.error("Error updating video gallery:", err); - req.flash("error_msg", err.message || "Error updating video gallery"); - res.redirect("/admin/home/video-gallery"); - } -}; diff --git a/data/Countries.json b/data/Countries.json deleted file mode 100644 index 638f898..0000000 --- a/data/Countries.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "countries": [ - { - "id": 1, - "name": "France", - "icon": "assets/img/home-2/visa/03.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 2, - "name": "UK", - "icon": "assets/img/home-2/visa/11.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 3, - "name": "Canada", - "icon": "assets/img/home-2/visa/02.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 4, - "name": "Germany", - "icon": "assets/img/home-2/visa/12.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 5, - "name": "Spain", - "icon": "assets/img/home-2/visa/13.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 6, - "name": "South Korea", - "icon": "assets/img/home-2/visa/14.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 7, - "name": "Japan", - "icon": "assets/img/home-2/visa/15.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 8, - "name": "Croatia", - "icon": "assets/img/home-2/visa/16.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 9, - "name": "England", - "icon": "assets/img/home-2/visa/17.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 10, - "name": "Indonesia", - "icon": "assets/img/home-2/visa/18.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - } - ] -} diff --git a/data/Countrydetails.json b/data/Countrydetails.json deleted file mode 100644 index 3943e29..0000000 --- a/data/Countrydetails.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "countryDetails": { - "id": 1, - "name": "United States of America", - "title": "COUNTRY USA", - "mainImage": "assets/img/inner-page/country-details/details-1.jpg", - "description": "The United States is one of the most popular destinations for international students and immigrants, offering world-class universities, diverse cultural experiences, and countless career opportunities. With top-ranked education systems, advanced research facilities, and a welcoming environment for skilled professionals, the USA is ideal for those seeking growth and global exposure.", - "additionalInfo": "Our consultancy provides complete guidance for study visas, work permits, and permanent residency pathways tailored to your goals.", - "tagline": "Over the last 35 Years we made an impact that is strong & we have long way to go.", - "visaTypes": [ - { - "category": "Tourist & Work", - "items": [ - { - "title": "Tourist Visa", - "description": "Broad term that can refer to various aspects of interconnectedness" - }, - { - "title": "Work Permit", - "description": "Broad term that can refer to various aspects of interconnectedness" - } - ] - }, - { - "category": "Student & Family", - "items": [ - { - "title": "Student", - "description": "Broad term that can refer to various aspects of interconnectedness" - }, - { - "title": "Tourist Visa", - "description": "Broad term that can refer to various aspects of interconnectedness" - } - ] - } - ], - "visaProcess": [ - { - "number": "01", - "title": "Consultation & Eligibility Check", - "description": "Our experts review your profile and visa requirements." - }, - { - "number": "02", - "title": "Application Preparation", - "description": "We help with document collection, form filling, and statement drafting." - }, - { - "number": "03", - "title": "Submission", - "description": "Visa application is submitted online with required fees." - }, - { - "number": "04", - "title": "Interview Guidance", - "description": "Get training and mock sessions for embassy interview." - }, - { - "number": "05", - "title": "Approval & Travel", - "description": "Once approved, we provide travel and pre-departure guidance." - } - ], - "images": [ - "assets/img/inner-page/country-details/details-2.jpg", - "assets/img/inner-page/country-details/details-3.png" - ], - "visaCategories": [ - "Student Visa (F1, M1, J1)", - "Work Visa (H1B, L1)", - "Tourist Visa (B1/B2)", - "Family/Spouse Visa (K1, IR1, F2A)", - "Green Card / Immigrant Visa" - ], - "serviceOptions": [ - { - "number": "01", - "title": "Consultation & Eligibility Check", - "description": "Our experts review your profile and visa requirements." - }, - { - "number": "02", - "title": "Application Preparation", - "description": "We help with document collection, form filling, and statement drafting." - }, - { - "number": "03", - "title": "Submission", - "description": "Visa application is submitted online with required fees." - }, - { - "number": "04", - "title": "Interview Guidance", - "description": "Get training and mock sessions for embassy interview." - }, - { - "number": "05", - "title": "Approval & Travel", - "description": "Once approved, we provide travel and pre-departure guidance." - } - ] - }, - "relatedCountries": [ - { - "id": 1, - "name": "Canada", - "icon": "assets/img/inner-page/country-details/01.png" - }, - { - "id": 2, - "name": "USA", - "icon": "assets/img/inner-page/country-details/02.png" - }, - { - "id": 3, - "name": "USA", - "icon": "assets/img/inner-page/country-details/03.png" - }, - { - "id": 4, - "name": "Saint Helena", - "icon": "assets/img/inner-page/country-details/05.png" - }, - { - "id": 5, - "name": "Iran", - "icon": "assets/img/inner-page/country-details/06.png" - }, - { - "id": 6, - "name": "Spain", - "icon": "assets/img/inner-page/country-details/07.png" - }, - { - "id": 7, - "name": "Japan", - "icon": "assets/img/inner-page/country-details/08.png" - } - ], - "contactInfo": { - "phone": "+009 438 222 9540", - "email": "infor@xridergamil.com", - "location": "Toronto, Montreal, City 2026" - } -} diff --git a/data/activities.json b/data/activities.json deleted file mode 100644 index 08cb503..0000000 --- a/data/activities.json +++ /dev/null @@ -1,6762 +0,0 @@ -{ - "hero":[ - { - "titleActivities": "Activities", - "titleBooking": "Booking", - - "bannerImageActivities": "/uploads/banner/b9.jpg", - "bannerImageBooking": "/uploads/banner/b13.jpg" - - } - ], - "filter": [ - { - "label": "Activities", - "value": "activities", - "items": [ - { - "value": "adventure", - "label": "Adventure, Sports & Creative" - }, - { - "value": "arts-crafts", - "label": "Arts & Crafts" - }, - { - "value": "climbing", - "label": "Climbing" - }, - { - "value": "dancing", - "label": "Dancing" - }, - { - "value": "diving", - "label": "Diving" - }, - { - "value": "englisch-camps", - "label": "Englischcamps" - }, - { - "value": "englisch-toefl", - "label": "Englisch TOEFL©" - }, - { - "value": "fishing", - "label": "Fishing" - }, - { - "value": "german-camps", - "label": "German Camps" - }, - { - "value": "horseback", - "label": "Horseback Riding" - }, - { - "value": "husky", - "label": "Husky Camp" - }, - { - "value": "icit", - "label": "International Counsellor in Training (ICIT)" - }, - { - "value": "lifeguarding", - "label": "Lifeguarding" - }, - { - "value": "language", - "label": "Language" - }, - { - "value": "leadership", - "label": "Leadership" - }, - { - "value": "multi-water", - "label": "Multi Water Adventure" - }, - { - "value": "sailing", - "label": "Sailing" - }, - { - "value": "skating", - "label": "Skating" - }, - { - "value": "soccer", - "label": "Soccer" - }, - { - "value": "space", - "label": "Space Exploration" - }, - { - "value": "spanish", - "label": "Spanishcourse" - }, - { - "value": "survival", - "label": "Survival" - }, - { - "value": "swimming", - "label": "Swimming" - }, - { - "value": "tennis", - "label": "Tennis" - }, - { - "value": "windsurf", - "label": "Windsurfing" - } - ] - }, - { - "label": "Holiday Season", - "value": "holidays", - "items": [ - { - "value": "autumn", - "label": "Autumn" - }, - { - "value": "spring", - "label": "Spring" - }, - { - "value": "summer", - "label": "Summer" - } - ] - }, - { - "label": "Location", - "value": "locations", - "items": [ - { - "value": "philippines", - "label": "Philippines" - }, - { - "value": "vietnam", - "label": "Vietnam" - }, - { - "value": "portugal", - "label": "Portugal" - }, - { - "value": "china", - "label": "China" - }, - { - "value": "thailand", - "label": "Thailand" - }, - { - "value": "malaysia", - "label": "Malaysia" - }, - { - "value": "holiday", - "label": "Holiday" - } - ] - } - ], - "camps": [ - { - "name": "Adventure, Sports & Creative", - "price": 395, - "priceText": "from 395 USD", - "season": [ - "spring", - "summer", - "autumn" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "thailand" - ], - "image": "/uploads/activity/bg-ad1.png", - "link": "/adventure-sports-creative", - "program": "adventure", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Adventure, Sports & Creative Camps in Germany", - "bgImage": "/uploads/activity/bg-ad1.png" - }, - "basicInfo": { - "location": "Germany", - "ageRange": "7 - 17 years\nSeparated by age groups", - "accommodationType": "Tent & Cabin/House", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nGER & EN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Volcanoes and Waterfalls", - "rating": 4.9, - "reviews": 25, - "location": "Hilo, Hawaii", - "price": 1500, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1542259009477-d625272157b7?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Exploring the Fjords", - "rating": 4.9, - "reviews": 28, - "location": "Bergen, Norway", - "price": 1900, - "originalPrice": 2200, - "image": "https://images.unsplash.com/photo-1530789253388-582c481c54b0?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Safari in Style", - "rating": 4.9, - "reviews": 35, - "location": "Okavango Delta, Botswana", - "price": 4500, - "originalPrice": 5000, - "image": "https://images.unsplash.com/photo-1516426122078-c23e76319801?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Cherry Blossom Tour", - "rating": 4.8, - "reviews": 22, - "location": "Kyoto, Japan", - "price": 1200, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1522383225653-ed111181a951?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Camp tent" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Archery" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Cabin" - } - ], - "overlayInfo": { - "location": "Thailand", - "season": "Spring, Summer, Autumn", - "languages": "GER & EN " - } - }, - "eventSchedule": { - "startDate": "06/15/2024", - "duration": "7 Days 6 Nights", - "tickets": "$48/50" - }, - "sections": { - "overview": { - "intro": "Nestled in the lush landscapes of Madridejos, Cebu Island, the Exploration Camp offers a vibrant mix of adventure, nature, and community. Campers wake up to tropical surroundings, enjoy engaging activities, and explore the beauty of the island while building friendships and unforgettable memories.", - "mainText": "The Exploration Camp offers young explorers aged 12 to 18 a chance to experience nature, culture and people against the picturesque scenes of the Philippines. Aiming to inspire, challenge and nurture a love of learning in each and every child, the camp combines outdoor adventures, engaging creative projects and incredible group efforts – all within a spirited international setting.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, open to all levels", - "Outdoor, sports, creative & evening activities", - "Cool, impactful excursions and trips", - "2 English-speaking camp environment", - "Dorm accommodation with full board", - "24/7 care from GGCamp teamers", - "Digital Detox: phones only during siesta", - "Arrival/departure shuttle service" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Your stay at Exploration Camp in Cebu City comes with more than just a place to spend your summer—it's a complete experience designed for learning, adventure, connection, and community. From the moment you arrive, every detail is taken care of. Explore the stunning island of Cebu, just a short walk from a quaint fishing village with traditional farms and charming timber framed homes. Enjoy activities across our expansive campgrounds, from kayaking and bouncing on water trampolines to building rafts and conquering the high ropes course. With fellow campers from around the world, you can improve your English skills, forge lasting friendships, and immerse yourself in the authentic spirit of camp.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Camp Life – Like a Little Village!", - "quote": "", - "mainHeading": "", - "introText": [ - "At our international summer camp in Lower Saxony, you can choose between our cozy tent village or the comfy Adventure Lodges – it all depends on your sense of adventure!" - ], - "outroText": [ - "🏕️ Tent Village: Spacious tents for 6–7 campers with wooden floors and a loft area – the ultimate outdoor experience under the stars.", - "🏡 Adventure Lodges: Comfortable cabins with 4–8 beds, storage shelves, and seating areas. (Please note: staying in a lodge comes at an extra charge.)" - ], - "details": [ - "Restroom and shower facilities are also separated by gender and always close by.", - "Best of all: Our teamers live right next door – they're available for you 24/7!", - "Good to know:", - "For tents, bring your own sleeping bag and sleeping mat.", - "For lodges, bring a fitted sheet and either a sleeping bag or bedding set (available for rent if needed).", - "You can choose your preferred accommodation during the booking process – secure your spot now!" - ], - "principles": [ - "Junior (7–12 years)", - " Senior (12–15 years)", - " Senior Plus (15–17 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "A Full Day of Adventure, Sports & Creativity!", - "introText": [ - "\"Adventure, Sports & Creativity\" is the base program at our Lüneburger Heide Camp – no extra booking needed! If you don't choose an additional profile like Horseback Riding or Survival, this is your go-to for an action-packed and varied camp experience." - ], - "quote": "", - "outroText": [ - "Learn English – Without Even Trying!", - "Our international team brings the real camp spirit – full of energy, adventure, and fun. And the best part? English becomes a natural part of the day – whether you're playing sports, doing creative projects, or chilling by the campfire.", - "Friendships That Last!", - "Shared adventures create real connections – and many campers already plan their return together for next summer. These are friendships that stick!" - ], - "mainHeading": "Every morning, you get to pick a new exciting activity – whatever you're in the mood for!", - "principles": [ - "Outdoor Action & Adventure: High ropes course, archery, raft building, or survival training – challenge your limits!", - "Sports & Movement: Soccer, volleyball, basketball, or splashing around in the lake – get moving and have fun!", - " Creativity & Chill: Crafts, painting, reading, or baking – perfect for relaxing moments at camp." - ], - "footerText": [ - "There's no room for boredom here – every day brings fresh adventures, new sports challenges, and creative highlights just for you!" - ] - }, - "meals": { - "title": "Meal On Site", - "description": "Indulge in three scrumptious meals each day—fresh, diverse, and absolutely delightful! Whether you have a vegetarian, gluten-free, or lactose-free diet, simply inform us in advance, and we'll take care of your needs.", - "items": [ - { - "title": "Breakfast", - "desc": "Start your day with a hearty buffet of fresh bread, seasonal fruits, muesli, milk , juice, and tea—perfect fuel for all your exciting activities" - }, - { - "title": "Lunch", - "desc": "Feast on warm, delicious dishes made entirely from scratch, featuring seafood, meats, vegetables, and rice to satisfy every appetite and keep you energized" - }, - { - "title": "Dinner", - "desc": "Savor authentic local flavors with carefully prepared meals, served fresh to delight your taste buds after a full day of adventure and exploration." - }, - { - "title": "Snacks and Refreshments", - "desc": "Stay energized with fresh fruits, afternoon treats, and plenty of water throughout the day, keeping you ready for every experience" - } - ], - "footer": "And the highlight? Everything is made from scratch—no instant meals here! Enjoy authentic dishes that not only taste incredible but also provide you with a true taste of local cuisine to fuel your adventures!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Cared for Around the Clock!", - "quote": "", - "mainHeading": "", - "introText": [ - "Our experienced and passionate teamers are there for you 24/7 – full of energy, positivity, and always ready to listen. Whether it's a quick question or a bigger worry, you can count on them anytime.", - "The best part?", - "Our team comes from all over the world and brings that true international camp spirit – that's why we speak both English and German!" - ], - "footerText": [ - "This way, you'll naturally pick up both languages – while playing sports, chatting by the campfire, or just hanging out.", - "Our supervision ratio is between 1:7 and 1:10, so you're always in good hands with our all-around care package!" - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Whether it's everyday bumps and scrapes to unexpected emergencies, our International Insurance Package gives your child all-round protection. Covering accidents, health issues, and other unforeseen events, it ensures peace of mind for parents while keeping children safe and supported throughout their entire journey.", - "package": { - "title": "Camp Insurance Package", - "desc": "With this, every risk is going to be covered, and participants will stay completely safe the entire time they are in camp.", - "items": [ - "Accidents and medical visits are covered", - "Protection against property damage", - "Price: Depending on the camping trip selected" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Our promise ensures a full refund for cancellations due to illness or unforeseen events before camp starts, giving you peace of mind and flexible plans.", - "items": [ - "Valid until one week before camp", - "Covers cancellations for illness, accidents, or exams", - "Refund applies to the full program cost" - ] - } - } - } - } - }, - { - "name": "Arts & Crafts", - "price": 500, - "priceText": "from 500 USD", - "season": [ - "spring", - "summer", - "autumn" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "vietnam" - ], - "image": "/uploads/banner/b6.jpg", - "link": "/arts-crafts", - "program": "arts-crafts", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Arts & Crafts Camp in Vietnam", - "bgImage": "/uploads/banner/b6.jpg" - }, - "basicInfo": { - "location": "Vietnam", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Dormitory & Bungalow", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & VN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Ceramic Workshop Retreat", - "rating": 4.8, - "reviews": 32, - "location": "Hanoi, Vietnam", - "price": 1200, - "originalPrice": 1500, - "image": "https://images.unsplash.com/photo-1565193566173-7a0ee3dbe261?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Traditional Art Experience", - "rating": 4.9, - "reviews": 28, - "location": "Hoi An, Vietnam", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1460661419201-fd4cecdf8a8b?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Painting & Nature Tour", - "rating": 4.7, - "reviews": 24, - "location": "Da Lat, Vietnam", - "price": 1100, - "originalPrice": 1400, - "image": "https://images.unsplash.com/photo-1513364776144-60967b0f800f?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Textile Art Discovery", - "rating": 4.8, - "reviews": 19, - "location": "Sapa, Vietnam", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Arts studio" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Crafts workshop" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Creative space" - } - ], - "overlayInfo": { - "location": "Vietnam", - "season": "Spring, Summer, Autumn", - "languages": "EN & VN" - } - }, - "eventSchedule": { - "startDate": "07/01/2024", - "duration": "10 Days 9 Nights", - "tickets": "$50/55" - }, - "sections": { - "overview": { - "intro": "Immerse yourself in the vibrant world of arts and crafts at our creative camp in Vietnam. Surrounded by stunning landscapes and rich cultural heritage, campers explore various artistic mediums while developing their creative skills and self-expression.", - "mainText": "The Arts & Crafts Camp invites young artists aged 12 to 18 to explore their creativity in the beautiful setting of Vietnam. From traditional Vietnamese crafts to modern art techniques, campers discover new ways to express themselves while learning about local culture and making lasting friendships.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels welcome", - "Painting, sculpture, ceramics & textile arts", - "Traditional Vietnamese craft workshops", - "Professional artist mentorship", - "Comfortable dormitory accommodation", - "24/7 care from experienced teamers", - "Art exhibition at camp conclusion", - "All materials and supplies included" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Arts & Crafts Camp is nestled in the picturesque countryside of Vietnam, offering the perfect blend of natural beauty and cultural richness. The serene environment provides endless inspiration for artistic creation. Campers can explore local villages, visit traditional artisan workshops, and draw inspiration from the stunning Vietnamese landscapes that have inspired artists for centuries.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Creative Living Spaces", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in our comfortable dormitories or charming bungalows, designed to inspire creativity and foster community among fellow artists." - ], - "outroText": [ - "🎨 Art Dormitory: Spacious rooms for 4-6 campers with dedicated art corners and natural lighting for sketching.", - "🏡 Creative Bungalows: Private cabins for 2-4 campers with verandas overlooking gardens. (Additional charge applies)" - ], - "details": [ - "Clean restroom and shower facilities nearby, separated by gender.", - "Teamers are always available for support, 24/7!", - "Good to know:", - "Bring your sketchbook and favorite art supplies.", - "All major materials are provided by the camp.", - "Choose your accommodation during booking!" - ], - "principles": [ - "Junior Artists (12–14 years)", - "Teen Creators (14–16 years)", - "Senior Artists (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Unleash Your Creative Potential!", - "introText": [ - "Our Arts & Crafts program offers a comprehensive creative experience, combining traditional techniques with modern artistic expression in a supportive and inspiring environment." - ], - "quote": "", - "outroText": [ - "Learn from Professional Artists!", - "Our team includes experienced artists and craftspeople who share their passion and expertise with campers.", - "Create Your Portfolio!", - "Throughout the camp, you'll build a collection of artwork to take home and showcase at our final exhibition." - ], - "mainHeading": "Each day brings new creative adventures and artistic discoveries!", - "principles": [ - "Visual Arts: Painting, drawing, watercolors, and mixed media – explore various techniques!", - "Handicrafts: Ceramics, pottery, jewelry making, and textile arts – create beautiful handmade pieces!", - "Cultural Arts: Learn traditional Vietnamese crafts and art forms – connect with local heritage!" - ], - "footerText": [ - "Every day offers fresh inspiration, new techniques to master, and opportunities to express your unique artistic vision!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy delicious Vietnamese cuisine prepared fresh daily. We accommodate all dietary requirements – just let us know in advance, and our kitchen team will take care of everything.", - "items": [ - { - "title": "Breakfast", - "desc": "Start your creative day with a nutritious buffet featuring Vietnamese and international options, fresh fruits, and energizing beverages." - }, - { - "title": "Lunch", - "desc": "Refuel with authentic Vietnamese dishes, including pho, spring rolls, and rice dishes prepared with fresh local ingredients." - }, - { - "title": "Dinner", - "desc": "End your day with a satisfying meal featuring a variety of Vietnamese specialties and international favorites." - }, - { - "title": "Snacks and Refreshments", - "desc": "Stay energized with fresh fruits, Vietnamese treats, and plenty of water throughout your creative sessions." - } - ], - "footer": "All meals are prepared fresh using local ingredients, giving you an authentic taste of Vietnamese cuisine while fueling your creative adventures!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Expert Artists & Caring Mentors", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team consists of professional artists, craft specialists, and experienced camp counselors who are passionate about nurturing young creative talents.", - "Every instructor brings expertise in their artistic field, combined with a love for teaching and mentoring young artists." - ], - "footerText": [ - "With a camper-to-staff ratio of 1:6, every participant receives personalized attention and guidance.", - "Our bilingual team ensures clear communication and a welcoming environment for all campers." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Your child's safety and wellbeing are our top priorities. Our comprehensive insurance package covers all activities and provides peace of mind for parents throughout the camp duration.", - "package": { - "title": "Camp Insurance Package", - "desc": "Complete coverage for all camp activities, ensuring participants are protected throughout their creative journey.", - "items": [ - "Full accident and medical coverage", - "Protection for art supplies and personal belongings", - "Price varies based on camp duration selected" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy with full refund for qualifying circumstances, giving you peace of mind when booking.", - "items": [ - "Valid until one week before camp start", - "Covers illness, family emergencies, and unforeseen events", - "Full refund of program fees" - ] - } - } - } - } - }, - { - "name": "Climbing", - "price": 515, - "priceText": "from 515 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "philippines" - ], - "image": "/uploads/banner/b1.jpg", - "link": "/climbing", - "program": "climbing", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Climbing Camp in Philippines", - "bgImage": "/uploads/banner/b1.jpg" - }, - "basicInfo": { - "location": "Philippines", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Mountain Lodge & Cabin", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & FIL" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Rock Climbing Adventure", - "rating": 4.9, - "reviews": 45, - "location": "Cebu, Philippines", - "price": 1600, - "originalPrice": 1900, - "image": "https://images.unsplash.com/photo-1522163182402-834f871fd851?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Mountain Peak Challenge", - "rating": 4.8, - "reviews": 38, - "location": "Palawan, Philippines", - "price": 1800, - "originalPrice": 2100, - "image": "https://images.unsplash.com/photo-1564769662533-4f00a87b4056?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Bouldering Basics", - "rating": 4.7, - "reviews": 29, - "location": "Baguio, Philippines", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1601024445121-e5b82f020549?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Cliff Expedition", - "rating": 4.9, - "reviews": 52, - "location": "El Nido, Philippines", - "price": 2000, - "originalPrice": 2400, - "image": "https://images.unsplash.com/photo-1508138221679-760a23a2285b?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Climbing wall" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Rock face" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Mountain view" - } - ], - "overlayInfo": { - "location": "Philippines", - "season": "Summer", - "languages": "EN & FIL" - } - }, - "eventSchedule": { - "startDate": "06/20/2024", - "duration": "8 Days 7 Nights", - "tickets": "$52/55" - }, - "sections": { - "overview": { - "intro": "Challenge yourself at our Climbing Camp in the stunning Philippines! With world-class climbing routes and breathtaking limestone cliffs, campers develop strength, technique, and confidence while exploring some of Asia's most spectacular climbing destinations.", - "mainText": "The Climbing Camp offers young adventurers aged 12 to 18 an unforgettable experience in the Philippines' premier climbing locations. From beginner bouldering to advanced rope techniques, our certified instructors guide campers through progressive skill-building in a safe and encouraging environment.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels from beginner to advanced", - "Indoor and outdoor climbing training", - "Certified climbing instructors", - "Top-quality climbing equipment provided", - "Comfortable lodge accommodation", - "24/7 supervision and care", - "Skill certification upon completion", - "Island exploration excursions" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Climbing Camp is located in the heart of the Philippines' most spectacular climbing region. The dramatic limestone formations and tropical scenery create an unforgettable backdrop for your climbing adventure. Between climbs, explore pristine beaches, crystal-clear waters, and lush tropical forests that make this region a paradise for outdoor enthusiasts.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Rest & Recharge After Your Climbs", - "quote": "", - "mainHeading": "", - "introText": [ - "After challenging climbs, relax in our comfortable mountain lodges or cozy cabins, designed for climbers to rest and prepare for the next adventure." - ], - "outroText": [ - "🏔️ Mountain Lodge: Shared rooms for 4-6 climbers with gear storage and drying areas for equipment.", - "🏡 Climber Cabins: Private cabins for 2-4 campers with stunning mountain views. (Additional charge applies)" - ], - "details": [ - "Modern restroom and shower facilities with hot water.", - "Equipment storage and maintenance area available.", - "Experienced staff on-site 24/7!", - "Good to know:", - "All climbing gear is provided – just bring comfortable activewear.", - "Personal climbing shoes available for rental or bring your own.", - "Secure your preferred accommodation during booking!" - ], - "principles": [ - "Junior Climbers (12–14 years)", - "Teen Climbers (14–16 years)", - "Advanced Climbers (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Reach New Heights Every Day!", - "introText": [ - "Our comprehensive climbing program takes you from fundamental techniques to advanced skills, with certified instructors guiding your progress every step of the way." - ], - "quote": "", - "outroText": [ - "Safety First, Always!", - "Every session begins with safety briefings and equipment checks. Our instructors maintain strict safety protocols while keeping the fun alive.", - "Build Lifelong Skills!", - "The confidence, problem-solving, and perseverance you develop through climbing will serve you well beyond the walls." - ], - "mainHeading": "Progressive skill development tailored to your level!", - "principles": [ - "Fundamentals: Knots, belaying, climbing techniques, and safety protocols – build your foundation!", - "Technical Skills: Lead climbing, multi-pitch routes, and outdoor climbing transitions – level up!", - "Adventure Climbing: Real rock experiences on natural formations – apply your skills in nature!" - ], - "footerText": [ - "Each day brings new challenges, new achievements, and the thrill of conquering heights you never thought possible!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your climbing adventures with nutritious, energy-packed meals. Our kitchen understands the nutritional needs of active climbers and prepares balanced meals to keep you performing at your best.", - "items": [ - { - "title": "Breakfast", - "desc": "High-protein breakfast options including eggs, local breads, tropical fruits, and energy-boosting smoothies to start your climbing day." - }, - { - "title": "Lunch", - "desc": "Hearty Filipino cuisine with grilled meats, fresh vegetables, and rice dishes to refuel after morning climbs." - }, - { - "title": "Dinner", - "desc": "Satisfying dinners featuring local seafood, barbecue, and traditional Filipino favorites to recover and recharge." - }, - { - "title": "Snacks and Refreshments", - "desc": "Energy bars, fresh fruits, electrolyte drinks, and healthy snacks available throughout your climbing sessions." - } - ], - "footer": "All meals are designed to support your active lifestyle, with options for various dietary requirements. Let us know your needs in advance!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Certified Instructors & Safety Experts", - "quote": "", - "mainHeading": "", - "introText": [ - "Our climbing team consists of internationally certified instructors with years of experience in both competitive and recreational climbing.", - "Every instructor holds valid certifications and maintains current first aid and rescue qualifications." - ], - "footerText": [ - "With a camper-to-instructor ratio of 1:4 during climbing activities, every participant receives personalized attention and coaching.", - "Safety is our absolute priority – our team conducts regular equipment inspections and maintains emergency response protocols." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Climbing involves inherent risks, which is why we provide comprehensive insurance coverage for all participants. Our insurance package is specifically designed for adventure sports and climbing activities.", - "package": { - "title": "Adventure Sports Insurance", - "desc": "Specialized coverage for climbing activities, ensuring complete protection during all camp sessions.", - "items": [ - "Full coverage for climbing-related accidents", - "Equipment damage protection", - "Emergency evacuation coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation options for unforeseen circumstances, with full refund eligibility under qualifying conditions.", - "items": [ - "Valid until one week before camp start", - "Covers medical emergencies and unforeseen events", - "Full program fee refund available" - ] - } - } - } - } - }, - { - "name": "Dancing", - "price": 520, - "priceText": "from 520 USD", - "season": [ - "summer", - "autumn" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "malaysia" - ], - "image": "/uploads/banner/b4.jpg", - "link": "/dancing", - "program": "dancing", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Dancing Camp in Malaysia", - "bgImage": "/uploads/banner/b4.jpg" - }, - "basicInfo": { - "location": "Malaysia", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Dance Studio Resort", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & MY" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Hip Hop Intensive", - "rating": 4.9, - "reviews": 42, - "location": "Kuala Lumpur, Malaysia", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1547153760-18fc86324498?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Contemporary Dance Workshop", - "rating": 4.8, - "reviews": 35, - "location": "Penang, Malaysia", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1508700929628-666bc8bd84ea?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Street Dance Festival", - "rating": 4.7, - "reviews": 28, - "location": "Johor Bahru, Malaysia", - "price": 1200, - "originalPrice": 1500, - "image": "https://images.unsplash.com/photo-1524594152303-9fd13543fe6e?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Traditional Dance Experience", - "rating": 4.8, - "reviews": 31, - "location": "Malacca, Malaysia", - "price": 1100, - "originalPrice": 1400, - "image": "https://images.unsplash.com/photo-1504609813442-a8924e83f76e?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Dance studio" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Performance" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Practice session" - } - ], - "overlayInfo": { - "location": "Malaysia", - "season": "Summer, Autumn", - "languages": "EN & MY" - } - }, - "eventSchedule": { - "startDate": "07/10/2024", - "duration": "10 Days 9 Nights", - "tickets": "$52/58" - }, - "sections": { - "overview": { - "intro": "Express yourself through movement at our Dancing Camp in Malaysia! From contemporary to hip-hop, traditional to modern styles, campers explore diverse dance forms in state-of-the-art studios while developing technique, artistry, and confidence.", - "mainText": "The Dancing Camp brings together young dancers aged 12 to 18 for an immersive dance experience in vibrant Malaysia. With professional choreographers from around the world, campers learn multiple dance styles, collaborate on group performances, and discover their unique artistic voice through movement.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all experience levels welcome", - "Multiple dance styles: contemporary, hip-hop, jazz & more", - "Professional choreographers and instructors", - "Air-conditioned dance studios with mirrors", - "Resort-style accommodation", - "24/7 supervision and support", - "End-of-camp showcase performance", - "Video recording of your performances" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Dancing Camp is located in a modern resort facility in Malaysia, featuring professional-grade dance studios and beautiful surroundings. The campus includes multiple air-conditioned studios with sprung floors, full-length mirrors, and professional sound systems. Between sessions, enjoy the resort's amenities including pools, gardens, and recreational areas.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Comfort for Dancers", - "quote": "", - "mainHeading": "", - "introText": [ - "Rest and recover in our comfortable resort accommodations, designed with dancers' needs in mind – close to studios and featuring all the amenities you need." - ], - "outroText": [ - "💃 Dancer Dorms: Shared rooms for 4-6 dancers with en-suite bathrooms and stretching space.", - "🌟 Premium Suites: Private rooms for 2 campers with additional amenities. (Additional charge applies)" - ], - "details": [ - "All rooms are air-conditioned with comfortable beds.", - "Stretching areas and recovery spaces available.", - "Staff available around the clock!", - "Good to know:", - "Bring comfortable dance wear and appropriate shoes for different styles.", - "Laundry facilities available for dance clothes.", - "Select your preferred room during the booking process!" - ], - "principles": [ - "Junior Dancers (12–14 years)", - "Teen Performers (14–16 years)", - "Advanced Dancers (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Dance Your Heart Out!", - "introText": [ - "Our comprehensive dance program offers training in multiple styles, choreography workshops, and performance opportunities, all guided by professional dancers and choreographers." - ], - "quote": "", - "outroText": [ - "Learn from the Best!", - "Our instructors include professional dancers, choreographers, and performers with experience on international stages.", - "Perform with Confidence!", - "The camp culminates in a spectacular showcase where you'll perform choreography you've learned and created." - ], - "mainHeading": "Explore diverse dance styles and find your groove!", - "principles": [ - "Contemporary & Jazz: Fluid movements, emotional expression, and technical foundations – expand your artistry!", - "Hip-Hop & Street: Urban styles, grooves, and freestyle – bring the energy!", - "Choreography & Creation: Learn to create your own pieces and collaborate with others!" - ], - "footerText": [ - "Every day brings new choreography, new challenges, and new opportunities to grow as a dancer and performer!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your dancing with nutritious, dancer-friendly meals prepared fresh daily. Our menu is designed to support high-energy activities while being delicious and satisfying.", - "items": [ - { - "title": "Breakfast", - "desc": "Energy-boosting breakfast with options including fresh fruits, whole grains, proteins, and refreshing beverages." - }, - { - "title": "Lunch", - "desc": "Balanced Malaysian and international cuisine with lean proteins, vegetables, and complex carbohydrates." - }, - { - "title": "Dinner", - "desc": "Delicious evening meals featuring a variety of Asian and Western dishes to refuel after a day of dancing." - }, - { - "title": "Snacks and Refreshments", - "desc": "Healthy snacks, fresh fruits, and hydrating drinks available between dance sessions." - } - ], - "footer": "All meals cater to dancers' nutritional needs, with vegetarian, halal, and other dietary options available upon request!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Professional Dancers & Caring Mentors", - "quote": "", - "mainHeading": "", - "introText": [ - "Our dance team includes professional choreographers, experienced dance instructors, and dedicated camp counselors who create a supportive and inspiring environment.", - "Instructors bring diverse backgrounds in contemporary, hip-hop, jazz, and traditional dance forms." - ], - "footerText": [ - "With a camper-to-instructor ratio of 1:8, dancers receive personalized attention and feedback to improve their skills.", - "Our bilingual staff ensures clear instruction and a welcoming atmosphere for all participants." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Dance involves physical activity, and we ensure all participants are fully covered. Our comprehensive insurance protects campers during all dance activities and camp events.", - "package": { - "title": "Dance Camp Insurance", - "desc": "Complete coverage for all dance-related activities, ensuring peace of mind for parents and protection for participants.", - "items": [ - "Medical coverage for dance-related injuries", - "Personal belongings protection", - "Coverage for all camp activities" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy with refund options for qualifying circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical issues and emergencies", - "Full refund of program fees available" - ] - } - } - } - } - }, - { - "name": "Diving", - "price": 1190, - "priceText": "from 1190 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "philippines" - ], - "image": "/uploads/banner/b2.jpg", - "link": "/diving", - "program": "diving", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Diving Camp in Philippines", - "bgImage": "/uploads/banner/b2.jpg" - }, - "basicInfo": { - "location": "Philippines", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Beach Resort & Dive Center", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & FIL" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Coral Reef Discovery", - "rating": 4.9, - "reviews": 56, - "location": "Cebu, Philippines", - "price": 2200, - "originalPrice": 2600, - "image": "https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Tropical Marine Adventure", - "rating": 4.9, - "reviews": 48, - "location": "Palawan, Philippines", - "price": 2400, - "originalPrice": 2800, - "image": "https://images.unsplash.com/photo-1559827260-dc66d52bef19?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Whale Shark Experience", - "rating": 5, - "reviews": 62, - "location": "Oslob, Philippines", - "price": 2600, - "originalPrice": 3000, - "image": "https://images.unsplash.com/photo-1560275619-4662e36fa65c?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Underwater Photography", - "rating": 4.8, - "reviews": 34, - "location": "Bohol, Philippines", - "price": 2100, - "originalPrice": 2500, - "image": "https://images.unsplash.com/photo-1546026423-cc4642628d2b?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Underwater scene" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Diving gear" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Beach resort" - } - ], - "overlayInfo": { - "location": "Philippines", - "season": "Summer", - "languages": "EN & FIL" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "12 Days 11 Nights", - "tickets": "$119/125" - }, - "sections": { - "overview": { - "intro": "Dive into adventure at our Diving Camp in the Philippines! Explore some of the world's most biodiverse marine environments, earn your diving certification, and discover the wonders of the underwater world in crystal-clear tropical waters.", - "mainText": "The Diving Camp offers young ocean enthusiasts aged 12 to 18 an extraordinary opportunity to learn scuba diving in the Philippines – consistently ranked among the world's top diving destinations. With PADI-certified instructors, campers progress from pool training to open water dives, exploring vibrant coral reefs and encountering incredible marine life.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, beginners to certified divers", - "PADI certification courses available", - "Certified dive instructors (1:4 ratio)", - "All diving equipment provided", - "Beachfront resort accommodation", - "24/7 supervision and safety protocols", - "Marine biology education sessions", - "Underwater photography introduction" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Diving Camp is situated on a pristine beach in the Philippines, with direct access to world-renowned dive sites. The Coral Triangle, where the Philippines is located, contains the highest concentration of marine species on Earth. Campers will explore colorful coral gardens, encounter tropical fish, sea turtles, and possibly whale sharks in the crystal-clear waters of this tropical paradise.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Beachfront Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay at our beautiful beachfront resort with direct access to the dive center. Fall asleep to the sound of waves and wake up ready for underwater adventures." - ], - "outroText": [ - "🏖️ Beach Bungalows: Shared rooms for 4-6 divers with ocean views and outdoor rinse stations for gear.", - "🌴 Premium Cottages: Private beachfront cottages for 2 campers with enhanced amenities. (Additional charge applies)" - ], - "details": [ - "All accommodations feature air conditioning and comfortable beds.", - "Dive equipment storage and rinse facilities provided.", - "Dive shop on-site for any needs!", - "Good to know:", - "Bring swimwear, reef-safe sunscreen, and a sense of adventure.", - "Personal dive equipment can be rented if needed.", - "Reserve your preferred bungalow during booking!" - ], - "principles": [ - "Junior Divers (12–14 years)", - "Teen Divers (14–16 years)", - "Advanced Divers (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Explore the Underwater World!", - "introText": [ - "Our comprehensive diving program follows PADI standards, taking campers from their first breath underwater to certified open water diver status, with opportunities for advanced training." - ], - "quote": "", - "outroText": [ - "Earn Your Certification!", - "Complete your PADI Open Water Diver certification during camp – a globally recognized credential that opens up the underwater world for life.", - "Conservation Matters!", - "Learn about marine conservation and coral reef protection as part of your diving education." - ], - "mainHeading": "From pool training to open water adventures!", - "principles": [ - "Pool Training: Master essential skills in confined water – buoyancy, breathing, safety procedures!", - "Open Water Dives: Experience the thrill of diving in the ocean among incredible marine life!", - "Specialty Sessions: Underwater photography, night diving introduction, and marine biology!" - ], - "footerText": [ - "Every dive brings new discoveries – from tiny nudibranchs to majestic sea turtles, the underwater world never stops amazing!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy fresh, delicious meals at our beachfront restaurant. Our menu features both local Filipino cuisine and international options, with an emphasis on fresh seafood and tropical fruits.", - "items": [ - { - "title": "Breakfast", - "desc": "Start your diving day with a hearty breakfast featuring fresh fruits, eggs, local breads, and energizing beverages." - }, - { - "title": "Lunch", - "desc": "Refuel after morning dives with grilled seafood, Filipino favorites, and refreshing tropical dishes." - }, - { - "title": "Dinner", - "desc": "End your day with a satisfying dinner featuring fresh catches, barbecue, and authentic island cuisine." - }, - { - "title": "Snacks and Refreshments", - "desc": "Stay hydrated with fresh coconuts, tropical juices, and healthy snacks throughout the day." - } - ], - "footer": "For diving, proper hydration and nutrition are essential. Our kitchen ensures you're fueled for every underwater adventure!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "PADI Professionals & Marine Experts", - "quote": "", - "mainHeading": "", - "introText": [ - "Our dive team consists of PADI-certified instructors and divemasters with extensive experience teaching young divers.", - "Safety is our top priority – all instructors maintain current certifications in dive instruction, first aid, and emergency oxygen provision." - ], - "footerText": [ - "With a strict 1:4 instructor-to-diver ratio during all dives, every camper receives personalized attention and guidance.", - "Our team includes marine biologists who add educational depth to every underwater experience." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Scuba diving requires specialized insurance coverage. Our comprehensive dive insurance package is included in your camp fee and provides world-class protection for all diving activities.", - "package": { - "title": "Dive Accident Insurance", - "desc": "Comprehensive coverage specifically designed for scuba diving activities, including emergency services.", - "items": [ - "Hyperbaric chamber treatment coverage", - "Emergency evacuation and medical transport", - "Dive equipment coverage" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for medical or unforeseen circumstances, including dive medical clearance issues.", - "items": [ - "Valid until one week before camp start", - "Covers medical clearance failures", - "Full program fee refund available" - ] - } - } - } - } - }, - { - "name": "Englisch TOEFL®", - "price": 1290, - "priceText": "from 1290 USD", - "season": [ - "spring", - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "malaysia" - ], - "image": "/uploads/banner/b1.jpg", - "link": "/englisch-toefl", - "program": "englisch-toefl", - "rating": 5, - "camp-detail": { - "hero": { - "title": "English TOEFL® Camp in Malaysia", - "bgImage": "/uploads/banner/b1.jpg" - }, - "basicInfo": { - "location": "Malaysia", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Language Campus & Dormitory", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "English Immersion" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "TOEFL Intensive Prep", - "rating": 4.9, - "reviews": 67, - "location": "Kuala Lumpur, Malaysia", - "price": 2100, - "originalPrice": 2500, - "image": "https://images.unsplash.com/photo-1523050854058-8df90110c9f1?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Academic English Bootcamp", - "rating": 4.8, - "reviews": 54, - "location": "Penang, Malaysia", - "price": 1900, - "originalPrice": 2300, - "image": "https://images.unsplash.com/photo-1434030216411-0b793f4b4173?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Speaking & Listening Focus", - "rating": 4.9, - "reviews": 42, - "location": "Langkawi, Malaysia", - "price": 1800, - "originalPrice": 2200, - "image": "https://images.unsplash.com/photo-1503676260728-1c00da094a0b?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Writing Excellence Program", - "rating": 4.7, - "reviews": 38, - "location": "Ipoh, Malaysia", - "price": 1700, - "originalPrice": 2000, - "image": "https://images.unsplash.com/photo-1456513080510-7bf3a84b82f8?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Classroom" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Study session" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Campus" - } - ], - "overlayInfo": { - "location": "Malaysia", - "season": "Spring, Summer", - "languages": "English" - } - }, - "eventSchedule": { - "startDate": "07/05/2024", - "duration": "14 Days 13 Nights", - "tickets": "$129/135" - }, - "sections": { - "overview": { - "intro": "Prepare for academic success at our English TOEFL® Camp in Malaysia! With intensive test preparation, English immersion, and engaging activities, campers boost their language skills while having fun in a supportive international environment.", - "mainText": "The English TOEFL® Camp offers students aged 12 to 18 comprehensive preparation for the TOEFL® examination while developing practical English communication skills. Our certified instructors combine rigorous academic training with engaging activities that make language learning enjoyable and effective.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all English levels welcome", - "Certified TOEFL® preparation instructors", - "Small class sizes (max 12 students)", - "Full-length practice tests included", - "Modern campus accommodation", - "24/7 English immersion environment", - "Score improvement guarantee", - "College counseling sessions available" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our English TOEFL® Camp is located on a modern language campus in Malaysia, designed specifically for intensive language learning. The campus features state-of-the-art classrooms, a well-stocked library, computer labs for practice tests, and comfortable common areas for student interaction. Malaysia's English-speaking environment provides additional immersion opportunities.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Study-Friendly Environment", - "quote": "", - "mainHeading": "", - "introText": [ - "Our campus dormitories are designed for focused study with quiet hours, comfortable study desks, and all the amenities students need for academic success." - ], - "outroText": [ - "📚 Student Dormitory: Shared rooms for 2-4 students with individual study desks and excellent lighting.", - "🎓 Premium Single Rooms: Private rooms for focused study. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning, WiFi, and comfortable beds.", - "Quiet study areas and library access available 24/7.", - "Academic support staff always available!", - "Good to know:", - "Bring your laptop or tablet for practice tests and homework.", - "All study materials are provided by the program.", - "Reserve your preferred room type during registration!" - ], - "principles": [ - "Intermediate Level (12–14 years)", - "Upper-Intermediate (14–16 years)", - "Advanced Preparation (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Comprehensive TOEFL® Preparation!", - "introText": [ - "Our intensive program covers all four TOEFL® sections – Reading, Listening, Speaking, and Writing – with proven strategies, extensive practice, and personalized feedback from certified instructors." - ], - "quote": "", - "outroText": [ - "Master Test Strategies!", - "Learn time management, question-type strategies, and scoring criteria directly from experienced TOEFL® preparation specialists.", - "Track Your Progress!", - "Regular diagnostic tests help identify areas for improvement, ensuring measurable score gains throughout the camp." - ], - "mainHeading": "Intensive preparation meets engaging learning!", - "principles": [ - "Morning Sessions: Intensive skill-building in reading, listening, speaking, and writing!", - "Afternoon Practice: Full-length section tests and targeted practice exercises!", - "Evening Activities: Fun English activities, conversation clubs, and cultural experiences!" - ], - "footerText": [ - "Every day brings you closer to your target score while building confidence in your English abilities!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Our campus cafeteria serves nutritious, brain-boosting meals designed to support intensive study. All meals are included, with plenty of healthy options to keep students energized and focused.", - "items": [ - { - "title": "Breakfast", - "desc": "Start your study day with a nutritious breakfast including proteins, whole grains, fresh fruits, and energizing beverages." - }, - { - "title": "Lunch", - "desc": "Refuel with balanced meals featuring Asian and Western options, plenty of vegetables, and brain-healthy foods." - }, - { - "title": "Dinner", - "desc": "Enjoy satisfying dinners with diverse menu options to reward your day of hard work and study." - }, - { - "title": "Study Snacks", - "desc": "Healthy snacks, fresh fruits, and beverages available during study sessions and breaks." - } - ], - "footer": "Good nutrition supports better learning! Our meals are designed to fuel academic success while satisfying diverse tastes." - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Expert Instructors & Academic Support", - "quote": "", - "mainHeading": "", - "introText": [ - "Our teaching team consists of certified TOEFL® preparation instructors with extensive experience helping students achieve their target scores.", - "Instructors hold advanced degrees in English education and TESOL, with years of experience in test preparation." - ], - "footerText": [ - "With a student-to-teacher ratio of 1:8, every participant receives personalized attention and individual feedback.", - "Academic counselors are available for college guidance and study planning support." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All participants are covered by our comprehensive camp insurance, ensuring peace of mind for parents while students focus on their academic goals.", - "package": { - "title": "Academic Camp Insurance", - "desc": "Full coverage for all camp activities, medical needs, and personal belongings during your stay.", - "items": [ - "Comprehensive medical coverage", - "Personal belongings protection", - "Study materials replacement coverage" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy for unforeseen circumstances, including academic conflicts.", - "items": [ - "Valid until one week before camp start", - "Covers medical and academic emergencies", - "Full program fee refund available" - ] - } - } - } - } - }, - { - "name": "Englischcamps", - "price": 530, - "priceText": "from 530 USD", - "season": [ - "spring", - "summer", - "autumn" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "philippines", - "thailand" - ], - "image": "/uploads/activity/b5.jpg", - "link": "/englischcamps", - "program": "englisch-camps", - "rating": 4, - "camp-detail": { - "hero": { - "title": "English Language Camp in Philippines & Thailand", - "bgImage": "/uploads/activity/b5.jpg" - }, - "basicInfo": { - "location": "Philippines & Thailand", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Campus & Resort", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "English Immersion" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "English Adventure Philippines", - "rating": 4.8, - "reviews": 48, - "location": "Cebu, Philippines", - "price": 1500, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1529156069898-49953e39b3ac?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Beach English Camp", - "rating": 4.9, - "reviews": 52, - "location": "Phuket, Thailand", - "price": 1600, - "originalPrice": 1900, - "image": "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Cultural English Exchange", - "rating": 4.7, - "reviews": 39, - "location": "Manila, Philippines", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1517486808906-6ca8b3f04846?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "English & Adventure Thailand", - "rating": 4.8, - "reviews": 45, - "location": "Chiang Mai, Thailand", - "price": 1550, - "originalPrice": 1850, - "image": "https://images.unsplash.com/photo-1528164344705-47542687000d?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Language class" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Group activity" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Cultural experience" - } - ], - "overlayInfo": { - "location": "Philippines & Thailand", - "season": "Spring, Summer, Autumn", - "languages": "English" - } - }, - "eventSchedule": { - "startDate": "06/15/2024", - "duration": "10 Days 9 Nights", - "tickets": "$53/58" - }, - "sections": { - "overview": { - "intro": "Immerse yourself in English at our dynamic language camps in the Philippines and Thailand! Combining classroom learning with real-world practice and exciting activities, campers rapidly improve their English skills while making international friends.", - "mainText": "The English Language Camp offers students aged 12 to 18 a complete immersion experience in English-speaking environments. Our unique approach combines structured lessons with adventure activities, cultural experiences, and constant opportunities to practice English in authentic situations.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all English levels welcome", - "Qualified native-speaking instructors", - "Full English immersion environment", - "Adventure activities in English", - "Comfortable camp accommodation", - "24/7 care and language support", - "Certificate of completion", - "Cultural exchange activities" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our English camps are located in beautiful tropical settings in the Philippines and Thailand. Both locations offer stunning natural environments perfect for language learning and adventure activities. The English-friendly environments in both countries provide excellent opportunities for practical language use beyond the classroom.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Comfortable & Social Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in comfortable shared accommodations designed to maximize English practice through social interaction with roommates from around the world." - ], - "outroText": [ - "🌍 International Dorms: Shared rooms with students from different countries – more chances to practice English!", - "🏠 Comfort Cabins: Semi-private rooms for 2-3 students. (Additional charge applies)" - ], - "details": [ - "All accommodations are clean, safe, and comfortable.", - "English-speaking environment 24/7!", - "Staff available around the clock!", - "Good to know:", - "Bring an open mind and willingness to practice English.", - "All levels are welcome – support is always available.", - "Choose your location preference during booking!" - ], - "principles": [ - "Starter (12–14 years)", - "Intermediate (14–16 years)", - "Advanced (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Learn English the Fun Way!", - "introText": [ - "Our program combines interactive classroom sessions with practical English use in real-life activities, making language learning engaging, effective, and fun." - ], - "quote": "", - "outroText": [ - "Practice Through Activities!", - "Every activity – from sports to crafts to excursions – is conducted in English, providing natural learning opportunities all day long.", - "Build Real Confidence!", - "By the end of camp, you'll have the confidence to communicate in English in any situation." - ], - "mainHeading": "English learning through total immersion!", - "principles": [ - "Morning Classes: Interactive grammar, vocabulary, speaking, and listening sessions!", - "Afternoon Activities: Sports, games, and adventures – all in English!", - "Evening Fun: Movies, campfires, talent shows, and social activities – English 24/7!" - ], - "footerText": [ - "Every moment is an opportunity to improve your English – and have amazing fun doing it!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy delicious meals featuring local and international cuisine. Mealtimes are also English practice times – our staff encourage conversation in English at all meals!", - "items": [ - { - "title": "Breakfast", - "desc": "Energizing breakfast with local and Western options to start your day of English adventures." - }, - { - "title": "Lunch", - "desc": "Delicious lunch featuring fresh, local ingredients prepared in various international styles." - }, - { - "title": "Dinner", - "desc": "Satisfying dinners with diverse options, enjoyed with your new international friends." - }, - { - "title": "Snacks and Refreshments", - "desc": "Fresh fruits, snacks, and drinks available throughout the day." - } - ], - "footer": "Mealtimes are social times! Practice your English while enjoying great food with friends from around the world." - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Native Speakers & Language Experts", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team includes native English-speaking instructors with TEFL/TESOL certifications and experience teaching young learners.", - "Activity leaders and counselors maintain the English-only environment while providing friendly support." - ], - "footerText": [ - "With a camper-to-staff ratio of 1:8, every student receives personal attention and language support.", - "Staff are trained to encourage English use in a supportive, fun way." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All campers are covered by comprehensive insurance throughout their stay, ensuring parents' peace of mind while students focus on learning and fun.", - "package": { - "title": "Language Camp Insurance", - "desc": "Full coverage for all camp activities and medical needs during your English adventure.", - "items": [ - "Comprehensive medical coverage", - "Personal belongings protection", - "All activities covered" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation options for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full refund of program fees" - ] - } - } - } - } - }, - { - "name": "Fishing", - "price": 580, - "priceText": "from 580 USD", - "season": [ - "spring", - "summer", - "autumn" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "vietnam" - ], - "image": "/uploads/activity/b6.jpg", - "link": "/fishing", - "program": "fishing", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Fishing Camp in Vietnam", - "bgImage": "/uploads/activity/b6.jpg" - }, - "basicInfo": { - "location": "Vietnam", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Lakeside Lodge & Cabin", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & VN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Lake Fishing Adventure", - "rating": 4.8, - "reviews": 34, - "location": "Da Lat, Vietnam", - "price": 1100, - "originalPrice": 1400, - "image": "https://images.unsplash.com/photo-1504309092620-4d0ec726efa4?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "River Fishing Experience", - "rating": 4.7, - "reviews": 28, - "location": "Mekong Delta, Vietnam", - "price": 1200, - "originalPrice": 1500, - "image": "https://images.unsplash.com/photo-1532015917327-c9ca18dfa9af?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Traditional Fishing Camp", - "rating": 4.9, - "reviews": 31, - "location": "Hoi An, Vietnam", - "price": 1150, - "originalPrice": 1450, - "image": "https://images.unsplash.com/photo-1516747773440-c28f1cf48b2c?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Fly Fishing Workshop", - "rating": 4.6, - "reviews": 22, - "location": "Sapa, Vietnam", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1535530992830-e25d07cfa780?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Lake scene" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Fishing" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Nature" - } - ], - "overlayInfo": { - "location": "Vietnam", - "season": "Spring, Summer, Autumn", - "languages": "EN & VN" - } - }, - "eventSchedule": { - "startDate": "06/20/2024", - "duration": "8 Days 7 Nights", - "tickets": "$58/62" - }, - "sections": { - "overview": { - "intro": "Experience the peaceful art of fishing at our camp in Vietnam! Surrounded by stunning natural landscapes, campers learn various fishing techniques while developing patience, respect for nature, and outdoor skills.", - "mainText": "The Fishing Camp welcomes young anglers aged 12 to 18 to discover the joys of fishing in Vietnam's beautiful lakes and rivers. From beginner lessons to advanced techniques, our experienced guides teach everything from casting to catch-and-release practices, all while fostering a deep appreciation for aquatic ecosystems.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all experience levels welcome", - "Expert fishing guides and instructors", - "All fishing equipment provided", - "Multiple fishing techniques taught", - "Lakeside accommodation", - "24/7 supervision and care", - "Ecology and conservation education", - "Nature exploration activities" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Fishing Camp is nestled beside a pristine lake in the highlands of Vietnam, offering perfect conditions for learning and enjoying fishing. The camp is surrounded by mountains, forests, and abundant wildlife. Between fishing sessions, explore hiking trails, observe local bird species, and enjoy the tranquility of nature.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Lakeside Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Rest in our comfortable lakeside lodges with views of the water. Wake up to misty mornings and the promise of great fishing!" - ], - "outroText": [ - "🎣 Angler's Lodge: Shared rooms for 4-6 campers with direct access to fishing spots.", - "🏡 Private Cabin: Lakefront cabins for 2-3 campers with premium views. (Additional charge applies)" - ], - "details": [ - "All accommodations include comfortable beds and storage for fishing gear.", - "Rod storage and tackle areas available.", - "Experienced staff on-site 24/7!", - "Good to know:", - "All fishing equipment is provided – just bring your enthusiasm!", - "Warm layers recommended for early morning fishing sessions.", - "Book your preferred accommodation during registration!" - ], - "principles": [ - "Junior Anglers (12–14 years)", - "Teen Fishers (14–16 years)", - "Advanced Anglers (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Master the Art of Fishing!", - "introText": [ - "Our comprehensive fishing program teaches everything from basic casting to advanced techniques, with emphasis on patience, technique, and respect for aquatic life." - ], - "quote": "", - "outroText": [ - "Learn From the Best!", - "Our guides have decades of experience and share their passion for fishing with enthusiasm and patience.", - "Respect for Nature!", - "We teach catch-and-release practices and environmental stewardship as part of responsible angling." - ], - "mainHeading": "From first cast to experienced angler!", - "principles": [ - "Fundamentals: Casting techniques, knot tying, bait selection – build your foundation!", - "Advanced Skills: Reading water, fly fishing, lure fishing – expand your abilities!", - "Nature Connection: Fish ecology, conservation, and responsible fishing practices!" - ], - "footerText": [ - "Every day on the water brings new lessons, new experiences, and the peaceful joy of fishing!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy hearty Vietnamese cuisine prepared fresh daily. Our kitchen uses local ingredients, and you might even get to cook your own catch with supervision!", - "items": [ - { - "title": "Breakfast", - "desc": "Early morning fuel with pho, banh mi, fresh fruits, and hot beverages before dawn fishing sessions." - }, - { - "title": "Lunch", - "desc": "Delicious Vietnamese dishes with rice, fresh vegetables, and protein to keep you energized." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals featuring local specialties, sometimes including fresh-caught fish!" - }, - { - "title": "Snacks and Refreshments", - "desc": "Trail mix, fresh fruits, and drinks to keep you going during long fishing sessions." - } - ], - "footer": "Experience authentic Vietnamese cuisine while enjoying the peaceful atmosphere of lakeside dining!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Expert Guides & Patient Teachers", - "quote": "", - "mainHeading": "", - "introText": [ - "Our fishing guides are experienced anglers with years of local knowledge and a passion for teaching young people.", - "All guides hold water safety certifications and first aid training." - ], - "footerText": [ - "With a camper-to-guide ratio of 1:6 during fishing activities, every participant receives personalized instruction.", - "Our bilingual team ensures clear communication and a supportive learning environment." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All water-based activities require proper insurance coverage. Our comprehensive package ensures participants are protected during all fishing and outdoor activities.", - "package": { - "title": "Outdoor Activity Insurance", - "desc": "Full coverage for all fishing and outdoor activities included in the camp program.", - "items": [ - "Water activity coverage", - "Equipment damage protection", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full program fee refund available" - ] - } - } - } - } - }, - { - "name": "German Camps", - "price": 610, - "priceText": "from 610 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "thailand", - "vietnam" - ], - "image": "/uploads/activity/b7.jpg", - "link": "/german-camps", - "program": "german-camps", - "rating": 4, - "camp-detail": { - "hero": { - "title": "German Language Camp in Thailand & Vietnam", - "bgImage": "/uploads/activity/b7.jpg" - }, - "basicInfo": { - "location": "Thailand & Vietnam", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Campus & Resort", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "German & English" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "German Intensive Thailand", - "rating": 4.8, - "reviews": 38, - "location": "Chiang Mai, Thailand", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1527004013197-933c4bb611b3?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "German Beach Camp", - "rating": 4.7, - "reviews": 32, - "location": "Phuket, Thailand", - "price": 1500, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1519125323398-675f0ddb6308?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "German Adventure Vietnam", - "rating": 4.9, - "reviews": 41, - "location": "Hanoi, Vietnam", - "price": 1350, - "originalPrice": 1650, - "image": "https://images.unsplash.com/photo-1557804506-669a67965ba0?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "German Cultural Exchange", - "rating": 4.8, - "reviews": 29, - "location": "Da Nang, Vietnam", - "price": 1450, - "originalPrice": 1750, - "image": "https://images.unsplash.com/photo-1528164344705-47542687000d?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Language class" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Group activity" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Cultural event" - } - ], - "overlayInfo": { - "location": "Thailand & Vietnam", - "season": "Summer", - "languages": "German & EN" - } - }, - "eventSchedule": { - "startDate": "07/01/2024", - "duration": "10 Days 9 Nights", - "tickets": "$61/65" - }, - "sections": { - "overview": { - "intro": "Lerne Deutsch auf eine ganz neue Art! Our German Language Camp combines intensive language learning with exciting adventures in Thailand and Vietnam, making language acquisition fun, effective, and memorable.", - "mainText": "The German Language Camp offers students aged 12 to 18 an immersive German learning experience in beautiful Southeast Asian settings. Native German-speaking instructors lead interactive lessons, while activities and excursions provide endless opportunities for practical language use.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all German levels welcome", - "Native German-speaking instructors", - "Small interactive class sizes", - "Daily conversation practice", - "Comfortable campus accommodation", - "24/7 care and language support", - "Certificate of completion", - "Cultural activities and excursions" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our German camps are located in beautiful destinations in Thailand and Vietnam, offering unique cultural experiences alongside language learning. The combination of tropical beauty and modern facilities creates the perfect environment for learning German while enjoying adventure and new experiences.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Comfortable Learning Environment", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in comfortable campus accommodations designed for language learning – practice German with roommates and staff in a supportive environment." - ], - "outroText": [ - "🇩🇪 Language Dorms: Shared rooms with German-speaking environment and study areas.", - "🏠 Premium Rooms: Semi-private accommodation for focused learners. (Additional charge applies)" - ], - "details": [ - "All accommodations feature modern amenities and comfortable beds.", - "German-speaking environment encouraged throughout!", - "Staff available 24/7 for support!", - "Good to know:", - "Bring enthusiasm for learning German!", - "All learning materials are provided.", - "Select your preferred location during booking!" - ], - "principles": [ - "Anfänger/Beginner (12–14 years)", - "Mittelstufe/Intermediate (14–16 years)", - "Fortgeschritten/Advanced (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Deutsch Lernen mit Spaß!", - "introText": [ - "Our program combines structured German lessons with practical application through activities, games, and cultural experiences – learning German has never been so enjoyable!" - ], - "quote": "", - "outroText": [ - "Muttersprachliche Lehrer!", - "Learn from native German speakers who bring language and culture to life through engaging, interactive teaching methods.", - "Praktische Anwendung!", - "Every activity is an opportunity to practice German – from sports to crafts to evening entertainment." - ], - "mainHeading": "Immersive German learning experience!", - "principles": [ - "Morgenunterricht: Interactive grammar, vocabulary, and conversation classes!", - "Nachmittagsaktivitäten: Sports, games, and adventures – all in German!", - "Abendprogramm: Movies, campfires, games, and cultural activities in German!" - ], - "footerText": [ - "Jeden Tag wird dein Deutsch besser! Every day brings improvement, confidence, and fun!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Guten Appetit! Enjoy delicious local and international cuisine at mealtimes. Meals are also German practice opportunities – our staff encourage German conversation at the table!", - "items": [ - { - "title": "Frühstück (Breakfast)", - "desc": "Start your learning day with a nutritious breakfast featuring local and Western options." - }, - { - "title": "Mittagessen (Lunch)", - "desc": "Delicious lunch with fresh local ingredients and international variety." - }, - { - "title": "Abendessen (Dinner)", - "desc": "Satisfying dinner with diverse menu options enjoyed with your German-speaking friends." - }, - { - "title": "Snacks und Getränke", - "desc": "Fresh fruits, snacks, and beverages available throughout the day." - } - ], - "footer": "Mahlzeiten sind Deutschübungen! Practice your German vocabulary while enjoying great food!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Native Speakers & Language Experts", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team consists of native German-speaking instructors with TEFL/DaF certifications and experience teaching young learners.", - "All staff maintain a German-speaking environment while providing supportive, encouraging instruction." - ], - "footerText": [ - "With a student-to-teacher ratio of 1:8, every camper receives personal attention and language support.", - "Our multilingual staff can assist when needed while encouraging maximum German practice." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All campers are covered by comprehensive insurance throughout their language learning adventure, ensuring peace of mind for parents.", - "package": { - "title": "Language Camp Insurance", - "desc": "Full coverage for all camp activities and medical needs during your German learning experience.", - "items": [ - "Comprehensive medical coverage", - "Personal belongings protection", - "All activities covered" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for unforeseen circumstances with full refund options.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full program fee refund available" - ] - } - } - } - } - }, - { - "name": "Horseback Riding", - "price": 620, - "priceText": "from 620 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "portugal" - ], - "image": "/uploads/activity/b8.jpg", - "link": "/horseback-riding", - "program": "horseback", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Horseback Riding Camp in Portugal", - "bgImage": "/uploads/activity/b8.jpg" - }, - "basicInfo": { - "location": "Portugal", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Equestrian Estate & Lodge", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & PT" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Lusitano Horse Experience", - "rating": 5, - "reviews": 48, - "location": "Alentejo, Portugal", - "price": 1800, - "originalPrice": 2200, - "image": "https://images.unsplash.com/photo-1553284965-83fd3e82fa5a?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Trail Riding Adventure", - "rating": 4.9, - "reviews": 42, - "location": "Sintra, Portugal", - "price": 1700, - "originalPrice": 2000, - "image": "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Dressage Basics", - "rating": 4.8, - "reviews": 35, - "location": "Cascais, Portugal", - "price": 1900, - "originalPrice": 2300, - "image": "https://images.unsplash.com/photo-1449495169669-7b118f960251?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Beach Horse Riding", - "rating": 4.9, - "reviews": 52, - "location": "Algarve, Portugal", - "price": 1650, - "originalPrice": 1950, - "image": "https://images.unsplash.com/photo-1534307671554-9a6d81f4d629?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Horse riding" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Stables" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Trail ride" - } - ], - "overlayInfo": { - "location": "Portugal", - "season": "Summer", - "languages": "EN & PT" - } - }, - "eventSchedule": { - "startDate": "07/01/2024", - "duration": "10 Days 9 Nights", - "tickets": "$62/68" - }, - "sections": { - "overview": { - "intro": "Experience the magic of horseback riding at our equestrian camp in beautiful Portugal! From beginner lessons to advanced riding skills, campers develop a deep connection with horses while exploring stunning Portuguese countryside.", - "mainText": "The Horseback Riding Camp offers young horse enthusiasts aged 12 to 18 a complete equestrian experience in Portugal, home to the legendary Lusitano horses. Under the guidance of certified riding instructors, campers learn riding fundamentals, horse care, and develop lasting bonds with these magnificent animals.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all riding levels welcome", - "Certified equestrian instructors", - "Beautiful Lusitano and mixed breed horses", - "All riding equipment provided", - "Equestrian estate accommodation", - "24/7 supervision and care", - "Trail rides through Portuguese countryside", - "Horse care and stable management lessons" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Horseback Riding Camp is located on a beautiful equestrian estate in Portugal, featuring professional stables, indoor and outdoor arenas, and miles of scenic trails. The rolling hills, cork oak forests, and traditional Portuguese landscape provide the perfect backdrop for your equestrian adventure.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Estate Living Near the Stables", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in our charming lodge accommodations on the equestrian estate, just steps away from the stables where you can visit your equine friends." - ], - "outroText": [ - "🐴 Rider's Lodge: Shared rooms for 4-6 riders with views of pastures and paddocks.", - "🏡 Estate Cottage: Private cottages for 2-3 campers with enhanced comfort. (Additional charge applies)" - ], - "details": [ - "All accommodations are clean, comfortable, and close to stables.", - "Boot room for storing riding gear and boots.", - "Staff available around the clock!", - "Good to know:", - "Bring long pants suitable for riding and closed-toe shoes.", - "Helmets and riding boots available for use.", - "Reserve your preferred accommodation during booking!" - ], - "principles": [ - "Beginner Riders (12–14 years)", - "Intermediate Riders (14–16 years)", - "Advanced Riders (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Ride, Learn, and Bond with Horses!", - "introText": [ - "Our comprehensive equestrian program covers riding skills, horse care, and horsemanship, creating well-rounded riders who understand and respect these beautiful animals." - ], - "quote": "", - "outroText": [ - "Complete Horsemanship!", - "Beyond riding, you'll learn grooming, tacking, feeding, and stable management – developing a complete understanding of horse care.", - "Trail Adventures!", - "Experience the thrill of riding through Portuguese countryside, beaches, and forests on memorable trail rides." - ], - "mainHeading": "From the ground up – complete equestrian education!", - "principles": [ - "Arena Sessions: Balance, position, gaits, and control in safe, structured lessons!", - "Horse Care: Grooming, tacking, feeding, and understanding horse behavior!", - "Trail Riding: Explore beautiful Portuguese landscapes on horseback!" - ], - "footerText": [ - "Every day strengthens your bond with horses and your skills as a rider!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy delicious Portuguese cuisine prepared fresh on the estate. Our meals feature local ingredients and traditional recipes, giving you a true taste of Portugal.", - "items": [ - { - "title": "Breakfast", - "desc": "Hearty breakfast with fresh bread, local cheeses, fruits, and eggs to fuel your morning ride." - }, - { - "title": "Lunch", - "desc": "Traditional Portuguese lunch with grilled meats, seafood, fresh salads, and local dishes." - }, - { - "title": "Dinner", - "desc": "Family-style dinners featuring Portuguese favorites and fresh, local ingredients." - }, - { - "title": "Rider's Snacks", - "desc": "Fresh fruits, energy bars, and beverages available between riding sessions." - } - ], - "footer": "Experience authentic Portuguese hospitality and cuisine on our beautiful equestrian estate!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Expert Equestrians & Caring Staff", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team includes certified riding instructors, experienced stable hands, and caring counselors who share a passion for horses and teaching.", - "All instructors hold recognized equestrian qualifications and first aid certifications." - ], - "footerText": [ - "With a rider-to-instructor ratio of 1:4 during lessons, every camper receives personalized attention and coaching.", - "Our bilingual team ensures clear instruction and creates a welcoming atmosphere for all participants." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Horseback riding requires specialized insurance coverage. Our comprehensive equestrian insurance protects all participants during riding activities and horse care.", - "package": { - "title": "Equestrian Activity Insurance", - "desc": "Specialized coverage for all horseback riding activities and related camp programs.", - "items": [ - "Full coverage for riding-related accidents", - "Personal liability protection", - "Medical evacuation coverage" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy with refund options for qualifying circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical issues and emergencies", - "Full refund of program fees available" - ] - } - } - } - } - }, - { - "name": "Husky Camp", - "price": 525, - "priceText": "from 525 USD", - "season": [ - "spring", - "summer", - "autumn" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "china" - ], - "image": "/uploads/activity/b9.jpg", - "link": "/husky-camp", - "program": "husky", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Husky Camp in China", - "bgImage": "/uploads/activity/b9.jpg" - }, - "basicInfo": { - "location": "China", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Mountain Lodge & Cabin", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & CN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Husky Trekking Adventure", - "rating": 5, - "reviews": 58, - "location": "Harbin, China", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1605568427561-40dd23c2acea?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Dog Sledding Experience", - "rating": 4.9, - "reviews": 45, - "location": "Inner Mongolia, China", - "price": 1500, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1551632811-561732d1e306?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Husky Training Camp", - "rating": 4.8, - "reviews": 38, - "location": "Changbai Mountain, China", - "price": 1350, - "originalPrice": 1650, - "image": "https://images.unsplash.com/photo-1568572933382-74d440642117?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Arctic Dogs Adventure", - "rating": 4.9, - "reviews": 52, - "location": "Mohe, China", - "price": 1600, - "originalPrice": 1900, - "image": "https://images.unsplash.com/photo-1547407139-3c921a66005c?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Huskies" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Sled dogs" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Mountain camp" - } - ], - "overlayInfo": { - "location": "China", - "season": "Spring, Summer, Autumn", - "languages": "EN & CN" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "8 Days 7 Nights", - "tickets": "$52/56" - }, - "sections": { - "overview": { - "intro": "Experience the incredible bond between humans and huskies at our unique camp in China! Work alongside these amazing sled dogs, learn about their care, and enjoy outdoor adventures in breathtaking mountain landscapes.", - "mainText": "The Husky Camp offers animal lovers aged 12 to 18 an extraordinary opportunity to connect with Siberian and Alaskan huskies. Campers learn about dog behavior, training, mushing traditions, and responsible animal care while forming unforgettable bonds with these friendly, energetic dogs.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all experience levels welcome", - "Professional husky handlers and trainers", - "Daily interaction with trained huskies", - "Learn dog care and training basics", - "Mountain lodge accommodation", - "24/7 supervision and care", - "Hiking and trekking with huskies", - "Photography opportunities with dogs" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Husky Camp is located in the scenic mountains of northern China, where the climate and terrain are perfect for these arctic-heritage dogs. The camp features professional dog facilities, hiking trails, and stunning natural scenery. Campers experience the beauty of Chinese mountain landscapes while bonding with our pack of friendly huskies.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Cozy Mountain Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in our warm, cozy mountain lodges surrounded by beautiful nature. Rest well after exciting days with the huskies!" - ], - "outroText": [ - "🐺 Musher's Lodge: Shared rooms for 4-6 campers with views of the husky kennel area.", - "🏔️ Mountain Cabin: Private cabins for 2-3 campers with fireplace and enhanced comfort. (Additional charge applies)" - ], - "details": [ - "All accommodations feature heating and comfortable beds.", - "Boot and gear drying facilities available.", - "Staff available 24/7!", - "Good to know:", - "Bring warm layers – mornings can be cool in the mountains.", - "Comfortable outdoor clothing essential.", - "Reserve your preferred accommodation during booking!" - ], - "principles": [ - "Junior Mushers (12–14 years)", - "Teen Handlers (14–16 years)", - "Advanced Mushers (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Bond with Amazing Huskies!", - "introText": [ - "Our program combines husky care, outdoor adventures, and education about these remarkable dogs, creating meaningful connections between campers and animals." - ], - "quote": "", - "outroText": [ - "Learn from Expert Handlers!", - "Our experienced mushers and dog trainers share their knowledge and passion for these incredible animals.", - "Unforgettable Memories!", - "The bond you form with huskies and the adventures you share will stay with you forever." - ], - "mainHeading": "Every day is an adventure with huskies!", - "principles": [ - "Husky Care: Feeding, grooming, and understanding husky behavior and needs!", - "Outdoor Adventures: Hiking and trekking with huskies through beautiful trails!", - "Training Basics: Learn how mushers communicate with and train sled dogs!" - ], - "footerText": [ - "Experience the joy, energy, and friendship of these amazing dogs every single day!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy hearty, warming meals designed for active outdoor adventures. Our kitchen serves nutritious Chinese and international dishes that fuel your adventures with the huskies.", - "items": [ - { - "title": "Breakfast", - "desc": "Filling breakfast with hot porridge, eggs, breads, and warming beverages to start your day with the dogs." - }, - { - "title": "Lunch", - "desc": "Substantial Chinese and international dishes with plenty of protein and vegetables." - }, - { - "title": "Dinner", - "desc": "Comforting evening meals with local specialties and international favorites after a day outdoors." - }, - { - "title": "Trail Snacks", - "desc": "Energy-packed snacks and hot drinks for outdoor activities and husky adventures." - } - ], - "footer": "Our meals are designed to keep you energized for adventures with the huskies – hearty, healthy, and delicious!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Expert Handlers & Animal Lovers", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team includes professional husky handlers, experienced trainers, and caring counselors who love working with both dogs and young people.", - "All staff are trained in animal handling and first aid." - ], - "footerText": [ - "With a camper-to-staff ratio of 1:6, every participant receives personal attention and guidance with the dogs.", - "Our bilingual team ensures clear communication and creates a welcoming, safe environment." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Working with animals requires appropriate insurance coverage. Our comprehensive package protects all participants during husky activities and outdoor adventures.", - "package": { - "title": "Animal Activity Insurance", - "desc": "Complete coverage for all activities involving huskies and outdoor adventures.", - "items": [ - "Animal-related activity coverage", - "Outdoor adventure protection", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation options for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full program fee refund available" - ] - } - } - } - } - }, - { - "name": "International Counsellor in Training (ICIT)", - "price": 995, - "priceText": "from 995 USD", - "season": [ - "summer" - ], - "age": [ - 16, - 18 - ], - "locations": [ - "thailand", - "malaysia" - ], - "image": "/uploads/activity/b10.jpg", - "link": "/international-counsellor-in-training-icit", - "program": "icit", - "rating": 5, - "camp-detail": { - "hero": { - "title": "International Counsellor in Training (ICIT) in Thailand & Malaysia", - "bgImage": "/uploads/activity/b10.jpg" - }, - "basicInfo": { - "location": "Thailand & Malaysia", - "ageRange": "16 - 18 years\nAdvanced Leadership Program", - "accommodationType": "Leadership Center & Campus", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "English Immersion" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Leadership Intensive Thailand", - "rating": 5, - "reviews": 62, - "location": "Chiang Mai, Thailand", - "price": 2200, - "originalPrice": 2600, - "image": "https://images.unsplash.com/photo-1522071820081-009f0129c71c?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Counselor Skills Malaysia", - "rating": 4.9, - "reviews": 55, - "location": "Kuala Lumpur, Malaysia", - "price": 2100, - "originalPrice": 2500, - "image": "https://images.unsplash.com/photo-1528901166007-3784c7dd3653?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Team Building Adventure", - "rating": 4.9, - "reviews": 48, - "location": "Phuket, Thailand", - "price": 2000, - "originalPrice": 2400, - "image": "https://images.unsplash.com/photo-1517048676732-d65bc937f952?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Future Leaders Program", - "rating": 5, - "reviews": 42, - "location": "Langkawi, Malaysia", - "price": 2300, - "originalPrice": 2700, - "image": "https://images.unsplash.com/photo-1552664730-d307ca884978?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Team building" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Leadership activity" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Group session" - } - ], - "overlayInfo": { - "location": "Thailand & Malaysia", - "season": "Summer", - "languages": "English" - } - }, - "eventSchedule": { - "startDate": "07/01/2024", - "duration": "14 Days 13 Nights", - "tickets": "$99/105" - }, - "sections": { - "overview": { - "intro": "Take the next step in your camp journey with our International Counsellor in Training program! Designed for experienced campers aged 16-18, the ICIT program develops leadership skills while preparing participants for future roles as camp counselors.", - "mainText": "The ICIT program offers mature teens aged 16 to 18 an advanced leadership experience across Thailand and Malaysia. Participants develop essential skills in communication, problem-solving, group dynamics, and child development while gaining hands-on experience supporting younger campers and learning from experienced counselors.", - "featuresTitle": "Key features", - "features": [ - "Ages 16–18, prior camp experience preferred", - "Comprehensive leadership training", - "Hands-on counselor experience", - "Child development education", - "International certification recognized", - "24/7 mentorship and support", - "Future employment opportunities", - "Resume-building experience" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "The ICIT program takes place across two locations – Thailand and Malaysia – giving participants exposure to different camp settings and cultural contexts. Both locations feature professional training facilities, leadership centers, and opportunities to practice skills with younger campers in real camp environments.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Leadership Living", - "quote": "", - "mainHeading": "", - "introText": [ - "ICIT participants stay in designated leadership areas, separate from younger campers, with additional responsibility and privileges appropriate to their training role." - ], - "outroText": [ - "🎓 ICIT Quarters: Shared rooms for 2-4 participants with study and meeting spaces.", - "🏢 Leadership Suite: Enhanced accommodations with additional amenities. (Additional charge applies)" - ], - "details": [ - "All accommodations feature air conditioning and comfortable beds.", - "Private meeting spaces for ICIT activities.", - "Mentors available for guidance and support!", - "Good to know:", - "Bring a positive attitude and willingness to learn and lead.", - "Professional attire required for some sessions.", - "Choose your preferred location during registration!" - ], - "principles": [ - "First-Year ICIT (16–17 years)", - "Advanced ICIT (17–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Become a Future Leader!", - "introText": [ - "Our comprehensive ICIT curriculum combines leadership theory with practical experience, preparing participants for counselor roles and developing skills valuable in any career path." - ], - "quote": "", - "outroText": [ - "Learn from Experienced Counselors!", - "Shadow and learn from our senior staff who share their experience, techniques, and passion for youth development.", - "Earn Your Certification!", - "Successfully complete the program and receive an internationally recognized certificate qualifying you for future counselor positions." - ], - "mainHeading": "From camper to leader – your journey continues!", - "principles": [ - "Leadership Training: Communication, conflict resolution, decision-making, and team dynamics!", - "Practical Experience: Assist with activities, support younger campers, lead small groups!", - "Professional Development: Child safety, diversity training, and career preparation!" - ], - "footerText": [ - "This program opens doors to future camp employment and builds leadership skills for life!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "ICIT participants enjoy the same excellent meals as all campers, with additional responsibility for modeling good dining hall behavior and occasionally assisting with meal supervision.", - "items": [ - { - "title": "Breakfast", - "desc": "Energizing breakfast to fuel your leadership day with healthy options and energizing beverages." - }, - { - "title": "Lunch", - "desc": "Delicious lunch featuring Asian and international cuisine with balanced nutrition." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals enjoyed with fellow ICIT participants and mentors." - }, - { - "title": "Study Snacks", - "desc": "Snacks and beverages available during evening sessions and planning meetings." - } - ], - "footer": "Meals are community time – practice your leadership and build relationships with fellow future counselors!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Experienced Mentors & Leaders", - "quote": "", - "mainHeading": "", - "introText": [ - "The ICIT program is led by our most experienced senior counselors and leadership trainers, who serve as mentors and role models.", - "All ICIT mentors have extensive experience in youth development and camp leadership." - ], - "footerText": [ - "With a participant-to-mentor ratio of 1:6, every ICIT receives personalized guidance and feedback.", - "Ongoing mentorship continues even after the program ends for those pursuing camp career paths." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All ICIT participants are covered by comprehensive insurance throughout the program, including enhanced coverage appropriate for leadership training activities.", - "package": { - "title": "ICIT Program Insurance", - "desc": "Complete coverage for all leadership training activities and camp experiences.", - "items": [ - "Full medical coverage", - "Professional liability awareness training", - "All program activities covered" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation options for this advanced program.", - "items": [ - "Valid until two weeks before program start", - "Covers medical and emergency situations", - "Partial or full refund depending on timing" - ] - } - } - } - } - }, - { - "name": "Leadership", - "price": 1185, - "priceText": "from 1185 USD", - "season": [ - "summer" - ], - "age": [ - 16, - 18 - ], - "locations": [ - "philippines" - ], - "image": "/uploads/activity/b11.jpg", - "link": "/senior-plus-leadership", - "program": "leadership", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Senior Plus Leadership Camp in Philippines", - "bgImage": "/uploads/activity/b11.jpg" - }, - "basicInfo": { - "location": "Philippines", - "ageRange": "16 - 18 years\nAdvanced Leadership Program", - "accommodationType": "Leadership Retreat Center", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "English Immersion" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Executive Leadership Summit", - "rating": 5, - "reviews": 45, - "location": "Cebu, Philippines", - "price": 2400, - "originalPrice": 2800, - "image": "https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Outdoor Leadership Challenge", - "rating": 4.9, - "reviews": 38, - "location": "Palawan, Philippines", - "price": 2300, - "originalPrice": 2700, - "image": "https://images.unsplash.com/photo-1521737711867-e3b97375f902?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Social Entrepreneurship", - "rating": 4.9, - "reviews": 32, - "location": "Manila, Philippines", - "price": 2200, - "originalPrice": 2600, - "image": "https://images.unsplash.com/photo-1553877522-43269d4ea984?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Adventure Leadership", - "rating": 5, - "reviews": 41, - "location": "Baguio, Philippines", - "price": 2500, - "originalPrice": 2900, - "image": "https://images.unsplash.com/photo-1542744173-8e7e53415bb0?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Leadership workshop" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Team challenge" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Adventure activity" - } - ], - "overlayInfo": { - "location": "Philippines", - "season": "Summer", - "languages": "English" - } - }, - "eventSchedule": { - "startDate": "07/05/2024", - "duration": "14 Days 13 Nights", - "tickets": "$118/125" - }, - "sections": { - "overview": { - "intro": "Unlock your leadership potential at our Senior Plus Leadership Camp in the Philippines! This advanced program challenges teens to develop critical thinking, communication, and leadership skills through adventure, teamwork, and real-world challenges.", - "mainText": "The Senior Plus Leadership Camp is designed for ambitious young people aged 16 to 18 who want to develop the skills that set future leaders apart. Through adventure challenges, team projects, community service, and expert-led workshops, participants discover their leadership style and build confidence to make a difference.", - "featuresTitle": "Key features", - "features": [ - "Ages 16–18, leadership-focused program", - "Expert leadership facilitators", - "Adventure-based leadership challenges", - "Community service project included", - "Premium retreat center accommodation", - "24/7 mentorship and support", - "Leadership certification awarded", - "University preparation elements" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Leadership Camp is held at a premier retreat center in the Philippines, featuring modern conference facilities, outdoor adventure areas, and comfortable accommodations. The stunning natural surroundings of the Philippines provide the perfect backdrop for transformative experiences, while nearby communities offer opportunities for meaningful service projects.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Executive-Style Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in our premium retreat center with executive-style accommodations, reflecting the professional development focus of this program." - ], - "outroText": [ - "🎯 Leader's Suite: Shared rooms for 2-3 participants with study desks and meeting areas.", - "⭐ Executive Room: Private rooms for focused reflection and planning. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning, modern amenities, and comfortable beds.", - "Conference rooms available for team projects and meetings.", - "Mentors available for guidance 24/7!", - "Good to know:", - "Business casual attire required for some sessions.", - "Bring a journal for reflection and planning exercises.", - "Reserve your accommodation during registration!" - ], - "principles": [ - "Emerging Leaders (16–17 years)", - "Senior Leaders (17–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Develop the Leader Within!", - "introText": [ - "Our leadership curriculum combines theory and practice, using adventure challenges, team projects, and real-world applications to develop effective, ethical leaders." - ], - "quote": "", - "outroText": [ - "Learn from Accomplished Leaders!", - "Our facilitators include successful entrepreneurs, community leaders, and professional leadership coaches who share their journeys and insights.", - "Make a Real Impact!", - "Your community service project creates lasting positive change while developing your leadership skills in action." - ], - "mainHeading": "Lead yourself, lead others, lead change!", - "principles": [ - "Self-Leadership: Self-awareness, emotional intelligence, goal setting, and personal effectiveness!", - "Team Leadership: Communication, conflict resolution, motivation, and team dynamics!", - "Changemaking: Social entrepreneurship, community impact, and sustainable leadership!" - ], - "footerText": [ - "Leave camp with the confidence, skills, and vision to lead in whatever path you choose!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy premium dining at our retreat center. Meals are designed for networking and discussion, with some sessions combining dining with group conversations and guest speaker events.", - "items": [ - { - "title": "Breakfast", - "desc": "Full breakfast buffet with healthy options to fuel your leadership journey." - }, - { - "title": "Lunch", - "desc": "Professional lunch service featuring Filipino and international cuisine." - }, - { - "title": "Dinner", - "desc": "Evening dining occasions with themed discussions and networking opportunities." - }, - { - "title": "Refreshments", - "desc": "Healthy snacks and beverages available during sessions, breaks, and meetings." - } - ], - "footer": "Dining is learning time! Practice professional networking and leadership communication during meals." - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Distinguished Facilitators & Mentors", - "quote": "", - "mainHeading": "", - "introText": [ - "Our leadership team includes professional facilitators, successful business leaders, and certified coaches with expertise in youth leadership development.", - "Many facilitators are accomplished leaders in their fields who volunteer their time to inspire the next generation." - ], - "footerText": [ - "With a participant-to-facilitator ratio of 1:5, you receive personalized feedback and mentorship throughout the program.", - "Alumni mentorship connects you with past participants who are now making impact in their communities." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All leadership program participants are covered by comprehensive insurance for all activities, including adventure-based challenges and community service projects.", - "package": { - "title": "Leadership Program Insurance", - "desc": "Premium coverage for all leadership activities, adventure challenges, and service projects.", - "items": [ - "Full medical coverage", - "Adventure activity protection", - "Community service project coverage" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy for this premium program.", - "items": [ - "Valid until two weeks before program start", - "Covers medical and academic conflicts", - "Partial or full refund available" - ] - } - } - } - } - }, - { - "name": "Lifeguarding", - "price": 580, - "priceText": "from 580 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "malaysia" - ], - "image": "/uploads/activity/b12.jpg", - "link": "/lifeguarding", - "program": "lifeguarding", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Lifeguarding Camp in Malaysia", - "bgImage": "/uploads/activity/b12.jpg" - }, - "basicInfo": { - "location": "Malaysia", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Beach Resort & Training Center", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & MY" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Beach Lifeguard Training", - "rating": 4.9, - "reviews": 42, - "location": "Langkawi, Malaysia", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Pool Rescue Certification", - "rating": 4.8, - "reviews": 38, - "location": "Penang, Malaysia", - "price": 1200, - "originalPrice": 1500, - "image": "https://images.unsplash.com/photo-1576013551627-0cc20b96c2a7?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Water Safety Intensive", - "rating": 4.9, - "reviews": 35, - "location": "Kuala Lumpur, Malaysia", - "price": 1250, - "originalPrice": 1550, - "image": "https://images.unsplash.com/photo-1530549387789-4c1017266635?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "First Aid & Rescue", - "rating": 4.7, - "reviews": 29, - "location": "Kota Kinabalu, Malaysia", - "price": 1150, - "originalPrice": 1450, - "image": "https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Lifeguard training" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Pool rescue" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Beach safety" - } - ], - "overlayInfo": { - "location": "Malaysia", - "season": "Summer", - "languages": "EN & MY" - } - }, - "eventSchedule": { - "startDate": "06/20/2024", - "duration": "10 Days 9 Nights", - "tickets": "$58/62" - }, - "sections": { - "overview": { - "intro": "Learn essential water safety and rescue skills at our Lifeguarding Camp in Malaysia! Train with certified instructors in pool and beach environments while earning recognized certifications that could save lives.", - "mainText": "The Lifeguarding Camp offers young people aged 12 to 18 comprehensive training in water safety, rescue techniques, and first aid. Under the guidance of certified lifeguard instructors, campers develop the skills and confidence to respond to water emergencies while enjoying the beautiful beaches of Malaysia.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, strong swimmers", - "Certified lifeguard instructors", - "Pool and beach training environments", - "First aid and CPR certification", - "Beach resort accommodation", - "24/7 supervision and care", - "Recognized rescue certifications", - "Physical fitness training included" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Lifeguarding Camp is located at a beach resort in Malaysia with access to both pool and ocean training environments. The warm tropical waters and beautiful beaches provide ideal conditions for learning water rescue techniques. Modern training facilities ensure safe, effective skill development.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Beachside Training Base", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay at our beach resort with easy access to training facilities. Get plenty of rest between intensive training sessions!" - ], - "outroText": [ - "🏊 Swimmer's Quarters: Shared rooms for 4-6 campers near the pool and beach.", - "🌊 Beachfront Room: Premium rooms with ocean views. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and drying areas for swimwear.", - "Outdoor rinse facilities for after training.", - "Medical support and staff available 24/7!", - "Good to know:", - "Bring multiple swimsuits and comfortable athletic wear.", - "Strong swimming ability required for this program.", - "Reserve your accommodation during booking!" - ], - "principles": [ - "Junior Lifeguards (12–14 years)", - "Teen Rescuers (14–16 years)", - "Advanced Lifeguards (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Learn to Save Lives!", - "introText": [ - "Our lifeguarding program combines water rescue techniques, first aid training, and physical conditioning to prepare participants for real-world emergency response." - ], - "quote": "", - "outroText": [ - "Earn Real Certifications!", - "Complete the program and earn recognized certifications in lifeguarding, first aid, and CPR.", - "Skills for Life!", - "The water safety and rescue skills you learn could save someone's life – including your own." - ], - "mainHeading": "Train like a professional lifeguard!", - "principles": [ - "Water Rescue: Swimming rescues, spinal injury management, and victim recovery techniques!", - "First Aid & CPR: Essential emergency response skills and cardiac resuscitation!", - "Physical Training: Endurance swimming, strength, and fitness for rescue readiness!" - ], - "footerText": [ - "Graduate with the knowledge, skills, and confidence to make a difference in water emergencies!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your training with nutritious meals designed for athletic performance. Our kitchen understands the energy demands of intensive water training and prepares balanced meals accordingly.", - "items": [ - { - "title": "Breakfast", - "desc": "High-energy breakfast with proteins, carbohydrates, and fruits to fuel morning training sessions." - }, - { - "title": "Lunch", - "desc": "Balanced Malaysian and international meals with recovery nutrition in mind." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals to recover from intensive training and prepare for the next day." - }, - { - "title": "Training Snacks", - "desc": "Energy snacks and electrolyte drinks available during and after training sessions." - } - ], - "footer": "Proper nutrition is essential for athletic training. Our meals support your lifeguard fitness goals!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Certified Lifeguard Trainers", - "quote": "", - "mainHeading": "", - "introText": [ - "Our instructors are certified lifeguard trainers with real-world rescue experience and a passion for teaching water safety.", - "All instructors maintain current certifications in lifeguarding, first aid, and emergency response." - ], - "footerText": [ - "With a camper-to-instructor ratio of 1:5 during water training, every participant receives close supervision and coaching.", - "Safety officers are present during all water activities to ensure a secure training environment." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Water-based training requires comprehensive insurance coverage. Our package protects all participants during training activities in both pool and ocean environments.", - "package": { - "title": "Water Training Insurance", - "desc": "Specialized coverage for all lifeguarding training activities and water-based sessions.", - "items": [ - "Water activity coverage", - "Training injury protection", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for medical or swimming ability reasons.", - "items": [ - "Valid until one week before camp start", - "Covers swim test failures and medical issues", - "Full program refund available" - ] - } - } - } - } - }, - { - "name": "Multi Water Adventure", - "price": 990, - "priceText": "from 990 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "philippines" - ], - "image": "/uploads/activity/b13.jpg", - "link": "/multi-water-adventure", - "program": "multi-water", - "rating": 1, - "camp-detail": { - "hero": { - "title": "Multi Water Adventure Camp in Philippines", - "bgImage": "/uploads/activity/b13.jpg" - }, - "basicInfo": { - "location": "Philippines", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Island Resort & Beach Cabin", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & FIL" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Island Hopping Adventure", - "rating": 4.9, - "reviews": 52, - "location": "Palawan, Philippines", - "price": 2200, - "originalPrice": 2600, - "image": "https://images.unsplash.com/photo-1544551763-46a013bb70d5?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Water Sports Intensive", - "rating": 4.8, - "reviews": 45, - "location": "Boracay, Philippines", - "price": 2100, - "originalPrice": 2500, - "image": "https://images.unsplash.com/photo-1502680390469-be75c86b636f?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Tropical Adventure Camp", - "rating": 4.9, - "reviews": 48, - "location": "Cebu, Philippines", - "price": 2000, - "originalPrice": 2400, - "image": "https://images.unsplash.com/photo-1533124646944-3e9c53e63c53?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Kayak & Snorkel Experience", - "rating": 4.7, - "reviews": 38, - "location": "Siargao, Philippines", - "price": 1900, - "originalPrice": 2300, - "image": "https://images.unsplash.com/photo-1530549387789-4c1017266635?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Kayaking" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Snorkeling" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Beach activity" - } - ], - "overlayInfo": { - "location": "Philippines", - "season": "Summer", - "languages": "EN & FIL" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "12 Days 11 Nights", - "tickets": "$99/105" - }, - "sections": { - "overview": { - "intro": "Dive into the ultimate water adventure at our Multi Water Adventure Camp in the Philippines! Experience kayaking, snorkeling, paddleboarding, and more in some of the world's most beautiful tropical waters.", - "mainText": "The Multi Water Adventure Camp offers water enthusiasts aged 12 to 18 an action-packed experience in the Philippines' stunning islands and seas. From paddling through pristine lagoons to snorkeling colorful coral reefs, campers try a variety of water sports while building skills, confidence, and unforgettable memories.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, swimmers of all levels", - "Multiple water sports: kayaking, SUP, snorkeling & more", - "Certified water sports instructors", - "All equipment provided", - "Island resort accommodation", - "24/7 supervision and water safety", - "Island exploration excursions", - "Marine life education" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Multi Water Adventure Camp is based in the stunning island archipelago of the Philippines, offering access to crystal-clear waters, pristine beaches, and incredible marine biodiversity. The warm tropical climate and calm seas provide perfect conditions for a variety of water activities and exploration.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Island Paradise Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in beautiful beach cabins or island resort rooms just steps from the water. Fall asleep to ocean sounds and wake up ready for aquatic adventures!" - ], - "outroText": [ - "🏝️ Beach Cabin: Shared cabins for 4-6 campers with direct beach access.", - "🌴 Island Suite: Premium beachfront rooms for 2-3 campers. (Additional charge applies)" - ], - "details": [ - "All accommodations feature fans/AC and comfortable beds.", - "Outdoor rinse stations for after water activities.", - "Water safety staff on duty 24/7!", - "Good to know:", - "Bring swimsuits, reef-safe sunscreen, and water shoes.", - "All water sports equipment is provided.", - "Book your island accommodation during registration!" - ], - "principles": [ - "Junior Adventurers (12–14 years)", - "Teen Explorers (14–16 years)", - "Advanced Water Sports (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Explore Every Wave and Current!", - "introText": [ - "Our multi-sport program introduces campers to a variety of water activities, from paddling sports to underwater exploration, all taught by certified instructors." - ], - "quote": "", - "outroText": [ - "Try Everything!", - "This is your chance to discover which water sports you love – we offer instruction in multiple disciplines.", - "Explore the Marine World!", - "Learn about marine ecosystems while snorkeling and paddling through some of the world's most biodiverse waters." - ], - "mainHeading": "A new water adventure every day!", - "principles": [ - "Paddling Sports: Kayaking, stand-up paddleboarding, and outrigger canoeing!", - "Underwater Exploration: Snorkeling, freediving basics, and marine life discovery!", - "Beach & Water Fun: Swimming, beach games, and tropical water activities!" - ], - "footerText": [ - "Every day brings new water adventures – discover your passion for the ocean!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy fresh island cuisine featuring local seafood, tropical fruits, and international favorites. Our beachside meals are the perfect fuel for your water adventures.", - "items": [ - { - "title": "Breakfast", - "desc": "Tropical breakfast with fresh fruits, eggs, local breads, and refreshing juices." - }, - { - "title": "Lunch", - "desc": "Beach-side lunch featuring grilled seafood, Filipino dishes, and refreshing salads." - }, - { - "title": "Dinner", - "desc": "Sunset dinners with fresh catches, barbecue, and authentic island cuisine." - }, - { - "title": "Beach Snacks", - "desc": "Fresh coconuts, tropical fruits, and hydrating drinks between activities." - } - ], - "footer": "Island fresh cuisine to fuel your adventures – enjoy the taste of tropical paradise!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Water Sports Experts & Safety Team", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team includes certified instructors in various water sports, experienced boat handlers, and trained water safety personnel.", - "All staff hold current lifeguarding certifications and first aid training." - ], - "footerText": [ - "With strict water safety ratios of 1:4 during activities, every participant is closely supervised.", - "Safety boats and personnel are present during all open-water activities." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Multi-sport water activities require comprehensive coverage. Our insurance package protects participants during all water-based activities.", - "package": { - "title": "Water Sports Insurance", - "desc": "Complete coverage for all water-based activities and excursions included in the program.", - "items": [ - "All water activities covered", - "Equipment use protection", - "Emergency evacuation included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for medical or swimming ability issues.", - "items": [ - "Valid until one week before camp start", - "Covers medical and ability concerns", - "Full refund of program fees" - ] - } - } - } - } - }, - { - "name": "Sailing", - "price": 990, - "priceText": "from 990 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "thailand" - ], - "image": "/uploads/activity/b14.jpg", - "link": "/sailing", - "program": "sailing", - "rating": 2, - "camp-detail": { - "hero": { - "title": "Sailing Camp in Thailand", - "bgImage": "/uploads/activity/b14.jpg" - }, - "basicInfo": { - "location": "Thailand", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Marina Resort & Yacht Club", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & TH" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Dinghy Sailing Course", - "rating": 4.9, - "reviews": 48, - "location": "Phuket, Thailand", - "price": 2100, - "originalPrice": 2500, - "image": "https://images.unsplash.com/photo-1534447677768-be436bb09401?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Catamaran Experience", - "rating": 4.8, - "reviews": 42, - "location": "Koh Samui, Thailand", - "price": 2200, - "originalPrice": 2600, - "image": "https://images.unsplash.com/photo-1500930287596-c1ecaa373bb2?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Island Sailing Expedition", - "rating": 5, - "reviews": 55, - "location": "Krabi, Thailand", - "price": 2400, - "originalPrice": 2800, - "image": "https://images.unsplash.com/photo-1508739773434-c26b3d09e071?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Racing Fundamentals", - "rating": 4.7, - "reviews": 35, - "location": "Pattaya, Thailand", - "price": 1900, - "originalPrice": 2300, - "image": "https://images.unsplash.com/photo-1540946485063-a40da27545f8?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Sailing" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Yacht" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Marina" - } - ], - "overlayInfo": { - "location": "Thailand", - "season": "Summer", - "languages": "EN & TH" - } - }, - "eventSchedule": { - "startDate": "07/01/2024", - "duration": "10 Days 9 Nights", - "tickets": "$99/105" - }, - "sections": { - "overview": { - "intro": "Catch the wind at our Sailing Camp in Thailand! Learn to sail in the stunning Andaman Sea, from basic boat handling to advanced sailing techniques, all in one of the world's most beautiful sailing destinations.", - "mainText": "The Sailing Camp offers young sailors aged 12 to 18 comprehensive sailing instruction in the tropical waters of Thailand. From first-time sailors to those seeking advanced skills, our certified instructors provide progressive training on dinghies, catamarans, and keelboats in ideal sailing conditions.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels from beginner to advanced", - "Certified sailing instructors (RYA/IYT)", - "Multiple boat types available", - "Progressive skill-based curriculum", - "Marina resort accommodation", - "24/7 supervision and water safety", - "Sailing certification available", - "Island sailing excursions" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Sailing Camp is based at a premier marina in Thailand, offering access to some of the world's best sailing waters. The Andaman Sea provides consistent trade winds, warm temperatures, and stunning scenery with limestone islands and pristine beaches. Between sailing sessions, explore the marina, nearby beaches, and local culture.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Marina-Side Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay at our marina resort overlooking the yacht harbor. Watch the boats and prepare for your next sailing adventure!" - ], - "outroText": [ - "⛵ Sailor's Lodge: Shared rooms for 4-6 campers with marina views.", - "🌅 Marina Suite: Premium waterfront rooms for 2-3 campers. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Sailing gear storage and drying areas available.", - "Marina facilities and yacht club access included!", - "Good to know:", - "Bring swimwear, sailing gloves optional, and reef-safe sunscreen.", - "All sailing equipment and life jackets provided.", - "Reserve your marina accommodation during booking!" - ], - "principles": [ - "Beginner Sailors (12–14 years)", - "Intermediate Sailors (14–16 years)", - "Advanced Sailors (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Master the Art of Sailing!", - "introText": [ - "Our progressive sailing curriculum takes you from understanding wind and boats to confidently sailing solo, with opportunities for racing and overnight expeditions." - ], - "quote": "", - "outroText": [ - "Earn Your Sailing Certificate!", - "Complete the program and receive an internationally recognized sailing certification.", - "Sail Thailand's Paradise!", - "Progress to island expeditions, sailing to stunning destinations with your new skills." - ], - "mainHeading": "From shore to sea – become a confident sailor!", - "principles": [ - "Fundamentals: Boat parts, rigging, wind awareness, and basic sailing maneuvers!", - "Skill Building: Tacking, gybing, points of sail, and crew coordination!", - "Advanced Sailing: Racing techniques, seamanship, and multi-day expeditions!" - ], - "footerText": [ - "Every day on the water builds confidence, skill, and an unforgettable connection to sailing!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy delicious Thai and international cuisine at our marina restaurant. Fresh seafood, local specialties, and international favorites fuel your sailing adventures.", - "items": [ - { - "title": "Breakfast", - "desc": "Energizing breakfast with Thai and Western options to fuel your morning sailing session." - }, - { - "title": "Lunch", - "desc": "Fresh and light Thai cuisine with seafood, salads, and satisfying dishes." - }, - { - "title": "Dinner", - "desc": "Sunset dinners at the marina featuring Thai specialties and fresh catches." - }, - { - "title": "Sailing Snacks", - "desc": "Sandwiches, fruits, and drinks available for on-water sailing sessions." - } - ], - "footer": "Dine with views of the marina and enjoy the sailor's lifestyle in tropical Thailand!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Professional Sailing Instructors", - "quote": "", - "mainHeading": "", - "introText": [ - "Our sailing team includes RYA and IYT certified instructors with extensive sailing and teaching experience.", - "All instructors hold current marine safety certifications and first aid training." - ], - "footerText": [ - "With an instructor-to-student ratio of 1:4 on the water, every sailor receives personalized attention and coaching.", - "Safety boats accompany all sailing sessions for immediate response capability." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Sailing activities require specialized marine insurance. Our comprehensive package covers all sailing activities and water-based excursions.", - "package": { - "title": "Marine Activity Insurance", - "desc": "Complete coverage for all sailing activities, boat use, and water-based excursions.", - "items": [ - "Sailing and boat activity coverage", - "Personal accident protection", - "Marine rescue coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and emergency situations", - "Full refund of program fees" - ] - } - } - } - } - }, - { - "name": "Skating", - "price": 420, - "priceText": "from 420 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "vietnam" - ], - "image": "/uploads/activity/b15.jpg", - "link": "/skating", - "program": "skating", - "rating": 3, - "camp-detail": { - "hero": { - "title": "Skating Camp in Vietnam", - "bgImage": "/uploads/activity/b15.jpg" - }, - "basicInfo": { - "location": "Vietnam", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Sports Campus & Dormitory", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & VN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Skateboard Fundamentals", - "rating": 4.8, - "reviews": 45, - "location": "Ho Chi Minh City, Vietnam", - "price": 1100, - "originalPrice": 1400, - "image": "https://images.unsplash.com/photo-1564982752979-3f7bc974d29a?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Street Skating Course", - "rating": 4.7, - "reviews": 38, - "location": "Hanoi, Vietnam", - "price": 1050, - "originalPrice": 1350, - "image": "https://images.unsplash.com/photo-1579721859550-ce3a0f9d4f48?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Roller Skating Workshop", - "rating": 4.9, - "reviews": 42, - "location": "Da Nang, Vietnam", - "price": 1000, - "originalPrice": 1300, - "image": "https://images.unsplash.com/photo-1551698618-1dfe5d97d256?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Inline Skating Adventure", - "rating": 4.6, - "reviews": 29, - "location": "Nha Trang, Vietnam", - "price": 1080, - "originalPrice": 1380, - "image": "https://images.unsplash.com/photo-1560188892-1e82f893dae7?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Skateboarding" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Skate park" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Practice session" - } - ], - "overlayInfo": { - "location": "Vietnam", - "season": "Summer", - "languages": "EN & VN" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "8 Days 7 Nights", - "tickets": "$42/46" - }, - "sections": { - "overview": { - "intro": "Shred and roll at our Skating Camp in Vietnam! Whether you prefer skateboarding, inline skating, or roller skating, our professional coaches help you develop skills, style, and confidence on wheels.", - "mainText": "The Skating Camp welcomes young skaters aged 12 to 18 for an action-packed experience in Vietnam. Our campus features quality skate facilities including ramps, rails, and smooth surfaces for all skating styles. From beginners learning balance to advanced skaters perfecting tricks, everyone progresses at their own pace.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels welcome", - "Professional skating coaches", - "Skateboarding, inline & roller skating", - "Modern skate park facilities", - "Sports campus accommodation", - "24/7 supervision and care", - "Safety gear provided", - "Video analysis of techniques" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Skating Camp is located on a modern sports campus in Vietnam featuring dedicated skate facilities. The campus includes an indoor and outdoor skate park with ramps, half-pipes, rails, and smooth concrete areas. Between sessions, enjoy the campus amenities and explore local Vietnamese culture.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Skater-Friendly Campus", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in comfortable campus dormitories close to the skate facilities. Rest up and get ready to shred!" - ], - "outroText": [ - "🛹 Skater Dorms: Shared rooms for 4-6 campers with gear storage areas.", - "🏢 Premium Rooms: Smaller rooms for 2-3 campers. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Secure equipment storage areas available.", - "Staff available around the clock!", - "Good to know:", - "Bring your own skateboard or use camp-provided equipment.", - "All safety gear is provided – helmets, pads, wrist guards.", - "Reserve your room during registration!" - ], - "principles": [ - "Beginner Skaters (12–14 years)", - "Intermediate Skaters (14–16 years)", - "Advanced Skaters (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Progress at Your Own Pace!", - "introText": [ - "Our skating program caters to all levels and styles, with professional coaches providing personalized instruction and progressive skill development." - ], - "quote": "", - "outroText": [ - "Find Your Style!", - "Whether you're into street skating, park, or freestyle, our coaches help you develop your unique skating identity.", - "Film Your Progress!", - "We capture your sessions on video for technique analysis and to create lasting memories of your achievements." - ], - "mainHeading": "Build skills, confidence, and style!", - "principles": [ - "Fundamentals: Balance, pushing, stopping, and turning – build your foundation!", - "Skill Development: Tricks, drops, ramps, and rails – challenge yourself!", - "Style & Expression: Develop your personal skating style and creative expression!" - ], - "footerText": [ - "Every session brings new challenges, new achievements, and new friends who share your passion for skating!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your skating with nutritious Vietnamese and international cuisine. Our cafeteria serves balanced meals designed for active athletes.", - "items": [ - { - "title": "Breakfast", - "desc": "Energizing breakfast with Vietnamese and Western options to start your skating day." - }, - { - "title": "Lunch", - "desc": "Fresh and satisfying Vietnamese cuisine with plenty of energy-boosting foods." - }, - { - "title": "Dinner", - "desc": "Delicious evening meals to recover and refuel after a day of skating." - }, - { - "title": "Skater Snacks", - "desc": "Energy snacks, fresh fruits, and drinks available during session breaks." - } - ], - "footer": "Good nutrition supports athletic performance. Our meals are designed to keep you energized for skating!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Professional Skating Coaches", - "quote": "", - "mainHeading": "", - "introText": [ - "Our coaching team includes experienced skaters and certified instructors who are passionate about sharing their skills with young people.", - "All coaches are trained in first aid and skate-specific injury prevention." - ], - "footerText": [ - "With a camper-to-coach ratio of 1:6, every skater receives personalized attention and progression guidance.", - "Our bilingual team ensures clear instruction and a welcoming environment for all participants." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Skating involves physical activity with fall risk. Our insurance package covers all skating activities and provides comprehensive protection for participants.", - "package": { - "title": "Action Sports Insurance", - "desc": "Complete coverage for skating activities, falls, and related camp programs.", - "items": [ - "Skating injury coverage", - "Equipment protection", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full refund available" - ] - } - } - } - } - }, - { - "name": "Soccer", - "price": 495, - "priceText": "from 495 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "malaysia" - ], - "image": "/uploads/activity/b16.jpg", - "link": "/soccer", - "program": "soccer", - "rating": 3, - "camp-detail": { - "hero": { - "title": "Soccer Camp in Malaysia", - "bgImage": "/uploads/activity/b16.jpg" - }, - "basicInfo": { - "location": "Malaysia", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Sports Academy & Dormitory", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & MY" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Skills Intensive Camp", - "rating": 4.9, - "reviews": 62, - "location": "Kuala Lumpur, Malaysia", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1574629810360-7efbbe195018?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Goalkeeper Specialist", - "rating": 4.8, - "reviews": 38, - "location": "Penang, Malaysia", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1517927033932-b3d18e61fb3a?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Tactical Training", - "rating": 4.7, - "reviews": 45, - "location": "Johor Bahru, Malaysia", - "price": 1250, - "originalPrice": 1550, - "image": "https://images.unsplash.com/photo-1431324155629-1a6deb1dec8d?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Elite Development", - "rating": 5, - "reviews": 52, - "location": "Selangor, Malaysia", - "price": 1500, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1579952363873-27f3bade9f55?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Soccer match" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Training session" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Team photo" - } - ], - "overlayInfo": { - "location": "Malaysia", - "season": "Summer", - "languages": "EN & MY" - } - }, - "eventSchedule": { - "startDate": "06/20/2024", - "duration": "10 Days 9 Nights", - "tickets": "$49/52" - }, - "sections": { - "overview": { - "intro": "Take your game to the next level at our Soccer Camp in Malaysia! Train like a pro with qualified coaches, develop technical skills, and compete in matches while making friends from around the world.", - "mainText": "The Soccer Camp offers young players aged 12 to 18 intensive football training in a professional academy setting in Malaysia. Our certified coaches focus on technical skills, tactical understanding, physical fitness, and mental strength to develop complete players who love the beautiful game.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels welcome", - "Licensed FA-qualified coaches", - "Professional training facilities", - "Position-specific training available", - "Academy dormitory accommodation", - "24/7 supervision and care", - "Daily matches and tournaments", - "Video analysis sessions" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Soccer Camp is based at a professional football academy in Malaysia, featuring world-class training facilities. The campus includes multiple natural grass and artificial turf pitches, a fully equipped gymnasium, and analysis rooms. The tropical climate allows for year-round outdoor training in excellent conditions.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Academy Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Experience life as a football academy player in our modern dormitories, designed for athletes with recovery and preparation in mind." - ], - "outroText": [ - "⚽ Player Dorms: Shared rooms for 4-6 players with kit storage and relaxation areas.", - "🏅 Elite Rooms: Premium rooms for 2-3 players with enhanced amenities. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Kit washing and boot room facilities available.", - "Physio and medical support on site!", - "Good to know:", - "Bring your own boots – we recommend studs and turfs.", - "Training kit is provided for camp activities.", - "Reserve your accommodation during registration!" - ], - "principles": [ - "Junior Players (12–14 years)", - "Development Players (14–16 years)", - "Advanced Players (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Train Like a Pro!", - "introText": [ - "Our comprehensive training program develops all aspects of the modern footballer – technical skills, tactical intelligence, physical conditioning, and mental strength." - ], - "quote": "", - "outroText": [ - "Learn from the Best!", - "Our coaching team includes UEFA and AFC licensed coaches with professional playing and coaching experience.", - "Compete Every Day!", - "Applied training through daily small-sided games and full matches reinforces skills in competitive situations." - ], - "mainHeading": "Develop every aspect of your game!", - "principles": [ - "Technical Skills: Ball mastery, passing, shooting, dribbling – perfect your fundamentals!", - "Tactical Understanding: Positioning, movement, team play, and game intelligence!", - "Physical & Mental: Fitness, agility, confidence, and competitive mentality!" - ], - "footerText": [ - "Every session brings improvement – return home a more complete player ready to excel in your team!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your performance with athlete-focused nutrition. Our kitchen prepares meals designed for football players, with the right balance of carbohydrates, proteins, and nutrients for training and recovery.", - "items": [ - { - "title": "Breakfast", - "desc": "High-energy breakfast with proteins, carbohydrates, and fruits to fuel morning training sessions." - }, - { - "title": "Lunch", - "desc": "Recovery-focused lunch with Malaysian and international options, balanced for athlete needs." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals to repair and rebuild after intensive training days." - }, - { - "title": "Training Snacks", - "desc": "Energy snacks, recovery drinks, and hydration available during and after sessions." - } - ], - "footer": "Proper nutrition is crucial for athletic performance. Our sport-science-based menu supports your training goals!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Licensed Coaches & Support Staff", - "quote": "", - "mainHeading": "", - "introText": [ - "Our coaching team includes AFC and UEFA licensed coaches with professional experience at elite levels.", - "Support staff includes physiotherapists, fitness coaches, and goalkeeper specialists." - ], - "footerText": [ - "With a player-to-coach ratio of 1:8, every footballer receives personalized attention and feedback.", - "Video analysis helps players understand their development and areas for improvement." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Football involves physical contact and injury risk. Our comprehensive sports insurance protects all participants during training, matches, and camp activities.", - "package": { - "title": "Sports Activity Insurance", - "desc": "Complete coverage for all football activities and related camp programs.", - "items": [ - "Football injury coverage", - "Physiotherapy treatment included", - "Medical coverage for all activities" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for injury or unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers injury and medical issues", - "Full refund available" - ] - } - } - } - } - }, - { - "name": "Space Exploration", - "price": 595, - "priceText": "from 595 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "china" - ], - "image": "/uploads/activity/b17.jpg", - "link": "/space-exploration", - "program": "space", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Space Exploration Camp in China", - "bgImage": "/uploads/activity/b17.jpg" - }, - "basicInfo": { - "location": "China", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Space Center Campus", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & CN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Astronaut Training Experience", - "rating": 5, - "reviews": 68, - "location": "Beijing, China", - "price": 1800, - "originalPrice": 2200, - "image": "https://images.unsplash.com/photo-1446776811953-b23d57bd21aa?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Rocket Science Workshop", - "rating": 4.9, - "reviews": 52, - "location": "Shanghai, China", - "price": 1700, - "originalPrice": 2100, - "image": "https://images.unsplash.com/photo-1517976487492-5750f3195933?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Telescope & Stargazing", - "rating": 4.8, - "reviews": 45, - "location": "Xi'an, China", - "price": 1500, - "originalPrice": 1900, - "image": "https://images.unsplash.com/photo-1419242902214-272b3f66ee7a?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Mars Mission Simulation", - "rating": 4.9, - "reviews": 58, - "location": "Wuhan, China", - "price": 1900, - "originalPrice": 2300, - "image": "https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Space center" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Telescope" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Rocket model" - } - ], - "overlayInfo": { - "location": "China", - "season": "Summer", - "languages": "EN & CN" - } - }, - "eventSchedule": { - "startDate": "07/05/2024", - "duration": "10 Days 9 Nights", - "tickets": "$59/65" - }, - "sections": { - "overview": { - "intro": "Blast off into the wonders of the universe at our Space Exploration Camp in China! Experience astronaut training simulations, build rockets, explore the night sky, and learn about humanity's journey to the stars.", - "mainText": "The Space Exploration Camp offers young scientists aged 12 to 18 an immersive journey into astronomy, space science, and astronautics. From planetarium visits to hands-on rocket building, telescope observations to mission simulations, campers explore the cosmos while developing STEM skills and scientific thinking.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all interest levels welcome", - "Professional astronomers and educators", - "Planetarium and observatory visits", - "Model rocket building and launching", - "Space Center campus accommodation", - "24/7 supervision and care", - "Night sky observation sessions", - "STEM certificate of completion" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Space Exploration Camp is based at a dedicated science and space education center in China. The facility includes a planetarium, telescope observatory, spacecraft simulators, and hands-on science labs. The location features minimal light pollution for optimal stargazing conditions and access to China's space exploration heritage.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Space Center Campus Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay on the space center campus in comfortable, modern dormitories designed for young scientists and explorers." - ], - "outroText": [ - "🚀 Explorer Dorms: Shared rooms for 4-6 campers with astronomy-themed decor.", - "🌟 Astronaut Quarters: Premium rooms for 2-3 campers with stargazing terrace access. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Evening observatory access for stargazing.", - "Science library and resource center available!", - "Good to know:", - "Bring warm layers for cool evening observation sessions.", - "Notebooks and writing materials recommended.", - "Reserve your space quarters during registration!" - ], - "principles": [ - "Junior Explorers (12–14 years)", - "Teen Scientists (14–16 years)", - "Advanced Astronomers (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Explore the Final Frontier!", - "introText": [ - "Our comprehensive space science program combines lectures, hands-on projects, observations, and simulations to ignite a lifelong passion for space exploration." - ], - "quote": "", - "outroText": [ - "Learn from Real Scientists!", - "Our educators include astronomers, aerospace engineers, and space enthusiasts who bring the wonder of the cosmos to life.", - "Build and Launch!", - "Design and build your own model rocket, then experience the thrill of launch day!" - ], - "mainHeading": "From Earth to the stars – an incredible journey!", - "principles": [ - "Astronomy: Stars, planets, galaxies, and cosmic phenomena – explore the universe!", - "Space Science: Rockets, satellites, space missions, and astronaut training!", - "Hands-On Projects: Rocket building, telescope use, and planetarium experiences!" - ], - "footerText": [ - "Leave camp with a deeper understanding of the universe and your place in the cosmic story!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Enjoy nutritious Chinese and international cuisine in our campus cafeteria. Special 'astronaut food' experiences are included as part of the space exploration theme!", - "items": [ - { - "title": "Breakfast", - "desc": "Energizing breakfast with Chinese and Western options to fuel your day of exploration." - }, - { - "title": "Lunch", - "desc": "Delicious campus meals featuring Chinese cuisine and international options." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals before evening observation sessions and activities." - }, - { - "title": "Space Snacks", - "desc": "Including real freeze-dried astronaut food experiences and healthy regular snacks!" - } - ], - "footer": "Experience eating like an astronaut while learning about the challenges of food in space!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Scientists & Space Educators", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team includes astronomers, physics educators, and space science enthusiasts with degrees and experience in their fields.", - "All staff are passionate about sharing the wonder of space with young people." - ], - "footerText": [ - "With a camper-to-educator ratio of 1:8, every participant receives personalized attention and can ask all their cosmic questions.", - "Our bilingual team ensures understanding for speakers of all language backgrounds." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All space camp activities are covered by comprehensive insurance, including rocket launches (conducted under strict safety protocols) and all educational activities.", - "package": { - "title": "STEM Camp Insurance", - "desc": "Complete coverage for all space camp activities and educational programs.", - "items": [ - "All activities coverage", - "Equipment use protection", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full refund of program fees" - ] - } - } - } - } - }, - { - "name": "Spanish Camps", - "price": 595, - "priceText": "from 595 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "portugal" - ], - "image": "/uploads/banner/b14.jpg", - "link": "/spanish-camps", - "program": "spanish", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Spanish Language Camp in Portugal", - "bgImage": "/uploads/banner/b14.jpg" - }, - "basicInfo": { - "location": "Portugal", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Language School Campus", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Spanish & English" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Spanish Intensive Lisboa", - "rating": 4.9, - "reviews": 48, - "location": "Lisbon, Portugal", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1555881400-74d7acaacd8b?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Conversation & Culture", - "rating": 4.8, - "reviews": 42, - "location": "Porto, Portugal", - "price": 1350, - "originalPrice": 1650, - "image": "https://images.unsplash.com/photo-1558642452-9d2a7deb7f62?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Spanish Beach Camp", - "rating": 4.9, - "reviews": 52, - "location": "Algarve, Portugal", - "price": 1450, - "originalPrice": 1750, - "image": "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Medieval Spanish Tours", - "rating": 4.7, - "reviews": 35, - "location": "Sintra, Portugal", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1548625149-fc4a29cf7092?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Spanish class" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Cultural activity" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Portugal scenery" - } - ], - "overlayInfo": { - "location": "Portugal", - "season": "Summer", - "languages": "Spanish & EN" - } - }, - "eventSchedule": { - "startDate": "07/01/2024", - "duration": "12 Days 11 Nights", - "tickets": "$59/65" - }, - "sections": { - "overview": { - "intro": "¡Aprende español! Our Spanish Language Camp in Portugal offers immersive Spanish learning in a beautiful Iberian Peninsula setting. Combine language classes with cultural experiences and make friends from around the world.", - "mainText": "The Spanish Language Camp welcomes students aged 12 to 18 for an intensive yet fun Spanish learning experience. Native Spanish-speaking instructors lead interactive classes while excursions and activities provide constant opportunities for real-world practice in this bilingual region where Spanish and Portuguese cultures meet.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all Spanish levels welcome", - "Native Spanish-speaking instructors", - "Small interactive class sizes", - "Cultural excursions included", - "Campus accommodation", - "24/7 care and language support", - "Certificate of achievement", - "Iberian cultural experiences" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Spanish Camp is located on a beautiful language school campus in Portugal, near the Spanish border. The Iberian Peninsula setting means easy access to Spanish culture while enjoying Portugal's stunning scenery. Excursions cross into Spain for authentic immersion experiences, combining the best of both Iberian cultures.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Language Campus Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay on our language school campus in comfortable dormitories designed for language learners, with plenty of social spaces for practicing Spanish with new friends." - ], - "outroText": [ - "🇪🇸 Language Dorms: Shared rooms with Spanish-speaking environment encouraged.", - "🏠 Premium Rooms: Semi-private rooms for focused learners. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Common rooms for socializing and language practice.", - "Spanish-speaking staff encourage immersion!", - "Good to know:", - "Bring enthusiasm for speaking Spanish!", - "All textbooks and materials are provided.", - "Select your room preference during booking!" - ], - "principles": [ - "Principiante/Beginner (12–14 years)", - "Intermedio/Intermediate (14–16 years)", - "Avanzado/Advanced (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "¡Vamos a Aprender Español!", - "introText": [ - "Our Spanish program combines structured classroom learning with immersive cultural experiences, making language acquisition natural, effective, and enjoyable." - ], - "quote": "", - "outroText": [ - "¡Profesores Nativos!", - "Learn from native Spanish speakers who bring language and culture to life through engaging activities.", - "¡Práctica Real!", - "Every activity and excursion is an opportunity to practice Spanish in authentic situations." - ], - "mainHeading": "Immersive Spanish learning experience!", - "principles": [ - "Clases Matutinas: Interactive grammar, vocabulary, and conversation classes!", - "Actividades: Games, sports, and creative activities – all in Spanish!", - "Excursiones: Cultural trips to experience Spanish-speaking environments!" - ], - "footerText": [ - "¡Cada día tu español mejora! Every day your Spanish improves through immersion and fun!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "¡Buen provecho! Enjoy delicious Iberian cuisine featuring both Spanish and Portuguese influences. Mealtimes are Spanish conversation times!", - "items": [ - { - "title": "Desayuno (Breakfast)", - "desc": "Spanish-style breakfast with churros, fresh bread, fruits, and energizing beverages." - }, - { - "title": "Almuerzo (Lunch)", - "desc": "Traditional Iberian cuisine with tapas, paella, and fresh Mediterranean dishes." - }, - { - "title": "Cena (Dinner)", - "desc": "Satisfying evening meals featuring Spanish and Portuguese favorites." - }, - { - "title": "Meriendas", - "desc": "Afternoon snacks and refreshments in the Spanish tradition." - } - ], - "footer": "¡Las comidas son clase también! Meals are learning opportunities – practice ordering and conversing in Spanish!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Native Spanish Teachers & Staff", - "quote": "", - "mainHeading": "", - "introText": [ - "Our teaching team consists of native Spanish speakers with qualifications in teaching Spanish as a foreign language.", - "All staff maintain a Spanish-speaking environment while providing supportive, encouraging instruction." - ], - "footerText": [ - "With a student-to-teacher ratio of 1:8, every camper receives personal attention and language support.", - "Our multilingual staff ensure all students feel supported while maximizing Spanish practice." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "All campers are covered by comprehensive insurance throughout their Spanish learning adventure, including all excursions and activities.", - "package": { - "title": "Language Camp Insurance", - "desc": "Full coverage for all camp activities, excursions, and medical needs.", - "items": [ - "Comprehensive medical coverage", - "Excursion and travel protection", - "Personal belongings coverage" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation policy for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full refund of program fees" - ] - } - } - } - } - }, - { - "name": "Survival", - "price": 495, - "priceText": "from 495 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "vietnam" - ], - "image": "/uploads/activity/b7.jpg", - "link": "/survival", - "program": "survival", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Survival Camp in Vietnam", - "bgImage": "/uploads/activity/b7.jpg" - }, - "basicInfo": { - "location": "Vietnam", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Wilderness Camp & Shelter Building", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & VN" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Jungle Survival Basics", - "rating": 4.9, - "reviews": 52, - "location": "Cat Tien, Vietnam", - "price": 1200, - "originalPrice": 1500, - "image": "https://images.unsplash.com/photo-1504280390367-361c6d9f38f4?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Mountain Survival Skills", - "rating": 4.8, - "reviews": 45, - "location": "Sapa, Vietnam", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1475924156734-496f6cac6ec1?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Bushcraft Adventure", - "rating": 4.9, - "reviews": 48, - "location": "Ba Vi, Vietnam", - "price": 1150, - "originalPrice": 1450, - "image": "https://images.unsplash.com/photo-1510312305653-8ed496efae75?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Wilderness Navigation", - "rating": 4.7, - "reviews": 38, - "location": "Phong Nha, Vietnam", - "price": 1250, - "originalPrice": 1550, - "image": "https://images.unsplash.com/photo-1478827536114-da961b7f86d2?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Wilderness camp" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Fire making" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Shelter building" - } - ], - "overlayInfo": { - "location": "Vietnam", - "season": "Summer", - "languages": "EN & VN" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "8 Days 7 Nights", - "tickets": "$49/55" - }, - "sections": { - "overview": { - "intro": "Test your limits and learn wilderness skills at our Survival Camp in Vietnam! From shelter building to fire craft, navigation to foraging, campers develop resilience, self-reliance, and a deep connection with nature.", - "mainText": "The Survival Camp challenges young adventurers aged 12 to 18 to step out of their comfort zones and master essential wilderness skills. Under the guidance of experienced survival instructors, campers learn to thrive in the jungle, building confidence and capabilities that extend far beyond the wilderness.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, no prior experience needed", - "Certified survival and bushcraft instructors", - "Progressive skill-building curriculum", - "Shelter building and fire craft", - "Wilderness navigation training", - "24/7 supervision and safety support", - "Tropical jungle environment", - "Team challenges and solo experiences" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Survival Camp is located in the lush tropical forests of Vietnam, providing an authentic wilderness environment for learning survival skills. The diverse terrain includes jungle, streams, and varied landscapes that offer the perfect classroom for outdoor education. Safe base camps provide security while allowing genuine wilderness immersion.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Wilderness Living Experience", - "quote": "", - "mainHeading": "", - "introText": [ - "Experience progressive wilderness living – from comfortable base camp to shelters you build yourself! This is part of the survival learning experience." - ], - "outroText": [ - "🏕️ Base Camp: Start in comfortable tents with essential amenities as you learn skills.", - "🌿 Wilderness Nights: Progress to sleeping in shelters you construct – the ultimate survival experience!" - ], - "details": [ - "Base camp provides secure, comfortable starting point.", - "Emergency shelter always available for safety.", - "Experienced staff supervise all wilderness experiences!", - "Good to know:", - "Bring sturdy outdoor clothing and footwear.", - "All survival gear and tools are provided.", - "Be prepared for challenging but rewarding experiences!" - ], - "principles": [ - "Junior Survivors (12–14 years)", - "Teen Bushcraft (14–16 years)", - "Advanced Survival (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Master Wilderness Skills!", - "introText": [ - "Our survival program builds skills progressively, from fundamental techniques to complex challenges, developing confident, capable young people." - ], - "quote": "", - "outroText": [ - "Learn from Survival Experts!", - "Our instructors have extensive wilderness experience and passion for teaching outdoor skills.", - "Build Real Confidence!", - "The challenges you overcome in the wilderness translate to confidence in all areas of life." - ], - "mainHeading": "From beginner to wilderness-capable!", - "principles": [ - "Fire & Shelter: Fire-making techniques and shelter construction – the survival essentials!", - "Navigation & Foraging: Map and compass skills, natural navigation, edible plants!", - "Challenges & Expeditions: Apply your skills in team challenges and overnight experiences!" - ], - "footerText": [ - "Leave camp with skills, confidence, and memories of overcoming challenges in the wild!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Experience a range of meals from base camp cooking to outdoor food preparation. Part of survival training includes learning to prepare simple outdoor meals!", - "items": [ - { - "title": "Breakfast", - "desc": "Hearty breakfast to fuel your survival training day – prepared at base camp or over campfire." - }, - { - "title": "Lunch", - "desc": "Trail lunch and field rations during outdoor training and expeditions." - }, - { - "title": "Dinner", - "desc": "Satisfying camp dinner including some meals you help prepare over fire." - }, - { - "title": "Trail Food", - "desc": "High-energy snacks and hydration for training activities and expeditions." - } - ], - "footer": "Part of survival is learning to prepare food in the field – you'll cook some of your own meals as part of training!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Expert Survival Instructors", - "quote": "", - "mainHeading": "", - "introText": [ - "Our team includes certified survival instructors and bushcraft experts with extensive wilderness experience.", - "All staff hold wilderness first aid certifications and emergency response training." - ], - "footerText": [ - "With a camper-to-instructor ratio of 1:5, every participant receives close supervision and personalized coaching.", - "Safety personnel are always available for any wilderness emergency." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Wilderness activities require comprehensive outdoor activity insurance. Our package covers all survival training activities and outdoor experiences.", - "package": { - "title": "Wilderness Activity Insurance", - "desc": "Complete coverage for all survival training and outdoor adventure activities.", - "items": [ - "Outdoor activity coverage", - "Wilderness emergency response", - "Medical evacuation included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for medical or personal reasons.", - "items": [ - "Valid until one week before camp start", - "Covers medical and family emergencies", - "Full refund available" - ] - } - } - } - } - }, - { - "name": "Swimming", - "price": 495, - "priceText": "from 495 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "philippines" - ], - "image": "/uploads/activity/b18.jpg", - "link": "/swimming", - "program": "swimming", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Swimming Camp in Philippines", - "bgImage": "/uploads/activity/b18.jpg" - }, - "basicInfo": { - "location": "Philippines", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Aquatic Center & Resort", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & FIL" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Competitive Swim Training", - "rating": 4.9, - "reviews": 58, - "location": "Manila, Philippines", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1530549387789-4c1017266635?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Stroke Technique Intensive", - "rating": 4.8, - "reviews": 45, - "location": "Cebu, Philippines", - "price": 1250, - "originalPrice": 1550, - "image": "https://images.unsplash.com/photo-1575429198097-0414ec08e8cd?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Open Water Swimming", - "rating": 4.9, - "reviews": 42, - "location": "Boracay, Philippines", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1560090995-01632a28895b?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Learn to Swim Program", - "rating": 4.7, - "reviews": 38, - "location": "Baguio, Philippines", - "price": 1100, - "originalPrice": 1400, - "image": "https://images.unsplash.com/photo-1519315901367-f34ff9154487?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Swimming pool" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Training session" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Beach swimming" - } - ], - "overlayInfo": { - "location": "Philippines", - "season": "Summer", - "languages": "EN & FIL" - } - }, - "eventSchedule": { - "startDate": "06/20/2024", - "duration": "10 Days 9 Nights", - "tickets": "$49/55" - }, - "sections": { - "overview": { - "intro": "Make a splash at our Swimming Camp in the Philippines! Whether you're learning to swim or training for competition, our certified coaches help you improve technique, build endurance, and develop confidence in the water.", - "mainText": "The Swimming Camp offers young swimmers aged 12 to 18 professional coaching in the beautiful Philippines. From beginners building water confidence to competitive swimmers perfecting strokes, our program caters to all levels with certified instructors and excellent facilities.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all swimming levels", - "Certified swimming coaches", - "Olympic-size pool facilities", - "Stroke technique analysis", - "Resort accommodation", - "24/7 supervision and water safety", - "Open water swimming introduction", - "Video analysis of technique" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Swimming Camp is based at a premier aquatic center in the Philippines with Olympic-standard facilities. The complex features a 50-meter pool, training pools, and access to supervised open water swim areas. The tropical climate ensures warm water and perfect swimming conditions year-round.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Swimmer's Resort Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in comfortable resort accommodation just steps from the aquatic center. Rest and recover between training sessions!" - ], - "outroText": [ - "🏊 Swimmer's Lodge: Shared rooms for 4-6 swimmers with gear drying areas.", - "🌴 Poolside Suite: Premium rooms for 2-3 campers with enhanced amenities. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Swimsuit drying and cap/goggle storage available.", - "Physio and massage services available!", - "Good to know:", - "Bring multiple swimsuits, caps, and goggles.", - "All training equipment is provided.", - "Reserve your accommodation during registration!" - ], - "principles": [ - "Learn to Swim (12–14 years)", - "Intermediate Swimmers (14–16 years)", - "Competitive Training (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Improve Every Stroke!", - "introText": [ - "Our comprehensive swimming program develops technique, endurance, and speed across all four competitive strokes, with personalized coaching for every skill level." - ], - "quote": "", - "outroText": [ - "Technique-Focused Coaching!", - "Our coaches use video analysis and one-on-one instruction to refine your technique in every stroke.", - "Build Confidence & Stamina!", - "Progressive training builds both water confidence and swimming endurance." - ], - "mainHeading": "From water confidence to competitive swimming!", - "principles": [ - "Stroke Technique: Perfect your freestyle, backstroke, breaststroke, and butterfly!", - "Starts & Turns: Master racing starts and efficient turns!", - "Endurance & Speed: Build swimming fitness and race strategy!" - ], - "footerText": [ - "Every lap brings improvement – leave camp a stronger, faster, more confident swimmer!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your swimming with athlete-focused nutrition. Our kitchen prepares balanced meals designed for swimmers' unique energy and recovery needs.", - "items": [ - { - "title": "Breakfast", - "desc": "High-energy breakfast with carbohydrates, proteins, and fruits to fuel morning training." - }, - { - "title": "Lunch", - "desc": "Recovery-focused Filipino and international cuisine with balanced nutrition." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals to repair muscles and prepare for the next day's training." - }, - { - "title": "Poolside Snacks", - "desc": "Energy drinks, fruits, and recovery snacks available between pool sessions." - } - ], - "footer": "Swimmers have unique nutritional needs. Our menu is designed to optimize training and recovery!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Professional Swimming Coaches", - "quote": "", - "mainHeading": "", - "introText": [ - "Our coaching team includes certified swimming instructors with competitive coaching experience and expertise in stroke technique development.", - "All coaches hold current lifeguarding certifications and first aid training." - ], - "footerText": [ - "With a swimmer-to-coach ratio of 1:6, every participant receives personalized attention and technique feedback.", - "Lifeguards are present during all pool sessions for additional safety." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Swimming activities require proper water safety coverage. Our insurance protects all participants during pool training, open water sessions, and all camp activities.", - "package": { - "title": "Aquatic Sports Insurance", - "desc": "Complete coverage for all swimming activities and water-based training.", - "items": [ - "Pool and open water coverage", - "Training injury protection", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for medical or ability concerns.", - "items": [ - "Valid until one week before camp start", - "Covers medical issues and ability concerns", - "Full refund available" - ] - } - } - } - } - }, - { - "name": "Tennis", - "price": 495, - "priceText": "from 495 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "malaysia" - ], - "image": "/uploads/activity/b15.jpg", - "link": "/tennis", - "program": "tennis", - "rating": 4, - "camp-detail": { - "hero": { - "title": "Tennis Camp in Malaysia", - "bgImage": "/uploads/activity/b15.jpg" - }, - "basicInfo": { - "location": "Malaysia", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Tennis Academy & Resort", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & MY" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Intensive Tennis Training", - "rating": 4.9, - "reviews": 52, - "location": "Kuala Lumpur, Malaysia", - "price": 1400, - "originalPrice": 1700, - "image": "https://images.unsplash.com/photo-1622279457486-62dcc4a431d6?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Beginner Tennis Academy", - "rating": 4.8, - "reviews": 45, - "location": "Penang, Malaysia", - "price": 1250, - "originalPrice": 1550, - "image": "https://images.unsplash.com/photo-1551773188-0801da12ddae?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Match Play Intensive", - "rating": 4.8, - "reviews": 42, - "location": "Langkawi, Malaysia", - "price": 1500, - "originalPrice": 1800, - "image": "https://images.unsplash.com/photo-1545809074-59472b3f5ecc?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Junior Development Camp", - "rating": 4.7, - "reviews": 38, - "location": "Johor Bahru, Malaysia", - "price": 1300, - "originalPrice": 1600, - "image": "https://images.unsplash.com/photo-1595435934249-5df7ed86e1c0?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Tennis court" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Training session" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Match play" - } - ], - "overlayInfo": { - "location": "Malaysia", - "season": "Summer", - "languages": "EN & MY" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "10 Days 9 Nights", - "tickets": "$49/55" - }, - "sections": { - "overview": { - "intro": "Ace your game at our Tennis Camp in Malaysia! Train on professional courts with certified coaches who help you develop technique, tactics, and match play skills in a fun, encouraging environment.", - "mainText": "The Tennis Camp offers young players aged 12 to 18 intensive coaching in Malaysia's premier tennis facilities. Whether you're picking up a racket for the first time or competing at junior level, our coaches provide personalized instruction to help you reach your potential on the court.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels welcome", - "Certified professional tennis coaches", - "Multiple court surfaces available", - "Technical and tactical training", - "Academy resort accommodation", - "24/7 supervision and care", - "Daily match play and tournaments", - "Video analysis sessions" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Tennis Camp is based at a professional tennis academy in Malaysia, featuring multiple courts on various surfaces. The facility includes hard courts, covered courts for rain protection, and excellent supporting facilities. The tropical climate is ideal for year-round tennis, with covered courts ensuring training continues in any weather.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Academy Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay on campus in comfortable accommodation designed for tennis players, with easy access to courts and training facilities." - ], - "outroText": [ - "🎾 Player Dorms: Shared rooms for 4-6 players with racket storage.", - "🏆 Elite Rooms: Premium rooms for 2-3 players with enhanced amenities. (Additional charge applies)" - ], - "details": [ - "All rooms feature air conditioning and comfortable beds.", - "Racket stringing and equipment shop on site.", - "Physio and sports massage available!", - "Good to know:", - "Bring your own racket or use academy equipment.", - "Extra strings and grips available for purchase.", - "Reserve your accommodation during registration!" - ], - "principles": [ - "Beginner Players (12–14 years)", - "Intermediate Players (14–16 years)", - "Advanced Players (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Develop Your Complete Game!", - "introText": [ - "Our comprehensive tennis program develops all aspects of the modern game – groundstrokes, net play, serving, and tactical awareness – through expert coaching and plenty of match play." - ], - "quote": "", - "outroText": [ - "Technical Excellence!", - "Our coaches break down each stroke to build technically sound, powerful, and consistent shots.", - "Match Play Focus!", - "Daily match play and tournaments help you apply your skills in competitive situations." - ], - "mainHeading": "From fundamentals to match winning!", - "principles": [ - "Stroke Production: Perfect your forehand, backhand, serve, and volleys!", - "Movement & Fitness: Footwork, agility, and tennis-specific conditioning!", - "Tactics & Match Play: Singles and doubles strategies, point construction!" - ], - "footerText": [ - "Every session builds your skills – return home a more complete tennis player!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your tennis with athlete-focused nutrition. Our kitchen prepares balanced meals designed for the energy demands of intensive tennis training.", - "items": [ - { - "title": "Breakfast", - "desc": "High-energy breakfast with carbohydrates, proteins, and fruits to power morning training." - }, - { - "title": "Lunch", - "desc": "Balanced Malaysian and international meals for recovery and afternoon sessions." - }, - { - "title": "Dinner", - "desc": "Satisfying evening meals to repair and prepare for the next day on court." - }, - { - "title": "Court-side Snacks", - "desc": "Energy bars, fruits, and sports drinks available during training breaks." - } - ], - "footer": "Tennis requires sustained energy. Our nutrition plan keeps you performing at your best on court!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Professional Tennis Coaches", - "quote": "", - "mainHeading": "", - "introText": [ - "Our coaching team includes certified professionals with competitive playing experience and expertise in junior player development.", - "Coaches are trained in the latest tennis methodology and use video analysis for effective feedback." - ], - "footerText": [ - "With a player-to-coach ratio of 1:4 on court, every player receives personalized attention and instruction.", - "Hitting partners and ball machine practice supplement coach-led sessions." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Tennis is a physically demanding sport. Our insurance protects all participants during training, match play, and all camp activities.", - "package": { - "title": "Sports Activity Insurance", - "desc": "Complete coverage for all tennis activities and related camp programs.", - "items": [ - "Tennis injury coverage", - "Physiotherapy access", - "Medical coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for injury or unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers injury and medical issues", - "Full refund available" - ] - } - } - } - } - }, - { - "name": "Windsurfing", - "price": 990, - "priceText": "from 990 USD", - "season": [ - "summer" - ], - "age": [ - 12, - 18 - ], - "locations": [ - "thailand" - ], - "image": "/uploads/activity/b13.jpg", - "link": "/windsurfing", - "program": "windsurf", - "rating": 5, - "camp-detail": { - "hero": { - "title": "Windsurfing Camp in Thailand", - "bgImage": "/uploads/activity/b13.jpg" - }, - "basicInfo": { - "location": "Thailand", - "ageRange": "12 - 18 years\nSeparated by age groups", - "accommodationType": "Beach Resort & Water Sports Center", - "careLevel": "Around-the-Clock Care & All Meals Included", - "languages": "Bilingual\nEN & TH" - }, - "sidebar": { - "contact": { - "phone": "+(123)-456-789", - "email": "hello@ggcamp.org" - }, - "menuItems": [ - { - "name": "Overview", - "href": "#overview" - }, - { - "name": "Location", - "href": "#location" - }, - { - "name": "Accommodation Options", - "href": "#accommodation" - }, - { - "name": "Program", - "href": "#program" - }, - { - "name": "Meals On Site", - "href": "#meals" - }, - { - "name": "Team and Supervision", - "href": "#team" - }, - { - "name": "Coverage and Insurance", - "href": "#coverage" - } - ], - "upcomingTours": [ - { - "id": 1, - "title": "Beginner Windsurfing Course", - "rating": 4.9, - "reviews": 52, - "location": "Phuket, Thailand", - "price": 2100, - "originalPrice": 2500, - "image": "https://images.unsplash.com/photo-1505118380757-91f5f5632de0?w=400&h=300&fit=crop" - }, - { - "id": 2, - "title": "Intermediate Windsurfing", - "rating": 4.8, - "reviews": 45, - "location": "Koh Samui, Thailand", - "price": 2200, - "originalPrice": 2600, - "image": "https://images.unsplash.com/photo-1515722661952-9893f0251db6?w=400&h=300&fit=crop" - }, - { - "id": 3, - "title": "Advanced Wind Techniques", - "rating": 5, - "reviews": 48, - "location": "Hua Hin, Thailand", - "price": 2400, - "originalPrice": 2800, - "image": "https://images.unsplash.com/photo-1538428494232-9c0d8a3ab403?w=400&h=300&fit=crop" - }, - { - "id": 4, - "title": "Island Windsurfing Safari", - "rating": 4.9, - "reviews": 42, - "location": "Krabi, Thailand", - "price": 2300, - "originalPrice": 2700, - "image": "https://images.unsplash.com/photo-1517649763962-0c623066013b?w=400&h=300&fit=crop" - } - ] - }, - "mainGallery": { - "slides": [ - { - "url": "/uploads/banner/b1.jpg", - "alt": "Windsurfing" - }, - { - "url": "/uploads/banner/b2.jpg", - "alt": "Beach" - }, - { - "url": "/uploads/banner/b3.jpg", - "alt": "Equipment" - } - ], - "overlayInfo": { - "location": "Thailand", - "season": "Summer", - "languages": "EN & TH" - } - }, - "eventSchedule": { - "startDate": "06/25/2024", - "duration": "10 Days 9 Nights", - "tickets": "$99/105" - }, - "sections": { - "overview": { - "intro": "Catch the wind at our Windsurfing Camp in Thailand! Learn to harness the power of wind and waves in the stunning Andaman Sea, from first-time board standing to advanced planing and maneuvers.", - "mainText": "The Windsurfing Camp offers young water sports enthusiasts aged 12 to 18 an exhilarating introduction to windsurfing in Thailand's ideal conditions. With consistent trade winds, warm water, and certified instructors, campers progress rapidly while enjoying one of the world's most exciting water sports.", - "featuresTitle": "Key features", - "features": [ - "Ages 12–18, all skill levels from beginner to advanced", - "Certified windsurfing instructors", - "Modern equipment for all conditions", - "Progressive skill-based curriculum", - "Beach resort accommodation", - "24/7 supervision and water safety", - "International certification available", - "Beach lifestyle and activities" - ], - "featureImage": "/uploads/banner/b4.jpg" - }, - "location": { - "title": "Location", - "description": "Our Windsurfing Camp is located on a beautiful beach in Thailand, known for excellent and consistent wind conditions. The shallow, warm waters provide safe learning conditions for beginners, while stronger winds offshore challenge advanced sailors. The stunning tropical setting makes every session an adventure.", - "images": [ - "/uploads/banner/b5.jpg", - "/uploads/banner/b6.jpg" - ] - }, - "accommodation": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Accommodation Options", - "subtitle": "Beachfront Living", - "quote": "", - "mainHeading": "", - "introText": [ - "Stay in comfortable beach resort accommodation just steps from the windsurfing center. Watch the conditions from your room and be first on the water!" - ], - "outroText": [ - "🏄 Windsurfer's Bungalow: Shared beachfront cabins for 4-6 campers.", - "🌊 Beach Suite: Premium beachfront rooms for 2-3 campers. (Additional charge applies)" - ], - "details": [ - "All accommodations feature fans/AC and comfortable beds.", - "Outdoor gear rinse and drying areas available.", - "Equipment storage at the water sports center!", - "Good to know:", - "Bring swimwear, reef-safe sunscreen, and beach footwear.", - "All windsurfing equipment is provided.", - "Reserve your beach accommodation during booking!" - ], - "principles": [ - "Beginner Windsurfers (12–14 years)", - "Intermediate Sailors (14–16 years)", - "Advanced Riders (16–18 years)" - ] - }, - "program": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Program", - "subtitle": "Ride the Wind!", - "introText": [ - "Our progressive windsurfing program takes you from understanding equipment to riding confidently, with opportunities for certification and advanced techniques." - ], - "quote": "", - "outroText": [ - "Perfect Conditions!", - "Thailand's consistent winds and warm waters provide ideal learning conditions throughout the season.", - "Earn Your Certificate!", - "Progress through levels and earn your internationally recognized windsurfing certification." - ], - "mainHeading": "From beach start to full planing!", - "principles": [ - "Fundamentals: Board balance, sail control, and basic sailing techniques!", - "Intermediate Skills: Beach starts, harness use, and directional control!", - "Advanced Techniques: Planing, foot straps, and high-performance sailing!" - ], - "footerText": [ - "Every session on the water builds skills and confidence – feel the thrill of gliding with the wind!" - ] - }, - "meals": { - "title": "Meals On Site", - "description": "Fuel your windsurfing with delicious Thai and international cuisine. Our beach restaurant serves nutritious meals designed for active water sports participants.", - "items": [ - { - "title": "Breakfast", - "desc": "Energizing breakfast with Thai and Western options to fuel morning sessions on the water." - }, - { - "title": "Lunch", - "desc": "Fresh Thai seafood and international dishes to refuel after morning windsurfing." - }, - { - "title": "Dinner", - "desc": "Sunset dinners at the beach restaurant featuring authentic Thai cuisine." - }, - { - "title": "Beach Snacks", - "desc": "Fresh coconuts, tropical fruits, and hydrating drinks between sessions." - } - ], - "footer": "Enjoy the beach lifestyle with delicious food and beautiful sunset views after windsurfing!" - }, - "team": { - "heroImage": "/uploads/banner/b9.jpg", - "title": "Team and Supervision", - "subtitle": "Certified Windsurfing Instructors", - "quote": "", - "mainHeading": "", - "introText": [ - "Our windsurfing team includes internationally certified instructors with years of teaching and sailing experience.", - "All instructors hold water safety certifications and are trained in rescue techniques." - ], - "footerText": [ - "With a camper-to-instructor ratio of 1:4 on the water, every participant receives personalized coaching.", - "Safety boats accompany all sessions for immediate assistance if needed." - ] - }, - "insurance": { - "title": "Coverage and Insurance", - "description": "Water sports require comprehensive coverage. Our insurance package protects all participants during windsurfing sessions and related activities.", - "package": { - "title": "Water Sports Insurance", - "desc": "Complete coverage for all windsurfing activities and water-based sessions.", - "items": [ - "Windsurfing activity coverage", - "Equipment use protection", - "Water rescue coverage included" - ] - }, - "cancellation": { - "title": "Travel Cancellation Guarantee", - "desc": "Flexible cancellation for unforeseen circumstances.", - "items": [ - "Valid until one week before camp start", - "Covers medical and emergency situations", - "Full refund of program fees" - ] - } - } - } - } - } - ] -} diff --git a/data/appointment.json b/data/appointment.json deleted file mode 100644 index a8f2cf2..0000000 --- a/data/appointment.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "hero": { - "title": "Make Appointment", - "backgroundImage": "/assets/img/inner-page/breadcrumb.jpg", - "subtitle": "About Our Consultancy", - "heading": "Want to meet us for your need?", - "description": "24/7 customer support is always ready to answer all your questions" - }, - "visaOptions": [ - "Canada Immigration", - "Tourist Visa", - "Medical Visa", - "Coaching", - "Student Visa", - "Spouse Visa", - "Job Opportunity", - "Exam" - ], - "form": { - "heading": "Request Appointment", - "fields": [ - { - "name": "name", - "label": "Your Name", - "type": "text", - "placeholder": "Your name", - "required": true, - "colClass": "col-lg-4" - }, - { - "name": "email", - "label": "Your Email", - "type": "email", - "placeholder": "Your email", - "required": true, - "colClass": "col-lg-4" - }, - { - "name": "phone", - "label": "Your Phone", - "type": "tel", - "placeholder": "Phone Number", - "required": false, - "colClass": "col-lg-4" - }, - { - "name": "address", - "label": "Your Address", - "type": "text", - "placeholder": "Your address", - "required": false, - "colClass": "col-lg-6" - }, - { - "name": "appointmentDate", - "label": "Appointment Date", - "type": "date", - "placeholder": "", - "required": false, - "colClass": "col-lg-6" - }, - { - "name": "message", - "label": "Your Message", - "type": "textarea", - "placeholder": "Type your message", - "required": false, - "colClass": "col-lg-12" - } - ], - "submitButton": { - "text": "Request Appointment", - "icon": "fa-solid fa-arrow-right", - "buttonClass": "theme-btn" - } - } -} \ No newline at end of file diff --git a/data/booking.json b/data/booking.json deleted file mode 100644 index ccb2965..0000000 --- a/data/booking.json +++ /dev/null @@ -1,690 +0,0 @@ -{ - "hero": { - "title": "Booking", - "backgroundImage": "/uploads/booking/b13.jpg" - }, - "searchBar": { - "locationLabel": "Location", - "holidaySeasonLabel": "Holiday Season", - "searchButtonText": "Search" - }, - "filterPanel": { - "title": "FIND YOUR CAMP!", - "priceTitle": "Price", - "priceLabel": "Maximum Price (USD)", - "pricePlaceholder": "Enter max price", - "priceMin": 0, - "priceMax": 2000, - "activitiesTitle": "Activities", - "ageTitle": "AGE", - "ageSelectPlaceholder": "Select age", - "ageMin": 7, - "ageMax": 18, - "ratingTitle": "RATING WISE", - "ratingOptions": [ - { "value": "", "label": "All Ratings" }, - { "value": "5", "label": "5 Stars" }, - { "value": "4", "label": "4 Stars & Up" }, - { "value": "3", "label": "3 Stars & Up" }, - { "value": "2", "label": "2 Stars & Up" }, - { "value": "1", "label": "1 Star & Up" } - ], - "resetButtonText": "Reset" - }, - "programs": [ - { "value": "adventure", "label": "Adventure, Sports & Creative" }, - { "value": "arts-crafts", "label": "Arts & Crafts" }, - { "value": "climbing", "label": "Climbing" }, - { "value": "dancing", "label": "Dancing" }, - { "value": "diving", "label": "Diving" }, - { "value": "englisch-camps", "label": "Englischcamps" }, - { "value": "englisch-toefl", "label": "Englisch TOEFL©" }, - { "value": "fishing", "label": "Fishing" }, - { "value": "german-camps", "label": "German Camps" }, - { "value": "horseback", "label": "Horseback Riding" }, - { "value": "husky", "label": "Husky Camp" }, - { "value": "icit", "label": "International Counsellor in Training (ICIT)" }, - { "value": "lifeguarding", "label": "Lifeguarding" }, - { "value": "language", "label": "Language" }, - { "value": "leadership", "label": "Leadership" }, - { "value": "multi-water", "label": "Multi Water Adventure" }, - { "value": "sailing", "label": "Sailing" }, - { "value": "skating", "label": "Skating" }, - { "value": "soccer", "label": "Soccer" }, - { "value": "space", "label": "Space Exploration" }, - { "value": "spanish", "label": "Spanishcourse" }, - { "value": "survival", "label": "Survival" }, - { "value": "swimming", "label": "Swimming" }, - { "value": "tennis", "label": "Tennis" }, - { "value": "windsurf", "label": "Windsurfing" } - ], - "holidays": [ - { "value": "autumn", "label": "Autumn" }, - { "value": "spring", "label": "Spring" }, - { "value": "summer", "label": "Summer" } - ], - "locations": [ - { "value": "philippines", "label": "Philippines" }, - { "value": "vietnam", "label": "Vietnam" }, - { "value": "portugal", "label": "Portugal" }, - { "value": "china", "label": "China" }, - { "value": "thailand", "label": "Thailand" }, - { "value": "malaysia", "label": "Malaysia" }, - { "value": "holiday", "label": "Holiday" } - ], - "camps": [ - { - "name": "Adventure, Sports & Creative", - "price": 395, - "priceText": "from 395 USD", - "season": ["spring", "summer", "autumn"], - "age": [12, 18], - "locations": ["thailand"], - "image": "/uploads/booking/00_Abenteuercamp-Hike-533b20fa.jpg", - "link": "/activities/adventure-sports-creative", - "program": "adventure", - "rating": 5 - }, - { - "name": "Arts & Crafts", - "price": 500, - "priceText": "from 500 USD", - "season": ["spring", "summer", "autumn"], - "age": [12, 18], - "locations": ["vietnam"], - "image": "/uploads/booking/01-Kreativprogramm-in-der-Ferienfreizeit-c6e95722.jpg", - "link": "/activities/arts-crafts", - "program": "arts-crafts", - "rating": 4 - }, - { - "name": "Climbing", - "price": 515, - "priceText": "from 515 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["philippines"], - "image": "/uploads/booking/00-Kletterkurs_Sommercamp_Bayern-40f1bd8d.jpg", - "link": "/activities/climbing", - "program": "climbing", - "rating": 5 - }, - { - "name": "Dancing", - "price": 520, - "priceText": "from 520 USD", - "season": ["summer", "autumn"], - "age": [12, 18], - "locations": ["malaysia"], - "image": "/uploads/booking/00-Tanzen-im-Feriencamp-c1834fc7.jpg", - "link": "/activities/dancing", - "program": "dancing", - "rating": 4 - }, - { - "name": "Diving", - "price": 1190, - "priceText": "from 1190 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["philippines"], - "image": "/uploads/booking/01-Tauchkurs-im-Sommercamp-3309e219.jpg", - "link": "/activities/diving", - "program": "diving", - "rating": 5 - }, - { - "name": "Englisch TOEFL®", - "price": 1290, - "priceText": "from 1290 USD", - "season": ["spring", "summer"], - "age": [12, 18], - "locations": ["malaysia"], - "image": "/uploads/booking/07-Language-Camps-by-Camp-Adventure-b9f01b6a.jpg", - "link": "/activities/englisch-toefl", - "program": "englisch-toefl", - "rating": 5 - }, - { - "name": "Englischcamps", - "price": 530, - "priceText": "from 530 USD", - "season": ["spring", "summer", "autumn"], - "age": [12, 18], - "locations": ["philippines", "thailand"], - "image": "/uploads/booking/00-Language-Camps-by-Camp-Adventure-add7aa60.jpg", - "link": "/activities/englischcamps", - "program": "englisch-camps", - "rating": 4 - }, - { - "name": "Fishing", - "price": 580, - "priceText": "from 580 USD", - "season": ["spring", "summer", "autumn"], - "age": [12, 18], - "locations": ["vietnam"], - "image": "/uploads/booking/01-Angeln-im-Ferienlager-02243939.jpg", - "link": "/activities/fishing", - "program": "fishing", - "rating": 4 - }, - { - "name": "German Camps", - "price": 610, - "priceText": "from 610 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["thailand", "vietnam"], - "image": "/uploads/booking/Deutschcamps-in-Deutschland-0ed3ea07.jpg", - "link": "/activities/german-camps", - "program": "german-camps", - "rating": 4 - }, - { - "name": "Horseback Riding", - "price": 620, - "priceText": "from 620 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["portugal"], - "image": "/uploads/booking/00-Reiten-Sommercamp-Ausritt-6930f841.jpg", - "link": "/activities/horseback-riding", - "program": "horseback", - "rating": 5 - }, - { - "name": "Husky Camp", - "price": 525, - "priceText": "from 525 USD", - "season": ["spring", "summer", "autumn"], - "age": [12, 18], - "locations": ["china"], - "image": "/uploads/booking/00-Husky20Camp_sommercamp20mit20Hunden-9c098a17.jpg", - "link": "/activities/husky-camp", - "program": "husky", - "rating": 5 - }, - { - "name": "International Counsellor in Training (ICIT)", - "price": 995, - "priceText": "from 995 USD", - "season": ["summer"], - "age": [16, 18], - "locations": ["thailand", "malaysia"], - "image": "/uploads/booking/00-INTERNATIONAL20COUNSELOR20IN20TRAINING_teambuilding-3b91547c.jpg", - "link": "/activities/international-counsellor-in-training-icit", - "program": "icit", - "rating": 5 - }, - { - "name": "Leadership", - "price": 1185, - "priceText": "from 1185 USD", - "season": ["summer"], - "age": [16, 18], - "locations": ["philippines"], - "image": "/uploads/booking/00-Leadership-Camp-0d21c60a.jpg", - "link": "/activities/senior-plus-leadership", - "program": "leadership", - "rating": 5 - }, - { - "name": "Lifeguarding", - "price": 580, - "priceText": "from 580 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["malaysia"], - "image": "/uploads/booking/00-Rettungsschwimmen-Feriencamp-6a364891.jpg", - "link": "/activities/lifeguarding", - "program": "lifeguarding", - "rating": 4 - }, - { - "name": "Multi Water Adventure", - "price": 990, - "priceText": "from 990 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["philippines"], - "image": "/uploads/booking/00-Multi-Water-Adventure-im-Sommercamp-a47c08a3.jpg", - "link": "/activities/multi-water-adventure", - "program": "multi-water", - "rating": 1 - }, - { - "name": "Sailing", - "price": 990, - "priceText": "from 990 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["thailand"], - "image": "/uploads/booking/01-Segeln-im-Sommercamp-in-Spanien-e9d06b28.jpg", - "link": "/activities/sailing", - "program": "sailing", - "rating": 2 - }, - { - "name": "Skating", - "price": 420, - "priceText": "from 420 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["vietnam"], - "image": "/uploads/booking/00-Skaten im Sommercamp-8240a4c7.jpg", - "link": "/activities/skating", - "program": "skating", - "rating": 3 - }, - { - "name": "Soccer", - "price": 495, - "priceText": "from 495 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["malaysia"], - "image": "/uploads/booking/00-Soccer-Camps-543a1625.jpg", - "link": "/activities/soccer", - "program": "soccer", - "rating": 3 - }, - { - "name": "Space Exploration", - "price": 595, - "priceText": "from 595 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["china"], - "image": "/uploads/booking/00-Space-Exploration-Sommer-Camp-599962e5.jpg", - "link": "/activities/space-exploration", - "program": "space", - "rating": 4 - }, - { - "name": "Spanish Camps", - "price": 595, - "priceText": "from 595 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["portugal"], - "image": "/uploads/booking/Spanischcamp-in-Spanien-d118b0e9.jpg", - "link": "/activities/spanish-camps", - "program": "spanish", - "rating": 4 - }, - { - "name": "Survival", - "price": 495, - "priceText": "from 495 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["vietnam"], - "image": "/uploads/booking/03-Walsrode-Survival-e00c16d7.jpg", - "link": "/activities/survival", - "program": "survival", - "rating": 4 - }, - { - "name": "Swimming", - "price": 495, - "priceText": "from 495 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["philippines"], - "image": "/uploads/booking/Schwimmen_camp-98f48b76.jpg", - "link": "/activities/swimming", - "program": "swimming", - "rating": 4 - }, - { - "name": "Tennis", - "price": 495, - "priceText": "from 495 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["malaysia"], - "image": "/uploads/booking/00-Tenniscamp-57cd2c79.jpg", - "link": "/activities/tennis", - "program": "tennis", - "rating": 4 - }, - { - "name": "Windsurfing", - "price": 990, - "priceText": "from 990 USD", - "season": ["summer"], - "age": [12, 18], - "locations": ["thailand"], - "image": "/uploads/booking/00-Windsurfen-im-Sommercamp-ac31b126.jpg", - "link": "/activities/windsurfing", - "program": "windsurf", - "rating": 5 - } - ], - "formSteps": [ - { - "step": 1, - "title": "Participant Information", - "sections": [ - { - "id": "logistics", - "fields": [ - { - "name": "accommodation", - "label": "Accommodation", - "type": "select", - "required": true, - "options": [ - { - "value": "a1", - "label": "Accommodation in tiny houses/huts in the Adventure Camp", - "price": 10 - } - ] - }, - { - "name": "transferTo", - "label": "Getting there", - "type": "select", - "required": true, - "options": [ - { - "value": "3", - "label": "Self-organized Arrival (4-6 pm)", - "price": 0 - }, - { - "value": "351", - "label": "Shuttle Plattling - Meeting Point: Train Station platform 5 (at 3:30 pm)", - "price": 45 - } - ] - }, - { - "name": "transferFrom", - "label": "Departure", - "type": "select", - "required": true, - "options": [ - { - "value": "3", - "label": "Self-organized Pick-up", - "price": 0 - }, - { - "value": "351", - "label": "Shuttle Plattling - Train Station", - "price": 45 - } - ] - }, - { - "name": "activities", - "label": "Activity Profile", - "type": "select", - "required": true, - "options": [ - { - "value": "195", - "label": "Adventure, Sports and Creative (Basic profile)", - "price": 0 - } - ] - }, - { - "name": "addons", - "label": "Additional addons", - "type": "checkbox-group", - "required": false, - "options": [ - { - "value": "8", - "label": "Travel Cancellation Guarantee (one week)", - "price": 45 - } - ] - } - ] - }, - { - "id": "personal_details", - "fields": [ - { - "name": "firstName", - "label": "First name", - "type": "text", - "required": true - }, - { - "name": "lastName", - "label": "Last name", - "type": "text", - "required": true - }, - { - "name": "birthday", - "label": "Birthday", - "type": "date", - "required": true - }, - { - "name": "gender", - "label": "Gender", - "type": "select", - "required": true, - "options": [ - { - "value": "female", - "label": "Female" - }, - { - "value": "male", - "label": "Male" - }, - { - "value": "divers", - "label": "Non binary" - } - ] - }, - { - "name": "nationality", - "label": "Nationality", - "type": "select", - "required": true, - "options": [ - { - "value": "Germany", - "label": "Germany" - }, - { - "value": "United States", - "label": "United States" - }, - { - "value": "United Kingdom", - "label": "United Kingdom" - }, - { - "value": "France", - "label": "France" - }, - { - "value": "Spain", - "label": "Spain" - } - ] - }, - { - "name": "lodgingPartner", - "label": "Lodging partner", - "type": "text", - "required": false - } - ] - } - ] - }, - { - "step": 2, - "title": "Guardian Information", - "sections": [ - { - "id": "guardian_details", - "fields": [ - { - "name": "customerGender", - "label": "Salutation", - "type": "select", - "required": false, - "options": [ - { - "value": "female", - "label": "Mrs" - }, - { - "value": "male", - "label": "Mr" - }, - { - "value": "divers", - "label": "Non binary" - } - ] - }, - { - "name": "customerFirstName", - "label": "First name", - "type": "text", - "required": true - }, - { - "name": "customerLastName", - "label": "Last name", - "type": "text", - "required": true - }, - { - "name": "customerEmail", - "label": "E-Mail", - "type": "email", - "required": true - }, - { - "name": "customerPhone", - "label": "Phone", - "type": "tel", - "required": true - }, - { - "name": "customerStreet", - "label": "Street & Number", - "type": "text", - "required": true - }, - { - "name": "customerZip", - "label": "Zip", - "type": "text", - "required": true - }, - { - "name": "customerCity", - "label": "City", - "type": "text", - "required": true - }, - { - "name": "customerCountry", - "label": "Country", - "type": "select", - "required": true, - "options": [ - { - "value": "Germany", - "label": "Germany" - }, - { - "value": "United States", - "label": "United States" - }, - { - "value": "United Kingdom", - "label": "United Kingdom" - }, - { - "value": "France", - "label": "France" - }, - { - "value": "Spain", - "label": "Spain" - } - ] - } - ] - } - ] - } - ], - "validation": { - "step1Required": [ - "accommodation", - "transferTo", - "transferFrom", - "activities", - "firstName", - "lastName", - "birthday", - "gender", - "nationality" - ], - "step2Required": [ - "customerFirstName", - "customerLastName", - "customerEmail", - "customerPhone", - "customerStreet", - "customerZip", - "customerCity", - "customerCountry" - ] - }, - "configuration": { - "currency": "USD", - "discounts": [ - { - "id": "915", - "name": "Sibling or Returning Camper Discount", - "type": "percentage", - "value": 0.05, - "description": "This discount is granted if your child has attended a Camp Adventure program before or if you register siblings." - }, - { - "id": "9152", - "name": "Sibling or Returning Camper Discount", - "type": "percentage", - "value": 0.05, - "description": "This discount is granted if your child has attended a Camp Adventure program before or if you register siblings." - } - ], - "vouchers": [ - { - "validCodes": "SUMMER2026", - "type": "percentage", - "value": 0.1 - }, - { - "validCodes": "SUMMER2027", - "type": "percentage", - "value": 0.05 - }, - { - "validCodes": "CAMP50", - "type": "fixed", - "value": 50 - } - ] - } -} diff --git a/data/dataheader.json b/data/dataheader.json deleted file mode 100644 index 3984dae..0000000 --- a/data/dataheader.json +++ /dev/null @@ -1,61 +0,0 @@ -[ - { - "title": "Academics", - "url": "/academics/", - "children": [ - { - "title": "Foundations", - "url": "/academics/foundations/", - "children": [], - "programmes": [ - { - "title": "Pre-A", - "url": "/academics/foundations/PAF1000/" - }, - { - "title": "Pre-U", - "url": "/academics/foundations/PUF1000/" - } - ] - }, - { - "title": "Undergraduate", - "url": "/academics/undergraduate/", - "children": [], - "programmes": [ - - ] - }, - { - "title": "Postgraduate", - "url": "/academics/postgraduate/", - "children": [], - "programmes": [ - - ] - }, - { - "title": "Global Education", - "url": "/academics/global-education/", - "children": [ - { - "title": "Postgraduate Online", - "url": "/academics/postgraduate-online/", - "children": [], - "programmes": [ - { - "title": "Accounting and Finance", - "url": "/academics/postgraduate-online/GE7002/" - }, - { - "title": "International Business Law", - "url": "/academics/postgraduate-online/GE7008/" - }, - ] - } - ] - } - ] - } - -] \ No newline at end of file diff --git a/data/faq-data.json b/data/faq-data.json deleted file mode 100644 index 8146100..0000000 --- a/data/faq-data.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "hero": { - "title": "Go and Grow Camp", - "backgroundImage": "/uploads/home/b2.jpg", - "overlayColor": "rgba(0, 0, 0, 0)", - "sectionClass": "uk-section-secondary uk-section-overlap uk-preserve-color uk-light", - "titleClass": "uk-heading-large uk-text-center !text-[5vw]", - "enableScrollspy": true, - "backgroundPosition": "top-center" - }, - - "sidebarNav": [ - { - "id": "general-information", - "label": "General Information" - }, - { - "id": "camps", - "label": "Camps" - }, - { - "id": "camp-routine", - "label": "Camp Routine" - }, - { - "id": "camp-counselors", - "label": "Camp Counselors" - }, - { - "id": "camp-rules", - "label": "Camp Rules" - }, - { - "id": "safety", - "label": "Safety" - }, - { - "id": "accommodation-catering", - "label": "Accommodation & Catering" - }, - { - "id": "transfers-shuttles", - "label": "Transfers & Shuttles" - } - ], - - "contactBox": { - "title": "Let's plan your perfect nature escape", - "phone": { - "icon": "phone", - "text": "+(123)-456-789" - }, - "email": { - "icon": "email", - "text": "hello@ggcamp.org" - } - }, - - "faqSections": [ - { - "id": "general-information", - "title": "General Information", - "faqs": [ - { - "title": "What are FAQ?", - "description": "FAQ are the initials for \"Frequently Asked Questions\".\n\nThe FAQ have been compiled by us over a long period of time and are intended to help give a general overview of our camps and clarify questions that arise before booking a camp." - }, - { - "title": "General booking process", - "description": "Once the booking has been confirmed by us, you will receive an e-mail requesting a deposit. As soon as we have received this, you will receive an e-mail with a payment confirmation.\nPlease have a look at the welcome package, which will reach you by e-mail with the Last Travel Information. This contains information that applies to the camp you have booked.\n\nStep 1: Registration\nStep 2: Receipt of registration confirmation, total invoice and deposit request (e-mail)\nStep 3: Deposit of USD 50 (due within 7 days after booking)\nStep 4: Receiving an email with the latest important travel information, a packing list, addresses and important emergency phone numbers plus remaining payment request about 3-4 weeks before the camp starts." - }, - { - "title": "Terms & Conditions", - "description": "Our Terms & Conditions can be found in our official documents section." - }, - { - "title": "Where can I find a packing guide for Camps?", - "description": "Just click here to download our packing list." - }, - { - "title": "Where can I find contact information from Camps and addresses?", - "description": "Here you can find all the necessary information if you want to drive to our camps or send something. If you want to send something please ALWAYS include the full name of your child on the letter/package and please only send it at the time when your kids are staying in camp as we cannot store it for a longer period of time.\n\nWalsrode/Lüneburger Heide - Germany:\nCamp Adventure, Vethem 58, 29664 Walsrode, Germany\nwalsrode@campadventure.de\n\nRegen/Bavarian Forest - Germany:\nCamp Adventure, Badstrasse 18, 94209 Regen\nregen@campadventure.de\n\nBarcelona - Spain:\nBISC International Sailing Center, c/o Camp Adventure, Parc del Fòrum Sota plaça fotovoltàica, 08930 Sant Adrià de Besòs, Barcelona, Spain\nbarcelona@campadventure.de\n\nBath - England:\nUniversity of Bath, c/o Camp Adventure, Claverton Down, Bath BA2 7AY, England\nengland@campadventure.de\n\nRossall - England:\nRossall School, Broadway, Fleetwood, Lancashire FY7 8JW, England\nengland@campadventure.de" - } - ] - }, - { - "id": "camps", - "title": "Camps", - "faqs": [ - { - "title": "Where do kids and camp counselors come from?", - "description": "Camp Adventure attaches great importance to internationality. The participants and supervisors in our camps come from many different countries. Last year, for example, we had participants from over 60 different countries and counselors from 25 different nations. Of course, we don't know where they will come from this year. So we are at least as excited as you are.\n\nThrough our office in Hamburg and our branch office in Canada, we reach motivated and committed counselors from all over the world. Canadian and Australian teamers can therefore be found as well as German or Spanish teamers.\n\nDue to the different experiences and cultural backgrounds an indescribably fantastic, international atmosphere is created." - }, - { - "title": "Which languages are spoken in camp?", - "description": "The main language in all our camps is English. In addition, there is the language of the country in which the camp takes place. As we have our headquarters in Germany, German teamers are always present in all camps in Germany. All announcements and explanations are here therefore always in German and English. Of course, all our teamers with their different nationalities are also available for individual translations." - }, - { - "title": "Are there problems if children have low language skills?", - "description": "No, because there are usually more participants and team members who speak the same language. We know from experience that children are excellent at communicating nonverbally. They often need a few days to warm up to it, but are then very open to other children as well." - }, - { - "title": "Are girls and boys separated?", - "description": "Girls and boys are accommodated separately in the dormitories/tents. The program is completely mixed." - }, - { - "title": "How big are the camps? How high is the caregiver ratio?", - "description": "Capacities range from around 30 participants in smaller language camps to a maximum of about 400 children in our camp Lueneburger Heide. However, the maximum capacity is not reached every week. However, a minimum number of participants must be guaranteed in order to run the camp.\n\nIt is important to us that all children are always grouped in small groups of 5-8, with a counselor as a contact person. This way homesickness doesn't stand a chance and despite the size of the camp in their group family, they experience a strong bond on which they can count on!" - }, - { - "title": "Should 12-year-olds go to Junior Camp or Senior Camp?", - "description": "This question is not easy to answer and depends on the individual stage of development of your child. Therefore, as parents, we leave you the opportunity to decide for yourself. In the Junior Camp they belong to the older ones and can explore a lot in a playful way. In the Senior Camp they are the younger ones, who have role models through the older ones, whom they can emulate." - } - ] - }, - { - "id": "camp-routine", - "title": "Camp Routine", - "faqs": [ - { - "title": "How is the choice of activities/courses in the camps made?", - "description": "If your child would like to participate in a paid additional course (e.g. horse riding, language course, Survival etc.), this must be booked in advance when registering. In principle, no extra additional courses have to be booked. A program with a variety of activities is of course available to the participants in all camps. The various activities can be chosen by the participants on site in the respective camps. We present the offers to the participants, so that everyone gets an insight into the different courses. The children can then register in the lists of the respective courses." - }, - { - "title": "What is a hike?", - "description": "The hike is a 1-3 day walking tour, in which all participants of the Adventure Camp who stay 2 weeks in the camp take part. On this hike the participants will not spend the night in a tent, but either in the open air or under a self-made shelter e.g. from tarpaulins. They will of course be accompanied by their teamers. The hike is a very special experience and a highlight for all participants. For this hike the participants need sturdy shoes and a big backpack." - }, - { - "title": "Can I wash my clothes during the camp?", - "description": "In principle, participants should bring sufficient clothing and change of clothes for the entire camp period.\n\nOnly in the camps in Lüneburger Heide and Bayerischer Wald a laundry service will be offered for kids staying three weeks or more, which means that a laundry bag (approx. 3 kg) will be washed in the laundry centre of the next village at a price of USD 45. This service can be booked upon registration for three-week camps. Please note that the laundry will be done either after one week or after two weeks." - }, - { - "title": "Anti Homesick Adviser", - "description": "Dear parents\n\nNow it's almost time: In summer your child travels for the first time with Camp Adventure. Maybe it will be the first time that he travels alone without parents or relatives. As we are getting more and more questions, we have decided to put together a small package for you parents with little tips from experts to make everything as easy as possible for you and your child. Follow our tips and your child will have a fantastic holiday, have many new experiences and make friends from all over the world! All these tips have been developed together with the International Camping Fellowship. And the more you think your child will be a \"homesick candidate\" - or your child even claims to be one - the more you consider the following tips." - } - ] - }, - { - "id": "camp-counselors", - "title": "Camp Counselors - Our Teamers", - "faqs": [ - { - "title": "Who are the camp counselors?", - "description": "Every year our team is made up of an international mix. The non-profit association Camp Europe e.V. with headquarters in Hamburg and a branch office in Canada takes care of the acquisition of national and international applicants. Since we have about 50% German-speaking children, there are also German carers in every location. But many also come from other countries, such as England, Spain, Canada and Australia, to name just a few." - }, - { - "title": "How are the teamers trained?", - "description": "All counselors go through an extensive application process. For a successful application, not only an interesting curriculum vitae and a minimum age of 19 years are sufficient! We conduct a personal interview with each individual in which our employees get a first impression of the applicant.\n\nBefore the camp season, everyone, both the first supervisors (teamers) as well as many recomers, complete a one-week training in which they are prepared for their assignment by trained coaches. They must have a first aid certificate, which may not be older than two years, as well as an internationally flawless police clearance certificate. We know how important the teamers are for a great camp and therefore select them very conscientiously." - } - ] - }, - { - "id": "camp-rules", - "title": "Camp Rules", - "faqs": [ - { - "title": "Drugs, Alcohol & Camp?", - "description": "From our point of view an absolutely unacceptable and indiscutable combination! Due to our cooperation with the association \"Keine Macht den Drogen\" (No power to drugs) and our common opinion that all kinds of drugs do not belong in the hands of children & teenagers, any possession or consumption of drugs is forbidden for teenagers and children in the camp and also outside the camp.\n\nViolations can lead to exclusion or even to criminal charges. The term \"drugs\" also includes cigarettes and alcohol! Through our varied activities, we offer a much better alternative! We would like to make it clear from the outset that we are also against any form of discrimination or \"putting down\". This is - just like violence - immediately prevented by us, in order to offer each young person a relaxed and joyful time in the camp." - }, - { - "title": "Should I call my kid or write an old-fashioned letter?", - "description": "We ask all parents to write to their child at least once. This is especially useful at the beginning, as it is a particularly upsetting experience for every child and every teenager when most of the participants receive a letter, but they do not.\n\nPlease note that there is NO public \"camp phone\" available for incoming or outgoing calls. If your child doesn't bring her/his own phone, she/he won't be able to call you. In case of any problems, we will of course contact you immediately.\n\nIf your child brings a mobile phone, we will collect it on arrival and store it with the valuables. Your child's Teamer may hand it over during the phone time after lunch. Please keep in mind: no news is good news (the location manager will contact you if it is necessary due to homesickness or illness). We kindly ask you not to call the office in Hamburg to ask about your kid's health and wellbeing, nor if you would like to know why your child hasn't called you yet. Please use our camp email service for such enquiries.\n\nOur recommendation is the following:\nWe recommend not to call your child (even if he or she has a mobile phone with him or her) and not to tell him or her to call you. Telephoning can in our experience promote homesickness very strongly and your child will be cured thereby if completely immersed in camp life! At noon after lunch, if absolutely necessary, your child can pick up his or her mobile phone from the counselors until the start of next program and make phone calls. Instead, you are welcome to bring a pre-stamped and addressed envelope with you. We will then make sure that your child has enough time to write letters. Since letters and postcards often arrive late at the camps, we also offer the e-mail service. You can send your child max. ONE email per day directly to the camp, which we then print out and give to your child. There is no way for them to reply, but your child will be happy to receive a small message from home. You can find the postal and email address in the info package of the booked camp." - }, - { - "title": "Are there any prohibited items?", - "description": "Yes, there are. Not allowed are pocket knives with lockable blades, all weapons, lighters and matches (danger of fire in the forest!). Drugs of any kind, including alcohol and cigarettes, are also included." - } - ] - }, - { - "id": "safety", - "title": "Safety", - "faqs": [ - { - "title": "Electronic equipment and valuables", - "description": "We recommend that you do not take an MP3 player, e-book, tablet, etc. or any valuables with you. On the one hand we do not assume any liability and on the other hand there are no possibilities to charge the devices. We are of the opinion that the camp time is a special experience for the participants if they do not have the headphones in their ears all the time or are busy with their mobile phones. Instead they have the chance to deal with other topics and they find time to dedicate themselves to the new people in the camp." - }, - { - "title": "How do you provide safety for the kids?", - "description": "Before our camp counselors start working with us, we check their police clearance certificates. You must be at least 19 years old to work for us as a teamer. They must also have a \"First Aid Certificate\", which must not be older than two years. In the camps we try to make sure that only adults from our camp or familiar faces are on the campground and that all our carers look after strangers.\n\nWe have many different camp sites. Some of them are fenced in, others are not. There are no armed guards or the like in our camps, as we believe that these conditions create a very insecure feeling. We do not have a high security zone in Germany, Northern Ireland or England, but we keep our eyes open and do everything we can to ensure that all participants have a great time." - }, - { - "title": "Insurance in case of illness?", - "description": "If your child should fall ill during the camp and medical help is required, he or she will of course be taken to the doctor by our carers and cared for there as well. It is therefore necessary for each participant to take their insurance card with them to the camp. We offer all participants the possibility of taking out liability, casualty & health insurance for travel abroad with us. This covers all costs in case of illness and prevents international children in particular from having to \"advance\" their own cash. You can find more detailed information on insurance in our documents section." - } - ] - }, - { - "id": "accommodation-catering", - "title": "Accommodation & Catering", - "faqs": [ - { - "title": "How's the food at the camps?", - "description": "Full board for the entire duration of the camp is of course already included in the camp price. In addition, water and fruit are available for the participants around the clock. For us it is a matter of course to provide one variant for vegetarians and one pork-free with each meal. In case of special allergies or intolerances of your children let us know in advance and we will try to find a solution." - }, - { - "title": "How is my child accommodated in the camp?", - "description": "In our Adventure Camp Bayerischer Wald and our Camp Lueneburger Heide, the Juniors (7-12) and the Seniors (12-16) can choose between tents and huts.\n\nThe tents are equipped with a floor and a wooden platform, up to 7 children can share one tent. The participants can make themselves comfortable with sleeping bag and sleeping mat. The wooden huts are equipped with bunk beds and can accommodate 4-8 children. At the other locations, participants will be accommodated in shared rooms in youth hostels, sports centres or boarding schools of private schools. You will find detailed information about the accommodation on the individual camp pages." - } - ] - }, - { - "id": "transfers-shuttles", - "title": "Transfers & Shuttles", - "faqs": [ - { - "title": "Entry regulations/Travel Consent for group flights", - "description": "All parents need to fill this out and bring it to camp:\n\nBelow is a summary of the travel requirements for minors from various EU countries traveling with Camp Adventure on group flights. Please note that regulations can change, so it's essential to consult the official resources provided for the most up-to-date information." - }, - { - "title": "Which transfers are offered?", - "description": "The respective transfer possibilities depend on the period and venue of the camp. Check directly on the respective camp page under \"Arrival & Departure Services\"." - }, - { - "title": "Where can I find the exact arrival and departure times?", - "description": "Information about the different arrival and departure times can be found on the respective camp page under \"Arrival & Departure Services\"." - }, - { - "title": "How do the transfer costs come about?", - "description": "When booking a train or air trip, the indicated price includes the arrival and departure as well as the accompaniment by a supervisor." - }, - { - "title": "Where can I find the address/driving directions from the camp?", - "description": "You will receive the exact address and directions of the camp with the Last Travel Information about 3-4 weeks before the camp starts." - } - ] - } - ], - - "video": { - "url": "https://www.youtube.com/embed/3NtE5wSwYTo?list=PLSOedrxa1c-bxvH6uuz_oZdIfJkov66wB&disablekb=1", - "title": "Anti Homesickness Adviser" - } -} \ No newline at end of file diff --git a/data/header-menu.json b/data/header-menu.json deleted file mode 100644 index af22c79..0000000 --- a/data/header-menu.json +++ /dev/null @@ -1,159 +0,0 @@ -[ - { - "label": "Home", - "slug": "home", - "href": "/", - "type": "internal", - "order": 1, - "isActive": true, - "children": [] - }, - { - "label": "About Us", - "slug": "about-us", - "href": "/about", - "type": "internal", - "order": 2, - "isActive": true, - "children": [] - }, - { - "label": "Pages", - "slug": "pages", - "href": "#", - "type": "internal", - "order": 3, - "isActive": true, - "children": [ - { - "label": "Services", - "slug": "services", - "href": "/services", - "type": "internal", - "order": 1, - "isActive": true, - "children": [ - { - "label": "Service List", - "slug": "service-list", - "href": "/service", - "type": "internal", - "order": 1, - "isActive": true - }, - { - "label": "Service Details", - "slug": "service-details", - "href": "/service-details", - "type": "internal", - "order": 2, - "isActive": true - } - ] - }, - { - "label": "Country List", - "slug": "country-list", - "href": "/country-list", - "type": "internal", - "order": 2, - "isActive": true, - "children": [ - { - "label": "Country List", - "slug": "country-list-all", - "href": "/country-list", - "type": "internal", - "order": 1, - "isActive": true - }, - { - "label": "Country Details", - "slug": "country-details", - "href": "/country-details", - "type": "internal", - "order": 2, - "isActive": true - } - ] - }, - { - "label": "Our Pricing", - "slug": "pricing", - "href": "/pricing", - "type": "internal", - "order": 3, - "isActive": true - }, - { - "label": "Appointment", - "slug": "appointment", - "href": "/appointment", - "type": "internal", - "order": 4, - "isActive": true - }, - { - "label": "FAQ", - "slug": "faq", - "href": "/faq", - "type": "internal", - "order": 5, - "isActive": true - } - ] - }, - { - "label": "VISA", - "slug": "visa", - "href": "#", - "type": "internal", - "order": 4, - "isActive": true, - "children": [ - { - "label": "Visa List", - "slug": "visa-list", - "href": "/visa-list", - "type": "internal", - "order": 1, - "isActive": true - }, - { - "label": "Visa Details", - "slug": "visa-details", - "href": "/visa-details", - "type": "internal", - "order": 2, - "isActive": true - } - ] - }, - { - "label": "Blog", - "slug": "blog", - "href": "/blog", - "type": "internal", - "order": 5, - "isActive": true, - "children": [] - }, - { - "label": "Contact Us", - "slug": "contact-us", - "href": "/contact", - "type": "internal", - "order": 6, - "isActive": true, - "children": [] - }, - { - "label": "External Portal", - "slug": "external-portal", - "href": "https://partner.hailearning.edu.vn", - "type": "external", - "order": 7, - "isActive": false, - "children": [] - } -] diff --git a/data/insurance.json b/data/insurance.json deleted file mode 100644 index 0592cd0..0000000 --- a/data/insurance.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "hero": { - "title": "Insurance & Travel Cancellation Guarantee", - "subtitle": "Comprehensive coverage for your peace of mind", - "backgroundImage": "/uploads/banner/b13.jpg", - "sectionClass": "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - "backgroundClasses": "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - "overlayStyle": { - "backgroundColor": "rgba(0, 0, 0, 0)" - }, - "titleClass": "text-white text-[5vw] uk-text-center", - "subtitleClass": "uk-panel font-[Raleway] italic text-[1.5vw] uk-margin uk-text-center", - "enableScrollspy": true - }, - "page": { - "title": "Insurance & Travel Information", - "divider": true, - "sectionClass": "uk-section-default uk-section-overlap uk-section", - "titleClass": "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - "dividerClass": "uk-divider-small uk-text-left@m uk-text-center" - }, - "content": { - "sectionClass": "uk-section-muted uk-section-overlap uk-section", - "textClass": "uk-panel uk-margin text-[1vw]", - "content": [ - { - "type": "header", - "level": 2, - "text": "Our Go and Grow Camp Insurance Package" - }, - { - "type": "paragraph", - "text": "Liability, casualty and health insurance" - }, - { - "type": "paragraph", - "text": "Price: USD 45 per person/trip" - }, - { - "type": "paragraph", - "text": "It only takes one mouse-click to book our comprehensive holiday insurance package for travels abroad, which includes a liability, casualty and health insurance for the entire duration of your journey. This ensures that your child is well insured in the unlikely event of an accident, a doctor's visit, a stay at the hospital or a misfortune causing damage to external property." - }, - { - "type": "paragraph", - "text": "The insurance covers the whole duration of the trip, including the days of arrival and departure." - }, - { - "type": "paragraph", - "text": "Please note that all participants without an EU insurance card/private health insurance or without a travel insurance package have to be prepared to cover the costs for medical treatment themselves. Go and Grow Camp does not provide any advance payment for doctor's bills. Non EU residents who do not book our insurance package have to submit a confirmation of their travel insurance." - }, - { - "type": "header", - "level": 2, - "text": "Go and Grow Camp Travel Cancellation Guarantee" - }, - { - "type": "paragraph", - "text": "It only takes one mouse-click to book our comprehensive holiday insurance package for travels abroad, which includes a liability, casualty and health insurance for the entire duration of your journey. This ensures that your child is well insured in the unlikely event of an accident, a doctor's visit, a stay at the hospital or a misfortune causing damage to external property." - }, - { - "type": "paragraph", - "text": "The insurance covers the whole duration of the trip, including the days of arrival and departure." - }, - { - "type": "paragraph", - "text": "Please note that all participants without an EU insurance card/private health insurance or without a travel insurance package have to be prepared to cover the costs for medical treatment themselves. Go and Grow Camp does not provide any advance payment for doctor's bills. Non EU residents who do not book our insurance package have to submit a confirmation of their travel insurance." - }, - { - "type": "header", - "level": 2, - "text": "Go and Grow Camp - Cooperations & Memberships" - } - ] - } -} diff --git a/data/menu-header.json b/data/menu-header.json deleted file mode 100644 index 13ad560..0000000 --- a/data/menu-header.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "menus": [ - { - "menuid": "info", - "parent": null, - "title": "Info", - "url": "#", - "order": 0, - "type": "static" - }, - { - "menuid": "info-about-us", - "parent": "info", - "title": "About us", - "url": "/info/about-us", - "order": 0, - "type": "page" - }, - { - "menuid": "info-safety", - "parent": "info", - "title": "Safety", - "url": "/info/safety", - "order": 1, - "type": "page" - }, - { - "menuid": "info-faq", - "parent": "info", - "title": "FAQ", - "url": "/info/faq", - "order": 2, - "type": "page" - }, - { - "menuid": "info-terms-conditions", - "parent": "info", - "title": "Terms & Conditions", - "url": "/info/terms-conditions", - "order": 3, - "type": "page" - }, - { - "menuid": "info-insurance", - "parent": "info", - "title": "Insurance", - "url": "/info/insurance", - "order": 4, - "type": "page" - }, - { - "menuid": "info-travel-documents", - "parent": "info", - "title": "Travel Documents", - "url": "/info/travel-documents", - "order": 5, - "type": "page" - }, - { - "menuid": "camp-locations", - "parent": null, - "title": "Camp Locations", - "url": "/destinations", - "order": 1, - "type": "static" - }, - { - "menuid": "activities", - "parent": null, - "title": "Activities", - "url": "/activities", - "order": 2, - "type": "static" - }, - { - "menuid": "blog", - "parent": null, - "title": "Blog", - "url": "/blog", - "order": 3, - "type": "static" - }, - { - "menuid": "contact-us", - "parent": null, - "title": "Contact US", - "url": "/contact-us", - "order": 4, - "type": "static" - }, - { - "menuid": "booking", - "parent": null, - "title": "Booking", - "url": "/booking", - "order": 5, - "type": "static" - } - ] -} diff --git a/data/pricing.json b/data/pricing.json deleted file mode 100644 index db531a8..0000000 --- a/data/pricing.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "hero": { - "title": "Pricing Plan", - "backgroundImage": "/assets/img/inner-page/breadcrumb.jpg", - "shapeImage": "/assets/img/inner-page/shape.png", - "breadcrumb": [ - { - "text": "Home", - "link": "/" - }, - { - "text": "Pricing Plan", - "link": "" - } - ] - }, - "pricingSection": { - "subtitle": "pricing plan", - "heading": "Flexible Plans to Suit Every Traveler", - "description": "Choose the plan that fits your visa needs and enjoy expert guidance every step of the way." - }, - "plans": { - "monthly": [ - { - "name": "Basic Plan", - "price": "32", - "period": "mo", - "currency": "$", - "buttonText": "Get Started Today", - "buttonLink": "/pricing", - "buttonIcon": "fa-solid fa-arrow-right", - "style": "default", - "features": [ - "Everything in Basic Plan", - "Visa Interview Preparation", - "Priority Processing Support", - "Phone & Email Assistance", - "Step-by-Step Application Support" - ] - }, - { - "name": "Premium Plan", - "price": "32", - "period": "mo", - "currency": "$", - "buttonText": "Get Started Today", - "buttonLink": "/pricing", - "buttonIcon": "fa-solid fa-arrow-right", - "style": "style-2", - "features": [ - "Everything in Basic Plan", - "Visa Interview Preparation", - "Priority Processing Support", - "Phone & Email Assistance", - "Step-by-Step Application Support" - ] - } - ], - "yearly": [ - { - "name": "Basic Plan", - "price": "32", - "period": "mo", - "currency": "$", - "buttonText": "Get Started Today", - "buttonLink": "/pricing", - "buttonIcon": "fa-solid fa-arrow-right", - "style": "default", - "features": [ - "Everything in Basic Plan", - "Visa Interview Preparation", - "Priority Processing Support", - "Phone & Email Assistance", - "Step-by-Step Application Support" - ] - }, - { - "name": "Premium Plan", - "price": "32", - "period": "mo", - "currency": "$", - "buttonText": "Get Started Today", - "buttonLink": "/pricing", - "buttonIcon": "fa-solid fa-arrow-right", - "style": "style-2", - "features": [ - "Everything in Basic Plan", - "Visa Interview Preparation", - "Priority Processing Support", - "Phone & Email Assistance", - "Step-by-Step Application Support" - ] - } - ] - }, - "testimonials": { - "subtitle": "What Our Clients Say", - "heading": "Immigration Success Stories", - "buttonText": "View All Review", - "buttonLink": "/contact", - "buttonIcon": "fa-solid fa-arrow-right", - "image": "/assets/img/home-3/test-thumb.jpg", - "items": [ - { - "name": "Mohammed Ali", - "role": "Family Visa", - "rating": 5, - "content": "The team provided exceptional guidance throughout my immigration process. Their expertise, personalized support, and attention to detail ensured a smooth, stress-free experience and successful visa approval." - }, - { - "name": "Mohammed Ali", - "role": "Family Visa", - "rating": 5, - "content": "The team provided exceptional guidance throughout my immigration process. Their expertise, personalized support, and attention to detail ensured a smooth, stress-free experience and successful visa approval." - } - ] - } -} \ No newline at end of file diff --git a/data/safety.json b/data/safety.json deleted file mode 100644 index 14286fc..0000000 --- a/data/safety.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "hero": { - "title": "Safety", - "banner": "/uploads/banner/b13.jpg" - }, - "approach":{ - "badge": "OUR APPROACH", - "title": "Learning, Comfort, and Confidence in Every Step", - "description": "Our camp philosophy ensures that every experience is exciting, engaging, and safe. We combine the thrill of outdoor exploration with a secure, well-managed environment where campers can grow, connect, and enjoy every moment.", - "imgs": - { - "img1": "/uploads/safety/pic1.jpg", - "img2": "/uploads/safety/pic2.jpg" - }, - "stats":{ - "count": "1,200+", - "label": "Happy Glampers Hosted", - "avatars": [ - "https://i.pravatar.cc/100?img=1", - "https://i.pravatar.cc/100?img=5", - "https://i.pravatar.cc/100?img=8" - ] - }, - "features":[ - { - "text":"Community built on trust and respect" - }, - { - "text":"Shared responsibility for a safe environment" - }, - { - "text":"Zero tolerance for discrimination or abuse" - }, - { - "text":"Staff trained and supervised around the clock" - } - ], - "cards":[ - { - "title":"Camp Protection", - "content":"Comprehensive measures ensure every camper is safe, including trained staff, strict supervision, and clear emergency protocols throughout their stay." - }, - { - "title":"Peace of Mind", - "content":"Parents and campers can feel confident knowing that safety, well-being, and support are prioritized at all times." - } - ] - }, - "philosophy":{ - "title":"Go and Grow Camp", - "subtitle":"Our Philosophy", - "cards":[ - { - "title":"Community", - "content":"What is most important for us at camp is the community. We want everyone – participants, teamers and camp directors, no matter from which country or what culture – to have an unforgettable time and every single one of us helps to reach this goal.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Responsibility", - "content":"We want everyone to help shape the daily life at camp. Besides playing this of course also includes social coexistence. Together with us your children keep the camp clean. This means cleaning the dishes and wiping the tables after a meals, as well as keeping the camp and sanitary facilities clean and tidying up the tents and huts together. All this of course, in a manner appropriate to the age of your children. This is how we, in shared responsibility, make everybody feel comfortable.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Internationality", - "content":"At camp new friendships arise even though some campers live thousands of kilometers apart. Our experienced campers immediately include newcomers because this is what they love camp for – they come to make new friends and meet their fellow camp mates again. After our camp season many parents tell us about mutual visits – some went to France, Spain or Canada. They also tell us about the increased motivation of their children to pay a little more attention to the language lessons at school so conversations at camp next summer become easier.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Log off, get outside", - "content":"We want all campers to have a relaxed holiday. Mobile phones are especially counterproductive to reach this goal. Therefore, our camps are mobile-free zones and we would like your children to hand over their phones and all other electronic devices to our teamers on the day of arrival so they can really relax. This also means that your children cannot be reached by phone outside the daily telephone hour which is after lunch.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"No power to drugs", - "content":"For legal reasons, as a result of our cooperation with the organization 'No power to drugs' and by our conviction that drugs don't belong into the hands of children and young adults, it is strictly forbidden for all campers to possess or consume any kind of drugs including cigarettes and alcoholic drinks. Non-compliance with this rule will lead to the suspension from camp or even criminal charges. It is our belief that with all our activities and the great atmosphere at camp, we offer much better alternatives anyway!", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Dealing with discrimination", - "content":"We would like to point out that we do not accept any form of discrimination, bullying or violence so that all campers can enjoy a happy, relaxed and safe holiday at camp.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - } - - ] - }, - "security":{ - "title":"Go and Grow Camp", - "subtitle":"Security Concept", - "cards":[ - { - "title":"Background Check", - "content":"Every counselor, chef, teamer or helper that enters our camps has to be registrated, complete a background check, as well as have references. That's why parents are only allowed on the camp site on the day of arrival and departure and not during the week. We want to make sure that we have checked and know every adult who is with us at camp.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Education", - "content":"Each counselor must complete an almost two-week training course with us, from early in the morning until late in the evening includes so many lessons that the number of hours even corresponds to the basic study in educational sciences. Here we focus on the areas of safety, accident prevention, child psychology and needs as well as the various safety aspects in the field of experiential education.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Crisis Intervention", - "content":"If something should happen, it is not only important to provide first aid for the affected person, but also to care for the other children and adolescents. We have a specially trained team for crisis intervention, which then provides immediate care and can thus prevent possible traumatisation due to the experience.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Nightwatch", - "content":"All our camps are also supervised at night by the counselors/teamers. On the one hand we want to prevent visitors from coming to the site - which has not happened until today - and on the other hand we want to be there for the children if they wake up at night and get homesick or have to go to the toilet. The nightwatch patrols the area and is otherwise reachable at a central place for the children. Some of our locations - e.g. the headquarters in Walsrode - are also video-monitored and fenced in.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Caregiver Key", - "content":"No safety without sufficient staff! We are the leaders in Germany with our great caregiver key. There are no camps that have a key worse than 1:6-1:8, which means that one caregiver is responsible for a maximum of 6-8 children. In the junior camps we also use our CIT (Counselor in Training), so that we often reach a key of only 1:4. We know that this key can seem exaggerated, but we want to guarantee the highest possible safety and we firmly believe that this is exactly what our high level of caregiver commitment leads to.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Cooperation", - "content":"Cooperation with the independent representative for questions of sexual child abuse via our umbrella organisation Reisenetz e.V.: Go and Grow Camp was one of the first tour operators for children and young people to develop a protection concept that prevents sexual abuse among children and young people. Today, this concept is considered important by many other tour operators, also due to our personal commitment in various associations and professional circles. Of course, the background check and the '6-eyes principle', which states that a child must never be alone with a caregiver, is also an essential part of our protection concept. The most important thing, however, is to create an 'open system' in which everyone knows that sexual abuse should not be a taboo subject, but that simple instruments such as a grievance box and feedback system can immediately address grievances and that they do not have to be denied.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Quality", - "content":"As a member of the quality committee of the professional association for children and youth travel 'Reisenetz', our managing director Jan Vieth is responsible for further developing and checking the quality guidelines of the entire industry. As Germany's ambassador to the ICF, he is also kept up to date on improvements in camp and training quality worldwide and adapts these as quickly as possible to our own camps.", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"Accessibility", - "content":"Of course, all parents receive a number from us, which allows them to reach us 24 hours a day in an emergency. If an emergency occurs at your home, you can inform us immediately and we can decide together how, when and whether to inform your child", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - }, - { - "title":"In case of emergency", - "content":"Every caregiver has a valid first aid certificate and can help if necessary", - "author":{ - "avt":"https://i.pravatar.cc/150?img=12", - "name":"abc", - "role":"customer", - "rating":"5" - } - } - ] - } -} \ No newline at end of file diff --git a/data/service.json b/data/service.json deleted file mode 100644 index aed5488..0000000 --- a/data/service.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "pageTitle": "Visaway – Immigration & Visa Consulting HTML Template", - - "services": { - "title": { - "subTitle": "What We Offer", - "mainTitle": "Our Immigration Services" - }, - "items": [ - { - "slug": "immigration-appeal", - "name": "Immigration Appeal & Legal Support", - "description": "Our experts provide professional guidance for immigration appeals and legal matters, helping clients overcome visa rejections with personalized strategies and strong case representation.", - "image": "/img/home-3/service/01.jpg", - "layout": "left", - "details": { - "title": "Immigration Appeal & Legal Support", - "description": "Our experts provide professional guidance for immigration appeals and legal matters, helping clients overcome visa rejections with personalized strategies and strong case representation. We analyze your case thoroughly and develop custom strategies to maximize your chances of success.", - "mainImage": "/img/inner-page/service-details/details-1.jpg", - "overviewTitle": "Service Overview", - "overviewDescription": "Our Immigration Appeal & Legal Support service is designed to help clients navigate complex immigration challenges. We provide expert legal guidance, case analysis, and strategic representation to maximize your chances of success. With our expert consultants, personalized approach, and global network, we ensure a smooth transition for every client.", - "additionalDescription": "From start to finish, we are committed to turning your immigration challenges into success stories through professional legal representation and strategic planning.", - "keyFeaturesTitle": "Key Features", - "keyFeaturesImage": "/img/inner-page/service-details/details-2.jpg", - "features": [ - { - "title": "Personalized Guidance", - "description": "Tailored support for each client's specific legal situation and requirements." - }, - { - "title": "Expert Legal Team", - "description": "Experienced immigration lawyers with proven track records in appeals." - }, - { - "title": "Case Analysis & Strategy", - "description": "Thorough case review and development of winning appeal strategies." - }, - { - "title": "Document Preparation", - "description": "Professional preparation of all legal documents and supporting evidence." - }, - { - "title": "Court Representation", - "description": "Expert representation in immigration courts and tribunals." - }, - { - "title": "Success Monitoring", - "description": "Regular updates and monitoring throughout the appeal process." - } - ], - "faqTitle": "Frequently Asked Question", - "faqImage": "/img/inner-page/service-details/details-3.jpg", - "faq": [ - { - "id": "faq-appeal-1", - "question": "01. What are the chances of a successful appeal?", - "answer": "Success rates vary by case type and circumstances, but our experienced legal team significantly improves your chances through thorough case analysis and strategic representation tailored to your specific situation.", - "isExpanded": false - }, - { - "id": "faq-appeal-2", - "question": "02. How long does the appeal process take?", - "answer": "Appeal timelines vary by jurisdiction and case complexity, typically ranging from 6-18 months. We keep you informed throughout the process and work to expedite where possible.", - "isExpanded": false - }, - { - "id": "faq-appeal-3", - "question": "03. What documents do I need for an appeal?", - "answer": "Required documents vary by case but typically include the original decision, supporting evidence, and legal submissions. We provide a comprehensive checklist and assist with document preparation.", - "isExpanded": false - }, - { - "id": "faq-appeal-4", - "question": "04. Do you handle all types of immigration appeals?", - "answer": "Yes, we handle various types of immigration appeals including visa refusals, deportation orders, and residency rejections. Our team has expertise across all immigration categories.", - "isExpanded": false - } - ] - } - }, - { - "slug": "scholarship-guidance", - "name": "Scholarship & Study Grant Guidance", - "description": "We help students unlock opportunities to study abroad with the right financial support. Our expert advisors guide you in finding scholarships, grants, and funding options that match your academic background, chosen destination, and career goals.", - "image": "/img/home-3/service/02.jpg", - "layout": "right", - "details": { - "title": "Scholarship & Study Grant Guidance", - "description": "We help students unlock opportunities to study abroad with the right financial support. Our expert advisors guide you in finding scholarships, grants, and funding options that match your academic background, chosen destination, and career goals. From preparing strong applications to meeting eligibility criteria, we ensure you maximize your chances of securing financial aid.", - "mainImage": "/img/inner-page/service-details/details-1.jpg", - "overviewTitle": "Service Overview", - "overviewDescription": "Our Education Visa Consultancy is dedicated to guiding students in achieving their study abroad dreams. We provide complete support including university selection, application assistance, scholarship guidance, visa documentation, and interview preparation. With our expert consultants, personalized approach, and global network, we ensure a smooth transition for every student.", - "additionalDescription": "From start to finish, we are committed to turning your education journey into a successful international experience.", - "keyFeaturesTitle": "Key Features", - "keyFeaturesImage": "/img/inner-page/service-details/details-2.jpg", - "features": [ - { - "title": "Personalized Guidance", - "description": "Tailored support for each student's goals and requirements." - }, - { - "title": "Target Audience & Persona Development", - "description": "Experienced team with global education and visa knowledge." - }, - { - "title": "Scholarship & Grant Assistance", - "description": "Helping students secure financial aid opportunities." - }, - { - "title": "Visa Application Support", - "description": "Step-by-step guidance for smooth visa processing." - }, - { - "title": "Interview Preparation", - "description": "Coaching for successful student visa interviews." - }, - { - "title": "Documentation Assistance", - "description": "Accurate and complete paperwork for faster approvals." - } - ], - "faqTitle": "Frequently Asked Question", - "faqImage": "/img/inner-page/service-details/details-3.jpg", - "faq": [ - { - "id": "faq-scholarship-1", - "question": "01. Do you assist with university selection?", - "answer": "Absolutely! We identify suitable scholarships, guide application processes, and maximize your chances of receiving financial aid.", - "isExpanded": false - }, - { - "id": "faq-scholarship-2", - "question": "02. Can you help with scholarship applications?", - "answer": "Absolutely! We identify suitable scholarships, guide application processes, and maximize your chances of receiving financial aid.", - "isExpanded": true - }, - { - "id": "faq-scholarship-3", - "question": "03. How long does the visa process take?", - "answer": "Absolutely! We identify suitable scholarships, guide application processes, and maximize your chances of receiving financial aid.", - "isExpanded": false - }, - { - "id": "faq-scholarship-4", - "question": "04. Is post-arrival support available?", - "answer": "Absolutely! We identify suitable scholarships, guide application processes, and maximize your chances of receiving financial aid.", - "isExpanded": false - } - ] - } - }, - { - "slug": "permanent-residency", - "name": "Permanent Residency (PR) Services", - "description": "Our PR services guide clients through every step of the residency process, including documentation, eligibility assessment, and application support, ensuring a smooth and successful approval.", - "image": "/img/home-3/service/03.jpg", - "layout": "left", - "details": { - "title": "Permanent Residency (PR) Services", - "description": "Our PR services guide clients through every step of the residency process, including documentation, eligibility assessment, and application support, ensuring a smooth and successful approval.", - "mainImage": "/img/inner-page/service-details/details-1.jpg", - "overviewTitle": "Service Overview", - "overviewDescription": "Our Permanent Residency services provide comprehensive support for individuals seeking to establish permanent residence in their chosen country. We handle all aspects of the PR application process with expertise and care.", - "additionalDescription": "Our experienced team ensures that your PR application is handled professionally and efficiently, maximizing your chances of approval.", - "keyFeaturesTitle": "Key Features", - "keyFeaturesImage": "/img/inner-page/service-details/details-2.jpg", - "features": [ - { - "title": "Eligibility Assessment", - "description": "Comprehensive evaluation of your PR eligibility and options." - }, - { - "title": "Points Calculation", - "description": "Accurate calculation and optimization of your points score." - }, - { - "title": "Document Verification", - "description": "Thorough verification and preparation of all required documents." - }, - { - "title": "Application Tracking", - "description": "Regular updates and tracking of your PR application status." - }, - { - "title": "Interview Preparation", - "description": "Coaching and preparation for PR interviews if required." - }, - { - "title": "Post-Approval Support", - "description": "Guidance on next steps after PR approval and settlement." - } - ], - "faqTitle": "Frequently Asked Question", - "faqImage": "/img/inner-page/service-details/details-3.jpg", - "faq": [ - { - "id": "faq-pr-1", - "question": "01. How long does the PR process take?", - "answer": "Processing times vary by country and program, typically ranging from 12-24 months. We provide realistic timelines based on current processing standards.", - "isExpanded": false - }, - { - "id": "faq-pr-2", - "question": "02. What documents are required for PR application?", - "answer": "Document requirements vary by country but typically include educational credentials, work experience, language test results, and medical examinations. We provide a complete checklist.", - "isExpanded": true - }, - { - "id": "faq-pr-3", - "question": "03. Can I include my family in the PR application?", - "answer": "Yes, most PR programs allow you to include your spouse and dependent children. We help you understand family inclusion requirements and processes.", - "isExpanded": false - }, - { - "id": "faq-pr-4", - "question": "04. What happens if my PR application is rejected?", - "answer": "If rejected, we analyze the reasons and explore options including appeals, reapplication, or alternative immigration pathways to achieve your goals.", - "isExpanded": false - } - ] - } - }, - { - "slug": "citizenship-naturalization", - "name": "Citizenship & Naturalization Guidance", - "description": "We provide expert guidance for citizenship and naturalization processes, assisting clients with documentation, eligibility, and legal procedures to achieve a smooth and successful application.", - "image": "/img/home-3/service/04.jpg", - "layout": "right", - "details": { - "title": "Citizenship & Naturalization Guidance", - "description": "We provide expert guidance for citizenship and naturalization processes, assisting clients with documentation, eligibility, and legal procedures to achieve a smooth and successful application.", - "mainImage": "/img/inner-page/service-details/details-1.jpg", - "overviewTitle": "Service Overview", - "overviewDescription": "Our Citizenship & Naturalization service helps individuals navigate the complex process of becoming a citizen. We provide step-by-step guidance, documentation support, and legal expertise throughout the entire process.", - "additionalDescription": "With our comprehensive approach, we make the path to citizenship clear, manageable, and successful for every client.", - "keyFeaturesTitle": "Key Features", - "keyFeaturesImage": "/img/inner-page/service-details/details-2.jpg", - "features": [ - { - "title": "Citizenship Test Preparation", - "description": "Comprehensive preparation for citizenship knowledge tests." - }, - { - "title": "Language Requirements", - "description": "Guidance on meeting language proficiency requirements." - }, - { - "title": "Residency Verification", - "description": "Assistance with proving residency and physical presence requirements." - }, - { - "title": "Application Processing", - "description": "Complete support throughout the citizenship application process." - }, - { - "title": "Interview Coaching", - "description": "Preparation and coaching for citizenship interviews." - }, - { - "title": "Ceremony Preparation", - "description": "Support and guidance for the citizenship ceremony process." - } - ], - "faqTitle": "Frequently Asked Question", - "faqImage": "/img/inner-page/service-details/details-3.jpg", - "faq": [ - { - "id": "faq-citizenship-1", - "question": "What are the basic requirements for citizenship?", - "answer": "Requirements typically include permanent residency, physical presence, language proficiency, and knowledge of the country's history and government. Specific requirements vary by country.", - "isExpanded": false - }, - { - "id": "faq-citizenship-2", - "question": "How do I prepare for the citizenship test?", - "answer": "We provide comprehensive study materials, practice tests, and coaching sessions to help you prepare for both the knowledge test and language requirements.", - "isExpanded": false - }, - { - "id": "faq-citizenship-3", - "question": "How long does the citizenship process take?", - "answer": "Processing times vary by country but typically range from 12-24 months from application to ceremony. We help you understand specific timelines for your situation.", - "isExpanded": false - }, - { - "id": "faq-citizenship-4", - "question": "Can I maintain dual citizenship?", - "answer": "Dual citizenship policies vary by country. We help you understand the implications and requirements for maintaining multiple citizenships if applicable.", - "isExpanded": false - } - ] - } - } - ] - }, - - "destinations": { - "backgroundImage": "/img/home-3/choose-us/bg.png", - "title": { - "subTitle": "Countries we offer", - "mainTitle": "Choose Your Immigration Destination" - } - }, - - "visas": { - "items": [ - { - "id": "family-visa", - "number": "01", - "name": "Family Visa", - "description": "Our Family Visa services help reunite loved ones by providing expert guidance.", - "buttonText": "service _ 02", - "buttonLink": "service-details.html" - }, - { - "id": "student-visa", - "number": "02", - "name": "Student Visa", - "description": "We provide expert guidance for student visa applications.", - "buttonText": "service _ 02", - "buttonLink": "service-details.html" - }, - { - "id": "work-visa", - "number": "03", - "name": "Work Visa", - "description": "Collaboratively disintermediate one to one functionalities and long term.", - "buttonText": "service _ 02", - "buttonLink": "service-details.html" - } - ] - }, - - "reviews": { - "title": { - "subTitle": "What Our Clients Say", - "mainTitle": "Immigration Success Stories" - }, - "thumb": "/img/home-3/test-thumb.jpg", - "items": [ - { - "id": "client-review-1", - "rating": 5, - "content": "The team provided exceptional guidance throughout my immigration process.", - "author": { - "name": "Mohammed Ali,", - "type": "Family Visa" - }, - "icon": "fa-solid fa-quote-right" - }, - { - "id": "client-review-2", - "rating": 5, - "content": "Their expertise and personalized support ensured a smooth visa approval.", - "author": { - "name": "Sarah Johnson,", - "type": "Student Visa" - }, - "icon": "fa-solid fa-quote-right" - } - ] - } -} diff --git a/data/terms-conditions.json b/data/terms-conditions.json deleted file mode 100644 index 98df5d5..0000000 --- a/data/terms-conditions.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "hero": { - "title": "Frequently Asked Questions", - "backgroundImage": "/uploads/terms/faqimage.jpg", - "sectionClass": "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - "backgroundClasses": "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - "overlayStyle": { - "backgroundColor": "rgba(0, 0, 0, 0)" - }, - "titleClass": "text-white text-[5vw] uk-text-center", - "enableScrollspy": true - }, - - "page": { - "title": "Terms & Conditions Go and Grow Camp e.K.", - "divider": true, - "sectionClass": "uk-section-default uk-section-overlap uk-section", - "titleClass": "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - "dividerClass": "uk-divider-small uk-text-left@m uk-text-center" - }, - - "content": { - "sectionClass": "uk-section-muted uk-section-overlap uk-section", - "textClass": "uk-panel uk-margin text-[1vw]", - "content": [ - { - "type": "paragraph", - "text": "This is an English translation of the original and legally binding German document \"Allgemeine Geschäftsbedingungen Go and Grow Camp e.K.\", which can be viewed at https://www.campadventure.de/de/infos/agb. This translation is for your information only and is not legally binding." - }, - { - "type": "paragraph", - "text": "Go and Grow Camp e.K. is the tour operator for individuals, for camps in Germany, England and Northern Ireland." - }, - { - "type": "paragraph", - "text": "GUARANTEE: All participants are protected in accordance with the legal regulations governing tour operators in Germany. As per §651, any payments made towards the travel price are insured against insolvency by tourVers." - }, - { - "type": "paragraph", - "text": "The following terms and conditions of travel apply to package travel contracts, to which the §§ 651a ff BGB regulations relating to travel contracts apply. The provisions, in so far as these have been effectively agreed, become part of the contract formed between the traveler and tour operator. They supplement and complete the legal regulations of §§ 651 a to y BGB and Articles 250 und 252 EGBGB." - }, - { - "type": "section", - "title": "1. Conclusion of the travel contract", - "content": "By registering for travel, the traveler submits a binding offer to conclude the travel agreement. Registrations can be made verbally, by telephone, in writing, by email or by electronic means, such as the internet booking system \"Book a Camp\". The contract comes into effect once a declaration of acceptance has been received. The tour operator will provide the traveler with a booking confirmation in line with legal requirements in a durable medium, unless the traveler is entitled to a travel confirmation in paper form under Article 250 § 6 Paragraph 1 Clause 2 EGBG. If the registration is made electronically, the contract is concluded once the traveler has received confirmation from the tour operator in a durable medium. If the corresponding travel confirmation is displayed directly after using the \"place a binding order\" button, the contract comes into effect upon display of this confirmation. The traveler will receive travel documents 2-3 weeks before the start of the trip. Any additional agreements, arrangements and wishes must be confirmed by us in writing, otherwise the services laid out in the contract apply. The traveler is liable for all contractual obligations of travelers that he registers, just as he is for his own, provided that he has assumed this obligation through an explicit and separate declaration. Should the contents of the booking confirmation deviate from the content of the booking, this constitutes a new offer, to which the tour operator is bound for a period of 10 days. The contract takes effect on the basis of this new offer, provided that the tour operator has indicated the changes relating to this new offer and has fulfilled his precontractual information duties and that the traveler gives the tour operator express consent, either through explicit declaration or deposit, within the commitment period. Pursuant to the legal regulation § 312 g Para. 2, Clause 1 Nr. 9 BGB and relating to all of the above-mentioned booking types, no right of withdrawal exists for distance contracts after contract conclusion. However, withdrawal from the contract on the basis of § 651 h BGB is possible at any time." - }, - { - "type": "section", - "title": "2. Terms of payment", - "content": "Go and Grow Camp e.K. shall only request or accept payments towards the travel price before the completion of the trip if the traveler has been provided with a guarantee certificate, stating the name and contact details of the credit institution, in accordance with § 651 r Abs. 4 BGB. A deposit of USD 50 per participant is due within one week of registration and after the issue of a guarantee certificate. The outstanding balance must be transferred, without specific request, no later than four weeks before the start of the trip, provided that the guarantee certificate has been issued and that the tour operator has not exercised its right of withdrawal on the grounds stated in Point 7. If, even after notification, the specified deposit sum is not payed, or the travel price has not been paid in full, prior to the commencement of the trip, although the tour operator is ready to provide the contractual services, has fulfilled all legal obligations and the client has no legal or contractual right of retention, the tour operator is entitled to withdraw from the travel contract after issuing a reminder with a deadline and to charge cancellation fees to the traveler." - }, - { - "type": "section", - "title": "3. Services and service modifications", - "content": "a) Our services are defined in our service descriptions and general program information found on the website https://www.campadventure.de/en/ and in the information given in the travel confirmation. Any additional agreements affecting the scope of the contractual services must be confirmed by us in written form.
    b) Luggage will be transported without any additional fee, as long as it does not exceed the norms, here defined as a maximum of 1 suitcase and 1 piece of hand luggage per person.
    c) External services arranged by us as part of the journey are not part of the initial travel contract, as long as these services are clearly marked as such with the identity and address of the contractual partner in the travel information and travel confirmation, such that the traveler can recognize that these are not part of the travel services offered by the tour operator.
    d) Any modifications to and deviations from the essential travel services agreed upon in the travel contract that become necessary after conclusion of the contract and are made in good faith, are permissible as long as the modifications and deviations are not substantial and do not impact the overall arrangement of the booked trip.
    e) The tour operator is obliged to inform the traveler of the reasons for a permissible modification to the essential travel service immediately, clearly, understandably and in a durable medium.
    f) In the event of a substantial change to an essential travel service or a deviation from special provisions stipulated in the contract for a traveler, the traveler is entitled to withdraw from the contract or demand another journey of at least equivalent value by the deadline specified at the same time as the contract change. This only applies if the tour operator is in a position to offer such a trip without any extra cost to the traveler. The traveler is free to decide whether to respond to the communication or not. The traveler is obliged to exercise these rights after being notified of the change. If the traveler does not respond by the specified deadline or at all, the communicated changes will be understood to be accepted. Any warranty claims remain unaffected, in so far as the modified services are deficient." - }, - { - "type": "section", - "title": "4. Customer cancellation", - "content": "The traveler is advised to communicate cancellation in a durable medium. Should the traveler withdraw from the travel contract before the start of the trip, or should he not begin the trip, the tour operator may claim fair compensation, provided it is not responsible for the withdrawal and that no exceptional circumstances have arisen at the destination or in the immediate vicinity, which have a significant effect on the execution of the trip or the transportation of persons to the destination. The compensation value is based on the travel price less the value of the costs saved by the tour operator and the sum that the tour operator is able to earn through alternative use of its services. The standard rates are based on the time period between the notice of cancellation and the start of the trip, as well as the expected saved expenses and the possible sum resulting from any other use of travel services. Upon receipt of notice of cancellation, compensation is calculated according to a sliding percentage scale, as follows (cancellation costs per person):", - "subsections": [ - { - "type": "cancellation_table", - "title": "Standard Cancellation Fees", - "items": [ - "cancellation up to 60 days before the beginning of the trip – USD 50/100", - "cancellation up to 31 days before the beginning of the trip – 30% of travel costs, USD 50 minimum", - "cancellation up to 14 days before the beginning of the trip – 50% of travel costs, USD 50 minimum", - "cancellation up to 1 day before the beginning of the trip – 80% of travel costs, USD 50 minimum", - "cancellation on the day of arrival or later – 90% of travel costs" - ] - }, - { - "type": "cancellation_section", - "title": "Cancellation policy for school groups:", - "items": [ - "A correction of student numbers up to 10% students is free of charge. Any higher alteration of numbers will lead to an extra cost.", - "Cancellation till 60 days before start of the trip: the fee will be 20% of the total price.", - "Cancellation till 30 days before start of the trip: the fee will be 40% of the total price.", - "Cancellation till 14 days before start of the trip: the fee will be 60% of the total price.", - "Cancellation till 1 day before start of the trip: the fee will be 90% of the total price.", - "Any later cancellations till the day before the trip: the fee will be 100% of the total price." - ] - }, - { - "type": "note", - "text": "In any event, it is up to the customer to demonstrate that compensation owed to the tour operator is significantly lower that the cancellation fee claimed. The tour operator reserves the right, by way of deviation from the above charges, to claim a higher, individually calculated compensation sum, insofar as it can prove that significantly greater expenses than the relevant flat rate were incurred. In this case, the tour operator is required to calculate and prove these extra costs, taking into account the costs saved by the tour operator and the sum that the tour operator is able to earn through alternative use of the services. Following cancellation, the tour operator is obliged to issue a refund immediately, but in any case within 14 days of receipt of the notice of cancellation. § 651 e BGB remains unaffected by the above conditions. It is recommended that travelers take out cancellation insurance." - } - ] - }, - { - "type": "section", - "title": "5. Modifications at the traveler's request", - "content": "After conclusion of the contract the traveler may not change travel dates, the destination, starting location, accommodation or mode of transport. This does not apply if the change to the booking is necessary because the tour operator provided the traveler due to inadequate or false precontractual information provided by the tour operator, as per Art. 250 § 3 EGBGB. In this case, travel may be rebooked at no extra cost. Should the traveler demand changes or rebooking after conclusion of the contract, up to 32 days before departure, the tour operator is entitled to charge a processing fee of USD 20, unless the tour operator demonstrates that higher compensation is due, the sum of which is based on the travel price minus the costs saved by the tour operator and the sum that the tour operator is able to earn through alternative use of its services. Requests to change bookings after this period can only be honored, if at all, by withdrawing from the travel contract and simultaneously reregistering, as per Section 4. This does not apply to requests only resulting in minor additional costs." - }, - { - "type": "section", - "title": "6. Disruption by the traveler", - "content": "If the traveler continuously disrupts the travel program, despite warnings from the tour operator, or behaves contrary to the contract, such that immediate termination of the contract is justified, the tour operator may cancel the travel contract without notification. This also applies when the traveler does not consider reasonable and well-founded instructions. In such cases, the tour operator is entitled to retain the full travel price, minus the costs saved by the tour operator and the sum that the tour operator is able to earn through alternative use of the unused service, including any sums credited to it by service providers, so the daily rate can be reduced by 20% as a result of savings made by services not provided. Compensation claims remain unaffected. This shall not apply if such behavior contrary to the terms of the contract is a result of a breach of information duties on the part of the tour operator." - }, - { - "type": "section", - "title": "7. Minimum number of participants", - "content": "If the number of participants registered for our holiday camps our transfer services is less than 10-60 participants (depending on the trip), the tour operator may withdraw from the travel contract up to 6 weeks before the start of the trip. The tour operator must have stated the minimum number of participants for the relevant trip and the latest date by which the traveler must be informed of cancellation in the travel information and must also have clearly stated the minimum number of participants and the latest possible date of withdrawal in the travel confirmation. If it is evident at an earlier stage that the minimum number of participants will not be reached, the tour operator is obliged to inform the traveler immediately. If the trip does not take place for this reason, the tour operator is obliged to issue a refund of any payments made on the travel price immediately and in any case within 14 days of notice of withdrawal." - }, - { - "type": "section", - "title": "8. Warranty and remedy", - "content": "Should services not be rendered according to the contract, the traveler is entitled to claim legal warranty rights for a reduction in the trip price, according to § 651 m BGB, provided that the traveler has not failed in his contractual duties to report any faults to the tour operator which may have occurred during the provision of services. In the event of a defect during the tour, the traveler can only remedy the defect himself or, in the case of a considerable defect, as described in § 651 i Abs. 2 BGB, cancel the trip, according to § 651 l BGB, as long as the tour operator has been given an adequate time to remedy the defect. A deadline need not be defined if remedial action is impossible or rejected by the tour operator or if immediate remedial action or termination is justified due to particular interests of the client. The traveler is obliged to inform the tour operator of any defect immediately and on the spot. Defects should be reported to the tour manager of the tour operator, to the contact person at the contact address or the tour operator directly. Should a representative of the tour operator not be available or contractually obliged, the tour operator must be informed of any defects relating to the trip at the following address: Go and Grow Camp e.K., Museumstr. 39, 22765 Hamburg. It is recommended that such notifications are made in a durable medium. In accordance with § 651 j BGB, claims shall lapse two years after the final day of the trip, as defined by the contract. We refer to the mutual assistance clause under § 651 q BGB, according to which the traveler is entitled to adequate assistance, notably through the provision of appropriate information concerning healthcare services, local authorities and consular assistance, as well as support in establishing communication links and in the search for other travel options, without delay in the event of § 651 k Para. 4 BGB or if the traveler faces difficulties for other reasons. § 651 k Para. 3 BGB remains unaffected." - }, - { - "type": "section", - "title": "9. Traveler's duty of cooperation", - "content": "The passenger is obliged to cooperate within the framework of legal regulations and to avoid or minimize potential damages. In the case of travel involving minors, it is the person with the supervisory role and not the tour operator, who is liable for any damages that arise. A violation of regulations may result in exclusion from the trip, as stipulated in Point 6 \"Disruption by the traveler\". Destruction, loss, damage or delay of baggage must be communicated to the transport company immediately. The transport company is required to issue written confirmation. In the case of no notification, there is a danger of losing the right to claims. The tour operator recommends that damage or delay in delivery when travelling by air is urgently and immediately reported to the relevant airline on the spot by means of a property irregularity report (P.I.R.). As a rule, airlines refuse to provide compensation if a property irregularity report has not been completed. The property irregularity report must be submitted within 7 days for lost luggage and within 21 days of delivery of delayed luggage. Otherwise, loss, damage or misdirection of baggage must be reported to the tour operator or to the local representative of the operator. This does not release the traveler from providing the airline with a property irregularity report within the above-mentioned periods." - }, - { - "type": "section", - "title": "10. Limitation of liability", - "content": "The tour operator's contractual liability for damages, not including damage to the body, nor damage caused by the negligence of the tour operator, is limited to three times the tour price. Any claims under international agreements or on legal regulations based on these remain unaffected by this limitation. We are not liable for service disruptions, personal injury or property damage in connection with third party services that are explicitly designated as such in the travel description and travel confirmation, where the name and address of the contract partner are given, in such a way that the traveler can clearly recognize that these are not an integral part of the travel services offered by the tour operator and that these are chosen separately. This applies in particular to additional programs over the course of the trip. §§ 651 b, 651 c, 651 w und 651 y remain unaffected. The tour operator is however liable if and insofar as the traveler suffers damages as a result of the failure of the tour operator to fulfill its information, clarification and organization obligations." - }, - { - "type": "section", - "title": "11. Passport, visa and health requirements", - "content": "The tour operator will inform the customer of any important changes to the general regulations contained in the travel announcement before the start of the trip. Before conclusion of the contract, the tour operator will inform the traveler of visa requirements and health formalities applicable to the destination country, including approximate periods for obtaining the necessary visa and will inform the traveler of any changes to these before the start of the trip. The tour operator shall not be liable for the timely issue and acquisition of necessary visas from the relevant diplomatic representation, if the traveler has charged the tour operator with the procurement of visas, unless the tour operator neglected its duties or is responsible for the delay. The traveler is responsible for compliance with all regulations important for the operation of the tour. The traveler is responsible for obtaining and carrying the necessary travel documents, any necessary vaccinations and for adhering to customs and foreign exchange regulations. Any disadvantages arising from failure to comply with these regulations, including but not limited to the payment of cancellation fees, shall be at the traveler's cost. This does not apply if the tour operator has not provided information, or if the information provided proves to be insufficient or false." - }, - { - "type": "section", - "title": "12. Data protection", - "content": "The protection of clients' privacy and personal data is very important to Go and Grow Camp. Go and Grow Camp collects and processes data according to legal regulations. Personal data is only stored when necessary for the performance of booked services or to comply with legal regulations." - }, - { - "type": "section", - "title": "13. Place of jurisdiction", - "content": "The entire legal and contractual relationship between the travel operator and travelers with no general place of residence or registered office in Germany shall be governed exclusively by German law, on the proviso that, should the traveler have a general place of residence in another country in accordance with Art. 6 Para. 2 of the Rome I Regulation, they are also protected by any mandatory rules of law in that country, which would not otherwise apply. The traveler can take legal action against the tour operator only at its registered office. Should the travel operator take legal action against the traveler, the domicile of the traveler is decisive, unless action is directed against registered traders or persons who have changed their residence or customary place of abode to a foreign country or whose residence or customary place of abode is not known at the time when legal action is brought. In such cases, the registered office of the tour operator is decisive. With respect to the law concerning consumer dispute resolution, the tour operator advises that it will not take part in any voluntary dispute settlement. Should the tour operator be obliged to take part in a dispute settlement after the printing of these travel conditions, the tour operator will inform the traveler of this in appropriate form. In relation to all travel contracts concluded electronically, the tour operator refers to the European online dispute resolution platform http://ec.europa.eu/consumers/odr/." - }, - { - "type": "section", - "title": "14. Identity of the operating airline", - "content": "Should the travel contract include transport by plane, the traveler will be informed of the identity and name(s) of the operating airline(s) providing all air transport services as part of the booked trip. Should the identity of the airline(s) be undetermined at the time of booking, the tour operator will inform the traveler of the airline or airlines that are most likely to operate the flight or flights and will inform the traveler immediately, as soon as this is determined. The tour operator must inform the traveler immediately if the airline is changed. The tour operator must take all appropriate steps to ensure that the customer is informed of the change as quickly as possible. The list of airlines on the EU blacklist can be found here: https://ec.europa.eu/transport/modes/air/safety/air-ban/search_en" - }, - { - "type": "section", - "title": "15. Invalidity of individual terms", - "content": "The invalidity of individual terms does not render other conditions or the contract as a whole invalid. 16. VAT Exemption in accordance with § 4 Nr. 23 UstG, Go and Grow Camp e.K. is exempt from sales tax for all child and youth travel." - }, - { - "type": "paragraph", - "text": "Last updated: August 2018" - } - ] - } -} \ No newline at end of file diff --git a/data/travel.json b/data/travel.json deleted file mode 100644 index 92f4ffe..0000000 --- a/data/travel.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "hero": { - "title": "Go and Grow Camp\nLast travel informations", - "backgroundImage": "/uploads/banner/b18.jpg" - }, - "page": { - "type": "blog", - "title": "Go and Grow Camp - Travel", - "year": "2026" - }, - "posts": [ - { - "id": "travel-info-2026", - "title": "Travel Information — Go and Grow Camp 2026", - "slug": "travel-information-2026", - "date": "2026-01-01", - "author": "Go and Grow Camp", - "excerpt": "Summary of important travel details, arrival/departure times and contact points.", - "coverImage": "/uploads/banner/b18.jpg", - "categories": ["Travel", "Info"], - "tags": ["travel", "camp", "2026"], - "content": { - "blocks": [ - { - "type": "paragraph", - "data": { - "text": "Our entire team is looking forward to an exciting and adventurous holiday camp with you. Below you will find a summary of all the important information about our adventure, sports and language camps. If you have any further questions, please contact us at office@campadventure.de" - } - } - ] - } - } - ] -} diff --git a/data/visa.json b/data/visa.json deleted file mode 100644 index f39e1d5..0000000 --- a/data/visa.json +++ /dev/null @@ -1,300 +0,0 @@ -{ - "hero": { - "title": "Visa Service", - "summaryList": [ - { - "id": 1, - "name": "France", - "slug": "france", - "icon": "/img/home-2/visa/03.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ], - "detailedView": { - "activeCountry": { - "id": 1, - "name": "United States of America ", - "title": "COUNTRY USA", - "mainImage": "/img/inner-page/country-details/details-1.jpg", - "description": "The United States is one of the most popular destinations for international students and immigrants, offering world-class universities, diverse cultural experiences, and countless career opportunities...", - "additionalInfo": "Our consultancy provides complete guidance for study visas, work permits, and permanent residency pathways tailored to your goals.", - "tagline": "Over the last 35 Years we made an impact that is strong & we have long way to go.", - "visaTypes": [ - { - "category": "Tourist & Work", - "items": [ - { - "title": "Tourist Visa", - "description": "Broad term that can refer to various aspects of interconnectedness" - }, - { - "title": "Work Permit", - "description": "Broad term that can refer to various aspects of interconnectedness" - } - ] - }, - { - "category": "Student & Family", - "items": [ - { - "title": "Student", - "description": "Broad term that can refer to various aspects of interconnectedness" - }, - { - "title": "Tourist Visa", - "description": "Broad term that can refer to various aspects of interconnectedness" - } - ] - } - ], - "visaProcess": { - "title": "USA Visa Process", - "steps": [ - { - "number": "01", - "title": "Consultation & Eligibility Check", - "description": "Our experts review your profile and visa requirements." - }, - { - "number": "02", - "title": "Application Preparation", - "description": "We help with document collection, form filling, and statement drafting." - }, - { - "number": "03", - "title": "Submission", - "description": "Visa application is submitted online with required fees." - }, - { - "number": "04", - "title": "Interview Guidance", - "description": "Get training and mock sessions for embassy interview." - }, - { - "number": "05", - "title": "Approval & Travel", - "description": "Once approved, we provide travel and pre-departure guidance." - } - ] - }, - "gallery": [ - "/img/inner-page/country-details/details-2.jpg", - "/img/inner-page/country-details/details-3.png" - ], - "visaCategories": { - "title": "Types of USA Visas", - "steps": [ - [ - "Student Visa (F1, M1, J1)", - "Work Visa (H1B, L1)", - "Tourist Visa (B1/B2)" - ], - [ - "Family/Spouse Visa (K1, IR1, F2A)", - "Green Card / Immigrant Visa" - ] - ] - }, - "visaService": { - "title": "Our USA Visa Service Options", - "steps": [ - { - "number": "01", - "title": "Consultation & Eligibility Check", - "description": "Our experts review your profile and visa requirements." - }, - { - "number": "02", - "title": "Application Preparation", - "description": "We help with document collection, form filling, and statement drafting." - }, - { - "number": "03", - "title": "Submission", - "description": "Visa application is submitted online with required fees." - }, - { - "number": "04", - "title": "Interview Guidance", - "description": "Get training and mock sessions for embassy interview." - }, - { - "number": "05", - "title": "Approval & Travel", - "description": "Once approved, we provide travel and pre-departure guidance." - } - ] - } - }, - "relatedCountries": [ - { - "id": 1, - "name": "Canada", - "icon": "/img/inner-page/country-details/01.png" - }, - { - "id": 2, - "name": "USA", - "icon": "/img/inner-page/country-details/02.png" - }, - { - "id": 3, - "name": "USA", - "icon": "/img/inner-page/country-details/03.png" - }, - { - "id": 4, - "name": "Saint Helena", - "icon": "/img/inner-page/country-details/05.png" - }, - { - "id": 5, - "name": "Iran", - "icon": "/img/inner-page/country-details/06.png" - }, - { - "id": 6, - "name": "Spain", - "icon": "/img/inner-page/country-details/07.png" - }, - { - "id": 7, - "name": "Japan", - "icon": "/img/inner-page/country-details/08.png" - } - ], - "contactInfo": { - "img": "/img/inner-page/country-details/bg.jpg", - "sectionTitle": "Visa & Immigration", - "helpText": "Need Help? Book Lab Visit", - "phone": { - "label": "Call Us", - "value": "+009 438 222 9540", - "link": "tel:+0094382229540" - }, - "email": { - "label": "Mail Us", - "value": "infor@xridergamil.com", - "link": "mailto:infor@xridergamil.com" - }, - "location": { - "label": "Location", - "address": "Toronto, Montreal, City 2026" - } - } - } - }, - { - "id": 2, - "name": "UK", - "slug": "uk", - "icon": "/img/home-2/visa/11.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 3, - "name": "Canada", - "slug": "canada", - "icon": "/img/home-2/visa/02.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 4, - "name": "Germany", - "slug": "germany", - "icon": "/img/home-2/visa/12.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 5, - "name": "Spain", - "slug": "spain", - "icon": "/img/home-2/visa/13.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 6, - "name": "South Korea", - "slug": "south-korea", - "icon": "/img/home-2/visa/14.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 7, - "name": "Japan", - "slug": "japan", - "icon": "/img/home-2/visa/15.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 8, - "name": "Croatia", - "slug": "croatia", - "icon": "/img/home-2/visa/16.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 9, - "name": "England", - "slug": "england", - "icon": "/img/home-2/visa/17.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - }, - { - "id": 10, - "name": "Indonesia", - "slug": "indonesia", - "icon": "/img/home-2/visa/18.png", - "services": [ - "Student Visa & Admission", - "Work Visa – H1B", - "Work permit for Canada", - "Student Visa for Canada" - ] - } - ] - } -} diff --git a/models/activity.js b/models/activity.js deleted file mode 100644 index 2c62e7e..0000000 --- a/models/activity.js +++ /dev/null @@ -1,194 +0,0 @@ -const mongoose = require("mongoose"); - -const activitySchema = new mongoose.Schema( - { - // Hero section for activity page header (supports Activities and Booking variants) - hero: { - titleActivities: { - type: String, - trim: true, - default: '' - }, - titleBooking: { - type: String, - trim: true, - default: '' - }, - bannerImageActivities: { - type: String, - trim: true, - default: '' - }, - bannerImageBooking: { - type: String, - trim: true, - default: '' - }, - }, - name: { - type: String, - required: true, - trim: true, - }, - price: { - type: Number, - required: true, - min: 0, - }, - priceText: { - type: String, - trim: true, - }, - season: [ - { - type: String, - enum: ["spring", "summer", "autumn", "winter"], - }, - ], - age: { - type: [Number], - validate: { - validator: function (v) { - return v.length === 2 && v[0] <= v[1]; - }, - message: "Age must be an array of [minAge, maxAge]", - }, - }, - locations: [ - { - type: String, - trim: true, - }, - ], - image: { - type: String, - trim: true, - }, - link: { - type: String, - trim: true, - }, - // Global filters document (single document in Activity collection) - filters: [ - { - label: { type: String, required: true, trim: true }, - value: { type: String, required: true, trim: true }, - items: [ - { - value: { type: String, required: true }, - label: { type: String, required: true }, - }, - ], - order: { type: Number, default: 0 }, - }, - ], - program: { - type: String, - trim: true, - }, - rating: { - type: Number, - min: 1, - max: 5, - default: 4, - }, - isActive: { - type: Boolean, - default: true, - }, - order: { - type: Number, - default: 0, - }, - // marker for the single document that stores global filters - isFiltersDoc: { - type: Boolean, - default: false, - }, - // Rich camp details from camp-detail field in activities.json - campDetail: { - type: mongoose.Schema.Types.Mixed, - default: {}, - }, - // Booking sessions - các đợt booking với thông số riêng - bookingSessions: [ - { - sessionId: { type: String, required: true }, - startDate: { type: Date, required: true }, - endDate: { type: Date, required: true }, - overnightStays: { type: Number, required: true, default: 14 }, - // Spots theo giới tính - totalMaleSpots: { type: Number, default: 25 }, - totalFemaleSpots: { type: Number, default: 25 }, - bookedMaleSpots: { type: Number, default: 0 }, - bookedFemaleSpots: { type: Number, default: 0 }, - price: { type: Number }, - isActive: { type: Boolean, default: true }, - // Danh sách booking cho session này - bookingList: [ - { - address: { type: String, required: true }, - agreeNewsletter: { type: Boolean, default: false }, - agreeTerms: { type: Boolean, required: true }, - city: { type: String, required: true }, - country: { type: String, required: true }, - dietaryRestrictions: { - type: String, - enum: ['none', 'vegetarian', 'vegan', 'halal', 'kosher', 'gluten-free', 'other'], - default: 'none' - }, - email: { - type: String, - required: true, - lowercase: true, - trim: true - }, - emergencyContact: { type: String, required: true }, - emergencyPhone: { type: String, required: true }, - medicalConditions: { type: String, default: '' }, - numberOfParticipants: { type: Number, required: true, min: 1 }, - parentFirstName: { type: String, required: true, trim: true }, - parentLastName: { type: String, required: true, trim: true }, - participantBirthDate: { type: Date, required: true }, - participantFirstName: { type: String, required: true, trim: true }, - participantGender: { - type: String, - enum: ['male', 'female', 'other'], - required: true - }, - participantLastName: { type: String, required: true, trim: true }, - phone: { type: String, required: true }, - postalCode: { type: String, required: true }, - sessionDate: { type: String, required: true }, // sessionId reference - specialRequests: { type: String, default: '' }, - // Thêm các trường quản lý - bookingStatus: { - type: String, - enum: ['pending', 'confirmed', 'cancelled', 'completed'], - default: 'pending' - }, - paymentStatus: { - type: String, - enum: ['pending', 'partial', 'paid', 'refunded'], - default: 'pending' - }, - totalAmount: { type: Number, default: 0 }, - paidAmount: { type: Number, default: 0 }, - bookingDate: { type: Date, default: Date.now }, - confirmationCode: { type: String, unique: true }, - adminNotes: { type: String, default: '' } - } - ] - } - ], - }, - {timestamps: true} -); - -// Add index for better query performance -activitySchema.index({name: 1}); -activitySchema.index({isActive: 1, order: 1}); -activitySchema.index({season: 1}); -activitySchema.index({locations: 1}); - -module.exports = mongoose.model("Activity", activitySchema); diff --git a/models/insurance.js b/models/insurance.js deleted file mode 100644 index 813543f..0000000 --- a/models/insurance.js +++ /dev/null @@ -1,302 +0,0 @@ -const mongoose = require("mongoose"); - -// Schema cho content items -const contentItemSchema = new mongoose.Schema( - { - type: { - type: String, - enum: ["paragraph", "section", "list", "note", "embed", "header"], - required: true, - }, - text: { - type: String, - trim: true, - default: "", - }, - title: { - type: String, - trim: true, - default: "", - }, - content: { - type: String, - trim: true, - default: "", - }, - items: { - type: [String], - default: [], - }, - level: { - type: Number, - default: 2, - }, - // Embed/video fields - embed: { - type: String, - trim: true, - default: '' - }, - url: { - type: String, - trim: true, - default: '' - }, - source: { - type: String, - trim: true, - default: '' - }, - videoId: { - type: String, - trim: true, - default: '' - }, - caption: { - type: String, - trim: true, - default: '' - }, - width: { - type: Number, - default: 0 - }, - height: { - type: Number, - default: 0 - }, - }, - { _id: false } -); - -// Schema cho overlay style -const overlayStyleSchema = new mongoose.Schema( - { - backgroundColor: { - type: String, - trim: true, - default: "rgba(0, 0, 0, 0)", - }, - }, - { _id: false } -); - -// Schema cho hero section -const heroSchema = new mongoose.Schema( - { - title: { - type: String, - required: true, - trim: true, - default: "Insurance & Travel Cancellation Guarantee", - }, - subtitle: { - type: String, - trim: true, - default: "Comprehensive coverage for your peace of mind", - }, - backgroundImage: { - type: String, - trim: true, - default: "/uploads/banner/b13.jpg", - }, - sectionClass: { - type: String, - trim: true, - default: "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - }, - backgroundClasses: { - type: String, - trim: true, - default: "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - }, - overlayStyle: { - type: overlayStyleSchema, - default: () => ({ backgroundColor: "rgba(0, 0, 0, 0)" }), - }, - titleClass: { - type: String, - trim: true, - default: "text-white text-[5vw] uk-text-center", - }, - subtitleClass: { - type: String, - trim: true, - default: "uk-panel font-[Raleway] italic text-[1.5vw] uk-margin uk-text-center", - }, - enableScrollspy: { - type: Boolean, - default: true, - }, - }, - { _id: false } -); - -// Schema cho page section -const pageSchema = new mongoose.Schema( - { - title: { - type: String, - required: true, - trim: true, - default: "Insurance & Travel Information", - }, - divider: { - type: Boolean, - default: true, - }, - sectionClass: { - type: String, - trim: true, - default: "uk-section-default uk-section-overlap uk-section", - }, - titleClass: { - type: String, - trim: true, - default: "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - }, - dividerClass: { - type: String, - trim: true, - default: "uk-divider-small uk-text-left@m uk-text-center", - }, - }, - { _id: false } -); - -// Schema cho content section -const contentSchema = new mongoose.Schema( - { - sectionClass: { - type: String, - trim: true, - default: "uk-section-muted uk-section-overlap uk-section", - }, - textClass: { - type: String, - trim: true, - default: "uk-panel uk-margin text-[1vw]", - }, - content: { - type: [contentItemSchema], - default: [], - }, - }, - { _id: false } -); - -// Main Insurance Schema - CẤU TRÚC MỚI -const insuranceSchema = new mongoose.Schema( - { - name: { - type: String, - default: "default", - unique: true, - }, - // 3 PHẦN CHÍNH - hero: { - type: heroSchema, - required: true, - }, - page: { - type: pageSchema, - required: true, - }, - content: { - type: contentSchema, - required: true, - }, - language: { - type: String, - default: "en", - }, - version: { - type: String, - default: "2.0.0", - }, - isActive: { - type: Boolean, - default: true, - }, - migratedFromOldStructure: { - type: Boolean, - default: false, - }, - }, - { - timestamps: true, - } -); - -// Static method: Lấy insurance default -insuranceSchema.statics.getDefault = async function(language = "en") { - try { - let insurance = await this.findOne({ name: "default", language: language }); - - if (!insurance) { - // Tạo default data nếu chưa có - insurance = await this.create({ - name: "default", - language: language, - hero: { - title: "Insurance & Travel Cancellation Guarantee", - subtitle: "Comprehensive coverage for your peace of mind", - backgroundImage: "/uploads/banner/b13.jpg", - }, - page: { - title: "Insurance & Travel Information", - divider: true, - }, - content: { - content: [] - } - }); - } - - return insurance; - } catch (error) { - console.error("Error in getDefault:", error); - throw error; - } -}; - -// Method để get insurance data -insuranceSchema.methods.getInsuranceData = function() { - return this.toObject(); -}; - -// Migration method - chỉ hỗ trợ cấu trúc mới -insuranceSchema.statics.migrateFromJson = async function(jsonData, language = "en") { - try { - console.log('Migrating insurance from JSON...'); - - // Xóa document cũ nếu có - await this.deleteOne({ name: "default", language: language }); - - // Sử dụng dữ liệu từ JSON trực tiếp - const processedData = { - name: "default", - language: language, - version: "2.0.0", - isActive: true, - hero: jsonData.hero, - page: jsonData.page, - content: jsonData.content - }; - - // Tạo document mới - const newInsurance = await this.create(processedData); - const contentItems = jsonData.content?.content || []; - console.log(`Insurance data migrated successfully for language: ${language}`); - console.log(`Total content items: ${contentItems.length}`); - - return newInsurance; - } catch (error) { - console.error("Error migrating insurance data to new structure:", error); - throw error; - } -}; - -const Insurance = mongoose.model("Insurance", insuranceSchema); - -module.exports = Insurance; diff --git a/models/safety.js b/models/safety.js deleted file mode 100644 index b8a8cd2..0000000 --- a/models/safety.js +++ /dev/null @@ -1,76 +0,0 @@ -const mongoose = require("mongoose"); - -// Schema cho hero section -const safetySchema = new mongoose.Schema( - { - //hero section - hero: { - banner: String, - title: String, - }, - - //approach section - approach: { - badge: String, - title:String, - description:String, - imgs:{ - img1:String, - img2:String - }, - stats:{ - count:String, - label:String, - avatars:[String] - }, - features:[ - {text:String} - ], - cards: [ - { - title: String, - content: String, - }, - ], - }, - - //philosophy section - philosophy: { - title: String, - subtitle: String, - cards: [ - { - title: String, - content: String, - author: { - avt: String, - name: String, - role: String, - rating: String, - }, - }, - ], - }, - - //security section - security: { - title: String, - subtitle: String, - cards: [ - { - title: String, - content: String, - author: { - avt: String, - name: String, - role: String, - rating: String, - }, - }, - ], - }, -}, -{ timestamps: true } -); - -module.exports = mongoose.model("Safety", safetySchema); \ No newline at end of file diff --git a/models/terms.js b/models/terms.js deleted file mode 100644 index d967df6..0000000 --- a/models/terms.js +++ /dev/null @@ -1,519 +0,0 @@ -// models/terms.js -const mongoose = require("mongoose"); - -// Schema cho content items -const contentItemSchema = new mongoose.Schema( - { - type: { - type: String, - enum: ["paragraph", "section", "header", "list", "cancellation_table", "cancellation_section", "note", "embed", "image"], - required: true, - }, - text: { - type: String, - trim: true, - default: "", - }, - // Header level (h2, h3, h4, h5, h6) - level: { - type: Number, - min: 1, - max: 6, - default: 2, - }, - title: { - type: String, - trim: true, - default: "", - }, - content: { - type: String, - trim: true, - default: "", - }, - subsections: { - type: [mongoose.Schema.Types.Mixed], // Recursive reference - default: [], - }, - items: { - type: [String], - default: [], - }, - // List style (for list type) - style: { - type: String, - enum: ["ordered", "unordered"], - default: "unordered", - }, - // Embed/video fields (optional) - embed: { - type: String, - trim: true, - default: '' - }, - url: { - type: String, - trim: true, - default: '' - }, - source: { - type: String, - trim: true, - default: '' - }, - videoId: { - type: String, - trim: true, - default: '' - }, - caption: { - type: String, - trim: true, - default: '' - }, - width: { - type: Number, - default: 0 - }, - height: { - type: Number, - default: 0 - }, - }, - { _id: false } -); - -// Schema cho overlay style -const overlayStyleSchema = new mongoose.Schema( - { - backgroundColor: { - type: String, - trim: true, - default: "rgba(0, 0, 0, 0)", - }, - }, - { _id: false } -); - -// Schema cho hero section - CẤU TRÚC MỚI -const heroSchema = new mongoose.Schema( - { - title: { - type: String, - required: true, - trim: true, - default: "Frequently Asked Questions", - }, - backgroundImage: { - type: String, - trim: true, - default: "/uploads/terms/faqimage.jpg", - }, - sectionClass: { - type: String, - trim: true, - default: "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - }, - backgroundClasses: { - type: String, - trim: true, - default: "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - }, - overlayStyle: { - type: overlayStyleSchema, - default: () => ({ backgroundColor: "rgba(0, 0, 0, 0)" }), - }, - titleClass: { - type: String, - trim: true, - default: "text-white text-[5vw] uk-text-center", - }, - enableScrollspy: { - type: Boolean, - default: true, - }, - }, - { _id: false } -); - -// Schema cho page section - CẤU TRÚC MỚI -const pageSchema = new mongoose.Schema( - { - title: { - type: String, - required: true, - trim: true, - default: "Terms & Conditions Go and Grow Camp e.K.", - }, - divider: { - type: Boolean, - default: true, - }, - sectionClass: { - type: String, - trim: true, - default: "uk-section-default uk-section-overlap uk-section", - }, - titleClass: { - type: String, - trim: true, - default: "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - }, - dividerClass: { - type: String, - trim: true, - default: "uk-divider-small uk-text-left@m uk-text-center", - }, - }, - { _id: false } -); - -// Schema cho content section - CẤU TRÚC MỚI -const contentSchema = new mongoose.Schema( - { - sectionClass: { - type: String, - trim: true, - default: "uk-section-muted uk-section-overlap uk-section", - }, - textClass: { - type: String, - trim: true, - default: "uk-panel uk-margin text-[1vw]", - }, - content: { - type: [contentItemSchema], - default: [], - }, - }, - { _id: false } -); - -// Main Terms Schema - CẤU TRÚC MỚI -const termsSchema = new mongoose.Schema( - { - name: { - type: String, - default: "default", - unique: true, - }, - // CHỈ CÒN 3 PHẦN CHÍNH - hero: { - type: heroSchema, - required: true, - }, - page: { - type: pageSchema, - required: true, - }, - content: { - type: contentSchema, - required: true, - }, - language: { - type: String, - default: "en", - }, - version: { - type: String, - default: "2.0.0", // Tăng version vì cấu trúc thay đổi - }, - isActive: { - type: Boolean, - default: true, - }, - migratedFromOldStructure: { - type: Boolean, - default: false, - }, - }, - { - timestamps: true, - } -); - -// Static method: Lấy terms default - CẬP NHẬT THEO CẤU TRÚC MỚI -termsSchema.statics.getDefault = async function(language = "en") { - try { - let terms = await this.findOne({ name: "default", language: language }); - - if (!terms) { - // Tạo terms mặc định theo cấu trúc mới - terms = new this({ - name: "default", - language: language, - hero: { - title: "Frequently Asked Questions", - subtitle: "Our Terms & Conditions", - backgroundImage: "/uploads/terms/faqimage.jpg", - sectionClass: "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - backgroundClasses: "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - overlayStyle: { - backgroundColor: "rgba(0, 0, 0, 0)" - }, - titleClass: "text-white text-[5vw] uk-text-center", - subtitleClass: "uk-panel font-[Raleway] italic text-[1.5vw] uk-margin uk-text-center", - enableScrollspy: true - }, - page: { - title: "Terms & Conditions Go and Grow Camp e.K.", - divider: true, - sectionClass: "uk-section-default uk-section-overlap uk-section", - titleClass: "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - dividerClass: "uk-divider-small uk-text-left@m uk-text-center" - }, - content: { - sectionClass: "uk-section-muted uk-section-overlap uk-section", - textClass: "uk-panel uk-margin text-[1vw]", - content: [ - { - type: "paragraph", - text: "This is an English translation of the original and legally binding German document \"Allgemeine Geschäftsbedingungen Go and Grow Camp e.K.\", which can be viewed at https://www.campadventure.de/de/infos/agb. This translation is for your information only and is not legally binding." - }, - { - type: "paragraph", - text: "Go and Grow Camp e.K. is the tour operator for individuals, for camps in Germany, England and Northern Ireland." - }, - { - type: "paragraph", - text: "GUARANTEE: All participants are protected in accordance with the legal regulations governing tour operators in Germany. As per §651, any payments made towards the travel price are insured against insolvency by tourVers." - } - ] - }, - version: "2.0.0", - isActive: true, - migratedFromOldStructure: false - }); - - await terms.save(); - console.log(`Created default terms for language: ${language} (new structure)`); - } - - return terms; - } catch (error) { - console.error("Error in getDefault:", error); - throw error; - } -}; - -// Method để get terms data -termsSchema.methods.getTermsData = function() { - return this.toObject(); -}; - -// Migration method từ JSON CŨ sang cấu trúc MỚI -termsSchema.statics.migrateFromJson = async function(jsonData, language = "en") { - try { - console.log('Migrating from JSON to new structure...'); - - // Xóa document cũ nếu có - await this.deleteOne({ name: "default", language: language }); - - // Chuyển đổi từ cấu trúc cũ sang mới - const processedData = { - name: "default", - language: language, - version: "2.0.0", - isActive: true, - migratedFromOldStructure: true, - - hero: { - title: jsonData.hero?.title || "Go and Grow Camp", - subtitle: jsonData.hero?.subtitle || "Our Terms & Conditions", - backgroundImage: jsonData.hero?.backgroundImage || "/uploads/terms/faqimage.jpg", - sectionClass: "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - backgroundClasses: "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - overlayStyle: { - backgroundColor: jsonData.hero?.overlayColor || "rgba(0, 0, 0, 0)" - }, - titleClass: "text-white text-[5vw] uk-text-center", - subtitleClass: "uk-panel font-[Raleway] italic text-[1.5vw] uk-margin uk-text-center", - enableScrollspy: jsonData.hero?.enableScrollspy || true - }, - - page: { - title: jsonData.termsHeader?.title || "Terms & Conditions Go and Grow Camp e.K.", - divider: jsonData.termsHeader?.divider !== false, - sectionClass: jsonData.termsHeader?.sectionClass || "uk-section-default uk-section-overlap uk-section", - titleClass: jsonData.termsHeader?.titleClass || "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - dividerClass: jsonData.termsHeader?.dividerClass || "uk-divider-small uk-text-left@m uk-text-center" - }, - - content: { - sectionClass: jsonData.layout?.termsSectionClass || "uk-section-muted uk-section-overlap uk-section", - textClass: jsonData.layout?.textContentClass || "uk-panel uk-margin text-[1vw]", - content: [] - } - }; - - // Chuyển đổi sections cũ sang content mới - const contentItems = []; - - // Thêm disclaimer đầu tiên nếu có - if (jsonData.disclaimer?.text) { - contentItems.push({ - type: "paragraph", - text: jsonData.disclaimer.text - }); - } - - if (jsonData.disclaimer?.importantNote) { - contentItems.push({ - type: "paragraph", - text: `${jsonData.disclaimer.importantNote}` - }); - } - - if (jsonData.disclaimer?.legalNote) { - contentItems.push({ - type: "paragraph", - text: jsonData.disclaimer.legalNote - }); - } - - // Thêm disclaimer note - if (jsonData.disclaimer?.note) { - contentItems.push({ - type: "paragraph", - text: jsonData.disclaimer.note - }); - } - - // Thêm các sections - if (jsonData.sections && Array.isArray(jsonData.sections)) { - jsonData.sections.forEach(section => { - if (section.title && section.content) { - const contentItem = { - type: "section", - title: section.title, - content: section.content - }; - - // Thêm subsections nếu có - if (section.subsections && section.subsections.length > 0) { - contentItem.subsections = section.subsections.map(sub => ({ - type: "note", - text: sub.content || sub - })); - } - - // Thêm cancellation fees nếu có - if (section.fees) { - contentItem.subsections = contentItem.subsections || []; - - // Individual fees - if (section.fees.individual && section.fees.individual.length > 0) { - contentItem.subsections.push({ - type: "cancellation_table", - title: "Standard Cancellation Fees", - items: section.fees.individual.map(fee => `${fee.period} – ${fee.fee}`) - }); - } - - // School group fees - if (section.fees.schoolGroups && section.fees.schoolGroups.fees) { - contentItem.subsections.push({ - type: "cancellation_section", - title: "Cancellation policy for school groups:", - items: [ - section.fees.schoolGroups.freeCorrection, - ...section.fees.schoolGroups.fees.map(fee => `${fee.period}: ${fee.fee}`) - ] - }); - } - - // Fee note - if (section.fees.note) { - contentItem.subsections.push({ - type: "note", - text: section.fees.note - }); - } - } - - contentItems.push(contentItem); - } - }); - } - - // Thêm footer note nếu có - if (jsonData.footerNote?.text) { - contentItems.push({ - type: "paragraph", - text: jsonData.footerNote.text - }); - } - - // Gán content items đã chuyển đổi - processedData.content.content = contentItems; - - // Tạo document mới - const newTerms = await this.create(processedData); - console.log(`Terms data migrated to new structure for language: ${language}`); - console.log(`Total content items: ${contentItems.length}`); - - return newTerms; - } catch (error) { - console.error("Error migrating terms data to new structure:", error); - throw error; - } -}; - -// Migration method từ cấu trúc MỚI sang cấu trúc MỚI (dành cho JSON mới) -termsSchema.statics.migrateFromNewJson = async function(jsonData, language = "en") { - try { - console.log('Migrating from new JSON structure...'); - - // Xóa document cũ nếu có - await this.deleteOne({ name: "default", language: language }); - - // Tạo document mới với cấu trúc mới - const newTerms = await this.create({ - name: "default", - language: language, - version: "2.0.0", - isActive: true, - migratedFromOldStructure: false, - - hero: { - title: jsonData.hero?.title || "Go and Grow Camp", - subtitle: jsonData.hero?.subtitle || "Our Terms & Conditions", - backgroundImage: jsonData.hero?.backgroundImage || "/uploads/terms/faqimage.jpg", - sectionClass: jsonData.hero?.sectionClass || "uk-section-default uk-section-overlap uk-preserve-color uk-light uk-position-relative", - backgroundClasses: jsonData.hero?.backgroundClasses || "uk-background-norepeat uk-background-cover uk-background-top-center uk-section uk-section-xlarge", - overlayStyle: jsonData.hero?.overlayStyle || { backgroundColor: "rgba(0, 0, 0, 0)" }, - titleClass: jsonData.hero?.titleClass || "text-white text-[5vw] uk-text-center", - subtitleClass: jsonData.hero?.subtitleClass || "uk-panel font-[Raleway] italic text-[1.5vw] uk-margin uk-text-center", - enableScrollspy: jsonData.hero?.enableScrollspy !== undefined ? jsonData.hero.enableScrollspy : true - }, - - page: { - title: jsonData.page?.title || "Terms & Conditions Go and Grow Camp e.K.", - divider: jsonData.page?.divider !== undefined ? jsonData.page.divider : true, - sectionClass: jsonData.page?.sectionClass || "uk-section-default uk-section-overlap uk-section", - titleClass: jsonData.page?.titleClass || "text-[2.5vw] text-[#292c3d] uk-text-left@m uk-text-center", - dividerClass: jsonData.page?.dividerClass || "uk-divider-small uk-text-left@m uk-text-center" - }, - - content: { - sectionClass: jsonData.content?.sectionClass || "uk-section-muted uk-section-overlap uk-section", - textClass: jsonData.content?.textClass || "uk-panel uk-margin text-[1vw]", - content: jsonData.content?.content || [] - } - }); - - console.log(`Terms data created with new structure for language: ${language}`); - console.log(`Hero title: ${newTerms.hero.title}`); - console.log(`Page title: ${newTerms.page.title}`); - console.log(`Content items: ${newTerms.content.content.length}`); - - return newTerms; - } catch (error) { - console.error("Error creating terms data from new structure:", error); - throw error; - } -}; - -const Terms = mongoose.model("Terms", termsSchema); - -module.exports = Terms; \ No newline at end of file diff --git a/models/travel.js b/models/travel.js deleted file mode 100644 index d903890..0000000 --- a/models/travel.js +++ /dev/null @@ -1,45 +0,0 @@ -const mongoose = require("mongoose"); - -const travelSchema = new mongoose.Schema( - { - page: { - title: { - type: String, - default: "Travel Information", - }, - description: { - type: String, - default: "", - }, - year: { - type: String, - default: "", - }, - metadata: { - title: String, - description: String, - }, - }, - hero: { - title: { - type: String, - default: "Travel Information", - }, - backgroundImage: { - type: String, - default: "", - }, - }, - content: { - type: mongoose.Schema.Types.Mixed, - default: { blocks: [] }, - }, - enableScrollspy: { - type: Boolean, - default: false, - }, - }, - { timestamps: true } -); - -module.exports = mongoose.model("Travel", travelSchema); diff --git a/public/img/favicon.png b/public/img/favicon.png index 820c25692207ed18885882a08055be1cf94c689e..02914527f802b158c7ef71a9af667ea22361af6a 100644 GIT binary patch literal 174569 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

    u`@h z=azRYTbVmCpVt|7QtX#Q_yX0>Huf6*`Tm3rLH&5p8ei*UgQ_Oi$FWaj%&c`-j}4E- z!HVN!> zDCW-`r*Q{(DAyhqjA%=1@QVPTsN69RCM=E$RIr1dHV#HWF$fnI{{HvB+d&wppg+hF zBs0fBf#hQ_Do$2E)UegJV%f4R#%c+TjI~xi!3hkNGYWkw74sw~A ^=$H?ANia$ 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

    3sdEaTEDStyp(}_E_-bNe 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%0A%CgLNmoD5ZOUXmQOoG-G( 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

    P7AIkm$ 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

    E!&ACbeMo#DRB!G3(RDI+JUI^eODC8laHtnEMO{ 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 B8PNa$ literal 0 HcmV?d00001 diff --git a/public/js/icon-picker.js b/public/js/icon-picker.js index 119152a..e22e5b0 100644 --- a/public/js/icon-picker.js +++ b/public/js/icon-picker.js @@ -112,7 +112,13 @@ _renderGrid(ALL_ICONS); } - new bootstrap.Modal(document.getElementById('iconPickerModal')).show(); + const modal = new bootstrap.Modal(document.getElementById('iconPickerModal')); + modal.show(); + + document.getElementById('iconPickerModal').addEventListener('shown.bs.modal', function handler() { + document.getElementById('iconSearchInput').focus(); + this.removeEventListener('shown.bs.modal', handler); + }); } function _renderGrid(icons) { @@ -137,10 +143,22 @@ `).join(''); document.fonts.ready.then(() => { - grid.style.visibility = 'visible'; + grid.style.visibility = 'visible'; }); } + function iconPickerInput(cssClass, currentValue) { + return ( + '

    ' + + '' + + (currentValue ? '' : '') + + '' + + '' + + '
    ' + ); + } + function pick(value) { if (!_targetInput) return; _targetInput.value = value; @@ -164,6 +182,7 @@ // ── Expose global ───────────────────────────────────────────────────────── window.IconPicker = { init, open, pick }; + window.IconPicker = { init, open, pick, inputHtml: iconPickerInput }; window.IconPicker.pick = pick; window.IconPickerPick = pick; })(); \ No newline at end of file diff --git a/public/uploads/programmes/Student_Studying.png b/public/uploads/programmes/Student_Studying.png new file mode 100644 index 0000000000000000000000000000000000000000..2a46353c9a218545a657612f15e5aff4934562d7 GIT binary patch literal 39113 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 literal 0 HcmV?d00001 diff --git a/routes/admin.js b/routes/admin.js index 2662b2d..d6201f6 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -8,11 +8,13 @@ const homeController = require("../controllers/homeController"); const headerController = require("../controllers/headerController"); const footerController = require("../controllers/footerController"); const aboutController = require("../controllers/aboutController"); + const partnershipsController = require("../controllers/partnershipsController"); const historyPageController = require("../controllers/historyPageController"); const accreditationController = require("../controllers/accreditationController"); const admissionsController = require("../controllers/admissionsController"); const policiesController = require("../controllers/policiesController"); + const formController = require("../controllers/formController"); const contactController = require("../controllers/contactController"); const studentSupportController = require("../controllers/studentSupportController"); @@ -20,14 +22,10 @@ const requestInfoController = require("../controllers/requestInfoController"); const pageController = require("../controllers/pageController"); const settingController = require("../controllers/settingController"); -const faqController = require("../controllers/faqController"); // Thêm import này -const termsController = require("../controllers/termsController"); -const { upload, uploadVideo, convertToWebp } = require("../middleware/upload"); -const safetyController = require("../controllers/safetyController"); -const insuranceController = require("../controllers/insuranceController"); -const auditLogController = require("../controllers/auditLogController"); -const activityController = require("../controllers/activityController"); +const { upload, uploadVideo, convertToWebp } = require("../middleware/upload"); + +const auditLogController = require("../controllers/auditLogController"); const headerMenuController = require("../controllers/headerMenuController"); const programmeController = require("../controllers/programmeController"); @@ -36,9 +34,6 @@ const programmeController = require("../controllers/programmeController"); const blogController = require("../controllers/blogController"); const blogCategoryController = require("../controllers/blogCategoryController"); const blogTagController = require("../controllers/blogTagController"); -const socialLinkController = require("../controllers/socialLinkController"); -const testimonialController = require("../controllers/testimonialController"); -const videoGalleryController = require("../controllers/videoGalleryController"); // Dashboard router.get("/dashboard", ensureAuthenticated, dashboardController.getDashboard); @@ -179,25 +174,6 @@ router.post( headerMenuController.reorder, ); -// Social Links routes -router.get("/social-links", ensureAuthenticated, socialLinkController.index); -router.post("/social-links", ensureAuthenticated, socialLinkController.store); -router.put( - "/social-links/:platform", - ensureAuthenticated, - socialLinkController.update, -); -router.delete( - "/social-links/:platform", - ensureAuthenticated, - socialLinkController.destroy, -); -router.post( - "/social-links/reorder", - ensureAuthenticated, - socialLinkController.reorder, -); - // Footer routes router.get("/footer", ensureAuthenticated, footerController.index); router.post("/footer/update", ensureAuthenticated, footerController.update); @@ -247,164 +223,6 @@ router.post( requestInfoController.update, ); - -// Activity CRUD routes -router.get("/activity", ensureAuthenticated, activityController.index); -router.get( - "/activity/create", - ensureAuthenticated, - activityController.createForm, -); -router.post("/activity/create", ensureAuthenticated, activityController.create); -// Update filters (place before any parameterized /activity/:id routes to avoid route collision) -router.post( - "/activity/filters/update", - ensureAuthenticated, - activityController.updateFilters, -); -// Update hero (global hero section for activities) -router.post( - "/activity/hero/update", - ensureAuthenticated, - activityController.updateHero, -); -router.get( - "/activity/:id/edit", - ensureAuthenticated, - activityController.editForm, -); -router.post( - "/activity/:id/update", - ensureAuthenticated, - activityController.update, -); -router.post( - "/activity/:id/delete", - ensureAuthenticated, - activityController.delete, -); -router.post( - "/activity/:id/toggle-status", - ensureAuthenticated, - activityController.toggleStatus, -); -// Update display order -router.post( - "/activity/update-order", - ensureAuthenticated, - activityController.updateOrder, -); - -// Booking submissions routes -router.get( - "/activity/:id/bookings/count", - ensureAuthenticated, - activityController.getBookingCount, -); -router.get( - "/activity/:id/bookings", - ensureAuthenticated, - activityController.getBookingSubmissions, -); -router.get( - "/activity/:id/bookings/export", - ensureAuthenticated, - activityController.exportBookingData, -); -// Export all bookings (across all activities) -router.get( - "/bookings/export-all", - ensureAuthenticated, - activityController.exportAllBookingsData, -); - -// Update filters - -// Preview activity -router.get( - "/activity/:id/preview", - ensureAuthenticated, - activityController.preview, -); - -// FAQ routes -router.get("/home/faq", ensureAuthenticated, faqController.index); -router.post("/home/faq/update", ensureAuthenticated, faqController.update); -router.get("/home/faq/data", ensureAuthenticated, faqController.getFAQData); -router.get("/home/faq/api", faqController.api); - -// Deprecated FAQ API routes removed - -// API routes cho quản lý FAQ items (AJAX calls) -router.post("/faq/api/add-faq", ensureAuthenticated, faqController.addFAQ); -router.put( - "/faq/api/update-faq-item/:sectionId/:faqId", - ensureAuthenticated, - faqController.updateFAQItem, -); -router.delete( - "/faq/api/delete-faq-item/:sectionId/:faqId", - ensureAuthenticated, - faqController.deleteFAQItem, -); -router.get("/terms-conditions", ensureAuthenticated, termsController.index); -router.post("/terms/update", ensureAuthenticated, termsController.update); -router.get("/terms/data", ensureAuthenticated, termsController.getTermsData); -router.get("/terms/api", termsController.api); -router.get("/terms/seed", ensureAuthenticated, termsController.seed); - -// Travel routes -// router.get("/travel", ensureAuthenticated, travelController.index); -// router.post("/travel/update", ensureAuthenticated, travelController.update); -// router.post("/travel/preview", ensureAuthenticated, travelController.preview); -// router.get("/travel/data", ensureAuthenticated, travelController.getTravelData); -// router.get("/travel/api", travelController.api); -// router.get("/travel/seed", ensureAuthenticated, travelController.seed); - -// Deprecated FAQ API routes removed - -// API routes cho quản lý FAQ sections (AJAX calls) -router.post( - "/faq/api/add-section", - ensureAuthenticated, - faqController.addFAQSection, -); -router.put( - "/faq/api/update-section/:sectionId", - ensureAuthenticated, - faqController.updateFAQSection, -); -router.delete( - "/faq/api/delete-section/:sectionId", - ensureAuthenticated, - faqController.deleteFAQSection, -); -router.post( - "/faq/api/reorder-sections", - ensureAuthenticated, - faqController.reorderFAQSection, -); - -// API routes cho sidebar navigation (AJAX calls) -router.put( - "/faq/api/update-sidebar", - ensureAuthenticated, - faqController.updateSidebarNav, -); - -// Safety routes -router.get("/safety", ensureAuthenticated, safetyController.index); -router.post("/safety/update", ensureAuthenticated, safetyController.update); - -//Insurance routes -router.get("/insurance", ensureAuthenticated, insuranceController.index); -router.post( - "/insurance/update", - ensureAuthenticated, - insuranceController.update, -); - - // Test Image Paths route router.get("/test-images", ensureAuthenticated, (req, res) => { const fs = require("fs"); @@ -559,30 +377,6 @@ router.post( blogTagController.quickCreate, ); -// Testimonials management -router.get( - "/home/testimonials", - ensureAuthenticated, - testimonialController.index, -); -router.post( - "/home/testimonials/update", - ensureAuthenticated, - testimonialController.update, -); - -// Video Gallery management -router.get( - "/home/video-gallery", - ensureAuthenticated, - videoGalleryController.index, -); -router.post( - "/home/video-gallery/update", - ensureAuthenticated, - videoGalleryController.update, -); - // Audit Log routes router.get("/audit-logs", ensureAuthenticated, auditLogController.index); router.get("/audit-logs/:id", ensureAuthenticated, auditLogController.show); diff --git a/routes/index.js b/routes/index.js index 657841e..d22df96 100644 --- a/routes/index.js +++ b/routes/index.js @@ -10,21 +10,13 @@ const admissionsController = require("../controllers/admissionsController"); const policiesController = require("../controllers/policiesController"); const headerController = require("../controllers/headerController"); -const socialLinkController = require("../controllers/socialLinkController"); - const footerController = require("../controllers/footerController"); const contactController = require("../controllers/contactController"); const studentSupportController = require("../controllers/studentSupportController"); const requestInfoController = require("../controllers/requestInfoController"); -const faqController = require("../controllers/faqController"); const headerMenuController = require("../controllers/headerMenuController"); -const safetyController = require("../controllers/safetyController"); - const programmeController = require("../controllers/programmeController"); -const insuranceController = require("../controllers/insuranceController"); -const termsController = require("../controllers/termsController"); // <-- IMPORT ĐÃ CÓ -const activityController = require("../controllers/activityController"); // Blog controllers const blogController = require("../controllers/blogController"); @@ -57,10 +49,6 @@ router.get("/api/header", headerController.api); // Header Menu New Module API router.get("/api/header-menu", headerMenuController.api); -// Social Links API routes -router.get("/api/social-links", socialLinkController.index); -router.get("/api/social-links/:platform", socialLinkController.show); - // Footer API routes router.get("/api/footer", footerController.getFooter); router.put("/api/admin/footer", footerController.updateFooter); @@ -77,20 +65,6 @@ router.get("/api/request-info", requestInfoController.api); // Contact form submission (public) router.post("/api/contact/submit", contactController.submitForm); -router.get("/api/faq", faqController.api); - -// Safety API route -router.get("/api/safety", safetyController.api); - -// Activity API routes -router.get("/api/activities", activityController.api); -router.get("/api/activities/:id", activityController.apiDetail); - -// Insurance APi route -router.get("/api/insurance", insuranceController.api); - -router.get("/api/terms", termsController.api); - // Blog API Routes router.get("/api/blog", blogController.api); router.get("/api/blog/featured", blogController.apiFeatured); @@ -115,28 +89,12 @@ router.post("/api/blog/:slug/comments", blogController.apiCreateComment); // Blog detail by slug (must come last among blog routes) router.get("/api/blog/:slug", blogController.apiShow); -// // API route cho blog detail -// router.get('/api/blog-detail', blogDetailController.api); // Programmes API router.get("/api/programmes", programmeController.api); router.get("/api/programmes/:id", programmeController.apiDetail); -// Testimonials API -const testimonialController = require("../controllers/testimonialController"); -router.get("/api/testimonials", testimonialController.api); - -// Video Gallery API -const videoGalleryController = require("../controllers/videoGalleryController"); -router.get("/api/video-gallery", videoGalleryController.api); -// Test route for footer -router.get("/test-footer", (req, res) => { - res.render("test-footer", { - title: "Footer Test", - layout: "layouts/main", - }); -}); module.exports = router; diff --git a/views/admin/about/index.ejs b/views/admin/about/index.ejs index 8bc3ba4..937c84b 100644 --- a/views/admin/about/index.ejs +++ b/views/admin/about/index.ejs @@ -1,16 +1,23 @@
    -
    +

    <%= title %>

    Edit content displayed on the About page

    +
    + <% if (frontendUrl) { %> + + View About Page + + <% } %> +
    -
    + @@ -366,7 +373,7 @@ let originalFormData = null; document.addEventListener('DOMContentLoaded', function () { - originalFormData = <%- JSON.stringify(data) %>; + originalFormData = <% - JSON.stringify(data) %>; populateAll(originalFormData); document.getElementById('aboutForm').addEventListener('submit', function (e) { @@ -595,22 +602,31 @@ c.insertAdjacentHTML('beforeend', `
    -
    +
    - +
    + + ${item.icon ? `` : ''} + + +
    -
    +
    +
    + +
    -
    `); } - function populateLearningFeatures(mode, features) { document.getElementById(mode + 'FeaturesContainer').innerHTML = ''; features.forEach(f => addLearningFeature(mode, f)); @@ -632,16 +648,26 @@
    - +
    + + ${item.icon ? `` : ''} + + +
    -
    +
    +
    + +
    -
    `); } diff --git a/views/admin/contact/index.ejs b/views/admin/contact/index.ejs index efc157e..e729b02 100644 --- a/views/admin/contact/index.ejs +++ b/views/admin/contact/index.ejs @@ -114,11 +114,14 @@
    - +
    + + <% if (ch.icon) { %><% } %> + + +
    @@ -367,7 +370,7 @@