Skip to content

Commit f6f96af

Browse files
author
“kebean”
committed
implement attendance
1 parent ea1e1e3 commit f6f96af

File tree

5 files changed

+96
-21
lines changed

5 files changed

+96
-21
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/AttendanceCard.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import React from 'react';
2+
import {
3+
UserGroupIcon,
4+
ArrowUpIcon,
5+
ArrowDownIcon,
6+
} from '@heroicons/react/solid';
7+
import { useTranslation } from 'react-i18next';
8+
9+
interface AttendanceCardProps {
10+
user: string;
11+
active: number;
12+
drop: number;
13+
week: number;
14+
phase: string;
15+
attendanceChange: number;
16+
}
17+
18+
function AttendanceCard({
19+
user,
20+
active,
21+
drop,
22+
week,
23+
phase,
24+
attendanceChange,
25+
}: AttendanceCardProps) {
26+
const { t } = useTranslation();
27+
28+
return (
29+
<div className="w-full p-4 md:w-[600px] bg-white shadow-lg rounded-lg flex flex-col md:flex-row items-start md:items-center justify-between">
30+
<div className="flex items-center mb-4 md:mb-0">
31+
<h2 className="text-2xl font-lexend">{user}</h2>
32+
</div>
33+
<div className="flex items-center text-gray-500">
34+
<UserGroupIcon className="w-5 h-5 text-green-600" />
35+
<p className="ml-2">
36+
{t('Active')}: {active}
37+
</p>
38+
<p className="ml-2">|</p>
39+
<p className="ml-2 text-red-500">
40+
{t('Drop')}: {drop}
41+
</p>
42+
</div>
43+
<div>
44+
<p>
45+
{t('Week')} {week} {t('in')} {phase}
46+
</p>
47+
</div>
48+
<div className="flex items-center">
49+
{attendanceChange >= 0 ? (
50+
<ArrowUpIcon className="w-5 h-5 text-green-500" />
51+
) : (
52+
<ArrowDownIcon className="w-5 h-5 text-red-500" />
53+
)}
54+
<p
55+
className={`ml-2 ${
56+
attendanceChange >= 0 ? 'text-green-700' : 'text-red-500'
57+
}`}
58+
>
59+
{attendanceChange}%
60+
</p>
61+
</div>
62+
</div>
63+
);
64+
}
65+
66+
67+
export default AttendanceCard;

src/components/Sidebar.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ function Sidebar({ style, toggle }: { style: string; toggle: () => void }) {
8181
<UserGroupIcon className="w-5" />
8282
</SideNavLink>
8383
</CheckRole>
84+
<CheckRole roles={['admin', 'coordinator']}>
85+
<SideNavLink onClick={toggle} to="/Attendance" name="Attendance">
86+
<UserGroupIcon className="w-5" />
87+
</SideNavLink>
88+
</CheckRole>
8489
{/* INVITATION */}
8590
<CheckRole roles={['admin', 'coordinator']}>
8691
<SideNavLink onClick={toggle} to="/invitation" name="Invitation">

src/containers/DashRoutes.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ function DashRoutes() {
126126
<Route path="/settings" element={<Settings />} />
127127
<Route path="/performance" element={<TraineePerfomance />} />
128128
{/* <Route path="/attendance" element={<TraineeAttendance />} /> */}
129-
<Route path="/attendance" element={<Attendance />} />
129+
<Route path="/attendance" element={<Attendance attendanceData={[]} />} />
130130
<Route path="/attendance-details" element={<AttendanceDetails />} />
131131
<Route path="/teams" element={<AdminTeams />} />
132132
<Route path="/cohorts" element={<AdminCohorts />} />

src/pages/Attendance.tsx

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import React from 'react';
2-
import CheckRole from '../utils/CheckRoles';
2+
import AttendanceCard from '../components/AttendanceCard'
33

4-
const TraineeAttendanceTracker = React.lazy(
5-
() => import('../pages/TraineeAttendance'),
6-
);
7-
const TraineeAttendance = React.lazy(
8-
() => import('../components/TraineeAttendance'),
9-
);
4+
interface AttendanceCardProps {
5+
user: string;
6+
active: number;
7+
drop: number;
8+
week: number;
9+
phase: string;
10+
attendanceChange: number;
11+
}
1012

11-
function Attendance() {
13+
function AttendancePage({ attendanceData }: { attendanceData: AttendanceCardProps[] }) {
1214
return (
13-
<>
14-
<CheckRole roles={['coordinator']}>
15-
<TraineeAttendanceTracker />
16-
</CheckRole>
17-
<CheckRole roles={['trainee']}>
18-
<TraineeAttendance />
19-
</CheckRole>
20-
</>
15+
<div className="min-h-screen bg-gray-50 p-4 md:p-10">
16+
<h1 className="text-3xl font-lexend mb-6">Attendance</h1>
17+
<div className="grid gap-6">
18+
{attendanceData.map((data) => (
19+
<AttendanceCard key={data.user} {...data} />
20+
))}
21+
</div>
22+
</div>
2123
);
2224
}
2325

24-
export default Attendance;
26+
27+
export default AttendancePage;

0 commit comments

Comments
 (0)