Round 19: Professional Notebooks, Digital Rewards, GDPR, Role-Based Dashboard, Deep Styling Polish

- Fixed attendance API 403: added TEACHER school membership check
- Fixed competitions API 403: cross-school access, null schoolId, public fallback
- Fixed GDPR export API 500: 16 Prisma field name mismatches
- Enhanced notebooks: page templates (Cornell, Mind Map, Venn, T-Chart, Weekly Planner),
  sticky notes, search, page duplication, sections/chapters, highlighter tool
- Added scratch pad with DrawingCanvas in assessments for hand-written solutions
- Role-based dashboard: TEACHER (competence radar, upcoming lessons),
  STUDENT (grades trend, competitions), PARENT (children grades, calendar),
  SCHOOL_ADMIN (system health, audit log, user management)
- Digital reward system: 16 demo rewards, points earning/redemption,
  categories (streaming, shopping, experiences, merchandise, privileges)
- GDPR compliance: consent management, data retention, cookie consent
- Deep styling polish: glassmorphism, gradient headers, animated sidebar,
  card hover effects, progress bar animations, timeline dots, FAB button
- 160+ new i18n keys (DE/EN)
This commit is contained in:
Mustafa Cetin committed 2026-07-29 16:23:18 +00:00
1 parent 86e4b504e4
commit 6d9b42ac37
43 files changed
+4569 -140

No files matched your search

+22 -19
View File
@@ -55,8 +55,9 @@ export async function GET() {
select: {
id: true,
competencyId: true,
level: true,
comment: true,
masteryLevelValue: true,
note: true,
date: true,
createdAt: true,
updatedAt: true,
},
@@ -83,12 +84,12 @@ export async function GET() {
where: { generatedByUserId: userId },
select: {
id: true,
type: true,
period: true,
status: true,
createdAt: true,
generatedAt: true,
},
take: 200,
orderBy: { createdAt: 'desc' },
orderBy: { generatedAt: 'desc' },
});
// Fetch audit log entries
@@ -97,12 +98,12 @@ export async function GET() {
select: {
id: true,
action: true,
entity: true,
entityType: true,
entityId: true,
createdAt: true,
timestamp: true,
},
take: 200,
orderBy: { createdAt: 'desc' },
orderBy: { timestamp: 'desc' },
});
// Fetch data export requests
@@ -121,7 +122,7 @@ export async function GET() {
// Fetch teacher notes
const teacherNotes = await db.teacherNote.findMany({
where: { userId },
where: { teacherId: userId },
select: {
id: true,
content: true,
@@ -154,7 +155,7 @@ export async function GET() {
type: true,
title: true,
message: true,
read: true,
isRead: true,
createdAt: true,
},
take: 200,
@@ -176,7 +177,7 @@ export async function GET() {
// Fetch homework
const homeworks = await db.homework.findMany({
where: { createdById: userId },
where: { teacherId: userId },
select: {
id: true,
title: true,
@@ -191,13 +192,17 @@ export async function GET() {
let studentData = null;
if (user.role === 'STUDENT') {
const student = await db.student.findFirst({
where: { email: user.email, deletedAt: null },
where: {
firstName: user.firstName,
lastName: user.lastName,
schoolId: user.schoolId ?? undefined,
deletedAt: null,
},
select: {
id: true,
firstName: true,
lastName: true,
dateOfBirth: true,
gender: true,
enrollments: {
select: {
id: true,
@@ -209,8 +214,8 @@ export async function GET() {
learningProgressEntries: {
select: {
id: true,
level: true,
comment: true,
masteryLevelValue: true,
note: true,
createdAt: true,
},
take: 200,
@@ -220,11 +225,9 @@ export async function GET() {
select: {
id: true,
score: true,
comment: true,
createdAt: true,
note: true,
},
take: 200,
orderBy: { createdAt: 'desc' },
},
},
});
@@ -235,7 +238,7 @@ export async function GET() {
let parentLinks = null;
if (user.role === 'PARENT') {
parentLinks = await db.parentStudentLink.findMany({
where: { userId },
where: { parentId: userId },
select: {
id: true,
relationship: true,