__('Event', 'acs-agenda-manager'),
'plural' => __('Events', 'acs-agenda-manager'),
'ajax' => false,
]);
}
public function get_columns(): array {
return [
'cb' => '',
'categorie' => __('Category', 'acs-agenda-manager'),
'title' => __('Title', 'acs-agenda-manager'),
'emplacement' => __('Location', 'acs-agenda-manager'),
'image' => __('Image', 'acs-agenda-manager'),
'intro' => __('Description', 'acs-agenda-manager'),
'link' => __('Page Link', 'acs-agenda-manager'),
'date' => __('Schedule', 'acs-agenda-manager'),
'price' => __('Price', 'acs-agenda-manager'),
'account' => __('Advance Payment', 'acs-agenda-manager'),
'candopartial' => __('Partial Attendance', 'acs-agenda-manager'),
'redirect' => __('External URL', 'acs-agenda-manager'),
'created_at' => __('Created', 'acs-agenda-manager'),
];
}
public function get_sortable_columns(): array {
return [
'categorie' => ['categorie', true],
'title' => ['title', false],
'date' => ['date', false],
'price' => ['price', false],
'created_at' => ['created_at', false],
];
}
public function get_bulk_actions(): array {
return ['bulk-delete' => __('Delete', 'acs-agenda-manager')];
}
public function column_cb($item): string {
return sprintf('', $item['id']);
}
public function column_default($item, $column_name): string {
$partial_options = [
__('No', 'acs-agenda-manager'),
__('Yes', 'acs-agenda-manager'),
__('Keep until end', 'acs-agenda-manager'),
];
$yes_no = [
__('No', 'acs-agenda-manager'),
__('Yes', 'acs-agenda-manager'),
];
$name_attr = sprintf('data-name="%s"', esc_attr($column_name));
$item_class = sprintf('origItem_%d', $item['id']);
switch ($column_name) {
case 'candopartial':
$value = isset($partial_options[$item[$column_name]]) ? $partial_options[$item[$column_name]] : '';
return sprintf('%s', esc_attr($item_class), $name_attr, esc_html($value));
case 'account':
$value = isset($yes_no[$item[$column_name]]) ? $yes_no[$item[$column_name]] : '';
return sprintf('%s', esc_attr($item_class), $name_attr, esc_html($value));
case 'intro':
return sprintf(
'%s
',
esc_html__('Read more', 'acs-agenda-manager'),
esc_html__('Hide', 'acs-agenda-manager'),
esc_attr($item_class),
$name_attr,
esc_html($item[$column_name])
);
case 'image':
return sprintf(
'
',
esc_attr($item_class),
$name_attr,
esc_attr($item[$column_name]),
esc_url($item[$column_name])
);
case 'link':
$page_link = trim((string) ($item[$column_name] ?? ''));
$valid_page_link = esc_url_raw($page_link);
if ($valid_page_link === '') {
return sprintf(
'%s%s',
esc_attr($item_class),
$name_attr,
esc_html($page_link),
esc_html__('No page link', 'acs-agenda-manager')
);
}
return sprintf(
'%s
%s',
esc_attr($item_class),
$name_attr,
esc_html($page_link),
esc_url($valid_page_link),
esc_html__('Open page', 'acs-agenda-manager')
);
default:
return sprintf(
'%s',
esc_attr($item_class),
$name_attr,
esc_html($item[$column_name] ?? '')
);
}
}
public function column_categorie($item): string {
$nonce = wp_create_nonce('acsagma_delete_event');
$item_class = sprintf('origItem_%d', $item['id']);
$name = sprintf(
'%s',
$item['id'],
esc_attr($item_class),
esc_html($item['categorie'])
);
$delete_url = wp_nonce_url(
add_query_arg(
[
'page' => 'acsagma-agenda',
'action' => 'delete',
'id' => $item['id'],
],
admin_url('admin.php')
),
'acsagma_delete_event'
);
$actions = [
'edit' => sprintf(
'%s',
$item['id'],
esc_html__('Edit', 'acs-agenda-manager')
),
'delete' => sprintf(
'%s',
esc_url($delete_url),
esc_html__('Delete', 'acs-agenda-manager')
),
];
return $name . str_replace('|', '', $this->row_actions($actions));
}
public function prepare_items(): void {
$this->_column_headers = $this->get_column_info();
$this->process_bulk_action();
$per_page = $this->get_items_per_page('events_per_page', 10);
$current_page = $this->get_pagenum();
// List table filtering/sorting/pagination uses WP's built-in list table nonce handling.
// phpcs:disable WordPress.Security.NonceVerification.Recommended
$args = [
'per_page' => $per_page,
'page' => $current_page,
'orderby' => sanitize_text_field(wp_unslash($_REQUEST['orderby'] ?? 'id')),
'order' => sanitize_text_field(wp_unslash($_REQUEST['order'] ?? 'DESC')),
'search' => sanitize_text_field(wp_unslash($_REQUEST['s'] ?? '')),
'filter' => sanitize_text_field(wp_unslash($_REQUEST['event-filter'] ?? '')),
];
// phpcs:enable WordPress.Security.NonceVerification.Recommended
$this->items = ACSAGMA_Database::get_events($args);
$total_items = ACSAGMA_Database::count_events($args);
$this->set_pagination_args([
'total_items' => $total_items,
'per_page' => $per_page,
]);
}
public function process_bulk_action(): void {
// Delete and bulk actions are now handled in handle_actions()
// which runs on admin_init before any output is sent.
}
public function no_items(): void {
esc_html_e('No events found.', 'acs-agenda-manager');
}
public function extra_tablenav($which): void {
if ($which !== 'top') {
return;
}
$filters = ACSAGMA_Database::get_event_filters();
if (empty($filters)) {
return;
}
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Filter dropdown uses WP's built-in list table form with nonce.
$current_filter = sanitize_text_field(wp_unslash($_REQUEST['event-filter'] ?? ''));
echo '