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/applicationService.ts b/api/src/services/applicationService.ts index 5692b4c..d0f2c95 100644 --- a/api/src/services/applicationService.ts +++ b/api/src/services/applicationService.ts @@ -32,6 +32,8 @@ export async function getApplicationByID(appID: number): Promise } export async function getApplicationList(page: number = 1, pageSize: number = 25): Promise { + const offset = (page - 1) * pageSize; + const sql = `SELECT member.name AS member_name, app.id, @@ -44,7 +46,7 @@ export async function getApplicationList(page: number = 1, pageSize: number = 25 ORDER BY app.submitted_at DESC LIMIT ? OFFSET ?;` - const rows: ApplicationListRow[] = await pool.query(sql, [pageSize, page]); + const rows: ApplicationListRow[] = await pool.query(sql, [pageSize, offset]); return rows; } 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/App.vue b/ui/src/App.vue index 2151903..8c55a33 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -30,10 +30,10 @@ const environment = import.meta.env.VITE_ENVIRONMENT;

This is a development build of the application. Some features will be unavailable or unstable.

- + -

You are on LOA until {{ formatDate(userStore.user?.LOAData?.[0].end_date) }}

-
diff --git a/ui/src/api/loa.ts b/ui/src/api/loa.ts index bd8802f..ee2f82e 100644 --- a/ui/src/api/loa.ts +++ b/ui/src/api/loa.ts @@ -31,9 +31,9 @@ export async function adminSubmitLOA(request: LOARequest): Promise<{ id?: number }); if (res.ok) { - return res.json(); + return } else { - return { error: "Failed to submit LOA" }; + throw new Error("Failed to submit LOA"); } } @@ -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/loaForm.vue b/ui/src/components/loa/loaForm.vue index 44dd7a9..8bea146 100644 --- a/ui/src/components/loa/loaForm.vue +++ b/ui/src/components/loa/loaForm.vue @@ -134,6 +134,22 @@ const maxEndDate = computed(() => { return null; } }) + +const memberFilter = ref(''); + +const filteredMembers = computed(() => { + const q = memberFilter?.value?.toLowerCase() ?? "" + const results: Member[] = [] + + for (const m of members.value ?? []) { + if (!q || (m.displayName || m.member_name).toLowerCase().includes(q)) { + results.push(m) + if (results.length >= 50) break + } + } + + return results +})