(null);
@@ -65,7 +69,7 @@ export default function TicketsPage() {
const queryClient = useQueryClient();
const { data, isLoading, error } = useQuery({
- queryKey: ['tickets', filters],
+ queryKey: ['tickets', filters, ticketPage],
queryFn: () => ticketsApi.getAll({
search: filters.search || undefined,
status: filters.status || undefined,
@@ -76,11 +80,14 @@ export default function TicketsPage() {
dateFrom: filters.dateFrom || undefined,
dateTo: filters.dateTo || undefined,
coachId: filters.coachId || undefined,
- skip: 0,
- take: 50,
+ skip: (ticketPage - 1) * PAGE_SIZE,
+ take: PAGE_SIZE,
}),
});
+ const ticketMeta = (data as any)?.meta;
+ const ticketTotalPages = ticketMeta ? ticketMeta.totalPages : Math.max(1, Math.ceil(((data as any)?.total ?? (data?.items?.length ?? 0)) / PAGE_SIZE));
+
const { data: stationsData } = useQuery({
queryKey: ['stations'],
queryFn: () => stationsApi.getAll(),
@@ -562,7 +569,7 @@ export default function TicketsPage() {
placeholder="Search by ticket number..."
className="input"
value={filters.search}
- onChange={(e) => setFilters({ ...filters, search: e.target.value })}
+ onChange={(e) => { resetTicketPage(); setFilters({ ...filters, search: e.target.value }); }}
/>
@@ -570,7 +577,7 @@ export default function TicketsPage() {
@@ -605,7 +612,7 @@ export default function TicketsPage() {
setFilters({ ...filters, coachId: e.target.value })}
+ onChange={(e) => { resetTicketPage(); setFilters({ ...filters, coachId: e.target.value }); }}
>
{(Array.isArray(coachesData) ? coachesData : (coachesData as any)?.data || []).map((coach: any) => (
@@ -627,7 +634,7 @@ export default function TicketsPage() {
setFilters({ ...filters, status: e.target.value })}
+ onChange={(e) => { resetTicketPage(); setFilters({ ...filters, status: e.target.value }); }}
>
@@ -638,12 +645,12 @@ export default function TicketsPage() {
setFilters({ ...filters, dateFrom: e.target.value })} />
+ onChange={(e) => { resetTicketPage(); setFilters({ ...filters, dateFrom: e.target.value }); }} />
setFilters({ ...filters, dateTo: e.target.value })} />
+ onChange={(e) => { resetTicketPage(); setFilters({ ...filters, dateTo: e.target.value }); }} />
)}
@@ -657,6 +664,7 @@ export default function TicketsPage() {
loading={isLoading}
emptyMessage="No tickets found"
/>
+
{/* Board Confirmation Modal */}
+
{/* Delete Confirmation */}
(items: T[], pageSize = 20) {
+ const [page, setPage] = useState(1);
+
+ const totalPages = Math.max(1, Math.ceil(items.length / pageSize));
+ const safePage = Math.min(page, totalPages);
+
+ const paged = useMemo(
+ () => items.slice((safePage - 1) * pageSize, safePage * pageSize),
+ [items, safePage, pageSize],
+ );
+
+ // Reset to page 1 whenever the source list changes length (e.g. after a filter)
+ const reset = () => setPage(1);
+
+ return { paged, page: safePage, totalPages, setPage, reset };
+}