feat: ajoute la navigation entre événements et un lien vers tous les albums photos

This commit is contained in:
Jalil Arfaoui 2025-08-11 19:16:29 +02:00
parent 74cfe041ae
commit 62e733c4d0
3 changed files with 135 additions and 2 deletions

View file

@ -106,3 +106,13 @@ export const fetchEvenement = async (slug: string) => {
return evenementFromContentfull(entries.items[0]!) return evenementFromContentfull(entries.items[0]!)
} }
export const fetchAllEvenements = async () => {
const entries = await contentfulClient.getEntries<ContentFulEvenement>({
content_type: "evenement",
});
return sortByDate(entries.items)
.map(evenementFromContentfull)
.reverse() // Plus récents en premier
}

View file

@ -31,6 +31,12 @@ const evenementsPassés = await fetchEvenementsPassés()
</p> </p>
</div> </div>
)} )}
<div class="albums-link">
<a href="https://www.flickr.com/photos/les-particules/albums/" target="_blank" class="voir-tous-albums">
Voir tous nos albums photos →
</a>
</div>
</main> </main>
</Layout> </Layout>
@ -64,4 +70,28 @@ const evenementsPassés = await fetchEvenementsPassés()
font-weight: 500; font-weight: 500;
} }
.albums-link {
text-align: center;
margin: 3rem 0 2rem;
}
.voir-tous-albums {
display: inline-block;
padding: 0.75rem 1.5rem;
background-color: orange;
color: white;
text-decoration: none;
border: black solid 2px;
border-radius: 0.4rem;
font-weight: bold;
box-shadow: 0.2em 0.2em 0.5em rgba(0,0,0,0.3);
transition: all 0.3s ease;
}
.voir-tous-albums:hover {
background-color: darkorange;
transform: translateY(-2px);
box-shadow: 0.3em 0.3em 0.7em rgba(0,0,0,0.4);
}
</style> </style>

View file

@ -1,7 +1,7 @@
--- ---
import type { Document } from '@contentful/rich-text-types'; import type { Document } from '@contentful/rich-text-types';
import { documentToHtmlString } from "@contentful/rich-text-html-renderer"; import { documentToHtmlString } from "@contentful/rich-text-html-renderer";
import {fetchEvenement, fetchEvenements} from "../../lib/contentful"; import {fetchEvenement, fetchAllEvenements} from "../../lib/contentful";
import Layout from "../../layouts/Layout.astro"; import Layout from "../../layouts/Layout.astro";
import Card from "../../components/Card.astro"; import Card from "../../components/Card.astro";
@ -9,12 +9,32 @@ export const prerender = false
const {slug} = Astro.params const {slug} = Astro.params
const { nom, description, date, lieu, lieuUrl, affiche, album } = await fetchEvenement(slug) const evenement = await fetchEvenement(slug)
const { nom, description, date, lieu, lieuUrl, affiche, album } = evenement
// Récupération de tous les événements pour la navigation
const tousEvenements = await fetchAllEvenements()
const currentIndex = tousEvenements.findIndex(e => e.slug === slug)
const evenementPrecedent = currentIndex > 0 ? tousEvenements[currentIndex - 1] : null
const evenementSuivant = currentIndex < tousEvenements.length - 1 ? tousEvenements[currentIndex + 1] : null
const Wrapper = lieuUrl ? 'a' : 'div' const Wrapper = lieuUrl ? 'a' : 'div'
--- ---
<Layout> <Layout>
<div class="navigation-header">
{evenementPrecedent && (
<a href={`/evenements/${evenementPrecedent.slug}`} class="nav-link nav-prev">
← {evenementPrecedent.nom}
</a>
)}
{evenementSuivant && (
<a href={`/evenements/${evenementSuivant.slug}`} class="nav-link nav-next">
{evenementSuivant.nom} →
</a>
)}
</div>
<h1>{nom}</h1> <h1>{nom}</h1>
<div class="content"> <div class="content">
{affiche && <img alt=`Affiche de ${nom}` src={affiche?.fields.file.url} />} {affiche && <img alt=`Affiche de ${nom}` src={affiche?.fields.file.url} />}
@ -43,6 +63,19 @@ const Wrapper = lieuUrl ? 'a' : 'div'
)} )}
</div> </div>
</div> </div>
<div class="navigation-header">
{evenementPrecedent && (
<a href={`/evenements/${evenementPrecedent.slug}`} class="nav-link nav-prev">
← {evenementPrecedent.nom}
</a>
)}
{evenementSuivant && (
<a href={`/evenements/${evenementSuivant.slug}`} class="nav-link nav-next">
{evenementSuivant.nom} →
</a>
)}
</div>
</Layout> </Layout>
<style is:global> <style is:global>
@ -117,6 +150,55 @@ const Wrapper = lieuUrl ? 'a' : 'div'
height: auto !important; height: auto !important;
} }
/* Navigation styles */
.navigation-header {
display: flex;
justify-content: space-between;
margin: 1rem 0;
padding: 0.5rem 0;
}
.navigation-header:first-of-type {
border-bottom: 1px solid rgba(0,0,0,0.1);
margin-bottom: 2rem;
}
.navigation-header:last-of-type {
border-top: 1px solid rgba(0,0,0,0.1);
margin-top: 2rem;
}
.nav-link {
color: rgb(68,68,68);
text-decoration: none;
font-size: 0.9rem;
opacity: 0.7;
transition: all 0.3s;
max-width: 45%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.nav-link:hover {
opacity: 1;
color: orange;
transform: translateX(3px);
}
.nav-prev {
margin-right: auto;
}
.nav-next {
margin-left: auto;
text-align: right;
}
.nav-next:hover {
transform: translateX(-3px);
}
@media (max-width: 48em) { @media (max-width: 48em) {
.content { .content {
flex-direction: column; flex-direction: column;
@ -124,11 +206,22 @@ const Wrapper = lieuUrl ? 'a' : 'div'
.content > img { .content > img {
width: 100%; width: 100%;
max-width: 400px;
border: black solid 0.1em; border: black solid 0.1em;
border-radius: 1em; border-radius: 1em;
margin: 0 auto 1em; margin: 0 auto 1em;
box-shadow: 0.2em 0.2em 1em black; box-shadow: 0.2em 0.2em 1em black;
} }
.navigation-header {
flex-direction: column;
gap: 0.5rem;
}
.nav-link {
max-width: 100%;
text-align: center;
}
} }