diff --git a/assets/css/variables.css b/assets/css/variables.css index 568b5b9..f235c37 100644 --- a/assets/css/variables.css +++ b/assets/css/variables.css @@ -5,10 +5,10 @@ :root { /* Primary Colors (Gold/Cinnamon) */ - --primary-color: #bc9f69; + --primary-color: #0048b4; --primary-rgb: 188, 159, 105; - --primary-light: #d4c4a8; - --primary-dark: #a68b58; + --primary-light: #0038b4; + --primary-dark: #0028b4; --primary-soft: rgba(188, 159, 105, 0.1); /* Secondary Colors */ diff --git a/controllers/blogController.js b/controllers/blogController.js index cbb8155..0abad0b 100644 --- a/controllers/blogController.js +++ b/controllers/blogController.js @@ -3,7 +3,7 @@ const BlogCategory = require('../models/blogCategory'); const BlogTag = require('../models/blogTag'); const BlogComment = require('../models/blogComment'); const RecentPost = require('../models/recentPost'); -const { addBaseUrlToImages } = require('../utils/imageHelper'); +const { addBaseUrlToImages, getFullImageUrl } = require('../utils/imageHelper'); const slugify = require('slugify'); // -------------------- Helper Functions -------------------- @@ -71,6 +71,7 @@ exports.index = async (req, res) => { const categories = await BlogCategory.getActive(); const frontendUrl = process.env.FRONTEND_URL || 'http://localhost:3000'; + const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001'; res.render('admin/blog/index', { layout: 'layouts/main', @@ -78,6 +79,8 @@ exports.index = async (req, res) => { blogs, categories, frontendUrl, + backendUrl, + getFullImageUrl, // Truyền helper function vào template pagination: { current: page, total: totalPages, @@ -102,6 +105,7 @@ exports.create = async (req, res) => { const tags = await BlogTag.getActive(); const frontendUrl = process.env.FRONTEND_URL || 'http://localhost:3000'; + const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001'; res.render('admin/blog/create', { layout: 'layouts/main', @@ -110,7 +114,9 @@ exports.create = async (req, res) => { tags, currentPath: req.path, user: req.session.user, - frontendUrl + frontendUrl, + backendUrl, + getFullImageUrl // Truyền helper function vào template }); } catch (err) { console.error('Blog create form error:', err); @@ -214,6 +220,7 @@ exports.edit = async (req, res) => { }); const frontendUrl = process.env.FRONTEND_URL || 'http://localhost:3000'; + const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001'; res.render('admin/blog/edit', { layout: 'layouts/main', @@ -225,7 +232,9 @@ exports.edit = async (req, res) => { commentsCount: allComments.length, currentPath: req.path, user: req.session.user, - frontendUrl + frontendUrl, + backendUrl, + getFullImageUrl // Truyền helper function vào template }); } catch (err) { console.error('Blog edit form error:', err); diff --git a/controllers/campLocationController.js b/controllers/campLocationController.js deleted file mode 100644 index 67d5999..0000000 --- a/controllers/campLocationController.js +++ /dev/null @@ -1,322 +0,0 @@ -const { addBaseUrlToImages } = require('../utils/imageHelper'); -const CampLocation = require('../models/campLocation'); - -// -------------------- Public (read-only) helpers -------------------- -// Get camp location data from MongoDB -const getCampLocationData = async () => { - const campLocation = await CampLocation.findOne().sort({ updatedAt: -1 }); - if (!campLocation) return null; - return campLocation.toObject ? campLocation.toObject() : campLocation; -}; - -// -------------------- Admin (CRUD on CampLocation model) helpers -------------------- -// Default shape for CampLocation documents -const getDefaultCampLocationData = () => ({ - metadata: { title: '', description: '', keywords: '' }, - hero: { title: '', subtitle: '', backgroundImage: '' }, - camps: [], - locations: [], - locationsSection: { title: '', description: '' }, - intro: { title: '', description: '' }, - map: { - coordinates: { lat: 0, lng: 0 }, - zoom: 15, - location: '', - markerTitle: '', - tileLayer: { - url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - attribution: '', - maxZoom: 18, - minZoom: 0 - } - }, - faq: [], - faqSection: { title: '', description: '' }, - welcomeQuote: { text: '', author: '' }, - securityConcept: { title: '', description: '', items: [] } -}); - -// Get latest stored CampLocation document or default -const getStoredCampLocation = async () => { - const campLocation = await CampLocation.findOne().sort({ updatedAt: -1 }); - if (!campLocation) return getDefaultCampLocationData(); - return campLocation.toObject ? campLocation.toObject() : campLocation; -}; - -// -------------------- Public exports -------------------- -// API endpoint to return camp location JSON -exports.api = async (req, res) => { - try { - const campLocationData = await getCampLocationData(); - const baseUrl = process.env.BACKEND_URL || `${req.protocol}://${req.get('host')}`; - const processed = addBaseUrlToImages(campLocationData || {}, baseUrl); - return res.json(processed); - } catch (err) { - console.error('campLocation.api error:', err); - return res.status(500).json({ error: 'Error loading camp location data' }); - } -}; - -// API endpoint to return an array of CampLocation records (for frontend listing) -exports.apiList = async (req, res) => { - try { - const docs = await CampLocation.find().sort({ updatedAt: -1 }).lean(); - const baseUrl = process.env.BACKEND_URL || `${req.protocol}://${req.get('host')}`; - const processed = (docs || []).map((d) => addBaseUrlToImages(d || {}, baseUrl)); - return res.json(processed); - } catch (err) { - console.error('campLocation.apiList error:', err); - return res.status(500).json({ error: 'Error loading camp location list' }); - } -}; - -// -------------------- Admin exports -------------------- -// Display camp location management page -exports.index = async (req, res) => { - try { - // Set cache control headers to prevent caching - res.set({ - 'Cache-Control': 'no-store, no-cache, must-revalidate, private', - 'Pragma': 'no-cache', - 'Expires': '0' - }); - - const data = await getStoredCampLocation(); - const items = await CampLocation.find().sort({ updatedAt: -1 }).limit(10); - - res.render('admin/campLocation/index', { - layout: 'layouts/main', - title: 'Camp Location Management', - data, - items, - 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 camp location data'); - res.redirect('/admin/dashboard'); - } -}; - -// Display create form -exports.createForm = async (req, res) => { - try { - const data = getDefaultCampLocationData(); - - res.render('admin/campLocation/create', { - layout: 'layouts/main', - title: 'Create Camp Location', - data, - currentPath: req.path, - user: req.session.user - }); - } catch (err) { - console.error(err); - req.flash('error_msg', 'Error loading create form'); - res.redirect('/admin/camp-location'); - } -}; - -// Create new CampLocation record -exports.create = async (req, res) => { - try { - const campLocationData = { - metadata: JSON.parse(req.body.metadata || '{}'), - hero: JSON.parse(req.body.hero || '{}'), - camps: JSON.parse(req.body.camps || '[]'), - locations: JSON.parse(req.body.locations || '[]'), - locationsSection: JSON.parse(req.body.locationsSection || '{}'), - intro: JSON.parse(req.body.intro || '{}'), - map: JSON.parse(req.body.map || '{}'), - faq: JSON.parse(req.body.faq || '[]'), - faqSection: JSON.parse(req.body.faqSection || '{}'), - welcomeQuote: JSON.parse(req.body.welcomeQuote || '{}'), - securityConcept: JSON.parse(req.body.securityConcept || '{}') - }; - - const newCampLocation = new CampLocation(campLocationData); - await newCampLocation.save(); - - req.flash('success_msg', 'Camp Location created successfully'); - res.redirect('/admin/camp-location'); - } catch (err) { - console.error('Create error:', err); - req.flash('error_msg', `Create error: ${err.message || 'Unknown'}`); - res.redirect('/admin/camp-location/create'); - } -}; - -// Display edit form -exports.editForm = async (req, res) => { - try { - const campLocation = await CampLocation.findById(req.params.id); - - if (!campLocation) { - req.flash('error_msg', 'Camp Location record not found'); - return res.redirect('/admin/camp-location'); - } - - res.render('admin/campLocation/edit', { - layout: 'layouts/main', - title: 'Edit Camp Location', - data: campLocation.toObject ? campLocation.toObject() : campLocation, - currentPath: req.path, - user: req.session.user - }); - } catch (err) { - console.error(err); - req.flash('error_msg', 'Error loading edit form'); - res.redirect('/admin/camp-location'); - } -}; - -// Update CampLocation record -exports.update = async (req, res) => { - try { - // Get current data - const currentData = await getStoredCampLocation(); - - // List of sections to update - const sections = [ - 'metadata', - 'hero', - 'camps', - 'locations', - 'locationsSection', - 'intro', - 'map', - 'faq', - 'faqSection', - 'welcomeQuote', - 'securityConcept' - ]; - const errors = []; - let hasChanges = false; - - // Create updated data object - const updatedData = { - ...(currentData.toObject ? currentData.toObject() : currentData) - }; - - // Process each section - sections.forEach((section) => { - try { - if (!req.body[section]) { - console.warn(`No data for section: ${section}`); - return; - } - - const newSectionData = JSON.parse(req.body[section]); - const currentSectionData = currentData[section]; - const sectionHasChanges = - JSON.stringify(newSectionData) !== JSON.stringify(currentSectionData); - - if (sectionHasChanges) { - updatedData[section] = newSectionData; - hasChanges = true; - } - } catch (error) { - console.error(`Error processing section ${section}:`, error); - errors.push(`Error processing ${section} data: ${error.message}`); - } - }); - - if (errors.length > 0) { - req.flash('error_msg', `Data processing error: ${errors[0]}`); - return req.session.save(() => res.redirect('/admin/camp-location')); - } - - if (!hasChanges) { - req.flash('info_msg', 'No changes were made'); - return req.session.save(() => res.redirect('/admin/camp-location')); - } - - try { - // Only update existing document; do not create a new one here - if (!currentData || !currentData._id) { - req.flash('error_msg', 'No existing Camp Location record to update. Create one first.'); - return req.session.save(() => res.redirect('/admin/camp-location')); - } - - // Update document and ensure it's saved to MongoDB - const updatedDoc = await CampLocation.findByIdAndUpdate( - currentData._id, - updatedData, - { - new: true, - runValidators: true, - useFindAndModify: false - } - ); - - // Verify the update was successful - if (!updatedDoc) { - throw new Error('Failed to update document'); - } - - // Force a save to ensure MongoDB commits the changes - await updatedDoc.save(); - - console.log('✓ Camp location updated successfully in MongoDB'); - console.log('✓ Document ID:', updatedDoc._id); - console.log('✓ Updated at:', updatedDoc.updatedAt); - - req.flash('success_msg', 'Camp location data updated successfully'); - // Redirect back to the same page with cache-busting parameter to force refresh - const timestamp = Date.now(); - return req.session.save(() => res.redirect(`/admin/camp-location?updated=${timestamp}`)); - } catch (dbError) { - console.error('Database error:', dbError); - req.flash('error_msg', `Database error: ${dbError.message || 'Unknown'}`); - return req.session.save(() => res.redirect('/admin/camp-location')); - } - } catch (err) { - console.error('Update error:', err); - req.flash('error_msg', `Update error: ${err.message || 'Unknown'}`); - return req.session.save(() => res.redirect('/admin/camp-location')); - } -}; - -// Delete CampLocation record -exports.delete = async (req, res) => { - try { - const campLocation = await CampLocation.findById(req.params.id); - - if (!campLocation) { - req.flash('error_msg', 'Camp Location record not found'); - return res.redirect('/admin/camp-location'); - } - - await CampLocation.findByIdAndDelete(req.params.id); - - req.flash('success_msg', 'Camp Location record deleted successfully'); - res.redirect('/admin/camp-location'); - } catch (err) { - console.error('Delete error:', err); - req.flash('error_msg', `Delete error: ${err.message || 'Unknown'}`); - res.redirect('/admin/camp-location'); - } -}; - -// Preview CampLocation record -exports.preview = async (req, res) => { - try { - const campLocation = await CampLocation.findById(req.params.id); - - if (!campLocation) { - return res.status(404).json({ error: 'Camp Location record not found' }); - } - - const baseUrl = process.env.BACKEND_URL || `${req.protocol}://${req.get('host')}`; - const processedData = addBaseUrlToImages( - campLocation.toObject ? campLocation.toObject() : campLocation, - baseUrl - ); - res.json(processedData); - } catch (err) { - console.error('Preview error:', err); - res.status(500).json({ error: 'Error loading preview data' }); - } -}; diff --git a/data/blog.json b/data/blog.json index 4a6b1d2..fbd7181 100644 --- a/data/blog.json +++ b/data/blog.json @@ -1,19 +1,29 @@ { "categories": [ { - "name": "Visa & Immigration", - "slug": "visa-immigration", - "description": "Tin tức và hướng dẫn về visa, định cư." + "name": "Permanent Residency (PR)", + "slug": "permanent-residency-pr", + "description": "Information about permanent residency programs and requirements" }, { - "name": "Study Abroad", - "slug": "study-abroad", - "description": "Kinh nghiệm du học, trường học, học bổng." + "name": "Immigration Policy Updates", + "slug": "immigration-policy-updates", + "description": "Latest updates on immigration policies and regulations" }, { - "name": "Travel Tips", - "slug": "travel-tips", - "description": "Mẹo du lịch, chuẩn bị hành lý, bảo hiểm." + "name": "Scholarships & Grants", + "slug": "scholarships-grants", + "description": "Scholarship opportunities and grant programs for international students" + }, + { + "name": "Citizenship & Naturalization", + "slug": "citizenship-naturalization", + "description": "Guide to citizenship and naturalization processes" + }, + { + "name": "Visa Interview Preparation", + "slug": "visa-interview-preparation", + "description": "Tips and guidance for preparing visa interviews" } ], "tags": [ @@ -21,150 +31,254 @@ "name": "WorkVisa", "slug": "work-visa" }, + { + "name": "FamilyVisa", + "slug": "family-visa" + }, { "name": "StudentVisa", "slug": "student-visa" }, { - "name": "Canada", - "slug": "canada" + "name": "VisaUpdates", + "slug": "visa-updates" }, { - "name": "Scholarship", - "slug": "scholarship" + "name": "TravelVisa", + "slug": "travel-visa" }, { - "name": "TravelSafety", - "slug": "travel-safety" + "name": "StudyAbroad", + "slug": "study-abroad" } ], "posts": [ { - "title": "Ultimate Guide To Getting A Work Visa In Canada", - "slug": "ultimate-guide-work-visa-canada", - "excerpt": "Tổng hợp đầy đủ các bước xin work visa tại Canada cho người mới bắt đầu, từ điều kiện, hồ sơ đến thời gian xử lý.", - "content": "

Trong bài viết này, chúng ta sẽ đi qua từng bước cụ thể để xin work visa Canada, từ việc chuẩn bị hồ sơ, chọn chương trình phù hợp đến cách theo dõi tiến độ xử lý hồ sơ. Bạn cũng sẽ tìm thấy một số mẹo thực tế để tránh những sai lầm phổ biến.

", - "category": ["Visa & Immigration", "Canada"], - "tags": ["WorkVisa", "Canada"], + "title": "Work Visa vs. Student Visa Which is Right for You?", + "slug": "work-visa-vs-student-visa-which-is-right-for-you", + "excerpt": "Choosing between a work visa and a student visa depends on your career and academic goals. A student visa allows you to pursue higher education abroad, gain international exposure, and sometimes work part-time while studying. On the other hand, a work visa is for professionals seeking employment opportunities and long-term career growth in another country.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Choosing between a work visa and a student visa is one of the most critical decisions you'll make when planning your international journey. This decision will shape not only your immediate experience abroad but also your long-term career trajectory, financial situation, and potential pathways to permanent residency. Understanding the fundamental differences, benefits, and requirements of each visa type is essential for making an informed choice that aligns with your personal and professional goals.\"},\"id\":\"2du9ld0ziiq778kwm2d6yk\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"A student visa is designed for individuals who wish to pursue higher education in a foreign country. This visa type provides access to world-class universities, cultural exposure, and global networking opportunities that can significantly enhance your academic and personal development. With a student visa, you typically gain access to educational institutions that offer cutting-edge research facilities, diverse academic programs, and internationally recognized degrees. Many countries also allow student visa holders to work part-time during their studies, which can help offset living expenses while providing valuable international work experience. However, the primary focus remains on academics and personal growth, with strict regulations on working hours and employment types.\"},\"id\":\"n1bz5qaw0segwiuoezsrcl\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"On the other hand, a work visa is perfect for professionals who want to establish themselves in a career overseas immediately. Work visas provide direct access to job markets, stable income from day one, and often serve as a pathway to permanent residency. These visas are typically designed for skilled professionals who can contribute to the host country's economy, bringing specialized knowledge, technical expertise, or filling critical skill shortages. Work visa holders enjoy the benefits of full-time employment, professional development opportunities, and the ability to build a career in an international context. Many work visa programs also allow for family members to accompany the primary applicant, making it an attractive option for those looking to relocate with their loved ones.\"},\"id\":\"24x8enid6ydhool9kwqfvt\"},{\"type\":\"header\",\"data\":{\"text\":\"Key Factors to Consider\",\"level\":3},\"id\":\"aw0woml416s8nzx9l7waq7\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"When deciding between a work visa and student visa, several key factors should guide your decision. First, consider your financial situation. Student visas require proof of sufficient funds to cover tuition fees and living expenses, which can be substantial depending on the country and institution. Work visas, conversely, provide immediate income but may require you to secure employment before applying, which can be challenging from abroad. Your career stage also matters significantly. If you're early in your career or looking to change fields, a student visa might provide the education and credentials you need. If you're an established professional with in-demand skills, a work visa could be the faster route to international experience and career advancement.\"},\"id\":\"unrc4o8vjywzdo8j98zzh\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Your long-term goals are perhaps the most important consideration. If permanent residency is your ultimate objective, research which visa type offers the most straightforward pathway in your target country. Some countries offer post-graduation work permits that allow students to transition to work visas after completing their studies, effectively combining the benefits of both options. Language proficiency requirements also vary between visa types, with work visas often requiring higher levels of professional language skills, while student visas may offer language preparation programs as part of the educational experience.\"},\"id\":\"s686pwd50va4isrdbmdawd\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Ultimately, the choice between a work visa and student visa comes down to your personal aspirations, financial capacity, career objectives, and long-term vision. If education, exploration, and academic achievement are your priorities, a student visa offers an enriching experience that can open doors to future opportunities. If career advancement, immediate professional growth, and financial stability are your primary goals, a work visa provides a direct path to international career success. Many successful international professionals have taken both paths at different stages of their careers, using education to build foundational knowledge and work visas to apply that knowledge in professional settings.\"},\"id\":\"6orypfkkmv74xymytdxgg5\"}],\"time\":1770262297198,\"version\":\"2.28.2\"}", + "category": [ + "Immigration Policy Updates", + "Visa Interview Preparation" + ], + "tags": [ + "WorkVisa", + "FamilyVisa", + "StudentVisa" + ], "author": "Admin", "status": "published", "publishedAt": "11 March 2025", "isFeatured": true, - "featuredImage": "/assets/img/inner-page/news-details/details-1.jpg", + "featuredImage": "img/inner-page/news-details/details-1.jpg", "galleryImages": [ - "/assets/img/inner-page/news-details/details-2.jpg", - "/assets/img/inner-page/news-details/details-3.jpg" + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" ], "quote": "This blog really helped me understand the difference between student and work visas. The explanations were clear and practical.", - "contentAfterQuote": "

It provides access to world-class universities, cultural exposure, and global networking opportunities. With a student visa, you may also get part-time work rights, which can help support your expenses and give you valuable international work experience. However, the primary focus remains on academics and personal growth. On the other hand, a work visa is perfect for those who want to establish themselves in a career overseas.

It provides immediate access to job markets, stable income, and often a pathway to permanent residency. Work visas are suitable for skilled professionals who are ready to contribute to the global workforce and achieve long-term career goals. Ultimately, the choice comes down to your personal aspirations. If education and exploration are your priorities, a student visa is ideal. If career advancement and stability are your goals, a work visa is the right fit.

", - "commentsCount": 3 - }, - { - "title": "Top 5 Scholarship Programs For International Students", - "slug": "top-5-scholarship-programs-international-students", - "excerpt": "Danh sách 5 chương trình học bổng nổi bật dành cho sinh viên quốc tế với mức hỗ trợ hấp dẫn.", - "content": "

Nếu bạn đang tìm kiếm học bổng để giảm chi phí du học, đây là 5 chương trình bạn không nên bỏ qua. Mỗi chương trình đều có tiêu chí xét tuyển, mức hỗ trợ và thời hạn đăng ký khác nhau.

Học bổng là một trong những cách tốt nhất để giảm gánh nặng tài chính khi du học. Các chương trình học bổng không chỉ hỗ trợ về mặt tài chính mà còn mở ra nhiều cơ hội phát triển nghề nghiệp và mở rộng mạng lưới quan hệ quốc tế.

", - "category": ["Study Abroad"], - "tags": ["StudentVisa", "Scholarship"], - "author": "Admin", - "status": "published", - "publishedAt": "20 March 2025", - "isFeatured": false, - "featuredImage": "/assets/img/inner-page/news-details/details-1.jpg", - "galleryImages": [ - "/assets/img/inner-page/news-details/details-2.jpg", - "/assets/img/inner-page/news-details/details-3.jpg" - ], - "quote": "These scholarship programs opened doors I never thought possible. The application process was straightforward, and the support I received was incredible.", - "contentAfterQuote": "

Applying for scholarships requires careful planning and preparation. Start by researching each program's requirements, deadlines, and eligibility criteria. Make sure to prepare all necessary documents well in advance, including transcripts, recommendation letters, and personal statements. Each scholarship has its own unique focus, so tailor your application to highlight how you align with their values and goals.

Remember that scholarship applications are competitive, so it's important to stand out. Showcase your academic achievements, extracurricular activities, and community involvement. Be authentic in your personal statement and demonstrate how the scholarship will help you achieve your educational and career aspirations. With dedication and proper preparation, you can increase your chances of securing financial support for your studies abroad.

", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"The decision-making process can be overwhelming, but understanding these fundamental differences will help you choose the path that best aligns with your goals. Remember that both visa types offer unique opportunities for personal and professional growth, and many people successfully transition from one to the other as their circumstances and objectives evolve. Consulting with immigration experts and researching country-specific requirements will further help you make an informed decision that sets you on the right path toward your international aspirations.\"},\"id\":\"dnr5ao91qioq6pvzr7yse9\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", "commentsCount": 2 }, { - "title": "10 Travel Safety Tips You Should Know Before Flying", - "slug": "10-travel-safety-tips-before-flying", - "excerpt": "Những lưu ý quan trọng để đảm bảo an toàn cho chuyến bay và hành trình của bạn.", - "content": "

An toàn luôn là ưu tiên hàng đầu khi đi du lịch. Dưới đây là 10 tips giúp bạn yên tâm hơn trên mọi chuyến đi, từ việc chuẩn bị giấy tờ, bảo hiểm đến cách bảo vệ tài sản cá nhân.

Du lịch là một trải nghiệm tuyệt vời, nhưng điều quan trọng là phải chuẩn bị kỹ lưỡng để đảm bảo an toàn. Những tips này được đúc kết từ kinh nghiệm thực tế của nhiều du khách và sẽ giúp bạn tránh được những rủi ro không đáng có.

", - "category": ["Travel Tips"], - "tags": ["TravelSafety"], + "title": "How to Avoid Common Mistakes in Visa Applications", + "slug": "how-to-avoid-common-mistakes-in-visa-applications", + "excerpt": "Navigating the visa application process can be complex and overwhelming. Many applicants make avoidable mistakes that lead to delays, rejections, or additional costs. Understanding these common pitfalls and learning how to prevent them is crucial for a successful visa application.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Applying for a visa is a meticulous process that requires attention to detail, thorough preparation, and strict adherence to guidelines. Unfortunately, many applicants fall into common traps that can derail their applications, resulting in frustrating delays, costly rejections, or missed opportunities. Understanding these frequent mistakes and learning how to avoid them can significantly improve your chances of approval and save you time, money, and stress.\"},\"id\":\"v11gtdsu85ss2drtwlsxmo\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"One of the most critical mistakes applicants make is submitting incomplete documentation. Visa applications require a comprehensive set of documents, and missing even a single required item can result in immediate rejection or significant delays. Common missing documents include recent bank statements, proof of accommodation, travel insurance, employment letters, academic transcripts, or passport copies. To avoid this, create a detailed checklist based on the official requirements for your specific visa type and country. Double-check each document before submission, ensuring all pages are included, documents are properly certified or notarized where required, and translations are provided for non-English documents.\"},\"id\":\"n7yupg3d6om6ctkqja03d3\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Incorrect or inconsistent information is another major cause of visa rejections. Many applicants provide information that doesn't match across different documents, such as different dates of employment, varying addresses, or inconsistent personal details. Immigration officers carefully cross-reference all information, and discrepancies raise red flags that can lead to suspicion of fraud. Always ensure that your name, date of birth, passport number, and other personal details are identical across all documents. Review your application multiple times, and consider having a second person review it for consistency before submission.\"},\"id\":\"49vpndxe1xenwhzxrqa3ui\"},{\"type\":\"header\",\"data\":{\"text\":\"Financial Documentation Errors\",\"level\":3},\"id\":\"umaa4m4qw48gjgjsz8epj5\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Financial proof is one of the most scrutinized aspects of visa applications, and mistakes here are particularly costly. Many applicants fail to provide sufficient evidence of financial stability, submit outdated bank statements, or don't clearly demonstrate the source of their funds. Some applicants make the error of depositing large sums of money just before applying, which can appear suspicious. Instead, maintain consistent account balances over several months, provide detailed bank statements covering the required period, and clearly document the source of all funds. If someone else is sponsoring your trip, ensure their financial documents are complete and include a proper sponsorship letter explaining the relationship and commitment.\"},\"id\":\"o5wydwmzx7jgurfuquuvv7\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Missing deadlines is another common but easily avoidable mistake. Visa processing times vary significantly, and failing to apply early enough can result in missing important dates like school start dates, job start dates, or travel plans. Research typical processing times for your visa type and country, and apply well in advance. Keep in mind that peak seasons can significantly extend processing times, and some countries require appointments that may be booked weeks in advance. Set reminders for important dates, track your application status regularly, and have contingency plans in case of delays.\"},\"id\":\"z6bnunk4jgwy06wcpsq9j\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Poor interview preparation is particularly problematic for visas that require interviews. Many applicants arrive unprepared, unable to clearly articulate their travel purpose, answer questions about their itinerary, or explain their financial situation. Practice answering common interview questions, prepare a clear and concise explanation of your travel purpose, and bring all required documents to the interview. Dress professionally, arrive early, and maintain a confident but respectful demeanor. Remember that the interview is your opportunity to clarify any questions and demonstrate your genuine intentions.\"},\"id\":\"sgdtcacli1kk7v0o8q7vr\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Finally, many applicants fail to seek professional help when needed. While it's possible to complete visa applications independently, complex cases, previous rejections, or specific circumstances may benefit from professional guidance. Immigration consultants understand the nuances of different visa types, stay updated with policy changes, and can help identify potential issues before they become problems. However, always ensure you're working with licensed and reputable consultants, as fraudulent services can cause serious problems.\"},\"id\":\"swsr2kbx5sy3ek9ph2x1\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "category": [ + "Visa Interview Preparation" + ], + "tags": [ + "WorkVisa", + "StudentVisa", + "VisaUpdates" + ], "author": "Admin", "status": "published", - "publishedAt": "05 April 2025", + "publishedAt": "11 March 2025", "isFeatured": false, - "featuredImage": "/assets/img/inner-page/news-details/details-1.jpg", + "featuredImage": "img/inner-page/news-details/details-1.jpg", "galleryImages": [ - "/assets/img/inner-page/news-details/details-2.jpg", - "/assets/img/inner-page/news-details/details-3.jpg" + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" ], - "quote": "These safety tips saved me from potential problems during my trip. I especially appreciated the advice about travel insurance and document preparation.", - "contentAfterQuote": "

Before you travel, make sure to research your destination thoroughly. Understand local customs, laws, and potential safety concerns. Keep copies of important documents like your passport, visa, and travel insurance in multiple places - both physical and digital. Inform family or friends about your itinerary and check in regularly during your trip.

When packing, prioritize essential items and keep valuables secure. Use luggage locks and consider travel insurance for expensive items. Stay aware of your surroundings, especially in crowded areas, and trust your instincts if something feels off. By following these safety tips, you can focus on enjoying your journey while staying protected throughout your travels.

", - "commentsCount": 1 + "quote": "The most common mistake I see is applicants rushing through their application without double-checking every detail. Taking the time to review your documents thoroughly can save you months of delays and additional costs.", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"By being methodical, organized, and attentive to detail, you can navigate the visa application process successfully. Remember that immigration officers are looking for complete, accurate, and consistent information. When in doubt, seek clarification from official sources or professional consultants rather than making assumptions. The investment in getting your application right the first time pays dividends in saved time, money, and stress.\"},\"id\":\"zfjo97ecblbwf9ptglwh5\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "commentsCount": 0 + }, + { + "title": "The Role of Immigration Consultants in Your Journey", + "slug": "the-role-of-immigration-consultants-in-your-journey", + "excerpt": "Immigration consultants play a vital role in guiding applicants through complex visa processes, offering expert advice, and ensuring successful outcomes for study, work, or permanent residency applications abroad.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Navigating the immigration process can be one of the most challenging and stressful experiences in your life. With constantly changing policies, complex requirements, extensive documentation, and high stakes, having expert guidance can make the difference between success and failure. Immigration consultants serve as knowledgeable guides, strategic advisors, and supportive partners throughout your journey, helping you navigate the intricate landscape of international migration with confidence and clarity.\"},\"id\":\"7xgdhicna6mxp7hf2yvm9l\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"One of the primary roles of immigration consultants is to provide expert knowledge and up-to-date information about visa requirements, policies, and procedures. Immigration laws and regulations change frequently, and what was true last year may no longer apply today. Professional consultants stay current with these changes through continuous education, professional development, and direct engagement with immigration authorities. They understand the nuances of different visa categories, eligibility requirements, processing times, and country-specific regulations that can be overwhelming for individuals to navigate alone.\"},\"id\":\"7qeapt7vooghxez5hx2t25\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Consultants also play a crucial role in helping you choose the right visa pathway for your specific situation. With numerous visa types available, each with different requirements, benefits, and pathways to permanent residency, selecting the most appropriate option can be confusing. An experienced consultant will assess your qualifications, goals, financial situation, and personal circumstances to recommend the best visa strategy. They can identify alternative pathways you might not have considered, such as post-graduation work permits, skilled migration programs, or family sponsorship options that could be more suitable for your long-term objectives.\"},\"id\":\"8qdftl40lv9ddf5eu00ak\"},{\"type\":\"header\",\"data\":{\"text\":\"Document Preparation and Review\",\"level\":3},\"id\":\"x7wp7f3b9rn8kduauqr2f\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Perhaps one of the most valuable services consultants provide is assistance with document preparation and review. Visa applications require extensive documentation, and even minor errors can lead to rejection. Consultants help you understand exactly which documents are needed, how they should be formatted, what certifications or translations are required, and how to present them effectively. They review your completed application before submission, identifying potential issues, inconsistencies, or missing information that could cause problems. This thorough review process significantly reduces the risk of rejection and saves you from costly mistakes.\"},\"id\":\"qadgxknegwibxd0va3kb38\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Immigration consultants also provide strategic guidance throughout the application process. They help you understand timelines, plan your application strategy, and coordinate multiple steps that need to happen in sequence. For example, they might advise you on when to take language tests, when to gather financial documents, or when to schedule medical examinations to ensure everything aligns properly with your application timeline. They can also help you prepare for interviews, providing practice questions, coaching on how to present yourself, and guidance on what to expect during the process.\"},\"id\":\"2dlqbtku473brc07teduyt\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"When complications arise, consultants are invaluable in helping you navigate challenges. Whether you've received a request for additional information, faced a rejection, or encountered unexpected delays, consultants can help you understand what went wrong, develop a strategy to address the issue, and guide you through appeals or reapplication processes. They understand the common reasons for rejections and can help you strengthen your application for resubmission.\"},\"id\":\"svrar6s50x887iaz9m7qj\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Beyond the technical aspects, consultants also provide emotional support and peace of mind during what can be an anxiety-inducing process. They serve as a reliable point of contact who understands your situation, can answer your questions promptly, and provide reassurance when you're feeling uncertain. This support can be particularly valuable when dealing with language barriers, cultural differences, or when you're far from home and feeling isolated.\"},\"id\":\"3geo1bw3vsj20j622aeg5x\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"However, it's important to choose your consultant carefully. Look for licensed, registered, or certified consultants with proven track records. Check their credentials, read reviews from previous clients, and ensure they have experience with your specific visa type and destination country. Be wary of consultants who make unrealistic promises or charge fees that seem too good to be true. A reputable consultant will provide honest assessments, clear fee structures, and realistic expectations about your chances of success.\"},\"id\":\"18pgruj0x13liukcd4u28\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "category": [ + "Immigration Policy Updates" + ], + "tags": [ + "VisaUpdates" + ], + "author": "Admin", + "status": "published", + "publishedAt": "11 March 2025", + "isFeatured": false, + "featuredImage": "img/inner-page/news-details/details-1.jpg", + "galleryImages": [ + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" + ], + "quote": "Working with an immigration consultant transformed my entire experience. Their expertise and guidance gave me confidence throughout the process, and I'm certain I wouldn't have been successful without their help.", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"The value of professional immigration consulting extends far beyond just filling out forms correctly. Consultants provide strategic guidance, emotional support, and peace of mind during one of life's most significant transitions. While the upfront cost may seem significant, the potential savings from avoiding mistakes, rejections, and delays often far outweigh the investment. For anyone navigating complex immigration processes, especially those with previous rejections, unique circumstances, or tight timelines, professional consultation can be the difference between success and failure.\"},\"id\":\"s2lthyy3iobl7t41cct4gi\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "commentsCount": 0 + }, + { + "title": "Latest Immigration Policy Updates You Should Know", + "slug": "latest-immigration-policy-updates-you-should-know", + "excerpt": "Stay informed with the latest immigration policy updates, ensuring you understand new rules, visa requirements, and opportunities that impact your study, work, or migration journey abroad.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Immigration policies are constantly evolving, with governments around the world regularly updating regulations, requirements, and pathways to reflect changing economic needs, security concerns, and international relations. Staying informed about these updates is crucial for anyone planning to study, work, or migrate abroad, as policy changes can significantly impact eligibility, processing times, costs, and available opportunities. Being proactive about understanding these changes can help you make informed decisions, take advantage of new opportunities, and avoid unexpected complications.\"},\"id\":\"jpzre22voon4x2hvd0h2cv\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"One of the most significant trends in recent immigration policy updates has been the expansion of post-graduation work rights for international students. Many countries, including Canada, Australia, and the United Kingdom, have extended the duration of post-graduation work permits, making it easier for students to gain valuable work experience and transition to permanent residency. These changes recognize the value that international students bring to host countries and provide clearer pathways from education to employment to settlement. For prospective students, these updates make studying abroad even more attractive, as they offer better long-term prospects beyond just obtaining a degree.\"},\"id\":\"3sd02alt73cnt6vhs29qfq\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Another important development has been the introduction and expansion of digital nomad visas and remote work programs. Countries like Portugal, Estonia, and several Caribbean nations have created specific visa categories for remote workers, recognizing the growing trend of location-independent employment. These programs typically offer longer stays than tourist visas, simplified application processes, and sometimes pathways to longer-term residency. For professionals who can work remotely, these new visa options open up exciting possibilities for international experience without the traditional constraints of work visas tied to specific employers or locations.\"},\"id\":\"s2fb9alvapsrsxe1twozi\"},{\"type\":\"header\",\"data\":{\"text\":\"Skilled Migration Program Updates\",\"level\":3},\"id\":\"yy0m9pfvyuj3bwd35673x9\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Many countries have also updated their skilled migration programs to better address labor market needs. Points-based systems have been refined to prioritize certain occupations, language proficiency requirements have been adjusted, and new pathways have been created for specific industries facing skill shortages. Countries like Australia and Canada regularly update their occupation lists, adding or removing professions based on current economic needs. These updates can significantly impact your eligibility for skilled migration programs, making it important to stay current with these changes if you're considering this pathway.\"},\"id\":\"goptt045816goq9pzyygrw\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Processing time improvements have been another focus of recent policy updates. Several countries have invested in digitalization and streamlined processes to reduce application backlogs and improve efficiency. Online application systems have been enhanced, biometric requirements have been updated, and some countries have introduced priority processing options for certain visa types. However, it's important to note that processing times can still vary significantly based on application volume, complexity, and individual circumstances. Always check current processing times when planning your application timeline.\"},\"id\":\"0airny0j4xgcitod0ncpq8\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Fee structures have also been updated in many countries, with some increases reflecting the costs of enhanced security measures, improved processing systems, and expanded services. Some countries have introduced new fee categories, such as priority processing fees or fees for additional services. Understanding these fee structures is important for budgeting your immigration journey, as costs can add up quickly when including application fees, biometric fees, medical examination costs, and other associated expenses.\"},\"id\":\"sciwsih5lthdpamp5zqjj\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Family sponsorship programs have seen updates as well, with some countries expanding eligibility criteria, adjusting income requirements, or changing processing priorities. These changes can affect your ability to sponsor family members or be sponsored by family members already living abroad. Understanding these updates is crucial if family reunification is part of your immigration goals.\"},\"id\":\"c3n0sacpivbmphj2755tw\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"To stay informed about these updates, regularly check official government immigration websites, subscribe to official newsletters or updates, and consider consulting with licensed immigration professionals who stay current with policy changes. Many consultants and immigration law firms provide regular updates through blogs, newsletters, or social media. Additionally, join relevant online communities or forums where members share updates and experiences, though always verify information through official sources.\"},\"id\":\"pusw144ai9btiv1rsi1c4m\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "category": [ + "Immigration Policy Updates" + ], + "tags": [ + "VisaUpdates" + ], + "author": "Admin", + "status": "published", + "publishedAt": "11 March 2025", + "isFeatured": false, + "featuredImage": "img/inner-page/news-details/details-1.jpg", + "galleryImages": [ + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" + ], + "quote": "Staying updated with immigration policy changes is crucial. What worked for a friend last year might not work for you today. Always check the latest official requirements before starting your application.", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"The immigration landscape is constantly evolving, and what seems like a minor policy change can have significant implications for your application. By staying informed, you can position yourself to take advantage of new opportunities, avoid unexpected complications, and make decisions based on current information rather than outdated advice. Consider setting up alerts for immigration news, following official government social media accounts, and maintaining relationships with immigration professionals who can provide timely updates relevant to your situation.\"},\"id\":\"7g4tsxxpuokxvk6a6zk4z\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "commentsCount": 0 + }, + { + "title": "Top Countries for Higher Education in 2025", + "slug": "top-countries-for-higher-education-in-2025", + "excerpt": "Discover the best countries for international students seeking quality higher education, excellent career opportunities, and a vibrant cultural experience.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Choosing the right country for higher education is one of the most important decisions you'll make, as it will shape not only your academic experience but also your career prospects, personal growth, and potentially your future residency options. With so many excellent destinations available, understanding what each country offers can help you make an informed choice that aligns with your academic goals, career aspirations, financial situation, and personal preferences.\"},\"id\":\"ke56l2vnpoxsu9ejzes1\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Canada continues to rank among the top destinations for international students, and for good reason. The country offers world-class universities, a welcoming multicultural environment, and excellent post-graduation work opportunities. Canadian institutions are known for their high academic standards, innovative research programs, and strong connections to industry. The Post-Graduation Work Permit Program allows graduates to work in Canada for up to three years, providing valuable experience and a pathway to permanent residency through programs like Express Entry. Additionally, Canada's quality of life, safety, and natural beauty make it an attractive destination for students seeking both academic excellence and a high standard of living.\"},\"id\":\"cbmaakecfle5a1doh31\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Australia has long been a favorite destination for international students, offering a combination of excellent education, beautiful landscapes, and a relaxed lifestyle. Australian universities consistently rank among the world's best, with particular strengths in fields like engineering, medicine, business, and environmental sciences. The country's Temporary Graduate visa allows students to stay and work after graduation, and Australia's skilled migration programs offer clear pathways to permanent residency for graduates in high-demand fields. The country's diverse culture, English-speaking environment, and strong support services for international students make it an appealing choice for many.\"},\"id\":\"essd9f5cpcsuxec94e5tkn\"},{\"type\":\"header\",\"data\":{\"text\":\"United Kingdom and European Options\",\"level\":3},\"id\":\"ceelpgrt3esq8gtzplp1j\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"The United Kingdom remains a prestigious destination for higher education, home to some of the world's most renowned universities including Oxford, Cambridge, and Imperial College London. While Brexit has brought changes to visa requirements and fees, the UK still offers excellent educational opportunities and a rich cultural experience. The Graduate Route visa allows international students to stay and work for up to two years after graduation, providing opportunities to gain work experience and potentially transition to longer-term visas. The UK's historical significance, cultural richness, and proximity to Europe continue to attract students despite higher costs.\"},\"id\":\"k5vk97gasfr77hx7bc4b2d\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Germany has emerged as an increasingly popular destination, particularly for students interested in engineering, technology, and sciences. One of the most attractive aspects of studying in Germany is that many public universities charge no or very low tuition fees, even for international students. This makes high-quality education accessible to a broader range of students. Germany's strong economy, excellent job prospects for graduates, and central location in Europe make it an attractive option. The country also offers good post-graduation work opportunities and pathways to permanent residency for skilled professionals.\"},\"id\":\"yqtv8cn100m4009o2koqn8\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"The United States continues to attract the largest number of international students globally, offering unparalleled diversity in educational institutions, programs, and opportunities. From prestigious Ivy League universities to innovative state schools and specialized institutions, the US provides options for every academic interest and budget. The Optional Practical Training program allows graduates to work for up to three years in their field of study, and the country's strong economy offers excellent career prospects. However, the US also has higher costs and more complex visa processes compared to some other destinations.\"},\"id\":\"4ljwyb5qjjia67yt22vj0k\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Other notable destinations include the Netherlands, known for its innovative teaching methods and strong English-taught programs; New Zealand, offering excellent quality of life and post-graduation work rights; and Singapore, a hub for business and technology education in Asia. Each country offers unique advantages, whether it's lower costs, specific academic strengths, cultural experiences, or post-graduation opportunities.\"},\"id\":\"9hr4duci0phubgfs9otf28\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"When choosing a country, consider factors beyond just university rankings. Think about language requirements, cost of living, climate, cultural fit, post-graduation work rights, pathways to permanent residency, and your long-term career goals. Research scholarship opportunities, as many countries offer financial support for international students. Consider the support services available for international students, including orientation programs, career services, and cultural integration support. Ultimately, the best country for you is one that offers the right combination of academic excellence, career opportunities, cultural fit, and personal growth experiences that align with your goals and values.\"},\"id\":\"z7mdlruj78qy4ux15skdvh\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "category": [ + "Scholarships & Grants" + ], + "tags": [ + "StudentVisa", + "StudyAbroad" + ], + "author": "Admin", + "status": "published", + "publishedAt": "March 26, 2025", + "isFeatured": false, + "featuredImage": "img/inner-page/news-details/details-1.jpg", + "galleryImages": [ + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" + ], + "quote": "Choosing Canada for my studies was the best decision I've made. The quality of education, post-graduation opportunities, and welcoming environment exceeded all my expectations.", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Remember that the best country for higher education is ultimately the one that aligns with your personal goals, values, and circumstances. While rankings and statistics provide valuable information, your personal fit with the academic culture, lifestyle, and opportunities in each country matters just as much. Take time to research thoroughly, speak with current students or alumni if possible, and consider visiting your top choices before making a final decision. Your education abroad is not just about obtaining a degree—it's about personal growth, cultural immersion, and building a foundation for your future career.\"},\"id\":\"qfj5mdgc9dgpfxsngtvgis\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "commentsCount": 0 + }, + { + "title": "The Benefits of Hiring a Visa Consultant", + "slug": "the-benefits-of-hiring-a-visa-consultant", + "excerpt": "Learn how professional visa consultants can help streamline your application process, increase approval chances, and save you time and stress.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Navigating the visa application process can be overwhelming, with complex requirements, extensive documentation, and high stakes. While it's possible to complete visa applications independently, hiring a professional visa consultant can provide significant advantages that often justify the investment. Understanding these benefits can help you decide whether professional assistance is right for your situation.\"},\"id\":\"f3xxdhe7c5r7142d9pf4wt\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"One of the most valuable benefits of working with a visa consultant is their expert knowledge and experience. Professional consultants have extensive experience with various visa types, understand the nuances of different requirements, and stay current with frequently changing policies and regulations. They've seen countless applications, understand what works and what doesn't, and can identify potential issues before they become problems. This expertise is particularly valuable for complex cases, previous rejections, or situations that don't fit standard application patterns. Consultants can help you understand which visa type is best for your situation, identify alternative pathways you might not have considered, and develop a strategic approach to your application.\"},\"id\":\"yp60oe9uvc8avg33hha4i\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Consultants also provide significant time savings. The visa application process involves extensive research, document gathering, form completion, and coordination of multiple steps. A consultant can handle much of this work for you, allowing you to focus on other important aspects of your preparation, such as language tests, financial planning, or career preparation. They know exactly what documents are needed, where to get them, how they should be formatted, and what certifications are required. This efficiency can be particularly valuable if you're working full-time, have family responsibilities, or are dealing with tight deadlines.\"},\"id\":\"jhemwk6ts67kf7mqxl2b8\"},{\"type\":\"header\",\"data\":{\"text\":\"Increased Approval Chances\",\"level\":3},\"id\":\"ejfit80gosiz1bvxmsc4ks\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Perhaps the most important benefit is the potential to significantly increase your chances of approval. Consultants understand common reasons for rejections and can help you avoid these pitfalls. They review your application thoroughly before submission, identifying inconsistencies, missing information, or weak points that could cause problems. They can help you strengthen your application by highlighting your strongest qualifications, addressing potential concerns proactively, and ensuring all requirements are met comprehensively. For applications that require interviews, consultants provide valuable preparation and coaching that can make a significant difference in the outcome.\"},\"id\":\"483m12cv2j4tmwgk8rk7fi\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Professional consultants also provide peace of mind during what can be an anxiety-inducing process. Having an expert guide you through each step, answer your questions promptly, and provide reassurance when you're uncertain can significantly reduce stress. They serve as a reliable point of contact who understands your situation and can provide support throughout the process. This emotional support can be particularly valuable when dealing with language barriers, cultural differences, or when you're feeling overwhelmed by the complexity of the process.\"},\"id\":\"cp7y1tb5ihwi1yxvxqzjm\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Consultants can also help you save money in the long run. While there's an upfront cost to hiring a consultant, their expertise can help you avoid costly mistakes that could lead to rejections, delays, or the need to reapply. A rejected application often means losing application fees, time, and potentially missing important deadlines. Consultants can help you get it right the first time, potentially saving you significant money and time. They can also help you identify cost-saving opportunities, such as fee waivers or programs with lower costs that might be suitable for your situation.\"},\"id\":\"lempi5u2ogmoap6wxc1v6\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"When complications arise, consultants are invaluable in helping you navigate challenges. Whether you've received a request for additional information, faced a rejection, or encountered unexpected delays, consultants can help you understand what went wrong, develop a strategy to address the issue, and guide you through appeals or reapplication processes. They understand the system, know how to communicate effectively with immigration authorities, and can advocate on your behalf when necessary.\"},\"id\":\"t30n1u7ixxq14eyr8be9ytg\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"However, it's important to choose your consultant carefully. Look for licensed, registered, or certified consultants with proven track records. Check their credentials, read reviews from previous clients, and ensure they have experience with your specific visa type and destination country. Be wary of consultants who make unrealistic promises or charge fees that seem too good to be true. A reputable consultant will provide honest assessments, clear fee structures, and realistic expectations about your chances of success. Remember that while consultants can significantly improve your chances, they cannot guarantee approval, as final decisions rest with immigration authorities.\"},\"id\":\"554es8szzl5gxcx6sbqltq\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "category": [ + "Visa Interview Preparation" + ], + "tags": [ + "WorkVisa", + "StudentVisa", + "TravelVisa" + ], + "author": "Admin", + "status": "published", + "publishedAt": "March 26, 2025", + "isFeatured": false, + "featuredImage": "img/inner-page/news-details/details-1.jpg", + "galleryImages": [ + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" + ], + "quote": "Hiring a visa consultant was worth every penny. They caught several potential issues in my application that I would have missed, and their interview preparation gave me the confidence I needed to succeed.", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"The decision to hire a consultant is a personal one that depends on your circumstances, confidence level, and the complexity of your case. For straightforward applications with clear requirements, you may feel comfortable proceeding independently. However, for complex cases, previous rejections, or when the stakes are particularly high, professional guidance can provide invaluable peace of mind and significantly improve your chances of success. Remember that consultants are not just for fixing problems—they can also help you optimize your application from the start, potentially saving you time and money in the long run.\"},\"id\":\"hwjv6r2pw7e3k3dgml07w8\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "commentsCount": 0 + }, + { + "title": "How to Prepare for Your Immigration Interview", + "slug": "how-to-prepare-for-your-immigration-interview", + "excerpt": "Essential tips and strategies to help you prepare effectively for your immigration interview and increase your chances of success.", + "content": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"The immigration interview is often the final and most critical step in the visa application process. This face-to-face meeting with an immigration officer can determine whether your application is approved or denied, making thorough preparation essential. While the thought of an interview can be nerve-wracking, understanding what to expect and preparing effectively can significantly increase your confidence and chances of success.\"},\"id\":\"ax5rxel90hnzhdn42am31\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"The first step in preparing for your immigration interview is understanding its purpose. Immigration officers conduct interviews to verify the information in your application, assess your genuine intentions, evaluate your eligibility, and ensure you meet all requirements. They want to confirm that you're a legitimate applicant with honest intentions, sufficient financial resources, and a clear purpose for your visit or stay. Understanding this purpose helps you prepare appropriate responses and present yourself in a way that addresses their concerns effectively.\"},\"id\":\"28jbvdmn25mtexgaky85t\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Thoroughly reviewing your application is crucial. You should be able to recall and discuss every detail in your application confidently and accurately. Immigration officers may ask about any information you've provided, including dates, addresses, employment history, educational background, financial details, or travel history. Inconsistencies between your interview responses and your application can raise red flags and lead to suspicion. Review your application multiple times, create notes or flashcards if needed, and practice explaining key aspects of your application clearly and concisely.\"},\"id\":\"ouxn8jhxg2ev1z3bn0sw\"},{\"type\":\"header\",\"data\":{\"text\":\"Document Preparation\",\"level\":3},\"id\":\"aruay0fj66frn3ih2bund\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Organizing your documents is another critical aspect of preparation. Bring all original documents that support your application, including passports, birth certificates, educational certificates, employment letters, bank statements, accommodation confirmations, and any other relevant paperwork. Organize these documents in a logical order, perhaps using a folder with tabs or dividers, so you can quickly locate any document the officer requests. Bring multiple copies of important documents, as officers may want to keep copies. Ensure all documents are current, properly certified or notarized where required, and in good condition.\"},\"id\":\"6sk73b4cyo9gi6crl1srg9\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Practicing common interview questions is essential for building confidence and ensuring you can provide clear, concise, and accurate responses. Common questions include: Why do you want to visit or study in this country? What are your plans during your stay? How will you support yourself financially? What ties do you have to your home country? What are your long-term goals? Practice answering these questions out loud, either alone or with a friend or family member. Focus on being clear, honest, and concise. Avoid memorizing scripted answers, as they can sound rehearsed and insincere. Instead, understand the key points you want to convey and practice expressing them naturally.\"},\"id\":\"wznskp0c9o5ghdcju23le\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Preparing for potential difficult questions is also important. Officers may ask about gaps in your employment history, previous visa rejections, criminal records, or other sensitive topics. Prepare honest, clear explanations for any potential concerns. If you have a previous rejection, be ready to explain what changed or how you've addressed the previous concerns. If you have employment gaps, prepare a clear explanation. Honesty is crucial, as providing false information can have serious consequences, including permanent bans from entering the country.\"},\"id\":\"hgkebxp228iz8ynej9vjh\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"Dress professionally and appropriately for your interview. While you don't need to wear formal business attire, you should present yourself in a clean, neat, and professional manner. Your appearance creates a first impression and demonstrates that you take the process seriously. Arrive early to allow time for security checks, finding the correct office, and settling your nerves. Being late can create a negative impression and add unnecessary stress.\"},\"id\":\"8t1otteynk49qyxpsfsal\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"During the interview, maintain eye contact, speak clearly and confidently, and listen carefully to questions before responding. Take your time to think before answering if needed, as it's better to provide a thoughtful response than a rushed one. Be honest and straightforward, avoiding unnecessary details that might confuse or raise additional questions. If you don't understand a question, politely ask for clarification rather than guessing what was asked. Stay calm and composed, even if you feel nervous, as confidence and composure can positively influence the officer's assessment.\"},\"id\":\"olu57x72rc8jvyw8dx88f\"},{\"type\":\"paragraph\",\"data\":{\"text\":\"After the interview, follow any instructions provided by the officer, such as submitting additional documents or checking your application status online. Be patient, as processing times can vary. If your application is approved, congratulations! If it's not approved, try to understand the reasons provided, as this information can be valuable if you decide to reapply or appeal the decision.\"},\"id\":\"35ob7d2olnfj6vdojrid4q\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "category": [ + "Visa Interview Preparation" + ], + "tags": [ + "WorkVisa", + "StudentVisa", + "FamilyVisa" + ], + "author": "Admin", + "status": "published", + "publishedAt": "March 26, 2025", + "isFeatured": false, + "featuredImage": "img/inner-page/news-details/details-1.jpg", + "galleryImages": [ + "img/inner-page/news-details/details-2.jpg", + "img/inner-page/news-details/details-3.jpg" + ], + "quote": "Preparation is everything. I spent weeks practicing interview questions and organizing my documents, and it made all the difference. The officer could tell I was well-prepared and confident.", + "contentAfterQuote": "{\"blocks\":[{\"type\":\"paragraph\",\"data\":{\"text\":\"Remember that the interview is your opportunity to bring your application to life and demonstrate your genuine intentions. While thorough preparation is essential, also remember to be yourself and answer questions honestly and naturally. The immigration officer wants to see a real person with legitimate goals, not a rehearsed script. Approach the interview with confidence, respect, and clarity, and you'll be well-positioned for success. If you're well-prepared, organized, and genuine, you've done everything you can to present your best case.\"},\"id\":\"vuekmo28aygrpghckin3ei\"}],\"time\":1770262297199,\"version\":\"2.28.2\"}", + "commentsCount": 0 } ], "recentPosts": [ { - "title": "Ultimate Guide To Getting A Work Visa In Canada", - "slug": "ultimate-guide-work-visa-canada", - "thumbnail": "/assets/img/inner-page/news-details/post-1.jpg", - "publishedAt": "11 March 2025" + "title": "Top Countries for Higher Education in 2025", + "slug": "top-countries-for-higher-education-in-2025", + "thumbnail": "img/inner-page/news-details/post-1.jpg", + "publishedAt": "March 26, 2025" }, { - "title": "Top 5 Scholarship Programs For International Students", - "slug": "top-5-scholarship-programs-international-students", - "thumbnail": "/assets/img/inner-page/news-details/post-2.jpg", - "publishedAt": "20 March 2025" + "title": "The Benefits of Hiring a Visa Consultant", + "slug": "the-benefits-of-hiring-a-visa-consultant", + "thumbnail": "img/inner-page/news-details/post-2.jpg", + "publishedAt": "March 26, 2025" }, { - "title": "10 Travel Safety Tips You Should Know Before Flying", - "slug": "10-travel-safety-tips-before-flying", - "thumbnail": "/assets/img/inner-page/news-details/post-3.jpg", - "publishedAt": "05 April 2025" + "title": "How to Prepare for Your Immigration Interview", + "slug": "how-to-prepare-for-your-immigration-interview", + "thumbnail": "img/inner-page/news-details/post-3.jpg", + "publishedAt": "March 26, 2025" } ], "comments": [ { - "postSlug": "ultimate-guide-work-visa-canada", + "postSlug": "work-visa-vs-student-visa-which-is-right-for-you", "authorName": "Frank Flores", - "authorAvatar": "/assets/img/inner-page/news-details/comment-1.png", - "content": "Bài viết rất hữu ích, cảm ơn bạn đã chia sẻ!", + "authorAvatar": "img/inner-page/news-details/comment-1.png", + "content": "This article was incredibly helpful in clarifying the differences between work and student visas. I've been struggling to decide which path to take, and the detailed comparison of financial requirements, career implications, and long-term goals really helped me understand what's best for my situation. The section on post-graduation work permits was particularly insightful.", "createdAt": "February 10, 2024", "status": "approved", "parentAuthorName": null }, { - "postSlug": "ultimate-guide-work-visa-canada", - "authorName": "Courtney Henry", - "authorAvatar": "/assets/img/inner-page/news-details/comment-2.png", - "content": "Mình đã làm theo hướng dẫn và hồ sơ được duyệt nhanh hơn hẳn.", - "createdAt": "February 12, 2024", + "postSlug": "work-visa-vs-student-visa-which-is-right-for-you", + "authorName": "Charlie Tushar", + "authorAvatar": "img/inner-page/news-details/comment-2.png", + "content": "As someone who went through both processes, I can confirm that this article accurately captures the key considerations. I started with a student visa and later transitioned to a work visa, and the article's explanation of how these pathways can complement each other is spot on. Great resource for anyone making this important decision.", + "createdAt": "February 10, 2024", + "status": "approved", + "parentAuthorName": null + }, + { + "postSlug": "work-visa-vs-student-visa-which-is-right-for-you", + "authorName": "Fatma Sariqul", + "authorAvatar": "img/inner-page/news-details/comment-3.png", + "content": "I completely agree with Frank's comment. The financial planning section was especially valuable. I wish I had read this before starting my application process. The article does a great job of explaining not just the differences, but also the practical implications of each choice.", + "createdAt": "February 10, 2024", "status": "approved", "parentAuthorName": "Frank Flores" - }, - { - "postSlug": "top-5-scholarship-programs-international-students", - "authorName": "Sarah Johnson", - "authorAvatar": "/assets/img/inner-page/news-details/comment-1.png", - "content": "Cảm ơn bạn đã chia sẻ thông tin về các chương trình học bổng này. Mình đã apply và đang chờ kết quả!", - "createdAt": "March 15, 2025", - "status": "approved", - "parentAuthorName": null - }, - { - "postSlug": "top-5-scholarship-programs-international-students", - "authorName": "Michael Chen", - "authorAvatar": "/assets/img/inner-page/news-details/comment-2.png", - "content": "Bài viết rất chi tiết và hữu ích. Mình đã tìm thấy một chương trình phù hợp với mình.", - "createdAt": "March 18, 2025", - "status": "approved", - "parentAuthorName": null - }, - { - "postSlug": "10-travel-safety-tips-before-flying", - "authorName": "Jenny Wilson", - "authorAvatar": "/assets/img/inner-page/news-details/comment-3.png", - "content": "Những tip này rất thực tế, đặc biệt là phần chuẩn bị bảo hiểm!", - "createdAt": "March 02, 2024", - "status": "approved", - "parentAuthorName": null } ] -} +} \ No newline at end of file diff --git a/data/camp-location.json b/data/camp-location.json deleted file mode 100644 index f1d0efe..0000000 --- a/data/camp-location.json +++ /dev/null @@ -1,354 +0,0 @@ -{ - "metadata": { - "_comment": "Meta information for SEO and page header", - "title": "International Sport & Language Camp in Germany 2026", - "description": "International camps for kids from ages 7-19 ☀ Spend your holiday making friends from all over the world! ► Book now!" - }, - "hero": { - "_comment": "Data for banner/hero section at the top of the page", - "title": "Our international Camps", - "backgroundImage": "/uploads/banner/b12.jpg" - }, - "camps": [ - { - "_comment": "Map markers data - contains GPS coordinates and representative images", - "id": 1, - "lat": 48.9701, - "lng": 13.1263, - "title": "Bayerischer Wald", - "image": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/11/1b/e5/23/trifter-klause-im-watzlik.jpg?w=1200&h=-1&s=1" - }, - { - "id": 2, - "lat": 53.5597, - "lng": 9.9601, - "title": "Hamburg", - "image": "https://cdn-images.wework.com/images/69626CB4-BEDF-11EB-8766-0E6A5DC689CD/69626cb4-bedf-11eb-8766-0e6a5dc689cd_0.jpg?width=600" - }, - { - "id": 3, - "lat": 52.8625, - "lng": 9.5883, - "title": "Lüneburger Heide", - "image": "https://www.campadventure.de/templates/yootheme/cache/05/01-Sommercamp-Walsrode-Dining-Hall-outside-05806542.jpeg" - }, - { - "id": 4, - "lat": 53.9246, - "lng": -3.00764, - "title": "Rossall School", - "image": "https://images.squarespace-cdn.com/content/v1/674e026f2e3d592ae64503b6/22ba03d4-bc8c-4c0a-8651-31932b1c16b6/Copy+of+Rossall+Archway+-+Prize+Day.jpg" - }, - { - "id": 5, - "lat": 51.3802, - "lng": -2.36674, - "title": "Bath University", - "image": "https://stories.bath.ac.uk/innovation-with-impact/landing-page/spin-out-club/assets/ylpLnicsFq/53233832409_7a68d40a42_o-2560x1440.jpg" - }, - { - "id": 6, - "lat": 53.6279, - "lng": 10.687, - "title": "Lauenburgische Seen", - "image": "https://www.herzogtum-lauenburg.info/wp-content/uploads/045_Abendimpression_Ratzebu.jpg" - }, - { - "id": 7, - "lat": 54.627, - "lng": 8.38935, - "title": "Amrum", - "image": "https://www.campadventure.de/templates/yootheme/cache/52/02-Language-Camps-by-Camp-Adventure-5201a531.jpeg" - }, - { - "id": 8, - "lat": 41.4114, - "lng": 2.2281, - "title": "Barcelona Beach Camp", - "image": "https://www.gelc-language-camps.org/templates/yootheme/cache/bd/1_Header-bdc50a76.jpeg" - } - ], - "locationsSection": { - "_comment": "Section title for camp locations and program options", - "title": "Our Camp Locations & Program Options", - "readMoreButtonText": "read more" - }, - "locations": [ - { - "_comment": "Detailed location information - id must match camps[].id", - "id": 1, - "country": "Germany", - "title": "Go and Grow Camp", - "imageSrc": "/uploads/locations/wal_bigpic-46c21709.jpg", - "imageAlt": "Go and Grow Camp", - "readMoreLink": "/destinations/germany-lueneburger-heide", - "imagePosition": "left", - "cardSize": "default", - "programOptions": [ - { - "_comment": "Available programs at this location", - "href": "/destinations/germany-lueneburger-heide#creative", - "imageSrc": "/uploads/programs/wal_creativesportsadventure-a530744c.jpg", - "title": "Creative, Sports & Adventure", - "description": "Many great activities are waiting for you" - }, - { - "href": "/destinations/germany-lueneburger-heide#language", - "imageSrc": "/uploads/programs/wal_germanenglish-11dc0bbb.jpg", - "title": "English/German", - "description": "Improve your language skills" - }, - { - "href": "/destinations/germany-lueneburger-heide#lifeguarding", - "imageSrc": "/uploads/programs/wal_lifeguarding-9d1139de.jpg", - "title": "Lifeguarding", - "description": "Recognize & act in emergencies at and in the water" - }, - { - "href": "/destinations/germany-lueneburger-heide#survival", - "imageSrc": "/uploads/programs/wal_survival-7ad276e4.jpg", - "title": "Survival", - "description": "The choice for all survivors" - }, - { - "href": "/destinations/germany-lueneburger-heide#soccer", - "imageSrc": "/uploads/programs/wal_soccer-e9f6b909.jpg", - "title": "Soccer", - "description": "Scoring goals has to be learned - our coaches teach you" - }, - { - "href": "/destinations/germany-lueneburger-heide#horseriding", - "imageSrc": "/uploads/programs/wal_reiten-3cc39545.jpg", - "title": "Horseback Riding", - "description": "It's all about horses" - }, - { - "href": "/destinations/germany-lueneburger-heide#husky", - "imageSrc": "/uploads/programs/wal_huskycamp-c46b92e9.jpg", - "title": "Husky Camp", - "description": "Learn more about the fascinating dogs" - }, - { - "href": "/destinations/germany-lueneburger-heide#leadership", - "imageSrc": "/uploads/programs/wal_leadership-7946a8ea.jpg", - "title": "Leadership", - "description": "The next step in camp life" - }, - { - "href": "/destinations/germany-lueneburger-heide#icit", - "imageSrc": "/uploads/programs/wal_cit-7b79f457.jpg", - "title": "Camp Counselor in Training (ICIT)", - "description": "Discover your strengths and become a teamer" - } - ] - }, - { - "id": 2, - "country": "Germany", - "title": "Adventure & Language Camp Bayerischer Wald", - "imageSrc": "/uploads/locations/REG_ADV_bigpic-d42b453f.jpg", - "imageAlt": "Adventure & Language Camp Bayerischer Wald", - "readMoreLink": "/destinations/germany-adventure-camp-bayerischer-wald", - "imagePosition": "right", - "cardSize": "large", - "programOptions": [ - { - "href": "/destinations/germany-adventure-camp-bayerischer-wald#creative", - "imageSrc": "/uploads/programs/neu_profil_creativesportsadventure_querformat-01fb7b2b.jpg", - "title": "Creative, Sports & Adventure", - "description": "Many great activities are waiting for you" - }, - { - "href": "/destinations/germany-adventure-camp-bayerischer-wald#survival", - "imageSrc": "/uploads/programs/neu_profil_survival_hochformat-0218ce10.jpg", - "title": "Survival", - "description": "The choice for all survivors" - }, - { - "href": "/destinations/germany-adventure-camp-bayerischer-wald#climbing", - "imageSrc": "/uploads/programs/reg_profil_klettern_querformat-86cc0bc7.jpg", - "title": "Climbing Course", - "description": "Pure adrenaline up to lofty heights" - }, - { - "href": "/destinations/germany-bayerischer-wald#engclassic", - "imageSrc": "/uploads/programs/reg_profil_englischclassic-50e45d03.jpg", - "title": "English Classic", - "description": "Improve your language skills in practice" - }, - { - "href": "/destinations/germany-bayerischer-wald#engtoefl", - "imageSrc": "/uploads/programs/reg_profil_toefl-a7488ef5.jpg", - "title": "English TOEFL®", - "description": "Language training incl. certificate" - }, - { - "href": "/destinations/germany-bayerischer-wald#gerclassic", - "imageSrc": "/uploads/programs/reg_profil_deutschclassic-fd03850d.jpg", - "title": "German Classic", - "description": "Holiday-oriented language course with fun" - } - ] - }, - { - "id": 3, - "country": "England", - "title": "Bath University", - "imageSrc": "/uploads/locations/bat_bigpic-7f627372.jpg", - "imageAlt": "Bath University", - "readMoreLink": "/destinations/en-england-bath-university", - "imagePosition": "right", - "cardSize": "large", - "programOptions": [ - { - "href": "/destinations/en-england-bath-university#engclassic", - "imageSrc": "/uploads/programs/bat_profil_englischclassic-64bd53f1.jpg", - "title": "English Classic", - "description": "Learning in the motherland of language" - }, - { - "href": "/destinations/en-england-bath-university#engtoefl", - "imageSrc": "/uploads/programs/bat_profil_englischtoefl-0a0f0b4f.jpg", - "title": "English TOEFL®", - "description": "Language training incl. certificate" - } - ] - }, - { - "id": 4, - "country": "England", - "title": "Rossall School", - "imageSrc": "/uploads/locations/ros_bigpic-29267065.jpg", - "imageAlt": "Rossall School", - "readMoreLink": "/destinations/en-england-rossall-school", - "imagePosition": "left", - "cardSize": "large", - "scrollspyClass": "uk-animation-slide-right-small", - "programOptions": [ - { - "href": "/destinations/en-england-rossall-school#engclassic", - "imageSrc": "/uploads/programs/ros_profil_englischclassic-8d5d3e02.jpg", - "title": "English Classic", - "description": "Learning in the motherland of language" - }, - { - "href": "/destinations/en-england-rossall-school#engtoefl", - "imageSrc": "/uploads/programs/ros_profil_englischtoefl-1899bb78.jpg", - "title": "English TOEFL®", - "description": "Language training incl. certificate" - } - ] - }, - { - "id": 5, - "country": "Spain", - "title": "Barcelona Beach camp", - "imageSrc": "/uploads/locations/AI_Kids_auf_Boot-3859030a.png", - "imageAlt": "Sailing trip at our Barcelona Beach Camp in Spain", - "readMoreLink": "/destinations/en-spain-barcelona", - "imagePosition": "right", - "cardSize": "large", - "programOptions": [] - } - ], - "intro": { - "_comment": "General introduction text - displayed in IntroSection component", - "content": "Our international Adventure, Sports & Language Camps in Germany, England and Spain combine a welcoming, inclusive atmosphere with unique Go and Grow Camp energy! Fun, stress-free language workshops and the mixture of original camp games along with traditional sports lead to an unforgettable experience. Join in and meet plenty of new friends your age from all over the globe in one of our international camps!" - }, - "faqSection": { - "_comment": "Section title for FAQ", - "title": "Frequently Asked Questions", - "buttonText": "More questions", - "buttonIcon": "comments", - "buttonLink": "/info/faq" - }, - "faq": [ - { - "_comment": "FAQ #1: Languages spoken in camp", - "question": "Which languages are spoken in camp?", - "answer": "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. All announcements and explanations are therefore always in German and English. Of course, all our teamers with their different nationalities are also available for individual translations." - }, - { - "question": "Who are the camp counselors?", - "answer": "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, Australia, Canada or Australia, to name just a few." - }, - { - "question": "Should 12-year-olds rather go to Junior Camp or Senior Camp?", - "answer": "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." - }, - { - "question": "How do you provide safety for the kids?", - "answer": "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." - }, - { - "question": "How is my child accommodated in camp?", - "answer": "In the Creative, Sports & Adventure Camp in Neuburg the participants are accommodated in tents with 6-7 persons. These are equipped with a floor and a wooden gallery. The participants can make themselves comfortable with sleeping bag and sleeping mat. In Walsrode the Juniors (7-12) and the Seniors (12-16) can choose between tent and hut. The wooden cabins are equipped with bunk beds and can accommodate 4-8 children each. In the other locations, participants are accommodated in shared rooms in youth hostels, sports centres or boarding schools run by private schools. Detailed information about the accommodation can be found at the various camps." - }, - { - "question": "Where do kids and camp counselors come from?", - "answer": "Go and Grow Camp 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 supervisors 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\nEvery year, our team is made up of an international mixture. Through our office in Hamburg and our branch office in Canada, we reach motivated and committed advisors from all over the world. Canadian and Australian teamers can therefore be found as well as German or Spanish teamers. Due to the different experiences and cultural backgrounds an indescribably fantastic, international atmosphere is created." - }, - { - "question": "How is the choice of activities/courses in the camps made?", - "answer": "If your child would like to participate in a paid profile (e.g. horse riding, language course, GEOlino), this must be booked in advance when registering. In principle, no extra profiles 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." - }, - { - "question": "How big are the camps? How high is the caregiver key?", - "answer": "Capacities range from around 30 participants in smaller language camps to a maximum of 350 children. 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 supervisor as contact person. This way homesickness does not get a chance and despite the size of the camp in their group family, they experience a strong cohesion on which they can count!" - }, - { - "question": "When do I have to pay the price for the booked camp?", - "answer": "The deposit must be paid within 7 days of receipt of the booking confirmation. The remaining payment for the booked camp is due 4 weeks before the start of the camp at the latest. Further information can be found in our Terms & Conditions." - } - ], - "welcomeQuote": { - "_comment": "Testimonial quote displayed in WelcomeQuote section", - "title": "Welcome to Go and Grow Camp", - "quote": "Both my children really enjoyed Go and Grow Camp. The teamers did a great job making them feel comfortable and at home. My son was unsure if he wanted to stay at first but he felt part of his tent group and camp very quickly and loved it. Both had tons of fun. Thank you CA!", - "author": "Anja B., Germany" - }, - "securityConcept": { - "_comment": "Security policy - 9 measures: Background Check, Education, Crisis Intervention, Caregiver Key, Nightwatch, Cooperation, Quality, Accessibility, Emergency", - "title": "Security Concept", - "introduction": "Dear parents,\n\nwe are very happy that you want us to take care of the sweetiest and the best of your life. Be sure: we will protect it as if it is our own child and do everything we can to guarantee supreme safety. We would like to introduce you a part of our safety concept, if you have any questions feel free to contact us.", - "items": [ - { - "_comment": "Security measure #1: Staff background verification", - "title": "Background Check", - "content": "Every counselor, chef, teamer who enters our camps has to be registrated, needs a background check as well as references. That's why parents are only allowed on the day of arrival and departure and not during the camp week. We want to make sure that we know and checked every adult who is with us at camp." - }, - { - "title": "Education", - "content": "Each supervisor must complete an almost two-week training course with us, which 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." - }, - { - "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." - }, - { - "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." - }, - { - "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 when 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." - }, - { - "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." - }, - { - "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." - }, - { - "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." - }, - { - "title": "In case of emergency", - "content": "Every caregiver has a valid first aid certificate and can help if necessary." - } - ] - } -} diff --git a/data/home.json b/data/home.json index 04fb44c..c7a1ac3 100644 --- a/data/home.json +++ b/data/home.json @@ -141,7 +141,7 @@ "image": "/uploads/home/b5.jpg", "contact": { "title": "Need Any Help?", - "info": "+(123) 456-789 | office@ggcamp.org" + "info": "+(123) 456-789 | info@hailearning.edu.vn" }, "questions": [ { diff --git a/models/campLocation.js b/models/campLocation.js deleted file mode 100644 index eeccbc5..0000000 --- a/models/campLocation.js +++ /dev/null @@ -1,245 +0,0 @@ -const mongoose = require('mongoose'); - -// Sub-schemas for better organization -const programOptionSchema = new mongoose.Schema({ - _comment: String, - href: String, - imageSrc: String, - title: String, - description: String -}, { _id: false }); - -const locationSchema = new mongoose.Schema({ - _comment: String, - id: { - type: Number, - required: true - }, - country: String, - title: String, - imageSrc: String, - imageAlt: String, - readMoreLink: String, - imagePosition: { - type: String, - enum: ['left', 'right'] - }, - cardSize: { - type: String, - enum: ['default', 'large'] - }, - scrollspyClass: String, - programOptions: [programOptionSchema] -}, { _id: false }); - -const campMarkerSchema = new mongoose.Schema({ - _comment: String, - id: { - type: Number, - required: true - }, - lat: { - type: Number, - required: false // Changed to false since coordinates are optional - }, - lng: { - type: Number, - required: false // Changed to false since coordinates are optional - }, - title: { - type: String, - required: true - }, - image: String -}, { _id: false }); - -const faqItemSchema = new mongoose.Schema({ - _comment: String, - question: { - type: String, - required: true - }, - answer: { - type: String, - required: true - } -}, { _id: false }); - -const securityItemSchema = new mongoose.Schema({ - _comment: String, - title: { - type: String, - required: true - }, - content: { - type: String, - required: true - } -}, { _id: false }); - -// Map schemas (similar to contact model) -const coordinatesSchema = new mongoose.Schema({ - lat: { - type: Number, - required: true - }, - lng: { - type: Number, - required: true - } -}, { _id: false }); - -const tileLayerSchema = new mongoose.Schema({ - url: { - type: String, - required: true, - trim: true - }, - attribution: { - type: String, - trim: true, - default: '' - }, - maxZoom: { - type: Number, - default: 18 - }, - minZoom: { - type: Number, - default: 0 - } -}, { _id: false }); - -const mapSchema = new mongoose.Schema({ - _comment: String, - coordinates: { - type: coordinatesSchema, - required: true - }, - zoom: { - type: Number, - default: 15 - }, - location: { - type: String, - required: true, - trim: true - }, - markerTitle: { - type: String, - trim: true, - default: '' - }, - tileLayer: { - type: tileLayerSchema, - required: true - } -}, { _id: false }); - -// Main schema -const campLocationSchema = new mongoose.Schema({ - metadata: { - _comment: String, - title: String, - description: String - }, - hero: { - _comment: String, - title: String, - backgroundImage: String, - overlayColor: String - }, - camps: [campMarkerSchema], - locationsSection: { - _comment: String, - title: String, - readMoreButtonText: { - type: String, - default: 'read more' - } - }, - locations: [locationSchema], - intro: { - _comment: String, - content: String - }, - map: { - coordinates: { - lat: { type: Number, default: 0 }, - lng: { type: Number, default: 0 } - }, - zoom: { type: Number, default: 5 }, - location: { type: String, default: '' }, - markerTitle: { type: String, default: '' }, - tileLayer: { - url: { type: String, default: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png' }, - attribution: { type: String, default: '' }, - maxZoom: { type: Number, default: 18 }, - minZoom: { type: Number, default: 0 } - } - }, - faqSection: { - _comment: String, - title: String, - buttonText: { - type: String, - default: 'More questions' - }, - buttonIcon: { - type: String, - default: 'comments' - }, - buttonLink: { - type: String, - default: '/info/faq' - } - }, - faq: [faqItemSchema], - welcomeQuote: { - _comment: String, - title: String, - quote: String, - author: String - }, - securityConcept: { - _comment: String, - title: String, - introduction: String, - items: [securityItemSchema] - }, - updatedAt: Date -}, { - timestamps: true -}); - -// Indexes for better query performance -campLocationSchema.index({ 'camps.id': 1 }); -campLocationSchema.index({ 'locations.id': 1 }); -campLocationSchema.index({ 'locations.country': 1 }); - -// Virtual to get camp by ID -campLocationSchema.virtual('getCampById').get(function() { - return (id) => this.camps.find(camp => camp.id === id); -}); - -// Virtual to get location by ID -campLocationSchema.virtual('getLocationById').get(function() { - return (id) => this.locations.find(location => location.id === id); -}); - -// Method to get locations by country -campLocationSchema.methods.getLocationsByCountry = function(country) { - return this.locations.filter(location => location.country === country); -}; - -// Method to get all countries -campLocationSchema.methods.getAllCountries = function() { - return [...new Set(this.locations.map(location => location.country))]; -}; - -// Static method to get the latest camp location data -campLocationSchema.statics.getLatest = function() { - return this.findOne().sort({ updatedAt: -1 }); -}; - -module.exports = mongoose.model('CampLocation', campLocationSchema); diff --git a/public/images/Logo_round.jpg b/public/images/Logo_round.jpg deleted file mode 100644 index 49125be..0000000 Binary files a/public/images/Logo_round.jpg and /dev/null differ diff --git a/public/img/Logo_round.jpg b/public/img/Logo_round.jpg deleted file mode 100644 index 49125be..0000000 Binary files a/public/img/Logo_round.jpg and /dev/null differ diff --git a/routes/admin.js b/routes/admin.js index 3c105a3..829abaf 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -10,7 +10,6 @@ const footerController = require("../controllers/footerController"); const aboutUsController = require("../controllers/aboutUsController"); const formController = require("../controllers/formController"); const contactController = require("../controllers/contactController"); -const campLocationController = require("../controllers/campLocationController"); const pageController = require("../controllers/pageController"); const settingController = require("../controllers/settingController"); const faqController = require("../controllers/faqController"); // Thêm import này @@ -224,13 +223,6 @@ router.put( // Safety routes router.get("/safety", ensureAuthenticated, safetyController.index); router.post("/safety/update", ensureAuthenticated, safetyController.update); -// Camp Location routes -router.get("/camp-location", ensureAuthenticated, campLocationController.index); -router.post( - "/camp-location/update", - ensureAuthenticated, - campLocationController.update, -); //Insurance routes router.get("/insurance", ensureAuthenticated, insuranceController.index); @@ -265,65 +257,6 @@ router.post( serviceController.updateDetails, ); -// Test Image Paths route -router.get("/test-images", ensureAuthenticated, (req, res) => { - const fs = require("fs"); - const path = require("path"); - const campLocationData = require("../data/camp-location.json"); - - // Collect all image paths - const imagePaths = []; - - // Camps images - if (campLocationData.camps) { - campLocationData.camps.forEach((camp) => { - if (camp.image) { - imagePaths.push({ - type: "Camp", - name: camp.title, - path: camp.image, - exists: fs.existsSync(path.join(__dirname, "../public", camp.image)), - }); - } - }); - } - - // Locations images - if (campLocationData.locations) { - campLocationData.locations.forEach((location) => { - if (location.imageSrc) { - imagePaths.push({ - type: "Location", - name: location.title, - path: location.imageSrc, - exists: fs.existsSync(path.join(__dirname, "../public", location.imageSrc)), - }); - } - - // Program images - if (location.programOptions) { - location.programOptions.forEach((program) => { - if (program.imageSrc) { - imagePaths.push({ - type: "Program", - name: program.title, - path: program.imageSrc, - exists: fs.existsSync(path.join(__dirname, "../public", program.imageSrc)), - }); - } - }); - } - }); - } - - res.render("admin/test-images", { - layout: "layouts/admin", - title: "Test Image Paths", - images: imagePaths, - user: req.session.user, - }); -}); - // Display visa management page router.get("/visa", ensureAuthenticated, visaController.index); diff --git a/routes/index.js b/routes/index.js index 2a51b18..8090a59 100644 --- a/routes/index.js +++ b/routes/index.js @@ -12,7 +12,6 @@ const faqController = require("../controllers/faqController"); const visaController = require("../controllers/visaController"); const headerMenuController = require("../controllers/headerMenuController"); const safetyController = require("../controllers/safetyController"); -const campLocationController = require("../controllers/campLocationController"); // Booking flow removed const insuranceController = require("../controllers/insuranceController"); @@ -83,10 +82,6 @@ router.get("/api/safety", safetyController.api); // Activity API routes router.get("/api/activities", activityController.api); router.get("/api/activities/:id", activityController.apiDetail); - -// Camp Location API route -router.get("/api/camp-location", campLocationController.api); -// Booking routes removed // Insurance APi route router.get("/api/insurance", insuranceController.api); @@ -127,16 +122,6 @@ router.get( bookingSubmissionController.getSessionAvailability, ); -// New API for creating bookings directly into camp sessions (by program) -router.post("/api/camps/:program/sessions/:sessionId/bookings", activityController.createSessionBookingByProgram); -router.get("/api/camps/:program/sessions/:sessionId/bookings", activityController.getSessionBookingsByProgram); -// Keep admin-style update/delete by activityId (protected) if needed -router.put("/api/camps/:activityId/sessions/:sessionId/bookings/:bookingId", activityController.updateSessionBooking); -router.delete( - "/api/camps/:activityId/sessions/:sessionId/bookings/:bookingId", - activityController.deleteSessionBooking, -); - // Demo booking form router.get("/demo/booking-form", (req, res) => { res.sendFile(path.join(__dirname, "../views/demo/booking-form.html")); diff --git a/scripts/2026_02_02_170000_create_blog_system.js b/scripts/2026_02_02_170000_blog.js similarity index 100% rename from scripts/2026_02_02_170000_create_blog_system.js rename to scripts/2026_02_02_170000_blog.js diff --git a/views/admin/blog/create.ejs b/views/admin/blog/create.ejs index b3bc9c5..139081b 100644 --- a/views/admin/blog/create.ejs +++ b/views/admin/blog/create.ejs @@ -540,10 +540,25 @@ // Lưu đúng relative path vào input (ví dụ: /uploads/blog/xxx.png) input.value = result.path; - // Show preview sử dụng đúng data gốc (không gắn thêm URL) + // Helper function để tạo full URL + const backendUrl = '<%= typeof backendUrl !== "undefined" ? backendUrl : "http://localhost:3001" %>'; + const getFullImageUrl = function(imagePath, baseUrl) { + if (!imagePath) return ""; + if (imagePath.startsWith("http://") || imagePath.startsWith("https://")) { + return imagePath; + } + const base = (baseUrl || "http://localhost:3001").replace(/\/$/, ""); + let imgSrc = imagePath; + if (!imgSrc.startsWith("/")) { + imgSrc = "/" + imgSrc; + } + return base + imgSrc; + }; + + // Show preview sử dụng helper function if (targetInput === 'featuredImageUrl') { const preview = document.getElementById('featuredImagePreview'); - const previewUrl = result.path || ''; + const previewUrl = getFullImageUrl(result.path, backendUrl); preview.innerHTML = `
<% if (blog.featuredImage) { %> - Featured image preview @@ -134,7 +134,7 @@
<% if (image1) { %> - Gallery image 1 preview @@ -157,7 +157,7 @@
<% if (image2) { %> - Gallery image 2 preview @@ -958,11 +958,23 @@ input.value = result.path; // Show preview + const backendUrl = '<%= typeof backendUrl !== "undefined" ? backendUrl : "http://localhost:3001" %>'; + const getFullImageUrl = function(imagePath, baseUrl) { + if (!imagePath) return ""; + if (imagePath.startsWith("http://") || imagePath.startsWith("https://")) { + return imagePath; + } + const base = (baseUrl || "http://localhost:3001").replace(/\/$/, ""); + let imgSrc = imagePath; + if (!imgSrc.startsWith("/")) { + imgSrc = "/" + imgSrc; + } + return base + imgSrc; + }; + if (targetInput === 'featuredImageUrl') { const preview = document.getElementById('featuredImagePreview'); - const previewUrl = (result.path && (result.path.startsWith('http://') || result.path.startsWith('https://'))) - ? result.path - : (window.location.origin + result.path); + const previewUrl = getFullImageUrl(result.path, backendUrl); preview.innerHTML = ` <% if (blog.featuredImage) { %> - <%= blog.title %> <% } else { %> diff --git a/views/admin/campLocation/index.ejs b/views/admin/campLocation/index.ejs deleted file mode 100644 index ddcc568..0000000 --- a/views/admin/campLocation/index.ejs +++ /dev/null @@ -1,1481 +0,0 @@ - - - -
-
-
-

<%= title %>

-

Edit content displayed on Camp Location page

-
-
- - View Camp Location Page - -
-
- -
-
-
- - - - - - - - - - - - - - -
- - -
-
- -
-
-
-
-
- - -
-
- -
- - -
- - Recommended size: 1920x1080px. Upload or enter image path. -
-
- <% if (data.hero?.backgroundImage) { %> - Hero background preview - <% } %> -
-
-
-
-
- - -
-
-
-
-
- - -
-
- - -
-
- - -
-
-
-
-
- - -
-
-
-
-
- - - General introduction text displayed in IntroSection component -
-
-
-
-
- - -
-
-
-
-
Section Title
- -
-
-
Read More Button Text
- - Text displayed on location cards' read more button -
-
-
-
Locations
- -
-
- <% if (data.locations && data.locations.length > 0) { %> - <% data.locations.forEach((location, index) => { %> -
-
- - - -
-
- - -
-
- - -
-
- -
- - -
- - Recommended size: 1200x800px. Upload or enter image path. -
-
- <% if (location.imageSrc) { %> - Location image preview - <% } %> -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- - -
-
-
- - -
-
- <% if (location.programOptions && location.programOptions.length > 0) { %> - <% location.programOptions.forEach((program, pIndex) => { %> -
-
-
-
- -
-
- -
-
-
- - -
- - Recommended: 600x400px -
-
- <% if (program.imageSrc) { %> - Program image preview - <% } %> -
-
- -
-
- -
-
-
-
- <% }); %> - <% } %> -
-
-
- -
-
- <% }); %> - <% } %> -
-
-
-
- - -
-
-
-
-
Section Title
- -
-
-
FAQ Button Settings
-
-
- - -
-
- - - UIkit icon name (e.g., comments, question, info) -
-
- - -
-
-
-
-
-
FAQ Items
- -
-
- <% if (data.faq && data.faq.length > 0) { %> - <% data.faq.forEach((faqItem, index) => { %> -
-
-
-
- - -
-
- - -
-
- -
-
- <% }); %> - <% } %> -
-
-
-
- - -
-
-
-
-
Section Title
- -
-
-
Introduction
- - Introduction text for parents about the security concept -
-
-
-
Security Measures
- -
-
- <% if (data.securityConcept && data.securityConcept.items && data.securityConcept.items.length > 0) { %> - <% data.securityConcept.items.forEach((item, index) => { %> -
-
-
-
- - -
-
- - -
-
- -
-
- <% }); %> - <% } %> -
-
-
-
- - -
-
-
-
Camp Locations Map
- - -
-
-
-
-
Manage Camp Markers
- Add camps with GPS coordinates to display on the map -
- -
- -
- <% if (data.camps && data.camps.length > 0) { %> - <% data.camps.forEach((camp, index) => { %> -
-
-
- -
- -
- - -
- - Recommended size: 800x600px -
- <% if (camp.image) { %> - Camp image preview - <% } %> -
-
- - -
- - - -
-
- -
- - -
- Click "Find" to auto-fill coordinates -
-
- - -
-
- - -
-
-
-
-
-
-
- -
-
- <% }); %> - <% } else { %> -
- No camps added yet. Click "Add Camp" to create your first camp marker. -
- <% } %> -
-
-
- -
- - -
-
-
-
Map Preview
- -
- <% if (data.camps && data.camps.filter(c => c.lat && c.lng).length > 0) { %> -
- - Showing <%= data.camps.filter(c => c.lat && c.lng).length %> camp location(s) on the map -
- <% } else { %> -
- - No camps with coordinates yet. Add latitude and longitude to camps above to see them on the map. -
- <% } %> -
- - -
-
-
-
- <% if (data.camps && data.camps.length > 0) { %> - <% - const validCamps = data.camps.filter(c => c.lat && c.lng); - if (validCamps.length > 0) { - %> - - <% } else { %> -
-
- -

Add coordinates to camps above to see them on the map

-
-
- <% } %> - <% } else { %> -
-
- -

No camps added yet. Click "Add Camp" button above to get started.

-
-
- <% } %> -
-
- <% if (data.camps && data.camps.filter(c => c.lat && c.lng).length > 0) { %> - - <% } %> -
-
-
- - - - - - - - - - -
-
-
-
-
-
- - -
- - -
-
-
-
-
- - - - diff --git a/views/admin/dashboard.ejs b/views/admin/dashboard.ejs index b7ee5a5..c04eaa0 100644 --- a/views/admin/dashboard.ejs +++ b/views/admin/dashboard.ejs @@ -217,25 +217,6 @@
- -
-
-
-
- -
-
-
Camp Location
-

Manage camp location

-
-
- - Edit - -
-
-
@@ -675,7 +656,7 @@
@@ -693,7 +674,7 @@
Version
- CMS-SIMS v1.0.0 + CMS.HAILearning v1.0.0
diff --git a/views/admin/home/index.ejs b/views/admin/home/index.ejs index c472abc..dbf860d 100644 --- a/views/admin/home/index.ejs +++ b/views/admin/home/index.ejs @@ -1219,7 +1219,7 @@ class="form-control" id="faqContactInfo" value="<%= data.faq?.contact?.info || '' %>" - placeholder="e.g., +(123) 456-789 | office@ggcamp.org" + placeholder="e.g., +(123) 456-789 | info@hailearning.edu.vn" />
diff --git a/views/index.ejs b/views/index.ejs index af34d6d..497bbcf 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -105,7 +105,7 @@
-

Start Using CMS-GGCamp Today

+

Start Using CMS.HAILearning Today

Experience simple and effective API management system

diff --git a/views/layouts/admin.ejs b/views/layouts/admin.ejs index 9696352..e740d1b 100644 --- a/views/layouts/admin.ejs +++ b/views/layouts/admin.ejs @@ -6,7 +6,7 @@ - <%= typeof title !=='undefined' ? title + ' | ' : '' %>CMS-GGCamp + <%= typeof title !=='undefined' ? title + ' | ' : '' %>CMS.HAILearning @@ -81,9 +81,6 @@ - diff --git a/views/layouts/main.ejs b/views/layouts/main.ejs index 47ba254..a85e09a 100644 --- a/views/layouts/main.ejs +++ b/views/layouts/main.ejs @@ -6,7 +6,7 @@ - <%= typeof title !=='undefined' ? title + ' | ' : '' %>CMS-GGCamp + <%= typeof title !=='undefined' ? title + ' | ' : '' %>CMS.HAILearning @@ -175,7 +175,7 @@ } footer { - background: linear-gradient(90deg, var(--primary-dark), var(--primary-color), var(--primary-light), #d4c4a8); + background: linear-gradient(90deg, var(--primary-dark), var(--primary-color), var(--primary-light), #0048b4); color: white; margin-top: 3rem; } @@ -681,15 +681,13 @@