Add total user balances stat card to admin dashboard
This commit is contained in:
@@ -16,6 +16,7 @@ export default async function AdminDashboard() {
|
|||||||
homeworkPending,
|
homeworkPending,
|
||||||
homeworkTotal,
|
homeworkTotal,
|
||||||
progressTotal,
|
progressTotal,
|
||||||
|
balanceAggregate,
|
||||||
] = await Promise.all([
|
] = await Promise.all([
|
||||||
prisma.user.count({ where: { role: "student" } }),
|
prisma.user.count({ where: { role: "student" } }),
|
||||||
prisma.user.count({ where: { role: "student", createdAt: { gte: monthAgo } } }),
|
prisma.user.count({ where: { role: "student", createdAt: { gte: monthAgo } } }),
|
||||||
@@ -30,8 +31,11 @@ export default async function AdminDashboard() {
|
|||||||
prisma.homeworkSubmission.count({ where: { feedbacks: { none: {} } } }),
|
prisma.homeworkSubmission.count({ where: { feedbacks: { none: {} } } }),
|
||||||
prisma.homeworkSubmission.count(),
|
prisma.homeworkSubmission.count(),
|
||||||
prisma.lessonProgress.count(),
|
prisma.lessonProgress.count(),
|
||||||
|
prisma.balanceTransaction.aggregate({ _sum: { amount: true } }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const totalBalance = Number(balanceAggregate._sum.amount ?? 0);
|
||||||
|
|
||||||
// Recent enrollments
|
// Recent enrollments
|
||||||
const recentEnrollments = await prisma.courseEnrollment.findMany({
|
const recentEnrollments = await prisma.courseEnrollment.findMany({
|
||||||
orderBy: { enrolledAt: "desc" },
|
orderBy: { enrolledAt: "desc" },
|
||||||
@@ -58,7 +62,7 @@ export default async function AdminDashboard() {
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Stats grid */}
|
{/* Stats grid */}
|
||||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8">
|
<div className="grid grid-cols-2 lg:grid-cols-5 gap-4 mb-8">
|
||||||
<StatCard
|
<StatCard
|
||||||
label="Студентов"
|
label="Студентов"
|
||||||
value={totalStudents}
|
value={totalStudents}
|
||||||
@@ -85,6 +89,12 @@ export default async function AdminDashboard() {
|
|||||||
subAccent={homeworkPending > 0}
|
subAccent={homeworkPending > 0}
|
||||||
href="/curator/homework"
|
href="/curator/homework"
|
||||||
/>
|
/>
|
||||||
|
<StatCard
|
||||||
|
label="На балансах"
|
||||||
|
value={totalBalance.toLocaleString("ru-RU", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + " ₽"}
|
||||||
|
sub="сумма по всем пользователям"
|
||||||
|
href="/admin/users"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid md:grid-cols-2 gap-6">
|
<div className="grid md:grid-cols-2 gap-6">
|
||||||
@@ -179,7 +189,7 @@ function StatCard({
|
|||||||
href,
|
href,
|
||||||
}: {
|
}: {
|
||||||
label: string;
|
label: string;
|
||||||
value: number;
|
value: number | string;
|
||||||
sub?: string;
|
sub?: string;
|
||||||
subAccent?: boolean;
|
subAccent?: boolean;
|
||||||
href?: string;
|
href?: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user