Newer
Older
tonitalia-pluginsoci / admin / class-registration-list-table.php
<?php
/**
 * Admin list table for registrations.
 *
 * @package TonItaliaRegistration
 */

defined( 'ABSPATH' ) || exit;

if ( ! class_exists( 'WP_List_Table' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
}

/**
 * Class TON_Reg_Registration_List_Table
 */
class TON_Reg_Registration_List_Table extends WP_List_Table {

	/**
	 * Constructor.
	 */
	public function __construct() {
		parent::__construct(
			array(
				'singular' => 'registration',
				'plural'   => 'registrations',
				'ajax'     => false,
			)
		);
	}

	/**
	 * @return array<string,string>
	 */
	public function get_columns() {
		return array(
			'id'         => __( 'ID', 'ton-italia-registration' ),
			'cognome'    => __( 'Cognome', 'ton-italia-registration' ),
			'nome'       => __( 'Nome', 'ton-italia-registration' ),
			'email'      => __( 'Email', 'ton-italia-registration' ),
			'status'     => __( 'Stato', 'ton-italia-registration' ),
			'created_at' => __( 'Data', 'ton-italia-registration' ),
		);
	}

	/**
	 * @param object $item Item.
	 * @return string
	 */
	public function column_id( $item ) {
		$view_url = admin_url( 'admin.php?page=ton-registrations&action=view&id=' . (int) $item->id );
		$actions  = array(
			'view' => '<a href="' . esc_url( $view_url ) . '">' . esc_html__( 'Dettaglio', 'ton-italia-registration' ) . '</a>',
		);
		return (int) $item->id . $this->row_actions( $actions );
	}

	/**
	 * @param object $item Item.
	 * @return string
	 */
	public function column_status( $item ) {
		$labels = array(
			'pending'  => __( 'In attesa', 'ton-italia-registration' ),
			'admitted' => __( 'Ammesso', 'ton-italia-registration' ),
			'rejected' => __( 'Non ammesso', 'ton-italia-registration' ),
		);
		$label = $labels[ $item->status ] ?? $item->status;
		if ( $item->anonymized_at ) {
			$label .= ' (' . __( 'anonimizzato', 'ton-italia-registration' ) . ')';
		}
		return esc_html( $label );
	}

	/**
	 * @param object $item        Item.
	 * @param string $column_name Column.
	 * @return string
	 */
	public function column_default( $item, $column_name ) {
		return esc_html( $item->$column_name ?? '' );
	}

	/**
	 * @return string
	 */
	protected function get_primary_column_name() {
		return 'cognome';
	}

	/**
	 * @return array<string,bool>
	 */
	protected function get_sortable_columns() {
		return array(
			'cognome'    => array( 'cognome', false ),
			'created_at' => array( 'created_at', true ),
			'status'     => array( 'status', false ),
		);
	}

	/**
	 * Prepare items.
	 */
	public function prepare_items() {
		$per_page = 20;
		$status   = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : '';
		$search   = isset( $_REQUEST['s'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['s'] ) ) : '';

		$total = TON_Reg_Database::count(
			array(
				'status' => $status,
				'search' => $search,
			)
		);

		$total_pages = max( 1, (int) ceil( $total / $per_page ) );
		$page        = max( 1, min( $this->get_pagenum(), $total_pages ) );

		$this->items = TON_Reg_Database::query(
			array(
				'status' => $status,
				'search' => $search,
				'limit'  => $per_page,
				'offset' => ( $page - 1 ) * $per_page,
			)
		);

		$this->set_pagination_args(
			array(
				'total_items' => $total,
				'per_page'    => $per_page,
				'total_pages' => $total_pages,
			)
		);

		$columns  = $this->get_columns();
		$hidden   = array();
		$sortable = $this->get_sortable_columns();
		$this->_column_headers = array( $columns, $hidden, $sortable );
	}

	/**
	 * @return string
	 */
	public function no_items() {
		esc_html_e( 'Nessuna iscrizione trovata.', 'ton-italia-registration' );
	}
}