diff --git a/app/admin/talks/page.tsx b/app/admin/talks/page.tsx index b6d6aa0..4307095 100644 --- a/app/admin/talks/page.tsx +++ b/app/admin/talks/page.tsx @@ -51,6 +51,8 @@ const TALK_STATUSES: TalkStatus[] = [ "cancelled" ] +const DEFAULT_FILTER_STATUSES: TalkStatus[] = ["pending", "under_review", "approved", "scheduled"] + const STATUS_COLORS: Record = { pending: "#f59e0b", under_review: "#3b82f6", @@ -66,7 +68,7 @@ const STATUS_COLORS: Record = { export default function AdminTalks() { const { loading, isAdmin } = useRequireAdminAuth() const [talks, setTalks] = useState([]) - const [filterStatus, setFilterStatus] = useState("all") + const [filterStatuses, setFilterStatuses] = useState(DEFAULT_FILTER_STATUSES) const [updatingId, setUpdatingId] = useState(null) const [downloadingId, setDownloadingId] = useState(null) const [error, setError] = useState(null) @@ -98,8 +100,13 @@ export default function AdminTalks() { ) .order("created_at", { ascending: false }) - if (filterStatus !== "all") { - query = query.eq("status", filterStatus) + if (filterStatuses.length === 0) { + setTalks([]) + return + } + + if (filterStatuses.length !== TALK_STATUSES.length) { + query = query.in("status", filterStatuses) } const { data, error: fetchError } = await query @@ -110,7 +117,7 @@ export default function AdminTalks() { } setTalks((data as unknown as TalkSubmission[]) || []) - }, [filterStatus]) + }, [filterStatuses]) useEffect(() => { if (isAdmin) { @@ -146,6 +153,26 @@ export default function AdminTalks() { } } + const handleFilterStatusToggle = (status: TalkStatus, withOptionKey: boolean) => { + setFilterStatuses((previousStatuses) => { + if (withOptionKey) { + const hasOtherEnabledStatuses = previousStatuses.some( + (enabledStatus) => enabledStatus !== status + ) + return hasOtherEnabledStatuses ? [status] : TALK_STATUSES + } + + if (previousStatuses.includes(status)) { + return previousStatuses.filter((enabledStatus) => enabledStatus !== status) + } + + return TALK_STATUSES.filter( + (candidateStatus) => + candidateStatus === status || previousStatuses.includes(candidateStatus) + ) + }) + } + const getFileNameFromPath = (filePath: string) => { const pathSegments = filePath.split("/") return pathSegments[pathSegments.length - 1] || filePath @@ -231,7 +258,9 @@ export default function AdminTalks() { Talk Submissions {talks.length} submission{talks.length !== 1 ? "s" : ""} - {filterStatus !== "all" ? ` (${filterStatus})` : ""} + {filterStatuses.length !== TALK_STATUSES.length + ? ` (${filterStatuses.length} status filter${filterStatuses.length !== 1 ? "s" : ""})` + : ""} @@ -240,15 +269,12 @@ export default function AdminTalks() { Filter by status: - setFilterStatus("all")}> - All - {TALK_STATUSES.map((status) => ( setFilterStatus(status)} + onClick={(event) => handleFilterStatusToggle(status, event.altKey)} > {status.replace("_", " ")}