* SPDX-FileCopyrightText: 2021 Harald Eilertsen
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
if ( ! class_exists( 'GiglogAdmin_ConcertsTable' ) ) {
/**
* Class to build and render the concerts table on a page.
*/
class GiglogAdmin_ConcertsTable {
const STATUS_LABELS = array(
'',
'Accred Requested',
'Photo Approved',
'Text Approved',
'Photo and Text Approved',
'Rejected',
);
const FILTER_KEYS = array(
'city',
'venue',
'month',
'only_mine',
);
private string $username;
private array $filter;
private int $page_no = 1;
private int $total_no_of_pages = 1;
private int $previous_page = 0;
private int $next_page = 0;
private string $nonce;
public static function update() : void {
//
// Check that we get a nonce, and that it is valid to prevent CSRF attacks.
//
if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'concerts-table' ) ) {
wp_die( 'You are not allowed to do that.', 403 );
exit();
}
if ( isset( $_POST['assignitem'] ) ) {
$concert = GiglogAdmin_Concert::get( intval( $_POST['cid'] ) );
if ( $concert ) {
$role = sanitize_text_field( $_POST['pid'] );
self::assignconcert( $role, $concert );
}
return;
}
if ( isset( $_POST['unassignitem'] ) ) {
$concert = GiglogAdmin_Concert::get( intval( $_POST['cid'] ) );
if ( $concert ) {
$role = sanitize_text_field( $_POST['pid'] );
self::unassignconcert( $role, $concert );
}
return;
}
// handle the status drop down
if ( isset( $_POST['selectstatus'] ) && ! empty( $_POST['selectstatus'] ) && ! empty( $_POST['cid'] ) ) {
if ( $_POST['selectstatus'] > 0 && $_POST['selectstatus'] < count( self::STATUS_LABELS ) ) {
$concert = GiglogAdmin_Concert::get( intval( $_POST['cid'] ) );
if ( $concert ) {
$concert->set_status( intval( $_POST['selectstatus'] ) );
$concert->save();
self::emailuser( $concert, intval( $_POST['selectstatus'] ) );
}
}
}
}
static function assignconcert( string $p1, GiglogAdmin_Concert $concert ): void {
$username = wp_get_current_user()->user_login;
$concert->assign_role( $p1, $username );
$concert->save();
$cuser = get_user_by( 'login', 'etadmin' );
if ( $cuser ) {
$dest = $cuser->user_email;
$subject = 'WP-GIGLOG ' . $username . ' has taken ' . $p1 . 'for concert ' . $concert->cname();
$body = 'WP-GIGLOG ' . $username . ' has taken ' . $p1 . 'for concert ' . $concert->cname() . ', concert with ID ' . $concert->id();
$headers = array( 'Content-Type: text/html; charset=UTF-8' );
wp_mail( $dest, $subject, $body );
}
}
static function unassignconcert( string $p1, GiglogAdmin_Concert $concert ): void {
$username = wp_get_current_user()->user_login;
$concert->remove_user_from_roles( $username );
$concert->save();
$cuser = get_user_by( 'login', 'etadmin' );
if ( $cuser ) {
$dest = $cuser->user_email;
$subject = 'WP-GIGLOG ' . $username . ' has UNASSIGNED ' . $p1 . 'for concert ' . $concert->cname();
$body = 'WP-GIGLOG ' . $username . ' has UNASSIGNED ' . $p1 . 'for concert ' . $concert->cname() . ', concert with ID ' . $concert->id();
$headers = array( 'Content-Type: text/html; charset=UTF-8' );
wp_mail( $dest, $subject, $body );
}
}
static function emailuser( GiglogAdmin_Concert $concert, string $cstatus ): void {
$username = wp_get_current_user()->user_login;
$useremail = 'live@eternal-terror.com';
$dest = '';
$roles = $concert->roles();
$x = '';
foreach ( $roles as $role ) {
if ( $role ) {
$cuser = get_user_by( 'login', $role );
if ( $cuser ) {
$dest .= $cuser->user_email . ',';
}
}
}
$subject = 'Message from GIGLOG: Concert ' . $concert->cname() . ' has a new status ' . $cstatus . '.';
$body = 'You receive this message because you have assigned one of the roles for Concert ' . $concert->cname() . '.';
$body .= '\r\n This is to inform you that there is a new status for the acreditation ' . $cstatus . '.';
$body .= '\r\n Should you no longer want to receive updates about this concert, please log in to Giglog and remove yourself from the concert. Thanks!';
$headers = array( 'Content-Type: text/plain; charset=UTF-8' ); // it is text by default so no need for headers actually
wp_mail( $dest, $subject, $body );
}
public function __construct() {
$this->username = wp_get_current_user()->user_login;
// Set the nonce we use to check for CSRF attacks.
$this->nonce = wp_create_nonce( 'concerts-table' );
$this->get_args();
}
public function render(): string {
return $this->render_filters()
. $this->render_concerts_table();
}
private function render_concert_table_header() : string {
$content = '
';
$content .= 'Note: the iCal link will download a file with extension .ical which can be used to add the event to your calendar. For convenience, we set all events with start time at 19:00 but please check the actual event for the correct time.';
$content .= '
';
$content .= $this->render_pagination();
// from main form that includes filters
$content .= '
';
// return the table
return $content;
}
private function render_filters() : string {
global $wp_locale;
$select = '
and mvoed them up to render_concerts_table function
$select .= '';
return $select;
}
private function adminactions( GiglogAdmin_Concert $concert ) : string {
return '';
}
/**
* Display a mark on the concert if it is new.
* I.e. imported/created within the last ten days.
*
* @return null|string
*/
private function mark_new_concert( GiglogAdmin_Concert $concert ) : string {
$now = new DateTime();
$new_entry = $now->diff( $concert->created() )->days <= 10;
if ( $new_entry ) {
return 'NEW';
} else {
return '';
}
}
private function assign_role_for_user_form( string $role, GiglogAdmin_Concert $concert ) : ?string {
$roles = $concert->roles();
$assigned_user = array_key_exists( $role, $roles ) ? $roles[ $role ] : null;
// first check if current slot is taken by current user
if ( $assigned_user == $this->username ) {
$f = '';
} elseif ( $assigned_user ) { // check if slot is taken by another user
$f = 'Taken'
. '
Taken by ' . $assigned_user . '
';
} elseif ( array_search( $this->username, $roles ) ) {
// other slots for this concert are taken by user
$f = '-';
} else { // not taken by anyone
$f = '';
}
return $f;
}
}
}