Fix pagination totals for zero counts
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { describe, expect, it } from 'vitest';
|
import { describe, expect, it } from 'vitest';
|
||||||
import { normalizeTenantPackage } from '../api';
|
import { buildPagination, normalizeTenantPackage } from '../api';
|
||||||
|
|
||||||
describe('normalizeTenantPackage', () => {
|
describe('normalizeTenantPackage', () => {
|
||||||
it('keeps remaining_events null when payload is null', () => {
|
it('keeps remaining_events null when payload is null', () => {
|
||||||
@@ -17,3 +17,15 @@ describe('normalizeTenantPackage', () => {
|
|||||||
expect(normalized.remaining_events).toBe(2);
|
expect(normalized.remaining_events).toBe(2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('buildPagination', () => {
|
||||||
|
it('keeps totals at zero when meta total is zero', () => {
|
||||||
|
const meta = buildPagination({ meta: { total: 0, per_page: 1, current_page: 1, last_page: 1 } } as any, 1);
|
||||||
|
expect(meta.total).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('falls back to data length when total is missing', () => {
|
||||||
|
const meta = buildPagination({ data: [] } as any, 1);
|
||||||
|
expect(meta.total).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -877,13 +877,18 @@ async function safeJson(response: Response): Promise<JsonValue | null> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildPagination(payload: JsonValue | null, defaultCount: number): PaginationMeta {
|
export function buildPagination(payload: JsonValue | null, defaultCount: number): PaginationMeta {
|
||||||
const meta = (payload?.meta as Partial<PaginationMeta>) ?? {};
|
const meta = (payload?.meta as Partial<PaginationMeta>) ?? {};
|
||||||
|
const data = payload && typeof payload === 'object' ? (payload as { data?: unknown }).data : undefined;
|
||||||
|
const fallbackTotal = Array.isArray(data) ? data.length : defaultCount ?? 0;
|
||||||
|
const perPage = Number(meta.per_page ?? payload?.per_page ?? defaultCount ?? 0);
|
||||||
|
const total = Number(meta.total ?? payload?.total ?? fallbackTotal);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
current_page: Number(meta.current_page ?? payload?.current_page ?? 1),
|
current_page: Number(meta.current_page ?? payload?.current_page ?? 1),
|
||||||
last_page: Number(meta.last_page ?? payload?.last_page ?? 1),
|
last_page: Number(meta.last_page ?? payload?.last_page ?? 1),
|
||||||
per_page: Number(meta.per_page ?? payload?.per_page ?? defaultCount ?? 0) || defaultCount || 0,
|
per_page: Number.isFinite(perPage) ? perPage : defaultCount ?? 0,
|
||||||
total: Number(meta.total ?? payload?.total ?? defaultCount ?? 0) || defaultCount || 0,
|
total: Number.isFinite(total) ? total : defaultCount ?? 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user