Initial commit

This commit is contained in:
ChuXun
2026-01-28 23:56:33 +08:00
commit f98da73376
92 changed files with 8261 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
import React, { useEffect, useState } from 'react';
import { api } from '../lib/api';
import { AttendanceDto, LeaveDto, NotificationDto } from '../types';
export default function Dashboard() {
const [attendance, setAttendance] = useState<AttendanceDto[]>([]);
const [leaves, setLeaves] = useState<LeaveDto[]>([]);
const [notifications, setNotifications] = useState<NotificationDto[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
Promise.all([
api.get<AttendanceDto[]>('/attendance/me'),
api.get<LeaveDto[]>('/leave-requests/my'),
api.get<NotificationDto[]>('/notifications'),
])
.then(([a, l, n]) => {
setAttendance(a);
setLeaves(l);
setNotifications(n);
})
.finally(() => setLoading(false));
}, []);
return (
<div className="page animate-in">
<div className="page-header">
<h1></h1>
<p></p>
</div>
<div className="grid stats">
<div className="card">
<div className="card-title"></div>
<div className="stat">{attendance.length}</div>
<div className="stat-sub"></div>
</div>
<div className="card">
<div className="card-title"></div>
<div className="stat">{leaves.length}</div>
<div className="stat-sub"></div>
</div>
<div className="card">
<div className="card-title"></div>
<div className="stat">{notifications.length}</div>
<div className="stat-sub"></div>
</div>
</div>
<div className="grid cols-2">
<div className="card">
<div className="card-title"></div>
{loading ? (
<div className="muted">...</div>
) : (
<table className="table">
<thead>
<tr>
<th></th>
<th></th>
<th>退</th>
<th></th>
</tr>
</thead>
<tbody>
{attendance.slice(0, 5).map((a) => (
<tr key={a.id}>
<td>{a.date}</td>
<td>{a.checkInTime || '-'}</td>
<td>{a.checkOutTime || '-'}</td>
<td>{a.workHours}</td>
</tr>
))}
</tbody>
</table>
)}
</div>
<div className="card">
<div className="card-title"></div>
<div className="list-stagger">
{notifications.slice(0, 5).map((n) => (
<div key={n.id} className={`list-item ${n.readAt ? 'read' : ''}`}>
<div className="list-title">{n.title}</div>
<div className="list-sub">{n.content}</div>
</div>
))}
</div>
</div>
</div>
</div>
);
}