'; foreach ($events as $index => $event) { $output .= self::render_event_card($event, $index); } $output .= ''; $output .= ''; $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( '

%s

', $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( '
%s
%s %s
', $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( '
%s%s

%s

%s

%s
', 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( '
%s
', 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) ); } }