load_dependencies();
// Initialize hooks
$this->init_hooks();
// Initialize dashboard data
if ( class_exists( 'HVAC_Master_Dashboard_Data' ) ) {
$this->dashboard_data = new HVAC_Master_Dashboard_Data();
}
}
/**
* Load required dependencies
*/
private function load_dependencies() {
// Ensure master dashboard data is available
if ( ! class_exists( 'HVAC_Master_Dashboard_Data' ) ) {
require_once HVAC_PLUGIN_DIR . 'includes/class-hvac-master-dashboard-data.php';
}
}
/**
* Initialize hooks
*/
private function init_hooks() {
// AJAX handlers for events overview
add_action( 'wp_ajax_hvac_master_events_filter', array( $this, 'ajax_filter_events' ) );
add_action( 'wp_ajax_hvac_master_events_kpis', array( $this, 'ajax_get_kpis' ) );
add_action( 'wp_ajax_hvac_master_events_calendar', array( $this, 'ajax_get_calendar_data' ) );
// Shortcode for embedding events overview
add_shortcode( 'hvac_master_events', array( $this, 'render_events_overview' ) );
// Add function for template integration
add_action( 'init', array( $this, 'register_template_functions' ) );
}
/**
* Register template functions
*/
public function register_template_functions() {
if ( ! function_exists( 'hvac_render_master_events' ) ) {
function hvac_render_master_events() {
$overview = HVAC_Master_Events_Overview::instance();
return $overview->render_events_overview();
}
}
}
/**
* Render the complete events overview
*/
public function render_events_overview( $atts = array() ) {
// Security check
if ( ! $this->can_view_events() ) {
return '
You do not have permission to view events overview.
';
}
ob_start();
?>
Loading event statistics...
Loading...
dashboard_data ) {
return '';
}
$trainer_stats = $this->dashboard_data->get_trainer_statistics();
$options = '';
if ( ! empty( $trainer_stats['trainer_data'] ) ) {
foreach ( $trainer_stats['trainer_data'] as $trainer ) {
$options .= sprintf(
'',
esc_attr( $trainer->trainer_id ),
esc_html( $trainer->display_name ),
esc_html( $trainer->total_events )
);
}
}
return $options;
}
/**
* AJAX handler for filtering events
*/
public function ajax_filter_events() {
// Verify nonce
if ( ! wp_verify_nonce( $_POST['nonce'], 'hvac_master_events_nonce' ) ) {
wp_send_json_error( array( 'message' => 'Security check failed' ) );
}
// Check permissions
if ( ! $this->can_view_events() ) {
wp_send_json_error( array( 'message' => 'Insufficient permissions' ) );
}
// Get filter parameters
$args = array(
'trainer_id' => isset( $_POST['trainer_id'] ) ? sanitize_text_field( $_POST['trainer_id'] ) : '',
'date_from' => isset( $_POST['date_from'] ) ? sanitize_text_field( $_POST['date_from'] ) : '',
'date_to' => isset( $_POST['date_to'] ) ? sanitize_text_field( $_POST['date_to'] ) : '',
'status' => isset( $_POST['status'] ) ? sanitize_text_field( $_POST['status'] ) : 'all',
'search' => isset( $_POST['search'] ) ? sanitize_text_field( $_POST['search'] ) : '',
'page' => isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 1,
'per_page' => isset( $_POST['per_page'] ) ? absint( $_POST['per_page'] ) : 20,
'orderby' => isset( $_POST['orderby'] ) ? sanitize_text_field( $_POST['orderby'] ) : 'date',
'order' => isset( $_POST['order'] ) ? sanitize_text_field( $_POST['order'] ) : 'DESC',
);
// Get events data
if ( $this->dashboard_data ) {
$events_data = $this->dashboard_data->get_events_table_data( $args );
// Format events for display
$formatted_events = $this->format_events_for_display( $events_data['events'] );
wp_send_json_success( array(
'events' => $formatted_events,
'pagination' => $events_data['pagination'],
'total_found' => $events_data['pagination']['total_items']
) );
}
wp_send_json_error( array( 'message' => 'Unable to load events data' ) );
}
/**
* AJAX handler for getting KPI data
*/
public function ajax_get_kpis() {
// Verify nonce
if ( ! wp_verify_nonce( $_POST['nonce'], 'hvac_master_events_nonce' ) ) {
wp_send_json_error( array( 'message' => 'Security check failed' ) );
}
// Check permissions
if ( ! $this->can_view_events() ) {
wp_send_json_error( array( 'message' => 'Insufficient permissions' ) );
}
if ( $this->dashboard_data ) {
$kpis = array(
'total_events' => $this->dashboard_data->get_total_events_count(),
'upcoming_events' => $this->dashboard_data->get_upcoming_events_count(),
'past_events' => $this->dashboard_data->get_past_events_count(),
'total_tickets' => $this->dashboard_data->get_total_tickets_sold(),
'total_revenue' => $this->dashboard_data->get_total_revenue(),
'active_trainers' => $this->dashboard_data->get_active_trainers_count()
);
wp_send_json_success( $kpis );
}
wp_send_json_error( array( 'message' => 'Unable to load KPI data' ) );
}
/**
* AJAX handler for calendar data
*/
public function ajax_get_calendar_data() {
// Verify nonce
if ( ! wp_verify_nonce( $_POST['nonce'], 'hvac_master_events_nonce' ) ) {
wp_send_json_error( array( 'message' => 'Security check failed' ) );
}
// Check permissions
if ( ! $this->can_view_events() ) {
wp_send_json_error( array( 'message' => 'Insufficient permissions' ) );
}
// Get filter parameters for calendar
$args = array(
'trainer_id' => isset( $_POST['trainer_id'] ) ? sanitize_text_field( $_POST['trainer_id'] ) : '',
'date_from' => isset( $_POST['date_from'] ) ? sanitize_text_field( $_POST['date_from'] ) : '',
'date_to' => isset( $_POST['date_to'] ) ? sanitize_text_field( $_POST['date_to'] ) : '',
'status' => isset( $_POST['status'] ) ? sanitize_text_field( $_POST['status'] ) : 'all',
'search' => isset( $_POST['search'] ) ? sanitize_text_field( $_POST['search'] ) : '',
'per_page' => 999, // Get all events for calendar display
'orderby' => 'date',
'order' => 'ASC'
);
// Get events data
if ( $this->dashboard_data ) {
$events_data = $this->dashboard_data->get_events_table_data( $args );
// Format events for calendar
$calendar_events = $this->format_events_for_calendar( $events_data['events'] );
wp_send_json_success( array(
'events' => $calendar_events,
'total_found' => count( $calendar_events )
) );
}
wp_send_json_error( array( 'message' => 'Unable to load calendar data' ) );
}
/**
* Format events for table display
*/
private function format_events_for_display( $events ) {
$formatted = array();
foreach ( $events as $event ) {
$event_date = date( 'M j, Y', $event['start_date_ts'] );
$event_time = date( 'g:i A', $event['start_date_ts'] );
// Determine status badge class
$status_class = 'hvac-status-' . esc_attr( $event['status'] );
if ( $event['start_date_ts'] > time() ) {
$status_class .= ' hvac-status-upcoming';
} else {
$status_class .= ' hvac-status-past';
}
$formatted[] = array(
'id' => $event['id'],
'name' => $event['name'],
'trainer_name' => $event['trainer_name'],
'trainer_email' => $event['trainer_email'],
'date' => $event_date,
'time' => $event_time,
'status' => ucfirst( $event['status'] ),
'status_class' => $status_class,
'capacity' => $event['capacity'],
'sold' => $event['sold'],
'revenue' => '$' . number_format( $event['revenue'], 2 ),
'link' => $event['link'],
'trainer_edit_link' => home_url( '/trainer/events/edit/' . $event['id'] . '/' ),
'is_upcoming' => $event['start_date_ts'] > time()
);
}
return $formatted;
}
/**
* Format events for calendar display
*/
private function format_events_for_calendar( $events ) {
$formatted = array();
foreach ( $events as $event ) {
$formatted[] = array(
'id' => $event['id'],
'title' => $event['name'],
'trainer' => $event['trainer_name'],
'start' => date( 'Y-m-d', $event['start_date_ts'] ),
'url' => $event['link'],
'className' => 'hvac-calendar-event hvac-status-' . $event['status'],
'extendedProps' => array(
'trainer_name' => $event['trainer_name'],
'capacity' => $event['capacity'],
'sold' => $event['sold'],
'revenue' => $event['revenue'],
'status' => $event['status']
)
);
}
return $formatted;
}
/**
* Check if current user can view events
*/
private function can_view_events() {
$user = wp_get_current_user();
return in_array( 'hvac_master_trainer', $user->roles ) || current_user_can( 'manage_options' );
}
/**
* Get events summary for quick stats
*/
public function get_events_summary() {
if ( ! $this->dashboard_data ) {
return array();
}
return array(
'total_events' => $this->dashboard_data->get_total_events_count(),
'upcoming_events' => $this->dashboard_data->get_upcoming_events_count(),
'past_events' => $this->dashboard_data->get_past_events_count(),
'total_revenue' => $this->dashboard_data->get_total_revenue(),
'total_tickets' => $this->dashboard_data->get_total_tickets_sold()
);
}
/**
* Clear events cache
*/
public function clear_cache() {
if ( method_exists( 'HVAC_Master_Dashboard_Data', 'clear_cache' ) ) {
HVAC_Master_Dashboard_Data::clear_cache();
}
}
/**
* Get filtered events count for display
*/
public function get_filtered_events_count( $args = array() ) {
if ( ! $this->dashboard_data ) {
return 0;
}
$events_data = $this->dashboard_data->get_events_table_data( array_merge( $args, array( 'per_page' => 1 ) ) );
return $events_data['pagination']['total_items'];
}
}
// Initialize the class
HVAC_Master_Events_Overview::instance();