add filter on organizer

This commit is contained in:
2024-06-20 02:14:21 +02:00
parent 7294e500c6
commit 90ada3e449
9 changed files with 126 additions and 25 deletions

View File

@ -9,11 +9,13 @@ import {
SingularEvent,
getSingularEvents,
organizeEventsByDate,
EventOrganizer,
} from "@/lib/event";
import { isTodayOrFuture } from "@/lib/date";
import styles from "./eventContainer.module.scss";
import { formatDate, formatYearMonth } from "@/lib/date";
import { parse } from "date-fns";
import { unique } from "@/lib/common";
/*
TODO: canonical / alternate URLs https://github.com/47ng/nuqs?tab=readme-ov-file#seo
@ -22,23 +24,45 @@ import { parse } from "date-fns";
export const EventContainer = ({
events,
eventCategories,
eventOrganizers,
}: {
events: EventFragment[];
eventCategories: EventCategory[];
eventOrganizers: EventOrganizer[];
}) => {
const [mode, setMode] = useQueryState(
"mode",
parseAsStringLiteral(["list", "calendar"]).withDefault("list")
);
const [category, setCategory] = useQueryState("category", parseAsString);
const [organizer, setOrganizer] = useQueryState("organizer", parseAsString);
const filterableCategories = eventCategories.filter((x) => x.showInFilters);
const [category, setCategory] = useQueryState("category", parseAsString);
const filteredEvents = events.filter(
(x) =>
!category ||
x.categories.map((eventCategory) => eventCategory.slug).includes(category)
const uniqueOrganizers: string[] = unique(
events
.map((x) => x.organizers)
.flat()
.filter((x) => x.__typename === "EventOrganizer")
.map((x) => x.slug)
);
const filterableOrganizers = uniqueOrganizers
.map((slug) => eventOrganizers.find((haystack) => haystack.slug === slug))
.filter((x) => x !== undefined) as EventOrganizer[];
const filteredEvents = events
.filter(
(x) =>
!organizer ||
x.organizers.map((organizer) => organizer.slug).includes(organizer)
)
.filter(
(x) =>
!category ||
x.categories
.map((eventCategory) => eventCategory.slug)
.includes(category)
);
return (
<div className={styles.events}>
@ -46,12 +70,15 @@ export const EventContainer = ({
eventCategories={filterableCategories}
setCategory={setCategory}
activeCategory={category}
eventOrganizers={filterableOrganizers}
setOrganizer={setOrganizer}
activeOrganizer={organizer}
/>
<div className={styles.eventWrapper}>
<div className={styles.displayOptions}>
<button onClick={() => setMode(null)}>Vis liste</button>
<button onClick={() => setMode("calendar")}>Vis kalender</button>
<button>Filter</button>
<button>Filtrer</button>
</div>
{mode === "list" && <EventList events={filteredEvents} />}
{mode === "calendar" && <EventCalendar events={filteredEvents} />}

View File

@ -1,4 +1,4 @@
import { EventCategory } from "@/lib/event";
import { EventCategory, EventOrganizer } from "@/lib/event";
import styles from "./eventFilter.module.scss";
@ -6,14 +6,25 @@ export const EventFilter = ({
eventCategories,
setCategory,
activeCategory,
eventOrganizers,
setOrganizer,
activeOrganizer,
}: {
eventCategories: EventCategory[];
setCategory: (slug: string | null) => void;
activeCategory: string | null;
eventOrganizers: EventOrganizer[];
setOrganizer: (slug: string | null) => void;
activeOrganizer: string | null;
}) => {
const onOrganizerSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {
const organizer = e.target.value;
setOrganizer(organizer === "" ? null : organizer);
};
return (
<div className={styles.eventFilter}>
<span className="suphead">Filter</span>
<span className="suphead">Kategori</span>
<ul>
{eventCategories
.filter((x) => x.showInFilters)
@ -34,6 +45,23 @@ export const EventFilter = ({
</li>
))}
</ul>
<label htmlFor="organizer" className="suphead">
Arrangør
</label>
<div>
<select
name="organizer"
value={activeOrganizer ?? ""}
onChange={onOrganizerSelect}
>
<option value="">Vis alle</option>
{eventOrganizers.map((organizer) => (
<option key={organizer.slug} value={organizer.slug}>
{organizer.name}
</option>
))}
</select>
</div>
</div>
);
};