From dac4de236b6445cc15a8f6687d6903ba122283ce Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Tue, 16 Dec 2025 19:14:08 -0500 Subject: [PATCH] added pagination support for member LOA history --- api/src/routes/loa.ts | 8 ++++++-- api/src/services/loaService.ts | 13 ++++++++++--- ui/src/api/loa.ts | 14 ++++++++++++-- ui/src/components/loa/loaList.vue | 4 +++- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/api/src/routes/loa.ts b/api/src/routes/loa.ts index 17f198a..bb85fa5 100644 --- a/api/src/routes/loa.ts +++ b/api/src/routes/loa.ts @@ -56,9 +56,13 @@ router.get("/me", async (req: Request, res: Response) => { //get my LOA history router.get("/history", async (req: Request, res: Response) => { - const user = req.user.id; try { - const result = await getUserLOA(user); + const user = req.user.id; + + const page = Number(req.query.page) || undefined; + const pageSize = Number(req.query.pageSize) || undefined; + + const result = await getUserLOA(user, page, pageSize); res.status(200).json(result) } catch (error) { console.error(error); diff --git a/api/src/services/loaService.ts b/api/src/services/loaService.ts index fa8cd52..24ffe3f 100644 --- a/api/src/services/loaService.ts +++ b/api/src/services/loaService.ts @@ -36,7 +36,10 @@ export async function getAllLOA(page = 1, pageSize = 10): Promise { +export async function getUserLOA(userId: number, page = 1, pageSize = 10): Promise> { + + const offset = (page - 1) * pageSize; + const result: LOARequest[] = await pool.query(` SELECT loa.*, members.name, t.name AS type_name FROM leave_of_absences AS loa @@ -53,8 +56,12 @@ export async function getUserLOA(userId: number): Promise { WHEN loa.closed IS NOT NULL THEN 4 END, loa.start_date DESC - `, [userId]) - return result; + LIMIT ? OFFSET ?;`, [userId, pageSize, offset]) + + let loaCount = Number((await pool.query(`SELECT COUNT(*) as count FROM leave_of_absences WHERE member_id = ?;`, [userId]))[0].count); + let pageCount = loaCount / pageSize; + let output: PagedData = { data: result, pagination: { page: page, pageSize: pageSize, total: loaCount, totalPages: pageCount } } + return output; } export async function getUserActiveLOA(userId: number): Promise { diff --git a/ui/src/api/loa.ts b/ui/src/api/loa.ts index 9d03071..ee2f82e 100644 --- a/ui/src/api/loa.ts +++ b/ui/src/api/loa.ts @@ -85,8 +85,18 @@ export async function getAllLOAs(page?: number, pageSize?: number): Promise { - return fetch(`${addr}/loa/history`, { +export function getMyLOAs(page?: number, pageSize?: number): Promise> { + const params = new URLSearchParams(); + + if (page !== undefined) { + params.set("page", page.toString()); + } + + if (pageSize !== undefined) { + params.set("pageSize", pageSize.toString()); + } + + return fetch(`${addr}/loa/history?${params}`, { method: "GET", credentials: 'include', headers: { diff --git a/ui/src/components/loa/loaList.vue b/ui/src/components/loa/loaList.vue index 585d74d..a097af4 100644 --- a/ui/src/components/loa/loaList.vue +++ b/ui/src/components/loa/loaList.vue @@ -59,7 +59,9 @@ async function loadLOAs() { LOAList.value = result.data; pageData.value = result.pagination; } else { - LOAList.value = await getMyLOAs(); + let result = await getMyLOAs(pageNum.value, pageSize.value); + LOAList.value = result.data; + pageData.value = result.pagination; } }