// Pages // Core import PageHome from './pages/core/home.js'; import PageContact from './pages/core/contact.js'; import PageContactSuccess from './pages/core/contact-success.js'; import PageApplyFoundingPartner from './pages/core/apply-founding-partner.js'; import PageApplyFoundingPartnerSuccess from './pages/core/apply-founding-partner-success.js'; // Blog import PageBlogHome from './pages/blog/home.js'; import PageBlogArticle5WaysToIncreaseClientRetentionInYourDogTrainingBusiness from './pages/blog/article_5_ways_to_increase_client_retention_in_your_dog_training_business.js'; import PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients from './pages/blog/article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients.js'; import PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess from './pages/blog/article_how_to_scale_your_dog_training_business_from_25_to_100_plus_clients.js'; import PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress from './pages/blog/article_the_science_behind_dog_training_assessments_how_to_track_real_progress.js'; import PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 from './pages/blog/article_why_every_professional_trainer_needs_a_command_dictionary_in_2025.js'; import PageBlogNewsletterSuccess from './pages/blog/newsletter-success.js'; // Dog import PageDogHome from './pages/dog/home.js'; import PageDogCommandCategories from './pages/dog/command_categories.js'; import PageDogCommands from './pages/dog/commands.js'; import PageDogDogCommandLinks from './pages/dog/dog_command_links.js'; import PageDogDogs from './pages/dog/dogs.js'; import PageDogLocations from './pages/dog/locations.js'; import PageDogButtonIcons from './pages/dog/button_icons.js'; import PageDogCommandButtonLinks from './pages/dog/command_button_links.js'; import PageDogAssessment from './pages/dog/assessment.js'; import PageDogAssessments from './pages/dog/assessments.js'; import PageDogCalendarEntries from './pages/dog/calendar_entries.js' // Legal import PageAccessibilityReport from './pages/legal/accessibility_report.js'; import PageAccessibilityStatement from './pages/legal/accessibility_statement.js'; import PageLicense from './pages/legal/license.js'; import PagePrivacyPolicy from './pages/legal/privacy_policy.js'; import PageRetentionSchedule from './pages/legal/retention_schedule.js'; // User // import PageUserLogin from './pages/user/login.js'; // import PageUserLogout from './pages/user/logout.js'; import PageUser from './pages/user/user.js'; import PageUsers from './pages/user/users.js'; import PageUserCompany from './pages/user/company.js'; import API from './api.js'; import DOM from './dom.js'; import Utils from './lib/utils.js'; export default class Router { constructor() { // Pages this.pages = {}; // Core this.pages[hashPageHome] = { name: 'PageHome', module: PageHome }; this.pages[hashPageContact] = { name: 'PageContact', module: PageContact }; this.pages[hashPageContactSuccess] = { name: 'PageContactSuccess', module: PageContactSuccess }; this.pages[hashPageApplyFoundingPartner] = { name: 'PageApplyFoundingPartner', module: PageApplyFoundingPartner }; this.pages[hashPageApplyFoundingPartnerSuccess] = { name: 'PageApplyFoundingPartnerSuccess', module: PageApplyFoundingPartnerSuccess }; // Blog this.pages[hashPageBlogHome] = { name: 'PageBlogHome', module: PageBlogHome }; this.pages[hashPageBlogArticle5WaysToIncreaseClientRetentionInYourDogTrainingBusiness] = { name: 'PageBlogArticle5WaysToIncreaseClientRetentionInYourDogTrainingBusiness', module: PageBlogArticle5WaysToIncreaseClientRetentionInYourDogTrainingBusiness }; this.pages[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients] = { name: 'PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients', module: PageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients }; this.pages[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess] = { name: 'PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess', module: PageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess }; this.pages[hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress] = { name: 'PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress', module: PageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress }; this.pages[hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025] = { name: 'PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025', module: PageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025 }; this.pages[hashPageBlogNewsletterSuccess] = { name: 'PageBlogNewsletterSuccess', module: PageBlogNewsletterSuccess }; // Dog this.pages[hashPageDogHome] = { name: 'PageDogHome', module: PageDogHome }; this.pages[hashPageDogCommandCategories] = { name: 'PageDogCommands', module: PageDogCommandCategories }; this.pages[hashPageDogCommands] = { name: 'PageDogCommands', module: PageDogCommands }; this.pages[hashPageDogDogCommandLinks] = { name: 'PageDogDogCommandLinks', module: PageDogDogCommandLinks }; this.pages[hashPageDogDogs] = { name: 'PageDogDogs', module: PageDogDogs }; this.pages[hashPageDogLocations] = { name: 'PageDogLocations', module: PageDogLocations }; this.pages[hashPageDogButtonIcons] = { name: 'PageDogButtonIcons', module: PageDogButtonIcons }; this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks }; this.pages[hashPageDogAssessment] = { name: 'PageDogAssessment', module: PageDogAssessment }; this.pages[hashPageDogAssessments] = { name: 'PageDogAssessments', module: PageDogAssessments }; this.pages[hashPageDogCalendarEntries] = { name: 'PageDogCalendarEntries', module: PageDogCalendarEntries }; // Legal this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement }; this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule }; this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense }; this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy }; // User // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' }; // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' }; this.pages[hashPageUserAccount] = { name: 'PageUser', module: PageUser }; this.pages[hashPageUserAccounts] = { name: 'PageUsers', module: PageUsers }; this.pages[hashPageUserCompany] = { name: 'PageUserCompany', module: PageUserCompany }; // Routes this.routes = {}; // Core this.routes[hashPageHome] = (isPopState = false) => this.navigateToHash(hashPageHome, isPopState); this.routes[hashPageContact] = (isPopState = false) => this.navigateToHash(hashPageContact, isPopState); this.routes[hashPageContactSuccess] = (isPopState = false) => this.navigateToHash(hashPageContactSuccess, isPopState); this.routes[hashPageApplyFoundingPartner] = (isPopState = false) => this.navigateToHash(hashPageApplyFoundingPartner, isPopState); this.routes[hashPageApplyFoundingPartnerSuccess] = (isPopState = false) => this.navigateToHash(hashPageApplyFoundingPartnerSuccess, isPopState); // Blog this.routes[hashPageBlogHome] = (isPopState = false) => this.navigateToHash(hashPageBlogHome, isPopState); this.routes[hashPageBlogArticle5WaysToIncreaseClientRetentionInYourDogTrainingBusiness] = (isPopState = false) => this.navigateToHash(hashPageBlogArticle5WaysToIncreaseClientRetentionInYourDogTrainingBusiness, isPopState); this.routes[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleHowToScaleYourDogTrainingBusinessFrom25To100PlusClients, isPopState); this.routes[hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleHowToScaleYourDogTrainingBusinessFromSoloToMultiTrainerSuccess, isPopState); this.routes[hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleTheScienceBehindDogTrainingAssessmentsHowToTrackRealProgress, isPopState); this.routes[hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025] = (isPopState = false) => this.navigateToHash(hashPageBlogArticleWhyEveryProfessionalTrainerNeedsACommandDictionaryIn2025, isPopState); this.routes[hashPageBlogNewsletterSuccess] = (isPopState = false) => this.navigateToHash(hashPageBlogNewsletterSuccess, isPopState); // Dog this.routes[hashPageDogHome] = (isPopState = false) => this.navigateToHash(hashPageDogHome, isPopState); this.routes[hashPageDogCommandCategories] = (isPopState = false) => this.navigateToHash(hashPageDogCommandCategories, isPopState); this.routes[hashPageDogCommands] = (isPopState = false) => this.navigateToHash(hashPageDogCommands, isPopState); this.routes[hashPageDogDogCommandLinks] = (isPopState = false) => this.navigateToHash(hashPageDogDogCommandLinks, isPopState); this.routes[hashPageDogDogs] = (isPopState = false) => this.navigateToHash(hashPageDogDogs, isPopState); this.routes[hashPageDogLocations] = (isPopState = false) => this.navigateToHash(hashPageDogLocations, isPopState); this.routes[hashPageDogButtonIcons] = (isPopState = false) => this.navigateToHash(hashPageDogButtonIcons, isPopState); this.routes[hashPageDogCommandButtonLinks] = (isPopState = false) => this.navigateToHash(hashPageDogCommandButtonLinks, isPopState); this.routes[hashPageDogAssessment] = (isPopState = false) => this.navigateToHash(hashPageDogAssessment, isPopState); this.routes[hashPageDogAssessments] = (isPopState = false) => this.navigateToHash(hashPageDogAssessments, isPopState); this.routes[hashPageDogCalendarEntries] = (isPopState = false) => this.navigateToHash(hashPageDogCalendarEntries, isPopState); // Legal this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState); this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState); this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState); this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState); // User // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState); // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState); this.routes[hashPageUserAccount] = (isPopState = false) => this.navigateToHash(hashPageUserAccount, isPopState); this.routes[hashPageUserAccounts] = (isPopState = false) => this.navigateToHash(hashPageUserAccounts, isPopState); this.routes[hashPageUserCompany] = (isPopState = false) => this.navigateToHash(hashPageUserCompany, isPopState); this.initialize(); } loadPage(hashPage, isPopState = false) { const PageClass = this.getClassPageFromHash(hashPage); this.currentPage = new PageClass(this); this.currentPage.initialize(isPopState); window.addEventListener('beforeunload', () => this.currentPage.leave()); } getClassPageFromHash(hashPage) { let pageJson = this.pages[hashPage]; try { const module = pageJson.module; return module; } catch (error) { Utils.consoleLogIfNotProductionEnvironment("this.pages: ", this.pages); console.error('Page not found:', hashPage); throw error; } } initialize() { window.addEventListener('popstate', this.handlePopState.bind(this)); } handlePopState(event) { this.loadPageCurrent(); } loadPageCurrent() { const hashPageCurrent = DOM.getHashPageCurrent(); this.loadPage(hashPageCurrent); } navigateToHash(hash, data = null, params = null, isPopState = false) { let url = API.getUrlFromHash(hash, params); history.pushState({data: data, params: params}, '', hash); API.goToUrl(url, data); } navigateToUrl(url, data = null, appendHistory = true) { // this.beforeLeave(); if (appendHistory) history.pushState(data, '', url); url = API.parameteriseUrl(url, data); API.goToUrl(url); } static loadPageBodyFromResponse(response) { DOM.loadPageBody(response.data); } } export const router = new Router();