add_action( 'admin_menu', $this, 'register_menu' ); $loader->add_action( 'admin_enqueue_scripts', $this, 'enqueue_assets' ); $loader->add_action( 'wp_ajax_aarambha_case_management_update_status', $this, 'ajax_update_status' ); $loader->add_action( 'admin_init', $this, 'email_settings' ); add_filter( 'plugin_action_links_' . AARAMBHA_CASE_MANAGEMENT_BASENAME, [ $this, 'add_settings_link' ] ); } /** * Add a Settings link to the plugin's row on the Plugins list screen. * * @param array $links Existing action links (Deactivate, etc.). * @return array */ public function add_settings_link( array $links ): array { $settings_link = sprintf( '%s', esc_url( admin_url( 'admin.php?page=aarambha-case-management' ) ), esc_html__( 'Settings', 'aarambha-case-management' ) ); array_unshift( $links, $settings_link ); return $links; } /** * Register admin menu. */ public function register_menu(): void { $hooks = [ add_menu_page( __( 'Case Management', 'aarambha-case-management' ), __( 'Case Management', 'aarambha-case-management' ), 'manage_options', 'aarambha-case-management', [ $this, 'dashboard_page' ], 'dashicons-portfolio', 30 ), add_submenu_page( null, __( 'Case Details', 'aarambha-case-management' ), __( 'Case Details', 'aarambha-case-management' ), 'manage_options', 'aarambha-case-management-details', [ $this, 'render_case_details' ] ), add_submenu_page( 'aarambha-case-management', __( 'Emails', 'aarambha-case-management' ), __( 'Emails', 'aarambha-case-management' ), 'manage_options', 'aarambha-case-management-emails', [ $this, 'render_emails_page' ] ), ]; // add_menu_page()/add_submenu_page() return false when the current // user lacks the required capability; keep only real hook suffixes. $this->hooks = array_values( array_filter( $hooks, 'is_string' ) ); } /** * Dashboard page. */ public function dashboard_page(): void { $page = new CaseListPage(); $page->render(); } /** * Case Detail Page */ public function render_case_details(): void { $page = new CaseDetailPage(); $page->render(); } /** * Emails Page */ public function render_emails_page(): void { $email_page = new EmailsPage(); $email_page->render(); } /** * Email Settings */ public function email_settings(): void { $email_settings = new EmailSettings(); $email_settings->register(); } /** * Enqueue admin assets on plugin screens only. * * @param string $hook Current admin page hook suffix. * @return void */ public function enqueue_assets( string $hook ): void { if ( ! in_array( $hook, $this->hooks, true ) ) { return; } wp_enqueue_style( 'aarambha-case-management-admin', AARAMBHA_CASE_MANAGEMENT_URL . 'assets/build/css/admin.css', [], AARAMBHA_CASE_MANAGEMENT_VERSION ); wp_enqueue_script( 'aarambha-case-management-admin-js', AARAMBHA_CASE_MANAGEMENT_URL . 'assets/build/js/admin.js', [ 'jquery' ], AARAMBHA_CASE_MANAGEMENT_VERSION, true ); wp_localize_script( 'aarambha-case-management-admin-js', 'aarambhaCaseManagementAdmin', [ 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'aarambha_case_management_update_status' ), ] ); } /** * Handle the AJAX case status update request. * * @return void */ public function ajax_update_status(): void { check_ajax_referer( 'aarambha_case_management_update_status', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( __( 'You are not allowed to do this.', 'aarambha-case-management' ), 403 ); } $case_id = isset( $_POST['case_id'] ) ? absint( $_POST['case_id'] ) : 0; if ( ! $case_id ) { wp_send_json_error( __( 'Invalid case.', 'aarambha-case-management' ) ); } $status = isset( $_POST['status'] ) ? sanitize_key( wp_unslash( $_POST['status'] ) ) : ''; $allowed_statuses = [ 'pending', 'in_progress', 'resolved', 'closed', ]; if ( ! in_array( $status, $allowed_statuses, true ) ) { wp_send_json_error( __( 'Invalid status.', 'aarambha-case-management' ) ); } $repository = new CaseRepository(); $updated = $repository->update_status( $case_id, $status ); if ( ! $updated ) { wp_send_json_error( __( 'Unable to update the status.', 'aarambha-case-management' ) ); } // Send email to customer as per the status, if the case can still be found. $case = $repository->find( $case_id ); if ( $case ) { $mailer = new Mailer(); $mailer->send_status_email( $status, $case ); } wp_send_json_success( [ 'message' => __( 'Status updated successfully.', 'aarambha-case-management' ), 'status' => $status, 'label' => ucfirst( str_replace( '_', ' ', $status ) ), ] ); } }