diff --git a/src/components/events/EventsGrid.astro b/src/components/events/EventsGrid.astro new file mode 100644 index 00000000..c36dd3e3 --- /dev/null +++ b/src/components/events/EventsGrid.astro @@ -0,0 +1,70 @@ +--- +import type { EventCalendarEntry } from '@data'; + +interface Props { + events: EventCalendarEntry[]; +} +const { events } = Astro.props; + +const TODAY = new Date(); +const CURRENT_YEAR = TODAY.getFullYear(); + +function formatRange(start: Date, end?: Date): string { + const startDay = start.getDate(); + const startMonth = start.toLocaleString('de-DE', { month: 'short' }); + const startYearStr = String(start.getFullYear()).slice(-2); + + // No end date (or same day): show a single date. + if (!end || end.toDateString() === start.toDateString()) { + const suffix = start.getFullYear() !== CURRENT_YEAR ? ` ${startYearStr}` : ''; + return `${startDay}. ${startMonth}${suffix}`; + } + + const endDay = end.getDate(); + const endMonth = end.toLocaleString('de-DE', { month: 'short' }); + const endYearStr = String(end.getFullYear()).slice(-2); + + const sameYear = start.getFullYear() === end.getFullYear(); + const showYear = sameYear ? start.getFullYear() !== CURRENT_YEAR : true; + + if (startMonth === endMonth && sameYear) { + // 2. - 5. Jun + return `${startDay}. - ${endDay}. ${endMonth}${showYear ? ` ${endYearStr}` : ''}`; + } + + if (sameYear) { + // 30. Mai - 3. Jun [YY] + return `${startDay}. ${startMonth} - ${endDay}. ${endMonth}${showYear ? ` ${endYearStr}` : ''}`; + } + + // Spans multiple years: include both years. + return `${startDay}. ${startMonth} ${startYearStr} - ${endDay}. ${endMonth} ${endYearStr}`; +} +--- + +
+ { + events.map((event) => ( + + {event.image.alt} +
+

{event.title}

+

{event.description}

+ +
{formatRange(event.date, event.end)}
+ {event.link &&
Mehr Infos >
} +
+
+
+ )) + } +
diff --git a/src/components/events/NextEvents.astro b/src/components/events/NextEvents.astro index ddbc2b6c..5f6649a9 100644 --- a/src/components/events/NextEvents.astro +++ b/src/components/events/NextEvents.astro @@ -1,29 +1,30 @@ --- import ProjectBackground1 from '@assets/events/projects-bg-lg-1.jpg'; import ProjectBackground2 from '@assets/events/projects-bg-lg-2.jpg'; -import Calendar from '@components/Calendar.svelte'; import { eventData } from '@data'; import { Image } from 'astro:assets'; +import EventsGrid from './EventsGrid.astro'; + const events = await eventData.get3CalendarEntries(); --- -
+
-
-
-

Unsere nächsten Veranstaltungen

-

- Trau dich! Wir wissen, es ist nicht so leicht, an Orte zu kommen, wo du niemanden kennst. Aber - auch, wenn du bisher noch keinen Kontakt mit YoungVision hattest, bist du ganz herzlich - eingeladen, zu kommen wie du bist. Du kannst dir sicher sein, wir fangen dich auf und halten den - Raum für dich und deinen Prozess. -

-
-
- -
+
+

Unsere nächsten Veranstaltungen

+

+ Trau dich! Wir wissen, es ist nicht so leicht, an Orte zu kommen, wo du niemanden kennst. Aber + auch, wenn du bisher noch keinen Kontakt mit YoungVision hattest, bist du ganz herzlich + eingeladen, zu kommen wie du bist. Du kannst dir sicher sein, wir fangen dich auf und halten + den Raum für dich und deinen Prozess. +

+
+
+ +
- + +
diff --git a/src/components/index/Events.astro b/src/components/index/Events.astro index 45d26b50..102252e5 100644 --- a/src/components/index/Events.astro +++ b/src/components/index/Events.astro @@ -1,6 +1,6 @@ --- import Button from '@components/Button.astro'; -import Calendar from '@components/Calendar.svelte'; +import EventsGrid from '@components/events/EventsGrid.astro'; import { eventData } from '@data'; const events = await eventData.get3CalendarEntries(); --- @@ -10,7 +10,7 @@ const events = await eventData.get3CalendarEntries();

Unsere Events

- +

diff --git a/src/data/index.ts b/src/data/index.ts index 3c752caa..b06c16fb 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -10,6 +10,7 @@ import { testInstagramData } from './test/instagram.ts'; export interface EventCalendarEntry { date: Date; description: string; + end?: Date; image: { alt: string; src: GetImageResult }; link?: string; title: string; diff --git a/src/data/real/events.ts b/src/data/real/events.ts index ada1d48d..8421168c 100644 --- a/src/data/real/events.ts +++ b/src/data/real/events.ts @@ -25,8 +25,11 @@ type EventRequest = { sort?: `-${keyof EventCMS}` | keyof EventCMS; where: { [key in keyof EventCMS]?: { + equals?: EventCMS[key]; + exists?: boolean; greater_than?: EventCMS[key]; less_than?: EventCMS[key]; + not_equals?: EventCMS[key]; }; }; }; @@ -48,6 +51,11 @@ export async function get3CalendarEntries(): Promise< }, }, }; + if (!DRAFT) { + request.where._status = { + equals: 'published', + }; + } console.log(request); console.log(`${process.env.CMS_URL}/api/events?${qs.stringify(request)}`); const response = await fetch(`${process.env.CMS_URL}/api/events?${qs.stringify(request)}`); @@ -65,6 +73,11 @@ export async function get3CalendarEntries(): Promise< }, }, }; + if (!DRAFT) { + request2.where._status = { + equals: 'published', + }; + } const pastEventsResponse = await fetch( `${process.env.CMS_URL}/api/events?${qs.stringify(request2)}`, ); @@ -77,6 +90,7 @@ export async function get3CalendarEntries(): Promise< const optimizedEvents = events.map(async (event) => ({ date: new Date(event.start), description: event.shortDescription, + end: new Date(event.end), image: await getEventImage(event.calendarCover.value).then(async (r) => ({ alt: r!.alt, src: await getImage({ @@ -91,11 +105,23 @@ export async function get3CalendarEntries(): Promise< } export async function getAllPages(): Promise { - const response = await fetch(`${process.env.CMS_URL}/api/events?draft=${DRAFT}`); + const request: EventRequest = { + draft: DRAFT, + where: { + slug: { + exists: true, + }, + }, + }; + if (!DRAFT) { + request.where._status = { + equals: 'published', + }; + } + const response = await fetch(`${process.env.CMS_URL}/api/events?${qs.stringify(request)}`); const data = await response.json(); const events = data.docs as EventCMS[]; - const eventsWithSlug = events.filter((event) => event.slug); - const promises = eventsWithSlug.map(async (event) => ({ + const promises = events.map(async (event) => ({ ...event, end: new Date(event.end), heroImage: await getEventImage(event.heroImage?.value), diff --git a/src/data/test/events.ts b/src/data/test/events.ts index 28238628..6a2b373b 100644 --- a/src/data/test/events.ts +++ b/src/data/test/events.ts @@ -36,6 +36,7 @@ export async function get3CalendarEntries(): Promise< { date: new Date(1999, 6, 10), description: 'This event covers the test case for past events', + end: new Date(1999, 6, 13), image: { alt: '', src: await getImage({ src: thirdEventImage }), @@ -46,6 +47,7 @@ export async function get3CalendarEntries(): Promise< { date: new Date(2999, 10, 2), description: 'This event will always (until the year 2999) be in the future.', + end: new Date(2999, 10, 5), image: { alt: '', src: await getImage({ src: calendarCoverImage }), @@ -56,6 +58,7 @@ export async function get3CalendarEntries(): Promise< { date: new Date(3024, 0, 28), description: 'This is test data. Test 1 2 3. Test test.', + end: new Date(3024, 1, 3), image: { alt: '', src: await getImage({ src: pastEvent }), diff --git a/src/pages/datenschutz.astro b/src/pages/datenschutz.astro index 682eccb3..a890dfd0 100644 --- a/src/pages/datenschutz.astro +++ b/src/pages/datenschutz.astro @@ -3,7 +3,7 @@ import Layout from '@layouts/Layout.astro'; --- -

+

Datenschutz­erklärung

1. Datenschutz auf einen Blick

diff --git a/src/pages/events.astro b/src/pages/events.astro index 15fd8915..66c5d368 100644 --- a/src/pages/events.astro +++ b/src/pages/events.astro @@ -1,15 +1,10 @@ --- import Hero from '@components/events/Hero.astro'; import NextEvents from '@components/events/NextEvents.astro'; -import YearlyEvents from '@components/events/YearlyEvents.svelte'; -import { eventData } from '@data'; import Layout from '@layouts/Layout.astro'; - -const yearlyEvents = await eventData.getAllYearlyEvents(); --- - diff --git a/src/pages/impressum.astro b/src/pages/impressum.astro index d86b2628..9a30c0b6 100644 --- a/src/pages/impressum.astro +++ b/src/pages/impressum.astro @@ -3,7 +3,7 @@ import Layout from '@layouts/Layout.astro'; --- -
+

Impressum

Angaben gemäß § 5 TMG:

YoungVision e.V. Am bhf 4, 16307 Mescherin Deutschland
@@ -31,7 +31,7 @@ import Layout from '@layouts/Layout.astro';

Registereintrag

-

Registergericht: Amtsgericht Charlottenburg Registernummer: VR 32815 B

+

Registergericht: Amtsgericht Neuruppin
Registernummer: VR 5579 NP