added member names to training reports
This commit is contained in:
@@ -18,7 +18,7 @@ function buildAttendee(row: RawAttendeeRow): CourseAttendee {
|
|||||||
updated_at: row.updated_at,
|
updated_at: row.updated_at,
|
||||||
remarks: row.remarks,
|
remarks: row.remarks,
|
||||||
attendee_role_id: row.attendee_role_id,
|
attendee_role_id: row.attendee_role_id,
|
||||||
|
attendee_name: row.attendee_name,
|
||||||
role: row.role_id
|
role: row.role_id
|
||||||
? {
|
? {
|
||||||
id: row.role_id,
|
id: row.role_id,
|
||||||
@@ -35,6 +35,7 @@ function buildAttendee(row: RawAttendeeRow): CourseAttendee {
|
|||||||
export async function getCourseEventAttendees(id: number): Promise<CourseAttendee[]> {
|
export async function getCourseEventAttendees(id: number): Promise<CourseAttendee[]> {
|
||||||
const sql = `SELECT
|
const sql = `SELECT
|
||||||
ca.*,
|
ca.*,
|
||||||
|
mem.name AS attendee_name,
|
||||||
ar.id AS role_id,
|
ar.id AS role_id,
|
||||||
ar.name AS role_name,
|
ar.name AS role_name,
|
||||||
ar.description AS role_description,
|
ar.description AS role_description,
|
||||||
@@ -43,6 +44,7 @@ export async function getCourseEventAttendees(id: number): Promise<CourseAttende
|
|||||||
ar.updated_at AS role_updated_at
|
ar.updated_at AS role_updated_at
|
||||||
FROM course_attendees ca
|
FROM course_attendees ca
|
||||||
LEFT JOIN course_attendee_roles ar ON ar.id = ca.attendee_role_id
|
LEFT JOIN course_attendee_roles ar ON ar.id = ca.attendee_role_id
|
||||||
|
LEFT JOIN members mem ON ca.attendee_id = mem.id
|
||||||
WHERE ca.course_event_id = ?;`;
|
WHERE ca.course_event_id = ?;`;
|
||||||
|
|
||||||
const res: RawAttendeeRow[] = await pool.query(sql, [id]);
|
const res: RawAttendeeRow[] = await pool.query(sql, [id]);
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ export interface CourseAttendee {
|
|||||||
created_at: string; // datetime → ISO string
|
created_at: string; // datetime → ISO string
|
||||||
updated_at: string; // datetime → ISO string
|
updated_at: string; // datetime → ISO string
|
||||||
remarks: string | null;
|
remarks: string | null;
|
||||||
|
|
||||||
|
attendee_name: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CourseAttendeeRole {
|
export interface CourseAttendeeRole {
|
||||||
@@ -68,6 +70,8 @@ export interface RawAttendeeRow {
|
|||||||
role_deleted: number | null;
|
role_deleted: number | null;
|
||||||
role_created_at: string | null;
|
role_created_at: string | null;
|
||||||
role_updated_at: string | null;
|
role_updated_at: string | null;
|
||||||
|
|
||||||
|
attendee_name: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CourseEventSummary {
|
export interface CourseEventSummary {
|
||||||
|
|||||||
@@ -44,9 +44,12 @@ onMounted(async () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="max-w-7xl mx-auto flex">
|
<div class="max-w-7xl mx-auto flex mt-5">
|
||||||
<!-- training report list -->
|
<!-- training report list -->
|
||||||
<div class="px-4" :class="focusedTrainingReport == null ? 'w-full' : 'w-1/2'">
|
<div class="px-4" :class="focusedTrainingReport == null ? 'w-full' : 'w-1/2'">
|
||||||
|
<div>
|
||||||
|
<p class="scroll-m-20 text-2xl font-semibold tracking-tight">Training Reports</p>
|
||||||
|
</div>
|
||||||
<Table>
|
<Table>
|
||||||
<TableHeader>
|
<TableHeader>
|
||||||
<TableRow>
|
<TableRow>
|
||||||
@@ -84,23 +87,23 @@ onMounted(async () => {
|
|||||||
<div class="flex flex-col gap-5">
|
<div class="flex flex-col gap-5">
|
||||||
<!-- {{ focusedTrainingReport }} -->
|
<!-- {{ focusedTrainingReport }} -->
|
||||||
<div>
|
<div>
|
||||||
<label>Trainers</label>
|
<label class="scroll-m-20 text-xl font-semibold tracking-tight">Trainers</label>
|
||||||
<div v-for="person in focusedTrainingTrainers" class="grid grid-cols-4 my-2">
|
<div v-for="person in focusedTrainingTrainers" class="grid grid-cols-4 my-2 items-center">
|
||||||
<p>{{ person.attendee_id }}</p>
|
<p>{{ person.attendee_name }}</p>
|
||||||
<p class="text-right px-5">{{ person.passed }}</p>
|
<p class="text-right px-5">{{ person.passed }}</p>
|
||||||
<p class="bg-muted p-2 rounded-lg min-h-[1lh] col-span-2 text-right">{{ person.remarks }}</p>
|
<p class="bg-muted p-2 rounded-lg min-h-10 col-span-2 text-right">{{ person.remarks }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label>Trainees</label>
|
<label class="scroll-m-20 text-xl font-semibold tracking-tight">Trainees</label>
|
||||||
<div v-for="person in focusedTrainingTrainees" class="grid grid-cols-4 my-2">
|
<div v-for="person in focusedTrainingTrainees" class="grid grid-cols-4 my-2 items-center">
|
||||||
<p>{{ person.attendee_id }}</p>
|
<p>{{ person.attendee_name }}</p>
|
||||||
<p class="text-right px-5">{{ person.passed }}</p>
|
<p class="text-right px-5">{{ person.passed ? "Passed" : "Failed" }}</p>
|
||||||
<p class="bg-muted p-2 rounded-lg min-h-[1lh] col-span-2 text-right">{{ person.remarks }}</p>
|
<p class="bg-muted p-2 rounded-lg min-h-10 col-span-2 text-right">{{ person.remarks }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label>Remarks</label>
|
<label class="scroll-m-20 text-xl font-semibold tracking-tight">Remarks</label>
|
||||||
<p class="bg-muted p-2 rounded-lg min-h-24"> {{ focusedTrainingReport.remarks }}</p>
|
<p class="bg-muted p-2 rounded-lg min-h-24"> {{ focusedTrainingReport.remarks }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user