Meetup-Übersicht: Teaser aus intro, kommende Termine chronologisch - #255
Conversation
Die Karten der Meetup-Übersicht haben ihren Anreißer aus `description` gelesen. Dort steht inzwischen der immer gleiche Aufruf für Lightning-Talk-Speaker samt Agenda, sodass auf jeder Karte derselbe Text stand. Der eigentliche Teaser liegt in `intro`, das `getMeetups` bisher gar nicht abgefragt hat. `intro` wird jetzt mitgeladen und auf der Karte gezeigt; ist es leer – bei älteren Meetups, die ihren Text noch in `description` haben – wird weiterhin `description` verwendet. Beide Felder sind Rich Text und laufen durch `getPlainText`. Außerdem waren die kommenden Meetups nach der Sortierung der Abfrage absteigend, also mit dem am weitesten entfernten Termin oben. Sie werden nun aufsteigend sortiert, damit der nächste Termin zuerst steht; die vergangenen Meetups bleiben wie bisher absteigend. Der Wunsch kam aus dem Team.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
Updates the Nuxt meetup overview and homepage meetup section so meetup cards show a per-meetup teaser (from Directus intro, with fallback to description) and upcoming meetups are displayed in chronological order (next meetup first).
Changes:
- Fetch
introfor meetups from Directus and use it as the primary card excerpt with adescriptionfallback. - Sort upcoming meetups ascending by
start_onon both the meetup overview page and the homepage. - Update component prop typings to include the new
introfield.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| nuxt-app/pages/meetup/index.vue | Sorts upcoming meetups chronologically while keeping past meetups newest-first. |
| nuxt-app/pages/index.vue | Sorts upcoming meetups chronologically for the homepage section. |
| nuxt-app/composables/useDirectus.ts | Adds intro to the meetups field selection. |
| nuxt-app/components/MeetupSection.vue | Extends meetup item prop shape to include intro. |
| nuxt-app/components/MeetupCard.vue | Renders an excerpt derived from intro with fallback to description via getPlainText. |
Suppressed comments (1)
nuxt-app/pages/index.vue:130
- The upcoming-meetup filtering/sorting logic is duplicated here and in
pages/meetup/index.vue(and now includes a sort as well). Consider extracting a small helper (e.g.getUpcomingMeetups(meetups)), so the ordering rules can't drift between the home page and the meetup overview.
const upcomingMeetups = meetups
.filter((meetup) => {
const now = new Date()
return new Date(meetup.start_on) > now
})
.sort((a, b) => new Date(a.start_on).getTime() - new Date(b.start_on).getTime())
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…mmen Der `meetups`-Prop von `MeetupSection` listete `id` und `slug` nicht auf, obwohl das Template `item.id` als Key nutzt und `MeetupCard` `slug` für den Link braucht. Der Typ war damit irreführend und hätte künftige Abweichungen in der Datenform verdeckt; beide Felder sind jetzt Teil des `Pick<>`. Außerdem wurde `new Date()` in den Filter-Callbacks pro Meetup neu gebildet. Der Zeitpunkt wird nun einmal vor den Filtern bestimmt, sodass vergangene und kommende Termine gegen dieselbe Referenzzeit verglichen werden.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d5510ed75a
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Die Auswahl und Sortierung der kommenden Meetups stand wortgleich auf der Meetup-Übersicht und auf der Startseite. AGENTS.md verlangt, ein Muster, das an mehr als einer Stelle auftaucht, in eine gemeinsame Abstraktion zu ziehen — genau das war hier nicht der Fall. `helpers/meetupSchedule.ts` enthält jetzt `getUpcomingMeetups` (filtert auf Termine in der Zukunft und sortiert aufsteigend, damit der nächste Termin oben steht) und `getPastMeetups` (behält die Reihenfolge der Abfrage, die bereits absteigend sortiert). Beide bekommen die Referenzzeit als Argument, statt selbst die Uhr zu lesen, damit eine Seite mit beiden Listen alle Meetups gegen denselben Zeitpunkt vergleicht. Die Startseite blendet weiterhin selbst das hervorgehobene Element aus — das ist ihr eigenes Anliegen und gehört nicht in den Helper. Dazu ein Unit-Test, der die Sortierung, die Grenzfälle und das saubere Aufteilen in vergangen/kommend abdeckt.
`getUpcomingMeetups` verglich strikt mit `>`, `getPastMeetups` strikt mit `<`. Ein Meetup, dessen `start_on` genau dem Referenzzeitpunkt entspricht, fiel damit aus beiden Listen heraus und war für diesen Moment auf keiner der beiden Seiten zu sehen — genau das, was die gemeinsame Referenzzeit verhindern sollte. Die Grenze gehört nun zur kommenden Seite: ein Meetup, das exakt jetzt beginnt, hat noch nicht stattgefunden. Damit teilen die beiden Auswahlen die Meetups vollständig auf. Die gewählte Grenze steht ausdrücklich im Docblock, statt sich nur aus dem Operator zu ergeben. Der Test deckt den Gleichheitsfall jetzt in beiden Auswahlen und in der Aufteilungsprüfung ab; ohne die Änderung schlagen die beiden neuen Fälle auf der kommenden Seite fehl.
Requested by Dennis Becker · Slack thread
Before: Wer die Meetup-Übersicht öffnet, sieht auf jeder Karte denselben Text. Der Anreißer stammt aus
description, und dort steht seit einiger Zeit der immer gleiche Aufruf für Lightning-Talk-Speaker samt Agenda – jede Karte beginnt also mit „Lightning Talk / Mit unserem ‚Lightning Talk‘-Format …", statt zu verraten, worum es beim jeweiligen Meetup geht. Dazu stehen die kommenden Termine in der falschen Richtung: oben der Termin, der am weitesten in der Zukunft liegt, unten der nächste. Wer wissen will, wann das nächste Meetup ist, muss bis zum Ende der Liste scrollen.After: Jede Karte zeigt den Teaser des jeweiligen Meetups, also den Text, den die Redaktion dafür geschrieben hat – die Karten unterscheiden sich wieder voneinander. Ältere Meetups, deren Text noch im Beschreibungsfeld liegt, zeigen weiterhin diesen Text, bleiben also unverändert lesbar. Und die kommenden Termine sind chronologisch sortiert: der nächste steht oben, auf der Meetup-Seite wie auch auf der Startseite. Die vergangenen Meetups bleiben wie gehabt mit dem jüngsten zuerst.
How:
getMeetupslädt zusätzlich das Feldintro; die Meetup-Karte zeigtintround greift aufdescriptionzurück, wennintroleer ist. Beide Felder sind Rich Text und laufen durch denselbengetPlainText-Helper, der Markup entfernt und Entities dekodiert – einintro, das leer oder nur leeres Markup ist, wird dadurch zum leeren String und löst den Fallback aus. Für die Reihenfolge werden die kommenden Meetups nach dem Filtern aufsteigend nachstart_onsortiert; die Abfrage selbst bleibt unverändert absteigend, weil die Liste der vergangenen Meetups genau das braucht.Geprüft mit
npm run prettier:check,npm run lint,npm test(100 Tests),npm run typecheck:ratchet(unverändert 263, Baseline 263) undnpm run build– alles grün.Der Wunsch kam aus dem Team.
Generated by Claude Code