Improve admin panel UX with toasts, evolution CRUD, sorting, drag-and-drop, and responsive layout

Add sonner toast notifications to all mutations, evolution management backend
(CRUD endpoints with search/pagination) and frontend (form modal with pokemon
selector, paginated list page), sortable AdminTable columns (Region/Gen/Year
on Games), drag-and-drop route reordering via @dnd-kit, skeleton loading states,
card-styled table wrappers, and responsive mobile nav in AdminLayout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-07 13:09:27 +01:00
parent 574e36ee22
commit 1f198aca4c
20 changed files with 1140 additions and 138 deletions

View File

@@ -15,6 +15,10 @@ import type {
PaginatedPokemon,
CreateRouteEncounterInput,
UpdateRouteEncounterInput,
EvolutionAdmin,
PaginatedEvolutions,
CreateEvolutionInput,
UpdateEvolutionInput,
} from '../types'
// Games
@@ -61,6 +65,24 @@ export const deletePokemon = (id: number) =>
export const bulkImportPokemon = (items: Array<{ nationalDex: number; name: string; types: string[]; spriteUrl?: string | null }>) =>
api.post<BulkImportResult>('/pokemon/bulk-import', items)
// Evolutions
export const listEvolutions = (search?: string, limit = 50, offset = 0) => {
const params = new URLSearchParams()
if (search) params.set('search', search)
params.set('limit', String(limit))
params.set('offset', String(offset))
return api.get<PaginatedEvolutions>(`/evolutions?${params}`)
}
export const createEvolution = (data: CreateEvolutionInput) =>
api.post<EvolutionAdmin>('/evolutions', data)
export const updateEvolution = (id: number, data: UpdateEvolutionInput) =>
api.put<EvolutionAdmin>(`/evolutions/${id}`, data)
export const deleteEvolution = (id: number) =>
api.del(`/evolutions/${id}`)
// Route Encounters
export const addRouteEncounter = (routeId: number, data: CreateRouteEncounterInput) =>
api.post<RouteEncounterDetail>(`/routes/${routeId}/pokemon`, data)