// SPDX-FileCopyrightText: 2021 Harald Eilertsen // // SPDX-License-Identifier: AGPL-3.0-or-later require_once __DIR__ . '/../../view-helpers/select_field.php'; if (!class_exists("GiglogAdmin_ConcertsTable")) { class GiglogAdmin_ConcertsTable { const STATUS_LABELS = [ '', 'Accred Requested', 'Photo Approved', 'Text Approved', 'Photo and Text Approved', 'Rejected' ]; const FILTER_KEYS = [ 'city', 'venue', 'month', 'only_mine' ]; private string $username; private array $filter; private int $page_no; public function __construct() { $this->username = wp_get_current_user()->user_login; $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.= ''; if (!is_admin()) { $content .= ''; } else { $content .= ''; if (current_user_can('administrator')) { $content .= ''; } } $content .= ''; return $content; } private function get_args() : void { $this->filter = []; // Use the submitted "city" if any. Otherwise, use the default/static value. $cty = filter_input( INPUT_GET, 'city', FILTER_SANITIZE_SPECIAL_CHARS ); if ($cty) { $this->filter['city'] = $cty; } $venue = filter_input( INPUT_GET, 'venue', FILTER_SANITIZE_SPECIAL_CHARS ); if ($venue) { $this->filter['venue_id'] = $venue; } $smonth = filter_input( INPUT_GET, 'month', FILTER_SANITIZE_SPECIAL_CHARS ); if ($smonth) { $this->filter['month'] = $smonth; } if(isset($_GET['only_mine']) && $_GET['only_mone'] == '1') { $this->filter['currentuser'] = $this->username; } if (isset($_GET['page_no']) && $_GET['page_no'] != "" && is_numeric($_GET['page_no']) && isset($_GET['page_no']) == $this->page_no ) { $this->page_no = intval($_GET['page_no']); } else { $this->page_no = 1; } } private function get_concerts() : ?array { $total_records_per_page = 15; $total_concerts = GiglogAdmin_Concert::count( $this->filter ); $this->total_no_of_pages = ceil( $total_concerts / $total_records_per_page ); //calculate OFFSET Value and SET other Variables $offset = ($this->page_no - 1) * $total_records_per_page; $this->previous_page = $this->page_no - 1; $this->next_page = $this->page_no + 1; if ($this->page_no > $this->total_no_of_pages ) { $this->page_no = 1; } $this->filter['offset'] = $offset; $this->filter['recperpage'] = $total_records_per_page; return GiglogAdmin_Concert::find_concerts($this->filter); } private function get_filter(string $f) : ?string { return isset( $this->filter[$f] ) ? $this->filter[$f] : null; } private function render_pagination() : string { $content = '
' . ''; if($this->page_no > 1) { $content .= '' . '' . 'First Page -' . '' . '' . '' . ' Previous'; } $content .= '' . '' . 'Page ' . $this->page_no . ' of ' . $this->total_no_of_pages . '' . ''; $content .= ''; if ($this->page_no < $this->total_no_of_pages) { $content .= '' . '' . 'Next - ' . '' . '' . '' . 'Last Page' . ''; } $content .= '' . '
'; return $content; } private function render_concerts_table() : string { $concerts = $this->get_concerts(); $last_city = ''; $content = $this->render_concert_table_header(); foreach ( $concerts as $concert ) { $content .= ''; $content .= "" . "" . ""; if( is_admin() ) { $content .= ''; foreach ( [ 'photo1', 'photo2', 'rev1', 'rev2' ] as $role ) { $content .= ''; } $content .= ''; if (current_user_can('administrator')) { $content .= ""; } } else { $content .= ""; $content .= ""; } $content .= ''; $content .= ''; $last_city = $concert->venue()->city(); } $content .= '
CITYDATENAMEVENUEEVENTTICKETSCalendarPHOTO1PHOTO2TEXT1TEXT2STATUSAdminOptions
'; if ($last_city != $concert->venue()->city()) { $content .= $concert->venue()->city(); } $content .= '" . date( 'd.M.Y', strtotime( $concert->cdate() ) ) . "{$concert->cname()}{$concert->venue()->name()}' . $this->mark_new_concert($concert) . '' . $this->assign_role_for_user_form( $role, $concert ) . '' . self::STATUS_LABELS[$concert->status()] . '{$this->adminactions( $concert )}eventlink()}\">Linktickets()}\">Tickets iCal
'; $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 = '

FILTER DATA: '; foreach( $_GET as $name => $val ) { if ( in_array( $name, self::FILTER_KEYS ) ) { continue; } $select .= ''; } $cty = $this->get_filter('city'); $select .= \EternalTerror\ViewHelpers\select_field( "city", array_map(fn($city) => [$city, $city], GiglogAdmin_Venue::all_cities()), $cty, "Select city..."); if ( !empty($cty) ) { //second drop down for venue $select .= \EternalTerror\ViewHelpers\select_field( "venue", array_map( fn($venue) => [$venue->id(), $venue->name()], GiglogAdmin_Venue::venues_in_city($cty) ), $this->get_filter('venue_id'), "Select venue..."); } $select .= \EternalTerror\ViewHelpers\select_field( "month", array_map( fn($m) => [ $m, $wp_locale->get_month( $m ) ], range( 1, 12 ) ), $this->get_filter('month'), "Select month..."); $select.=''; if(is_admin()) { //option to select own concerts only $select .= 'get_filter( 'current_user' ) ) . '>'; } //NOTE that I remvoed

and mvoed them up to render_concerts_table function $select .= ''; return $select; } private function adminactions( GiglogAdmin_Concert $concert ) : string { return '
' . '' . \EternalTerror\ViewHelpers\select_field( 'selectstatus', array_map(fn($i) => [ $i, self::STATUS_LABELS[$i] ], range(1, count(self::STATUS_LABELS) - 1)), $concert->status()) . '' . '' . '
'; } /** * 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; } } }