feat: Admin Shows - add link filter buttons, increase limit to 1000
Some checks are pending
Deploy Elmeg / deploy (push) Waiting to run

This commit is contained in:
fullsizemalt 2025-12-24 16:15:59 -08:00
parent 6ba55a595a
commit 97d40c0f4e

View file

@ -43,6 +43,7 @@ export default function AdminShowsPage() {
const [shows, setShows] = useState<Show[]>([]) const [shows, setShows] = useState<Show[]>([])
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(true)
const [search, setSearch] = useState("") const [search, setSearch] = useState("")
const [linkFilter, setLinkFilter] = useState<"all" | "missing" | "has_links">("all")
const [editingShow, setEditingShow] = useState<Show | null>(null) const [editingShow, setEditingShow] = useState<Show | null>(null)
const [saving, setSaving] = useState(false) const [saving, setSaving] = useState(false)
@ -63,7 +64,7 @@ export default function AdminShowsPage() {
if (!token) return if (!token) return
try { try {
const res = await fetch(`${getApiUrl()}/shows?limit=100&sort=date_desc`, { const res = await fetch(`${getApiUrl()}/shows?limit=1000&sort=date_desc`, {
headers: { Authorization: `Bearer ${token}` } headers: { Authorization: `Bearer ${token}` }
}) })
if (res.ok) { if (res.ok) {
@ -115,11 +116,20 @@ export default function AdminShowsPage() {
}) })
} }
const filteredShows = shows.filter(s => const filteredShows = shows.filter(s => {
s.venue_name?.toLowerCase().includes(search.toLowerCase()) || const matchesSearch =
s.venue_city?.toLowerCase().includes(search.toLowerCase()) || s.venue?.name?.toLowerCase().includes(search.toLowerCase()) ||
s.venue?.city?.toLowerCase().includes(search.toLowerCase()) ||
s.date.includes(search) s.date.includes(search)
)
const hasAnyLink = s.nugs_link || s.bandcamp_link || s.youtube_link
const matchesLinkFilter =
linkFilter === "all" ||
(linkFilter === "missing" && !hasAnyLink) ||
(linkFilter === "has_links" && hasAnyLink)
return matchesSearch && matchesLinkFilter
})
if (loading) { if (loading) {
return ( return (
@ -141,7 +151,8 @@ export default function AdminShowsPage() {
</h2> </h2>
</div> </div>
<div className="relative max-w-sm"> <div className="flex flex-wrap gap-4 items-center">
<div className="relative max-w-sm flex-1">
<Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" /> <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input <Input
placeholder="Search by venue, city, or date..." placeholder="Search by venue, city, or date..."
@ -150,6 +161,30 @@ export default function AdminShowsPage() {
className="pl-9" className="pl-9"
/> />
</div> </div>
<div className="flex gap-1">
<Button
variant={linkFilter === "all" ? "secondary" : "ghost"}
size="sm"
onClick={() => setLinkFilter("all")}
>
All
</Button>
<Button
variant={linkFilter === "missing" ? "secondary" : "ghost"}
size="sm"
onClick={() => setLinkFilter("missing")}
>
Missing Links
</Button>
<Button
variant={linkFilter === "has_links" ? "secondary" : "ghost"}
size="sm"
onClick={() => setLinkFilter("has_links")}
>
Has Links
</Button>
</div>
</div>
<Card> <Card>
<CardContent className="p-0"> <CardContent className="p-0">