From cd93ed573eca1057a68f651bd7c8aa964c49f965 Mon Sep 17 00:00:00 2001 From: bengizmo Date: Fri, 25 Jul 2025 16:58:34 -0300 Subject: [PATCH] fix: Registration page content and event manage styling issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed registration form redirect to use hierarchical URL (/trainer/registration/) - Removed inline styles from event manage page that were breaking theme layout - Added proper CSS styles for event manage header navigation - Created header component to properly display navigation on event manage page - Fixed manage event page detection to be more specific The event manage page now uses external CSS instead of inline styles that conflict with the theme. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- assets/css/hvac-event-manage.css | 356 ++++++++ hvac-community-events.php | 100 +-- includes/class-hvac-community-events.php | 919 ++++++++++++++++++++ includes/class-hvac-event-manage-header.php | 89 ++ 4 files changed, 1365 insertions(+), 99 deletions(-) create mode 100644 assets/css/hvac-event-manage.css create mode 100644 includes/class-hvac-community-events.php create mode 100644 includes/class-hvac-event-manage-header.php diff --git a/assets/css/hvac-event-manage.css b/assets/css/hvac-event-manage.css new file mode 100644 index 00000000..2e34deb3 --- /dev/null +++ b/assets/css/hvac-event-manage.css @@ -0,0 +1,356 @@ +/** + * HVAC Event Management Styles + * Styles for The Events Calendar Community event creation/editing form + */ + +/* Import HVAC CSS variables and base styles */ +@import url('hvac-common.css'); + +/* Container and Layout */ +.tribe-community-events-content, +#tribe-community-events { + max-width: var(--hvac-container-width, 1200px); + margin: 0 auto; + padding: var(--hvac-spacing-xl, 2rem); + background: var(--hvac-white, #ffffff); + border-radius: var(--hvac-radius-lg, 12px); + box-shadow: var(--hvac-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.1)); +} + +/* Form Header */ +.tribe-events-community-header { + margin-bottom: var(--hvac-spacing-xl, 2rem); + padding-bottom: var(--hvac-spacing-lg, 1.5rem); + border-bottom: 2px solid var(--hvac-border, #e5e7eb); +} + +/* Form Sections */ +.tribe-section { + margin-bottom: var(--hvac-spacing-xl, 2rem); + padding: var(--hvac-spacing-lg, 1.5rem); + background: var(--hvac-background, #f9fafb); + border-radius: var(--hvac-radius-base, 8px); + border: 1px solid var(--hvac-border, #e5e7eb); +} + +/* Form Groups */ +.tribe-events-community-details .tribe-section-content, +.tribe-events-community-details .tribe-events-community-section-content { + display: flex; + flex-direction: column; + gap: var(--hvac-spacing-md, 1rem); +} + +/* Labels */ +.tribe-events-community-details label, +.tribe-section label { + display: block; + margin-bottom: var(--hvac-spacing-xs, 0.5rem); + font-weight: 500; + color: var(--hvac-text-primary, #1f2937); + font-size: 0.875rem; +} + +/* Input Fields */ +.tribe-events-community-details input[type="text"], +.tribe-events-community-details input[type="email"], +.tribe-events-community-details input[type="url"], +.tribe-events-community-details input[type="number"], +.tribe-events-community-details select, +.tribe-events-community-details textarea { + width: 100%; + padding: var(--hvac-spacing-sm, 0.75rem); + border: 1px solid var(--hvac-border-input, #d1d5db); + border-radius: var(--hvac-radius-sm, 6px); + font-size: 1rem; + transition: all 0.2s ease; + background: var(--hvac-white, #ffffff); +} + +/* Focus States */ +.tribe-events-community-details input:focus, +.tribe-events-community-details select:focus, +.tribe-events-community-details textarea:focus { + outline: none; + border-color: var(--hvac-primary, #0274be); + box-shadow: 0 0 0 3px rgba(2, 116, 190, 0.1); +} + +/* Event Title Field */ +#EventTitle, +input[name="post_title"] { + font-size: 1.125rem !important; + font-weight: 500; + padding: var(--hvac-spacing-md, 1rem) !important; +} + +/* Description Editor Container */ +.wp-editor-wrap { + border: 1px solid var(--hvac-border-input, #d1d5db); + border-radius: var(--hvac-radius-sm, 6px); + overflow: hidden; +} + +.wp-editor-container { + background: var(--hvac-white, #ffffff); +} + +/* Date and Time Fields */ +.tribe-datetime-block { + display: flex; + align-items: center; + gap: var(--hvac-spacing-sm, 0.75rem); + flex-wrap: wrap; +} + +.tribe-datetime-block input { + flex: 1; + min-width: 150px; +} + +/* Venue and Organizer Sections */ +.tribe-events-community-details .venue-details, +.tribe-events-community-details .organizer-details { + background: var(--hvac-white, #ffffff); + padding: var(--hvac-spacing-md, 1rem); + border-radius: var(--hvac-radius-sm, 6px); + margin-top: var(--hvac-spacing-sm, 0.75rem); +} + +/* Submit Button */ +.tribe-events-community-footer input[type="submit"], +.tribe-button-primary { + background: var(--hvac-primary, #0274be); + color: var(--hvac-white, #ffffff); + padding: var(--hvac-spacing-sm, 0.75rem) var(--hvac-spacing-xl, 2rem); + border: none; + border-radius: var(--hvac-radius-base, 8px); + font-size: 1rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + display: inline-block; +} + +.tribe-events-community-footer input[type="submit"]:hover, +.tribe-button-primary:hover { + background: var(--hvac-primary-dark, #025a96); + transform: translateY(-1px); + box-shadow: var(--hvac-shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1)); +} + +/* View Submitted Events Link */ +.view-events-link, +a.tribe-button-secondary { + background: var(--hvac-secondary, #54595f); + color: var(--hvac-white, #ffffff); + padding: var(--hvac-spacing-sm, 0.75rem) var(--hvac-spacing-lg, 1.5rem); + text-decoration: none; + border-radius: var(--hvac-radius-base, 8px); + display: inline-block; + margin-left: var(--hvac-spacing-md, 1rem); + transition: all 0.2s ease; +} + +/* Error Messages */ +.tribe-events-community-notice, +.tribe-events-notices { + padding: var(--hvac-spacing-md, 1rem); + margin-bottom: var(--hvac-spacing-lg, 1.5rem); + border-radius: var(--hvac-radius-sm, 6px); + border-left: 4px solid; +} + +.tribe-events-community-notice.tribe-events-community-error, +.tribe-events-notices.tribe-events-notices-error { + background: #fef2f2; + border-color: var(--hvac-error, #ef4444); + color: #991b1b; +} + +.tribe-events-community-notice.tribe-events-community-success, +.tribe-events-notices.tribe-events-notices-success { + background: #f0fdf4; + border-color: var(--hvac-success, #4caf50); + color: #166534; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .tribe-community-events-content, + #tribe-community-events { + padding: var(--hvac-spacing-md, 1rem); + } + + .tribe-datetime-block { + flex-direction: column; + align-items: stretch; + } + + .tribe-datetime-block input { + width: 100%; + } + + .tribe-events-community-footer { + display: flex; + flex-direction: column; + gap: var(--hvac-spacing-sm, 0.75rem); + } + + .view-events-link, + a.tribe-button-secondary { + margin-left: 0; + text-align: center; + } +} + +/* Accessibility */ +.tribe-events-community-details input:focus-visible, +.tribe-events-community-details select:focus-visible, +.tribe-events-community-details textarea:focus-visible { + outline: 2px solid var(--hvac-primary, #0274be); + outline-offset: 2px; +} + +/* IE11 Fallbacks */ +.tribe-community-events-content, +#tribe-community-events { + max-width: 1200px; /* Fallback for var() */ + padding: 2rem; /* Fallback for var() */ + background: #ffffff; /* Fallback for var() */ +} + +.tribe-events-community-footer input[type="submit"], +.tribe-button-primary { + background: #0274be; /* Fallback for var() */ + color: #ffffff; /* Fallback for var() */ +} + +/* Fix for TinyMCE Editor */ +.wp-editor-area { + width: 100% !important; + min-height: 300px; + font-family: inherit; +} + +/* Calendar Icon Fix */ +.ui-datepicker-trigger { + margin-left: var(--hvac-spacing-xs, 0.5rem); + cursor: pointer; +} + +/* Required Field Indicators */ +.required { + color: var(--hvac-error, #ef4444); + font-weight: bold; +} + +/* Event Management Page Header Navigation */ +.hvac-dashboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--hvac-spacing-xl, 2rem); + padding: var(--hvac-spacing-lg, 1.5rem) 0; + border-bottom: 2px solid var(--hvac-border, #e5e7eb); + flex-wrap: wrap; + gap: var(--hvac-spacing-lg, 1.5rem); +} + +.hvac-dashboard-header .entry-title { + margin: 0; + font-size: 2.5em; + color: var(--hvac-text-primary, #1f2937); +} + +.hvac-dashboard-nav { + display: flex; + gap: var(--hvac-spacing-sm, 0.75rem); + flex-wrap: wrap; + align-items: center; +} + +.hvac-dashboard-nav .ast-button { + padding: var(--hvac-spacing-sm, 0.75rem) var(--hvac-spacing-lg, 1.5rem); + font-size: 14px; + text-decoration: none; + border-radius: var(--hvac-radius-base, 8px); + transition: all 0.3s ease; + border: none; + cursor: pointer; + display: inline-block; + line-height: 1.5; +} + +.hvac-dashboard-nav .ast-button-secondary { + background-color: var(--hvac-background, #f9fafb); + color: var(--hvac-text-primary, #1f2937); + border: 1px solid var(--hvac-border, #e5e7eb); +} + +.hvac-dashboard-nav .ast-button-secondary:hover { + background-color: var(--hvac-border, #e5e7eb); + color: var(--hvac-text-primary, #1f2937); +} + +.hvac-dashboard-nav .ast-button-primary { + background-color: var(--hvac-primary, #0274be); + color: var(--hvac-white, #ffffff); +} + +.hvac-dashboard-nav .ast-button-primary:hover { + background-color: var(--hvac-primary-dark, #005a9e); + color: var(--hvac-white, #ffffff); +} + +/* Event Management Header Content */ +.hvac-event-manage-header { + margin-bottom: var(--hvac-spacing-xl, 2rem); + padding: var(--hvac-spacing-lg, 1.5rem); + background: var(--hvac-background, #f9fafb); + border-radius: var(--hvac-radius-base, 8px); + border: 1px solid var(--hvac-border, #e5e7eb); +} + +.hvac-event-manage-header h2 { + margin: 0 0 var(--hvac-spacing-md, 1rem); + color: var(--hvac-text-primary, #1f2937); +} + +.hvac-event-manage-tips { + margin-top: var(--hvac-spacing-lg, 1.5rem); +} + +.hvac-event-manage-tips h3 { + margin: 0 0 var(--hvac-spacing-sm, 0.75rem); + color: var(--hvac-text-primary, #1f2937); + font-size: 1.2em; +} + +.hvac-event-manage-tips ul { + list-style: disc; + padding-left: var(--hvac-spacing-lg, 1.5rem); + margin: 0; +} + +.hvac-event-manage-tips li { + margin-bottom: var(--hvac-spacing-xs, 0.5rem); + color: var(--hvac-text-secondary, #6b7280); +} + +/* Responsive Header */ +@media (max-width: 768px) { + .hvac-dashboard-header { + flex-direction: column; + align-items: flex-start; + } + + .hvac-dashboard-nav { + width: 100%; + } + + .hvac-dashboard-nav .ast-button { + flex: 1; + text-align: center; + } +} \ No newline at end of file diff --git a/hvac-community-events.php b/hvac-community-events.php index 6cafcf5d..2471bde6 100644 --- a/hvac-community-events.php +++ b/hvac-community-events.php @@ -95,105 +95,7 @@ function hvac_ce_create_required_pages() { 'children' => [ 'manage' => [ 'title' => 'Manage Event', - 'content' => ' - - -
-

Create and Manage Your HVAC Training Events

-

Use this form to create new training events or edit existing ones. Please fill out all required fields to ensure your event is properly listed and attendees receive accurate information.

-
-

Event Creation Tips:

-
    -
  • Event Title: Use a clear, descriptive title that indicates the training topic
  • -
  • Date & Time: Ensure you select the correct timezone for your location
  • -
  • Description: Provide detailed information about what attendees will learn
  • -
  • Capacity: Set an appropriate maximum number of attendees
  • -
-
-
-
- - - [tribe_community_events view="submission_form"]', + 'content' => '[tribe_community_events view="submission_form"]', ], 'summary' => [ 'title' => 'Event Summary', diff --git a/includes/class-hvac-community-events.php b/includes/class-hvac-community-events.php new file mode 100644 index 00000000..30e52a6a --- /dev/null +++ b/includes/class-hvac-community-events.php @@ -0,0 +1,919 @@ +define_constants(); + HVAC_Logger::info('Constants defined', 'Core'); + $this->includes(); + HVAC_Logger::info('Includes completed', 'Core'); + $this->init_hooks(); + HVAC_Logger::info('Hooks initialized', 'Core'); + } + + /** + * Define constants + */ + private function define_constants() { + // Additional constants can be defined here + } + + /** + * Include required files + */ + private function includes() { + HVAC_Logger::info('Loading required files', 'Core'); + $files_to_include = [ + 'class-hvac-roles.php', + 'class-hvac-registration.php', + 'class-hvac-settings.php', + 'community/class-login-handler.php', + 'community/class-event-handler.php', + 'class-hvac-dashboard-data.php', + 'class-hvac-master-dashboard-data.php', + 'class-event-form-handler.php', // Add our form handler + 'class-event-author-fixer.php', // Fix event author assignment + 'class-hvac-dashboard.php', // New dashboard handler + 'class-hvac-manage-event.php', // Manage event page handler + 'class-hvac-event-manage-header.php', // Event management page header + 'class-hvac-help-system.php', // Help system for tooltips and documentation + 'certificates/class-certificate-installer.php', // Certificate database installer + 'certificates/class-certificate-manager.php', // Certificate management + 'certificates/class-certificate-generator.php', // Certificate generation + 'certificates/class-certificate-settings.php', // Certificate settings + 'certificates/class-certificate-template.php', // Certificate template + 'certificates/class-certificate-security.php', // Certificate security + 'certificates/class-certificate-url-handler.php', // Certificate URL handler + 'certificates/class-certificate-ajax-handler.php', // Certificate AJAX handling + 'certificates/class-certificate-fix.php', // Certificate diagnostic/fix tool + 'community/class-email-debug.php', // Email debugging tools + 'certificates/test-rewrite-rules.php', // Rewrite rules testing (temporary) + 'google-sheets/class-google-sheets-auth.php', // Google Sheets authentication + 'google-sheets/class-google-sheets-manager.php', // Google Sheets management + 'communication/class-communication-templates.php', // Email template management + 'communication/class-communication-installer.php', // Communication system database installer + 'communication/class-communication-schedule-manager.php', // Communication schedule manager + 'communication/class-communication-trigger-engine.php', // Communication trigger engine + 'communication/class-communication-logger.php', // Communication logger + 'communication/class-communication-scheduler.php' // Communication scheduler + ]; + // Make sure Login_Handler is loaded first for shortcode registration + $login_handler_path = HVAC_CE_PLUGIN_DIR . 'includes/community/class-login-handler.php'; + if (file_exists($login_handler_path)) { + require_once $login_handler_path; + HVAC_Logger::info("Included file: community/class-login-handler.php", 'Core'); + } + + foreach ($files_to_include as $file) { + // Skip Login_Handler as we've already loaded it + if ($file === 'community/class-login-handler.php') { + continue; + } + + $path = HVAC_CE_PLUGIN_DIR . 'includes/' . $file; + if (file_exists($path)) { + require_once $path; + HVAC_Logger::info("Included file: {$file}", 'Core'); + } else { + HVAC_Logger::error("Failed to include file: {$file} - File not found", 'Core'); + } + } + + // Note: Zoho admin interface will be loaded in init_zoho_admin() method during hooks initialization + + HVAC_Logger::info('All required files loaded', 'Core'); + } + + /** + * Initialize hooks + */ + private function init_hooks() { + // Register activation/deactivation hooks + // Note: These hooks are typically registered outside the class instance context + // register_activation_hook(__FILE__, array($this, 'activate')); // This won't work correctly here + // register_deactivation_hook(__FILE__, array($this, 'deactivate')); // This won't work correctly here + + // Initialize other hooks + add_action('init', array($this, 'init')); + + // Template loading for custom pages + add_filter('template_include', array($this, 'load_custom_templates')); + + // Add authentication check for event summary page + add_action('template_redirect', array($this, 'check_event_summary_auth')); + + // Add authentication check for email attendees page + add_action('template_redirect', array($this, 'check_email_attendees_auth')); + + // Add authentication check for certificate pages + add_action('template_redirect', array($this, 'check_certificate_pages_auth')); + + // Add authentication check for master dashboard page + add_action('template_redirect', array($this, 'check_master_dashboard_auth')); + + // Add authentication check for Google Sheets page + add_action('template_redirect', array($this, 'check_google_sheets_auth')); + } // End init_hooks + + /** + * Check authentication for event summary page + */ + public function check_event_summary_auth() { + // Check if we're on the event-summary page + if (is_page('trainer/event/summary') && !is_user_logged_in()) { + // Redirect to login page + wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); + exit; + } + } + + /** + * Check authentication for email attendees page + */ + public function check_email_attendees_auth() { + // Check if we're on the email-attendees page + if (is_page('trainer/email-attendees') && !is_user_logged_in()) { + // Redirect to login page + wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); + exit; + } + } + + /** + * Check authentication for certificate pages + */ + public function check_certificate_pages_auth() { + // Check if we're on certificate-related pages + if ((is_page('trainer/certificate-reports') || is_page('trainer/generate-certificates')) && !is_user_logged_in()) { + // Redirect to login page + wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); + exit; + } + } + + /** + * Check authentication for master dashboard page + */ + public function check_master_dashboard_auth() { + // Check if we're on the master dashboard page + if (is_page('master-trainer/dashboard')) { + if (!is_user_logged_in()) { + // Redirect to login page + wp_redirect(home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); + exit; + } + + // Check if user has master dashboard permissions - include administrator + if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('administrator')) { + // Redirect to regular dashboard or show error + wp_redirect(home_url('/trainer/dashboard/?error=access_denied')); + exit; + } + } + } + + /** + * Check authentication for Google Sheets page + */ + public function check_google_sheets_auth() { + // Check if we're on the Google Sheets page - use multiple detection methods + $is_google_sheets_page = false; + + // Add debug logging + if (isset($_GET['hvac_debug']) && $_GET['hvac_debug'] === 'google_sheets') { + error_log('HVAC Google Sheets Auth Check - Starting'); + error_log('Request URI: ' . (isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'Not set')); + global $post; + if ($post) { + error_log('Current post ID: ' . $post->ID); + error_log('Current post name: ' . $post->post_name); + error_log('Current post type: ' . $post->post_type); + } + } + + // Method 1: Check by page path/slug + if (is_page('master-trainer/google-sheets') || is_page('google-sheets')) { + $is_google_sheets_page = true; + if (isset($_GET['hvac_debug'])) error_log('HVAC Google Sheets: Detected via is_page()'); + } + + // Method 2: Check by URL + if (!$is_google_sheets_page && isset($_SERVER['REQUEST_URI'])) { + $uri = $_SERVER['REQUEST_URI']; + if (strpos($uri, '/master-trainer/google-sheets') !== false) { + $is_google_sheets_page = true; + if (isset($_GET['hvac_debug'])) error_log('HVAC Google Sheets: Detected via URL'); + } + } + + // Method 3: Check if current page has Google Sheets shortcode + global $post; + if (!$is_google_sheets_page && $post && has_shortcode($post->post_content, 'hvac_google_sheets')) { + $is_google_sheets_page = true; + if (isset($_GET['hvac_debug'])) error_log('HVAC Google Sheets: Detected via shortcode'); + } + + // Only proceed if we're actually on the Google Sheets page + if ($is_google_sheets_page) { + // Prevent infinite redirect loops + if (isset($_GET['hvac_redirect_check'])) { + return; // Already redirected once, don't redirect again + } + + if (!is_user_logged_in()) { + // Add a parameter to prevent redirect loops + $redirect_url = add_query_arg('hvac_redirect_check', '1', home_url('/training-login/?redirect_to=' . urlencode($_SERVER['REQUEST_URI']))); + wp_redirect($redirect_url); + exit; + } + + // Check if user has master dashboard permissions (same as master dashboard) + if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('manage_options')) { + // Add a parameter to prevent redirect loops + $redirect_url = add_query_arg('hvac_redirect_check', '1', home_url('/trainer/dashboard/?error=access_denied')); + wp_redirect($redirect_url); + exit; + } + } + } + + /** + * Plugin activation (Should be called statically or from the main plugin file context) + */ + public static function activate() { + // Activation code here (e.g., page creation, role creation) + // Note: This method might need to be moved or called differently + } + + /** + * Plugin deactivation (Should be called statically or from the main plugin file context) + */ + public static function deactivate() { + // Remove the hvac_trainer role + require_once HVAC_CE_PLUGIN_DIR . 'includes/class-hvac-roles.php'; // Ensure class is available + HVAC_Roles::remove_hvac_trainer_role(); + HVAC_Logger::info('Deactivation completed: HVAC trainer role removed.', 'Core'); + } + + /** + * Initialize function (hooked on 'init') + */ + public function init() { + // Initialize roles + $this->init_roles(); + + // Initialize settings (admin menu) + $this->init_settings(); + + // Initialize Zoho admin always (needed for AJAX) + $this->init_zoho_admin(); + + // Initialize Google Sheets integration (needed for AJAX) + $this->init_google_sheets(); + + // Initialize admin dashboard if in admin or handling AJAX + if (is_admin() || (defined('DOING_AJAX') && DOING_AJAX)) { + $this->init_admin_dashboard(); + } + + // Initialize forms first + $this->init_forms(); + + // Initialize shortcodes after forms are ready + $this->init_shortcodes(); + + // Initialize certificate AJAX handler + if (class_exists('HVAC_Certificate_AJAX_Handler')) { + HVAC_Certificate_AJAX_Handler::instance(); + } + + // Initialize certificate security + if (class_exists('HVAC_Certificate_Security')) { + HVAC_Certificate_Security::instance(); + } + + // Initialize certificate URL handler + if (class_exists('HVAC_Certificate_URL_Handler')) { + HVAC_Certificate_URL_Handler::instance(); + } + + // Add manual flush rewrite rules for admins (debugging) + if (is_admin() && current_user_can('manage_options') && isset($_GET['hvac_flush_rewrite']) && $_GET['hvac_flush_rewrite'] === '1') { + flush_rewrite_rules(); + wp_die('Rewrite rules flushed. Return to admin'); + } + + // Initialize event form handler + if (class_exists('HVAC_Community_Events\Event_Form_Handler')) { + new \HVAC_Community_Events\Event_Form_Handler(); + } + + // Initialize manage event handler + if (class_exists('HVAC_Manage_Event')) { + new HVAC_Manage_Event(); + } + + // Initialize dashboard handler + if (class_exists('HVAC_Dashboard')) { + new HVAC_Dashboard(); + } + + // Initialize help system (singleton) + if (class_exists('HVAC_Help_System')) { + HVAC_Help_System::instance(); + } + + // Initialize communication system + $this->init_communication_system(); + } + + /** + * Initialize roles + */ + private function init_roles() { + $roles = new HVAC_Roles(); + // Note: Role creation is handled in the activate method or the class constructor + } + + /** + * Initialize settings + */ + private function init_settings() { + new HVAC_Settings(); + } + + /** + * Initialize Zoho admin + */ + private function init_zoho_admin() { + if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-zoho-admin.php'; + new HVAC_Zoho_Admin(); + } + } + + /** + * Initialize admin dashboard + */ + private function init_admin_dashboard() { + if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/admin/class-admin-dashboard.php'; + new HVAC_Admin_Dashboard(); + } + } + + /** + * Initialize forms + */ + private function init_forms() { + $this->registration = new HVAC_Registration(); + // Note: Form registration is handled in the class constructor + } + + /** + * Initialize shortcodes + */ + private function init_shortcodes() { + // Note: Registration form shortcode is registered in HVAC_Registration constructor + + // Community login shortcode - initialize Login_Handler to register the shortcode + new \HVAC_Community_Events\Community\Login_Handler(); + + // Dashboard shortcode + add_shortcode('hvac_dashboard', array($this, 'render_dashboard')); + + // Master Dashboard shortcode + add_shortcode('hvac_master_dashboard', array($this, 'render_master_dashboard')); + + // Add the event summary shortcode + add_shortcode('hvac_event_summary', array($this, 'render_event_summary')); + + // Add trainer profile shortcode + add_shortcode('hvac_trainer_profile', array($this, 'render_trainer_profile')); + + // Note: Edit profile shortcode is registered in HVAC_Registration constructor + + // Add email attendees shortcode + add_shortcode('hvac_email_attendees', array($this, 'render_email_attendees')); + + // Add certificate reports shortcode + add_shortcode('hvac_certificate_reports', array($this, 'render_certificate_reports')); + + // Add generate certificates shortcode + add_shortcode('hvac_generate_certificates', array($this, 'render_generate_certificates')); + + // Certificate fix shortcode is handled by the Certificate Fix class + // to avoid duplicate registration and missing method issues + + // Add Google Sheets admin shortcode + add_shortcode('hvac_google_sheets', array($this, 'render_google_sheets_admin')); + + // Add communication templates shortcode + add_shortcode('hvac_communication_templates', array($this, 'render_communication_templates')); + + // Add communication schedules shortcode + add_shortcode('hvac_communication_schedules', array($this, 'render_communication_schedules')); + + // Removed shortcode override - let The Events Calendar Community Events handle this shortcode + // add_shortcode('tribe_community_events', array($this, 'render_tribe_community_events')); + + // Add future shortcodes here + } + + /** + * Render dashboard content + */ + public function render_dashboard() { + if (!is_user_logged_in()) { + return '

Please log in to view the dashboard.

'; + } + + // Include the dashboard template + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-dashboard.php'; + return ob_get_clean(); + } + + /** + * Render master dashboard content + */ + public function render_master_dashboard() { + if (!is_user_logged_in()) { + return '

Please log in to view the master dashboard.

'; + } + + // Check if user has master dashboard permissions - include administrator + if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('administrator')) { + return '
You do not have permission to view the master dashboard. This dashboard is only available to Master Trainers and Administrators.
'; + } + + // Include the master dashboard template + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php'; + return ob_get_clean(); + } + + /** + * Render event summary content + */ + public function render_event_summary() { + // Check if user is logged in + if (!is_user_logged_in()) { + return '

Please log in to view the event summary.

'; + } + + // Get event ID from URL parameter + $event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0; + + if ($event_id <= 0) { + return '
No event ID provided. Please access this page from your dashboard.
'; + } + + // Check if the event exists and user has permission to view it + $event = get_post($event_id); + if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) { + return '
Event not found or invalid.
'; + } + + // Check if the current user has permission to view this event + // For now, we'll check if they're the post author or have edit_posts capability + if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) { + return '
You do not have permission to view this event summary.
'; + } + + // Include the event summary template + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/event-summary/template-event-summary.php'; + return ob_get_clean(); + } + + /** + * Render trainer profile content + */ + public function render_trainer_profile() { + if (!is_user_logged_in()) { + return '

Please log in to view your profile.

'; + } + + // Include the trainer profile template + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/template-trainer-profile.php'; + return ob_get_clean(); + } + + /** + * Render email attendees content + */ + public function render_email_attendees() { + // Check if user is logged in + if (!is_user_logged_in()) { + return '

Please log in to email event attendees.

'; + } + + // Get event ID from URL parameter + $event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0; + + if ($event_id <= 0) { + return '
No event ID provided. Please access this page from your dashboard or event summary page.
'; + } + + // Check if the event exists and user has permission to view it + $event = get_post($event_id); + if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) { + return '
Event not found or invalid.
'; + } + + // Check if the current user has permission to view this event + // For now, we'll check if they're the post author or have edit_posts capability + if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) { + return '
You do not have permission to email attendees for this event.
'; + } + + // Include the email attendees template + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php'; + return ob_get_clean(); + } + + /** + * Validate template file for common syntax errors + * @param string $file_path Path to the template file + * @return bool|string True if valid, error message otherwise + */ + private function validate_template_file($file_path) { + // Check if the file exists + if (!file_exists($file_path)) { + return "Template file does not exist: {$file_path}"; + } + + // Get file contents + $content = file_get_contents($file_path); + + // Check for common syntax errors with escaped operators + $common_errors = [ + '\\!==', // Escaped !== + '\\!=' , // Escaped != + '\\!' , // Escaped ! + '\\=' , // Escaped = + '\\>' , // Escaped > + '\\<' , // Escaped < + ]; + + foreach ($common_errors as $error) { + if (strpos($content, $error) !== false) { + // Find the line number + $lines = explode("\n", $content); + $line_number = 0; + foreach ($lines as $i => $line) { + if (strpos($line, $error) !== false) { + $line_number = $i + 1; + break; + } + } + + // Log the error for admin + $filename = basename($file_path); + HVAC_Logger::error("Syntax error detected in {$filename} line {$line_number}: Improper escape sequence {$error}", 'Core'); + + return "Template file contains syntax errors: {$filename} line {$line_number}. Please contact the administrator."; + } + } + + return true; + } + + /** + * Render certificate reports content + */ + public function render_certificate_reports() { + // Check if user is logged in + if (!is_user_logged_in()) { + return '

Please log in to view certificate reports.

'; + } + + // Check if the current user has permission to view certificate reports + // For now, we'll check if they're a trainer or have edit_posts capability + if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) { + return '
You do not have permission to view certificate reports.
'; + } + + // Make sure certificate manager is loaded + require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php'; + + // Make sure certificate security is loaded + require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php'; + + // Validate the template file before including + $template_path = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php'; + $validation = $this->validate_template_file($template_path); + if ($validation !== true) { + return '
' . esc_html($validation) . '
'; + } + + // Include the certificate reports template with error handling + try { + ob_start(); + include $template_path; + return ob_get_clean(); + } catch (Exception $e) { + return '
Error loading certificate reports: ' . esc_html($e->getMessage()) . '
'; + } + } + + /** + * Render generate certificates content + */ + public function render_generate_certificates() { + // Check if user is logged in + if (!is_user_logged_in()) { + return '

Please log in to generate certificates.

'; + } + + // Get event ID from URL parameter if available + $event_id = isset($_GET['event_id']) ? absint($_GET['event_id']) : 0; + + // Check if the event exists and user has permission to view it when event_id is provided + if ($event_id > 0) { + $event = get_post($event_id); + if (!$event || get_post_type($event) !== Tribe__Events__Main::POSTTYPE) { + return '
Event not found or invalid.
'; + } + + // Check if the current user has permission to view this event + if ($event->post_author != get_current_user_id() && !current_user_can('edit_posts')) { + return '
You do not have permission to generate certificates for this event.
'; + } + } else { + // If no event ID is provided, check general permissions + if (!current_user_can('hvac_trainer') && !current_user_can('edit_posts')) { + return '
You do not have permission to generate certificates.
'; + } + } + + // Make sure certificate manager is loaded + require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-manager.php'; + + // Make sure certificate security is loaded + require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-security.php'; + + // Make sure certificate generator is loaded + require_once HVAC_CE_PLUGIN_DIR . 'includes/certificates/class-certificate-generator.php'; + + // Validate the template file before including + $template_path = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php'; + $validation = $this->validate_template_file($template_path); + if ($validation !== true) { + return '
' . esc_html($validation) . '
'; + } + + // Include the generate certificates template with error handling + try { + ob_start(); + include $template_path; + return ob_get_clean(); + } catch (Exception $e) { + return '
Error loading certificate generation: ' . esc_html($e->getMessage()) . '
'; + } + } + + /** + * Include custom templates for plugin pages + */ + public function load_custom_templates($template) { + $custom_template = null; + + // Check for dashboard page + if (is_page('trainer/dashboard')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-dashboard.php'; + } + + // Check for master dashboard page + if (is_page('master-trainer/dashboard')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-hvac-master-dashboard.php'; + } + + // Check for google-sheets page + if (is_page('master-trainer/google-sheets')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-google-sheets.php'; + } + + // Check for community-login page + if (is_page('training-login')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/page-community-login.php'; + } + + + // Check for trainer-profile page + if (is_page('trainer/my-profile')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-trainer-profile.php'; + } + + // Check for event-summary page + if (is_page('trainer/event/summary')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-event-summary.php'; + } + + // Check for email-attendees page + if (is_page('trainer/email-attendees')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/email-attendees/template-email-attendees.php'; + } + + // Check for certificate-reports page + if (is_page('trainer/certificate-reports')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-certificate-reports.php'; + } + + // Check for generate-certificates page + if (is_page('trainer/generate-certificates')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/certificates/template-generate-certificates.php'; + } + + // Check for edit-profile page + if (is_page('edit-profile')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/template-edit-profile.php'; + } + + // Check for communication-templates page + if (is_page('trainer/communication-templates')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/communication/template-communication-templates.php'; + } + + // Check for single event view (temporary) + if (is_singular('tribe_events')) { + $custom_template = HVAC_CE_PLUGIN_DIR . 'templates/single-tribe_events.php'; + } + + // Process the custom template if one was found + if ($custom_template !== null) { + // Check if file exists + if (file_exists($custom_template)) { + // Validate certificate templates for syntax errors + if (strpos($custom_template, 'certificates/') !== false) { + $validation = $this->validate_template_file($custom_template); + if ($validation !== true) { + // Log error and show friendly message + HVAC_Logger::error("Template validation failed in load_custom_templates: {$validation}", 'Core'); + + // Display error or fallback template + add_action('wp_head', function() use ($validation) { + echo '
There was a problem loading this page. ' . + 'The administrator has been notified. Please try again later.
'; + }); + + // Either fall back to the standard WP template or use a simple error template + return $template; + } + } + + // Template exists and passes validation + return $custom_template; + } + } + + return $template; + } // End load_custom_templates + + // REMOVED: render_tribe_community_events() method + // This method was overriding The Events Calendar Community Events shortcode + // Let TEC handle the shortcode properly instead + + /** + * Render Google Sheets admin content + */ + public function render_google_sheets_admin() { + if (!is_user_logged_in()) { + return '

Please log in to access Google Sheets integration.

'; + } + + // Check if user has master dashboard permissions + if (!current_user_can('view_master_dashboard') && !current_user_can('view_all_trainer_data') && !current_user_can('manage_options')) { + return '

You do not have permission to access Google Sheets integration.

'; + } + + // Initialize Google Sheets admin if not already done + if (!class_exists('HVAC_Google_Sheets_Admin')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php'; + } + + $google_sheets_admin = new HVAC_Google_Sheets_Admin(); + + ob_start(); + $google_sheets_admin->render_admin_page(); + return ob_get_clean(); + } + + /** + * Initialize Google Sheets integration + */ + private function init_google_sheets() { + // Always initialize auth handler for OAuth callbacks + if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-auth.php')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-auth.php'; + new HVAC_Google_Sheets_Auth(); + } + + // Initialize admin interface + if (file_exists(HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/google-sheets/class-google-sheets-admin.php'; + new HVAC_Google_Sheets_Admin(); + } + } + + /** + * Initialize communication system + */ + private function init_communication_system() { + // Check and install/update communication database tables + if (class_exists('HVAC_Communication_Installer')) { + HVAC_Communication_Installer::maybe_update(); + } + + // Initialize the communication scheduler (singleton) + if (class_exists('HVAC_Communication_Scheduler')) { + hvac_communication_scheduler(); + } + + if (class_exists('HVAC_Logger')) { + HVAC_Logger::info('Communication system initialized', 'Communication System'); + } + } + + /** + * Render communication templates content + */ + public function render_communication_templates() { + if (!is_user_logged_in()) { + return '

Please log in to manage communication templates.

'; + } + + // Check if user is a trainer or has permission to manage templates + $current_user = wp_get_current_user(); + if (!in_array('hvac_trainer', $current_user->roles) && !current_user_can('edit_posts')) { + return '

You do not have permission to manage communication templates.

'; + } + + // Initialize the communication templates class + if (!class_exists('HVAC_Communication_Templates')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/communication/class-communication-templates.php'; + } + + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/communication/template-communication-templates.php'; + return ob_get_clean(); + } + + /** + * Render communication schedules content + */ + public function render_communication_schedules() { + if (!is_user_logged_in()) { + return '

Please log in to manage communication schedules.

'; + } + + // Check if user is a trainer or has permission to manage schedules + $current_user = wp_get_current_user(); + if (!in_array('hvac_trainer', $current_user->roles) && !current_user_can('edit_posts')) { + return '

You do not have permission to manage communication schedules.

'; + } + + // Initialize the communication scheduler class + if (!class_exists('HVAC_Communication_Scheduler')) { + require_once HVAC_CE_PLUGIN_DIR . 'includes/communication/class-communication-scheduler.php'; + } + + ob_start(); + include HVAC_CE_PLUGIN_DIR . 'templates/communication/template-communication-schedules.php'; + return ob_get_clean(); + } + +} // End class HVAC_Community_Events \ No newline at end of file diff --git a/includes/class-hvac-event-manage-header.php b/includes/class-hvac-event-manage-header.php new file mode 100644 index 00000000..e637aa3a --- /dev/null +++ b/includes/class-hvac-event-manage-header.php @@ -0,0 +1,89 @@ +get_header_html(); + + // Add header before the content + return $header . $content; + } + + /** + * Render the header + */ + public function render_header() { + echo $this->get_header_html(); + } + + /** + * Get the header HTML + */ + private function get_header_html() { + ob_start(); + ?> + + + +
+

Create and Manage Your HVAC Training Events

+

Use this form to create new training events or edit existing ones. Please fill out all required fields to ensure your event is properly listed and attendees receive accurate information.

+
+

Event Creation Tips:

+
    +
  • Event Title: Use a clear, descriptive title that indicates the training topic
  • +
  • Date & Time: Ensure you select the correct timezone for your location
  • +
  • Description: Provide detailed information about what attendees will learn
  • +
  • Capacity: Set an appropriate maximum number of attendees
  • +
+
+
+
+