';
foreach ($events as $index => $event) {
$output .= self::render_event_card($event, $index);
}
$output .= '';
$output .= '
'
. esc_html__('No events match your filters.', 'acs-agenda-manager')
. '
';
$output .= '';
$output .= '';
return $output;
}
/**
* Render frontend toolbar controls.
*/
private static function render_agenda_controls(): string {
return sprintf(
'',
esc_attr__('Agenda filters and sorting', 'acs-agenda-manager'),
esc_html__('Search', 'acs-agenda-manager'),
esc_attr__('Search title or description', 'acs-agenda-manager'),
esc_html__('Category', 'acs-agenda-manager'),
esc_html__('All categories', 'acs-agenda-manager'),
esc_html__('Date', 'acs-agenda-manager'),
esc_html__('All dates', 'acs-agenda-manager'),
esc_html__('Today', 'acs-agenda-manager'),
esc_html__('This week', 'acs-agenda-manager'),
esc_html__('This month', 'acs-agenda-manager'),
esc_html__('Sort', 'acs-agenda-manager'),
esc_html__('Soonest first', 'acs-agenda-manager'),
esc_html__('Latest first', 'acs-agenda-manager'),
esc_html__('Title A-Z', 'acs-agenda-manager'),
esc_html__('Compact mode', 'acs-agenda-manager')
);
}
/**
* Render admin link if user has permissions
*/
private static function render_admin_link(): string {
if (!is_user_logged_in() || !current_user_can('manage_options')) {
return '';
}
$admin_url = esc_url(admin_url('admin.php?page=acsagma-agenda'));
return sprintf(
'',
$admin_url,
esc_html__('Agenda Administration', 'acs-agenda-manager')
);
}
/**
* Render a single event card
*/
private static function render_event_card(array $event, int $index): string {
$post_id = url_to_postid($event['link']);
$section_id = 'section-' . $index;
// For candopartial=2 events, leading dates in dates_info may be expired.
// Use the first non-expired date so data-date-ts reflects when the event
// is actually relevant, not when it started.
$first_date = '';
foreach ($event['dates_info'] as $date_info) {
if (empty($date_info['expired'])) {
$first_date = $date_info['date'];
break;
}
}
if ('' === $first_date) {
$first_date = $event['dates'][0] ?? '';
}
$parsed = !empty($first_date) ? ACSAGMA_Event::parse_date($first_date) : [];
$date_ts = (int) ($parsed['timestamp'] ?? 0);
$month_group = !empty($parsed)
? sprintf('%s %d', $parsed['month_name'], $parsed['year'])
: '';
$output = sprintf(
'',
esc_attr((string) ($event['categorie'] ?? '')),
esc_attr((string) ($event['title'] ?? '')),
esc_attr((string) ($event['emplacement'] ?? '')),
esc_attr((string) ($event['intro'] ?? '')),
$date_ts,
esc_attr($month_group)
);
// Left column - dates
$output .= self::render_date_column($event);
// Center column - content
$output .= self::render_content_column($event, $section_id, $post_id);
// Right column - image
$output .= self::render_image_column($event);
// Contact form shortcode if available
$output .= self::render_contact_form($event);
$output .= '
';
return $output;
}
/**
* Render the date column
*/
private static function render_date_column(array $event): string {
$years = [];
$dates_html = '';
foreach ($event['dates_info'] as $date_info) {
$parsed = ACSAGMA_Event::parse_date($date_info['date']);
if (empty($parsed)) {
continue;
}
$years[] = $parsed['year'];
$class = 'ACSdate';
if (!empty($date_info['today'])) {
$class .= ' blink_me';
} elseif (!empty($date_info['expired'])) {
$class .= ' acsagendaexpired';
}
$dates_html .= sprintf(
'
%s
%s
%s
',
esc_attr($class),
esc_html($parsed['month_name']),
esc_html($parsed['day']),
esc_html($parsed['weekday'])
);
}
// Determine year display
$unique_years = array_unique($years);
$year_display = count($unique_years) > 1
? implode('-', [min($unique_years), max($unique_years)])
: (string) reset($unique_years);
// Build location HTML only if location exists
$location_html = '';
if (!empty($event['emplacement'])) {
$location_html = sprintf(
'
%s
',
esc_html($event['emplacement'])
);
}
return sprintf(
'',
$dates_html,
esc_html($year_display),
$location_html
);
}
/**
* Render the content column
*/
private static function render_content_column(array $event, string $section_id, int $post_id): string {
$status_badge = '';
if ($event['status'] === 'today') {
$status_badge = '' . esc_html__('Today', 'acs-agenda-manager') . '';
} elseif ($event['status'] === 'running') {
$status_badge = '' . esc_html__('Running', 'acs-agenda-manager') . '';
}
// Build category badge if exists
$category_html = '';
if (!empty($event['categorie'])) {
$category_html = sprintf(
'%s',
esc_html($event['categorie'])
);
}
$read_more_html = '';
if (self::should_show_read_more($post_id)) {
$read_more_html = sprintf(
'',
esc_url($event['link']),
$post_id,
esc_attr($section_id),
esc_html__('Read more', 'acs-agenda-manager')
);
}
return sprintf(
'',
esc_attr($section_id),
$status_badge,
$category_html,
esc_html($event['title']),
esc_html($event['intro']),
$read_more_html
);
}
/**
* Determine whether Read more should be displayed.
*/
private static function should_show_read_more(int $post_id): bool {
if ($post_id <= 0) {
return false;
}
$post = get_post($post_id);
if (!$post instanceof WP_Post) {
return false;
}
$content_text = trim(wp_strip_all_tags(strip_shortcodes((string) $post->post_content)));
return $content_text !== '';
}
/**
* Render the image column
*/
private static function render_image_column(array $event): string {
// Skip if no image provided
if (empty($event['image'])) {
return '';
}
return sprintf(
'',
esc_url($event['image']),
esc_attr($event['title']),
esc_url($event['image'])
);
}
/**
* Render contact form shortcode if available
*/
private static function render_contact_form(array $event): string {
if (!shortcode_exists('ACScontactform')) {
return '';
}
$shortcode = sprintf(
'[ACScontactform dates="%s" subject="%s" price="%s" account="%s" candopartial="%s" redirect="%s"]',
esc_attr(implode(',', $event['dates'])),
esc_attr($event['title']),
esc_attr($event['price']),
esc_attr($event['account']),
esc_attr($event['candopartial']),
esc_attr($event['redirect'])
);
return do_shortcode($shortcode);
}
/**
* Render the read more dialog content
*/
public static function render_read_more_dialog(WP_Post $post, string $href): string {
return sprintf(
'',
esc_attr__('Close dialog', 'acs-agenda-manager'),
esc_html(get_the_title($post)),
esc_url($href),
esc_html__('Go to page', 'acs-agenda-manager'),
do_shortcode($post->post_content)
);
}
}