alpinux-portail/web/index.php
Cédrix fc4d010c66 Modale de détail au clic sur une tuile événement (#2)
- calendar.php : ajout DTEND, DESCRIPTION, URL ; dépliage des lignes
  iCal et désescapage (\n, \,, \;)
- index.php : tuiles cliquables avec data-event JSON, modale native
  (overlay + dialog div), JS vanilla pour ouverture/fermeture (clic
  extérieur, touche Escape)
- style.css : styles modale et hover sur tuiles événements

Closes #2

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-06 00:10:16 +02:00

172 lines
6.7 KiB
PHP

<?php
require_once __DIR__ . '/inc/config.php';
require_once __DIR__ . '/inc/auth.php';
require_once __DIR__ . '/inc/services.php';
require_once __DIR__ . '/inc/calendar.php';
session_start_safe();
$user = current_user();
$title = 'Portail Alpinux';
$services = services_list();
$is_admin = $user && ($user['is_admin'] ?? false);
$is_adherent = $user && ($user['is_adherent'] || $is_admin);
$user_groups = $user['groups'] ?? [];
require __DIR__ . '/views/layout.php';
?>
<?php if ($user): ?>
<div class="hero">
<h1>Bienvenue, <?= htmlspecialchars($user['name'] ?: $user['username']) ?></h1>
<?php if (!$is_adherent): ?>
<p>Vous n'avez pas encore adhéré à Alpinux. Adhérer, c'est soutenir nos actions pour le logiciel libre en Savoie.</p>
<div class="hero-actions">
<a href="/helloasso/renew.php" class="btn-primary">Adhérer maintenant</a>
<a href="/profile.php" class="btn-outline">Mon profil</a>
</div>
<?php else: ?>
<p>Merci pour votre soutien. Retrouvez vos services et votre profil ci-dessous.</p>
<div class="hero-actions">
<a href="/profile.php" class="btn-outline">Mon profil</a>
</div>
<?php endif; ?>
</div>
<?php else: ?>
<div class="hero">
<h1>Portail membres Alpinux</h1>
<p>Accédez à vos services, gérez votre adhésion et votre compte AlpID.</p>
<div class="hero-actions">
<a href="/register.php" class="btn-primary">Créer mon compte</a>
<a href="/auth/login.php" class="btn-outline">Se connecter</a>
</div>
</div>
<section class="home-about">
<div class="about-grid">
<div class="about-card">
<div class="about-title">Qui sommes-nous ?</div>
<p>Alpinux est le LUG (Linux User Group) de Savoie. Nous promouvons le logiciel libre, organisons des ateliers et des événements autour de Linux et des technologies ouvertes.</p>
</div>
<div class="about-card">
<div class="about-title">Pourquoi adhérer ?</div>
<p>Adhérer, c'est soutenir nos actions pour le logiciel libre en Savoie. C'est aussi accéder à l'ensemble des services membres et participer aux décisions lors de l'assemblée générale.</p>
</div>
<div class="about-card">
<div class="about-title">AlpID</div>
<p>Un seul compte pour tous les services Alpinux. Gérez votre profil, votre adresse et votre adhésion depuis ce portail.</p>
</div>
</div>
</section>
<?php endif; ?>
<?php $calendar_events = calendar_next_events(5); if ($calendar_events): ?>
<section class="calendar-section">
<h2>Prochains événements</h2>
<div class="about-grid">
<?php foreach ($calendar_events as $ev): ?>
<div class="about-card about-card--event"
onclick="openEventModal(this)"
data-event="<?= htmlspecialchars(json_encode([
'title' => $ev['title'],
'start' => $ev['start'],
'end' => $ev['end'] ?? null,
'location' => $ev['location'] ?? null,
'description' => $ev['description'] ?? null,
'url' => $ev['url'] ?? null,
]), ENT_QUOTES) ?>">
<div class="about-title"><?= htmlspecialchars($ev['title']) ?></div>
<p>
<?= date('d/m/Y H:i', $ev['start']) ?>
<?= !empty($ev['location']) ? ' — ' . htmlspecialchars($ev['location']) : '' ?>
</p>
</div>
<?php endforeach; ?>
</div>
</section>
<div id="event-modal-overlay" class="event-modal-overlay" onclick="closeEventModal(event)">
<div class="event-modal" role="dialog" aria-modal="true">
<button class="event-modal-close" onclick="closeEventModal()" aria-label="Fermer">&times;</button>
<h2 class="event-modal-title" id="event-modal-title"></h2>
<dl class="event-modal-meta" id="event-modal-meta"></dl>
<div class="event-modal-desc" id="event-modal-desc"></div>
<div id="event-modal-url"></div>
</div>
</div>
<script>
function openEventModal(card) {
const ev = JSON.parse(card.dataset.event);
const fmt = ts => ts ? new Date(ts * 1000).toLocaleString('fr-FR', {weekday:'long', day:'numeric', month:'long', year:'numeric', hour:'2-digit', minute:'2-digit'}) : null;
document.getElementById('event-modal-title').textContent = ev.title;
let meta = '';
const start = fmt(ev.start), end = fmt(ev.end);
if (start) meta += `<dt>Début</dt><dd>${start}</dd>`;
if (end) meta += `<dt>Fin</dt><dd>${end}</dd>`;
if (ev.location) meta += `<dt>Lieu</dt><dd>${ev.location}</dd>`;
document.getElementById('event-modal-meta').innerHTML = meta;
const desc = document.getElementById('event-modal-desc');
if (ev.description) {
desc.innerHTML = ev.description.replace(/\n/g, '<br>');
desc.style.display = '';
} else {
desc.style.display = 'none';
}
const urlEl = document.getElementById('event-modal-url');
urlEl.innerHTML = ev.url ? `<a href="${ev.url}" target="_blank" rel="noopener" class="btn-outline btn-sm" style="margin-top:1rem;display:inline-block">En savoir plus →</a>` : '';
document.getElementById('event-modal-overlay').classList.add('event-modal-overlay--open');
document.body.style.overflow = 'hidden';
}
function closeEventModal(e) {
if (e && e.target !== document.getElementById('event-modal-overlay')) return;
document.getElementById('event-modal-overlay').classList.remove('event-modal-overlay--open');
document.body.style.overflow = '';
}
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeEventModal(); });
</script>
<?php endif; ?>
<section class="services-section">
<h2>Nos services</h2>
<div class="grid">
<?php foreach ($services as $s): if (!$s['visible']) continue;
$can_access = service_accessible($s, $user_groups, $is_admin); ?>
<div class="service-card <?= $s['requires_adherent'] ? 'adherent-only' : '' ?> <?= (!$can_access) ? 'locked' : '' ?>">
<div class="service-header">
<strong><?= htmlspecialchars($s['name']) ?></strong>
<?php if ($s['requires_adherent']): ?>
<span class="badge">Adhérent</span>
<?php endif; ?>
</div>
<?php if ($s['description']): ?>
<p><?= htmlspecialchars($s['description']) ?></p>
<?php endif; ?>
<div style="margin-top:.8rem">
<?php if ($can_access): ?>
<a href="<?= htmlspecialchars($s['url']) ?>" target="_blank" rel="noopener" style="font-size:.85rem">Accéder →</a>
<?php elseif ($user): ?>
<span class="text-muted small">Adhésion requise</span>
<?php else: ?>
<span class="text-muted small">Réservé aux adhérents —</span>
<a href="/register.php" style="font-size:.85rem">Adhérer</a>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
</div>
</section>
<?php require __DIR__ . '/views/layout_end.php'; ?>