@studious-lms/server 1.23.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/.env.example +0 -1
  2. package/data/curriculum/nepal-cdc-g4-g5/README.md +90 -0
  3. package/data/curriculum/nepal-cdc-g4-g5/manifest.json +97 -0
  4. package/data/curriculum/nepal-cdc-g4-g5/proficiency-scale.json +76 -0
  5. package/data/curriculum/nepal-cdc-g4-g5/subjects/english.json +6936 -0
  6. package/data/curriculum/nepal-cdc-g4-g5/subjects/health-physical-creative-arts.json +3401 -0
  7. package/data/curriculum/nepal-cdc-g4-g5/subjects/mathematics.json +1511 -0
  8. package/data/curriculum/nepal-cdc-g4-g5/subjects/nepali.json +7928 -0
  9. package/data/curriculum/nepal-cdc-g4-g5/subjects/science-technology.json +2420 -0
  10. package/data/curriculum/nepal-cdc-g4-g5/subjects/social-studies.json +2177 -0
  11. package/dist/lib/assignmentTypeDefaults.d.ts +41 -0
  12. package/dist/lib/assignmentTypeDefaults.d.ts.map +1 -0
  13. package/dist/lib/assignmentTypeDefaults.js +167 -0
  14. package/dist/lib/assignmentTypeDefaults.js.map +1 -0
  15. package/dist/lib/config/env.d.ts +0 -8
  16. package/dist/lib/config/env.d.ts.map +1 -1
  17. package/dist/lib/config/env.js +2 -5
  18. package/dist/lib/config/env.js.map +1 -1
  19. package/dist/lib/feePdf.d.ts +19 -0
  20. package/dist/lib/feePdf.d.ts.map +1 -0
  21. package/dist/lib/feePdf.js +167 -0
  22. package/dist/lib/feePdf.js.map +1 -0
  23. package/dist/lib/feePdfFormat.d.ts +4 -0
  24. package/dist/lib/feePdfFormat.d.ts.map +1 -0
  25. package/dist/lib/feePdfFormat.js +16 -0
  26. package/dist/lib/feePdfFormat.js.map +1 -0
  27. package/dist/lib/idCardPdf.d.ts +26 -0
  28. package/dist/lib/idCardPdf.d.ts.map +1 -0
  29. package/dist/lib/idCardPdf.js +272 -0
  30. package/dist/lib/idCardPdf.js.map +1 -0
  31. package/dist/lib/pdfLetterhead.d.ts +41 -0
  32. package/dist/lib/pdfLetterhead.d.ts.map +1 -0
  33. package/dist/lib/pdfLetterhead.js +86 -0
  34. package/dist/lib/pdfLetterhead.js.map +1 -0
  35. package/dist/lib/transcriptPdf.d.ts +55 -0
  36. package/dist/lib/transcriptPdf.d.ts.map +1 -0
  37. package/dist/lib/transcriptPdf.js +303 -0
  38. package/dist/lib/transcriptPdf.js.map +1 -0
  39. package/dist/models/academicCalendar.d.ts +198 -0
  40. package/dist/models/academicCalendar.d.ts.map +1 -0
  41. package/dist/models/academicCalendar.js +106 -0
  42. package/dist/models/academicCalendar.js.map +1 -0
  43. package/dist/models/agenda.d.ts +8 -0
  44. package/dist/models/agenda.d.ts.map +1 -1
  45. package/dist/models/announcement.d.ts +2 -0
  46. package/dist/models/announcement.d.ts.map +1 -1
  47. package/dist/models/assignment.d.ts +66 -0
  48. package/dist/models/assignment.d.ts.map +1 -1
  49. package/dist/models/attendance.d.ts +659 -21
  50. package/dist/models/attendance.d.ts.map +1 -1
  51. package/dist/models/attendance.js +544 -75
  52. package/dist/models/attendance.js.map +1 -1
  53. package/dist/models/auth.d.ts +2 -0
  54. package/dist/models/auth.d.ts.map +1 -1
  55. package/dist/models/class.d.ts +12 -0
  56. package/dist/models/class.d.ts.map +1 -1
  57. package/dist/models/class.js +3 -2
  58. package/dist/models/class.js.map +1 -1
  59. package/dist/models/event.d.ts +16 -0
  60. package/dist/models/event.d.ts.map +1 -1
  61. package/dist/models/fees.d.ts +554 -0
  62. package/dist/models/fees.d.ts.map +1 -0
  63. package/dist/models/fees.js +278 -0
  64. package/dist/models/fees.js.map +1 -0
  65. package/dist/models/file.d.ts +29 -0
  66. package/dist/models/file.d.ts.map +1 -1
  67. package/dist/models/folder.d.ts +2 -0
  68. package/dist/models/folder.d.ts.map +1 -1
  69. package/dist/models/labChat.d.ts +2 -0
  70. package/dist/models/labChat.d.ts.map +1 -1
  71. package/dist/models/marketplace.d.ts +178 -0
  72. package/dist/models/marketplace.d.ts.map +1 -0
  73. package/dist/models/marketplace.js +115 -0
  74. package/dist/models/marketplace.js.map +1 -0
  75. package/dist/models/moduleItem.d.ts +304 -0
  76. package/dist/models/moduleItem.d.ts.map +1 -0
  77. package/dist/models/moduleItem.js +78 -0
  78. package/dist/models/moduleItem.js.map +1 -0
  79. package/dist/models/newtonChat.d.ts +1 -0
  80. package/dist/models/newtonChat.d.ts.map +1 -1
  81. package/dist/models/school.d.ts +18 -0
  82. package/dist/models/school.d.ts.map +1 -1
  83. package/dist/models/school.js +7 -2
  84. package/dist/models/school.js.map +1 -1
  85. package/dist/models/section.d.ts +4 -0
  86. package/dist/models/section.d.ts.map +1 -1
  87. package/dist/models/worksheet.d.ts +19 -0
  88. package/dist/models/worksheet.d.ts.map +1 -1
  89. package/dist/models/worksheet.js +2 -2
  90. package/dist/models/worksheet.js.map +1 -1
  91. package/dist/routers/_app.d.ts +11341 -7097
  92. package/dist/routers/_app.d.ts.map +1 -1
  93. package/dist/routers/_app.js +12 -2
  94. package/dist/routers/_app.js.map +1 -1
  95. package/dist/routers/academicCalendar.d.ts +229 -0
  96. package/dist/routers/academicCalendar.d.ts.map +1 -0
  97. package/dist/routers/academicCalendar.js +75 -0
  98. package/dist/routers/academicCalendar.js.map +1 -0
  99. package/dist/routers/admin.d.ts +2 -0
  100. package/dist/routers/admin.d.ts.map +1 -1
  101. package/dist/routers/agenda.d.ts +8 -0
  102. package/dist/routers/agenda.d.ts.map +1 -1
  103. package/dist/routers/assignment.d.ts +75 -0
  104. package/dist/routers/assignment.d.ts.map +1 -1
  105. package/dist/routers/assignment.js +10 -2
  106. package/dist/routers/assignment.js.map +1 -1
  107. package/dist/routers/attendance.d.ts +103 -0
  108. package/dist/routers/attendance.d.ts.map +1 -1
  109. package/dist/routers/attendance.js +8 -5
  110. package/dist/routers/attendance.js.map +1 -1
  111. package/dist/routers/class.d.ts +27 -0
  112. package/dist/routers/class.d.ts.map +1 -1
  113. package/dist/routers/class.js +6 -2
  114. package/dist/routers/class.js.map +1 -1
  115. package/dist/routers/event.d.ts +8 -0
  116. package/dist/routers/event.d.ts.map +1 -1
  117. package/dist/routers/fees.d.ts +513 -0
  118. package/dist/routers/fees.d.ts.map +1 -0
  119. package/dist/routers/fees.js +88 -0
  120. package/dist/routers/fees.js.map +1 -0
  121. package/dist/routers/file.d.ts +2 -0
  122. package/dist/routers/file.d.ts.map +1 -1
  123. package/dist/routers/gradebook.d.ts +4 -1
  124. package/dist/routers/gradebook.d.ts.map +1 -1
  125. package/dist/routers/marketplace.d.ts +371 -0
  126. package/dist/routers/marketplace.d.ts.map +1 -0
  127. package/dist/routers/marketplace.js +87 -0
  128. package/dist/routers/marketplace.js.map +1 -0
  129. package/dist/routers/moduleItem.d.ts +263 -0
  130. package/dist/routers/moduleItem.d.ts.map +1 -0
  131. package/dist/routers/moduleItem.js +60 -0
  132. package/dist/routers/moduleItem.js.map +1 -0
  133. package/dist/routers/parent.d.ts +169 -0
  134. package/dist/routers/parent.d.ts.map +1 -0
  135. package/dist/routers/parent.js +49 -0
  136. package/dist/routers/parent.js.map +1 -0
  137. package/dist/routers/school.d.ts +363 -7
  138. package/dist/routers/school.d.ts.map +1 -1
  139. package/dist/routers/school.js +100 -3
  140. package/dist/routers/school.js.map +1 -1
  141. package/dist/routers/worksheet.d.ts +27 -0
  142. package/dist/routers/worksheet.d.ts.map +1 -1
  143. package/dist/routers/worksheet.js +10 -3
  144. package/dist/routers/worksheet.js.map +1 -1
  145. package/dist/services/academicCalendar.d.ts +173 -0
  146. package/dist/services/academicCalendar.d.ts.map +1 -0
  147. package/dist/services/academicCalendar.js +214 -0
  148. package/dist/services/academicCalendar.js.map +1 -0
  149. package/dist/services/adminInstitution.d.ts +2 -0
  150. package/dist/services/adminInstitution.d.ts.map +1 -1
  151. package/dist/services/agenda.d.ts +8 -0
  152. package/dist/services/agenda.d.ts.map +1 -1
  153. package/dist/services/assignment.d.ts +75 -0
  154. package/dist/services/assignment.d.ts.map +1 -1
  155. package/dist/services/assignment.js +91 -12
  156. package/dist/services/assignment.js.map +1 -1
  157. package/dist/services/attendance.d.ts +323 -10
  158. package/dist/services/attendance.d.ts.map +1 -1
  159. package/dist/services/attendance.js +385 -25
  160. package/dist/services/attendance.js.map +1 -1
  161. package/dist/services/attendanceMerge.d.ts +53 -0
  162. package/dist/services/attendanceMerge.d.ts.map +1 -0
  163. package/dist/services/attendanceMerge.js +87 -0
  164. package/dist/services/attendanceMerge.js.map +1 -0
  165. package/dist/services/attendanceRate.d.ts +24 -0
  166. package/dist/services/attendanceRate.d.ts.map +1 -0
  167. package/dist/services/attendanceRate.js +31 -0
  168. package/dist/services/attendanceRate.js.map +1 -0
  169. package/dist/services/attendanceStats.d.ts +22 -0
  170. package/dist/services/attendanceStats.d.ts.map +1 -0
  171. package/dist/services/attendanceStats.js +45 -0
  172. package/dist/services/attendanceStats.js.map +1 -0
  173. package/dist/services/class.d.ts +27 -0
  174. package/dist/services/class.d.ts.map +1 -1
  175. package/dist/services/class.js +26 -3
  176. package/dist/services/class.js.map +1 -1
  177. package/dist/services/event.d.ts +8 -0
  178. package/dist/services/event.d.ts.map +1 -1
  179. package/dist/services/fees.d.ts +422 -0
  180. package/dist/services/fees.d.ts.map +1 -0
  181. package/dist/services/fees.js +310 -0
  182. package/dist/services/fees.js.map +1 -0
  183. package/dist/services/feesAuthz.d.ts +49 -0
  184. package/dist/services/feesAuthz.d.ts.map +1 -0
  185. package/dist/services/feesAuthz.js +52 -0
  186. package/dist/services/feesAuthz.js.map +1 -0
  187. package/dist/services/file.d.ts +4 -0
  188. package/dist/services/file.d.ts.map +1 -1
  189. package/dist/services/gradebook.d.ts +18 -1
  190. package/dist/services/gradebook.d.ts.map +1 -1
  191. package/dist/services/gradebook.js +57 -2
  192. package/dist/services/gradebook.js.map +1 -1
  193. package/dist/services/idCard.d.ts +11 -0
  194. package/dist/services/idCard.d.ts.map +1 -0
  195. package/dist/services/idCard.js +122 -0
  196. package/dist/services/idCard.js.map +1 -0
  197. package/dist/services/marketplace.d.ts +301 -0
  198. package/dist/services/marketplace.d.ts.map +1 -0
  199. package/dist/services/marketplace.js +628 -0
  200. package/dist/services/marketplace.js.map +1 -0
  201. package/dist/services/moduleItem.d.ts +196 -0
  202. package/dist/services/moduleItem.d.ts.map +1 -0
  203. package/dist/services/moduleItem.js +188 -0
  204. package/dist/services/moduleItem.js.map +1 -0
  205. package/dist/services/notification.d.ts +58 -0
  206. package/dist/services/notification.d.ts.map +1 -1
  207. package/dist/services/notification.js +30 -2
  208. package/dist/services/notification.js.map +1 -1
  209. package/dist/services/parentPortal.d.ts +133 -0
  210. package/dist/services/parentPortal.d.ts.map +1 -0
  211. package/dist/services/parentPortal.js +328 -0
  212. package/dist/services/parentPortal.js.map +1 -0
  213. package/dist/services/school.d.ts +28 -3
  214. package/dist/services/school.d.ts.map +1 -1
  215. package/dist/services/school.js +65 -45
  216. package/dist/services/school.js.map +1 -1
  217. package/dist/services/studentImport.d.ts +34 -0
  218. package/dist/services/studentImport.d.ts.map +1 -0
  219. package/dist/services/studentImport.js +236 -0
  220. package/dist/services/studentImport.js.map +1 -0
  221. package/dist/services/transcript.d.ts +61 -0
  222. package/dist/services/transcript.d.ts.map +1 -0
  223. package/dist/services/transcript.js +243 -0
  224. package/dist/services/transcript.js.map +1 -0
  225. package/dist/services/worksheet.d.ts +22 -0
  226. package/dist/services/worksheet.d.ts.map +1 -1
  227. package/dist/services/worksheet.js +94 -2
  228. package/dist/services/worksheet.js.map +1 -1
  229. package/dist/trpc.d.ts +1 -1
  230. package/dist/trpc.d.ts.map +1 -1
  231. package/dist/trpc.js +5 -5
  232. package/dist/trpc.js.map +1 -1
  233. package/dist/utils/adminPanelAccess.d.ts +4 -5
  234. package/dist/utils/adminPanelAccess.d.ts.map +1 -1
  235. package/dist/utils/adminPanelAccess.js +12 -34
  236. package/dist/utils/adminPanelAccess.js.map +1 -1
  237. package/package.json +2 -1
  238. package/prisma/migrations/20260804120000_add_attendance_records_and_excusals/migration.sql +114 -0
  239. package/prisma/migrations/20260804120100_add_fee_plans_invoices_payments/migration.sql +101 -0
  240. package/prisma/migrations/20260804120200_add_marketplace_listings/migration.sql +54 -0
  241. package/prisma/migrations/20260804120300_content_platform_b3_b9/migration.sql +63 -0
  242. package/prisma/migrations/20260804120400_c_academic_ops/migration.sql +77 -0
  243. package/prisma/schema.prisma +371 -11
  244. package/scripts/import-nepal-cdc-curriculum.ts +379 -0
  245. package/src/lib/assignmentTypeDefaults.ts +222 -0
  246. package/src/lib/config/env.ts +0 -3
  247. package/src/lib/feePdf.ts +199 -0
  248. package/src/lib/feePdfFormat.ts +14 -0
  249. package/src/lib/idCardPdf.ts +336 -0
  250. package/src/lib/pdfLetterhead.ts +124 -0
  251. package/src/lib/transcriptPdf.ts +502 -0
  252. package/src/models/academicCalendar.ts +139 -0
  253. package/src/models/attendance.ts +704 -73
  254. package/src/models/class.ts +1 -0
  255. package/src/models/fees.ts +349 -0
  256. package/src/models/marketplace.ts +158 -0
  257. package/src/models/moduleItem.ts +107 -0
  258. package/src/models/school.ts +6 -0
  259. package/src/models/worksheet.ts +2 -0
  260. package/src/routers/_app.ts +10 -0
  261. package/src/routers/academicCalendar.ts +103 -0
  262. package/src/routers/assignment.ts +8 -0
  263. package/src/routers/attendance.ts +7 -3
  264. package/src/routers/class.ts +4 -0
  265. package/src/routers/fees.ts +126 -0
  266. package/src/routers/marketplace.ts +134 -0
  267. package/src/routers/moduleItem.ts +89 -0
  268. package/src/routers/parent.ts +68 -0
  269. package/src/routers/school.ts +139 -1
  270. package/src/routers/worksheet.ts +11 -0
  271. package/src/services/academicCalendar.ts +299 -0
  272. package/src/services/assignment.ts +122 -12
  273. package/src/services/attendance.ts +548 -26
  274. package/src/services/attendanceMerge.ts +139 -0
  275. package/src/services/attendanceRate.ts +41 -0
  276. package/src/services/attendanceStats.ts +63 -0
  277. package/src/services/class.ts +25 -1
  278. package/src/services/fees.ts +424 -0
  279. package/src/services/feesAuthz.ts +77 -0
  280. package/src/services/gradebook.ts +70 -0
  281. package/src/services/idCard.ts +147 -0
  282. package/src/services/marketplace.ts +785 -0
  283. package/src/services/moduleItem.ts +274 -0
  284. package/src/services/notification.ts +43 -0
  285. package/src/services/parentPortal.ts +380 -0
  286. package/src/services/school.ts +65 -44
  287. package/src/services/studentImport.ts +273 -0
  288. package/src/services/transcript.ts +313 -0
  289. package/src/services/worksheet.ts +111 -0
  290. package/src/trpc.ts +3 -3
  291. package/src/utils/adminPanelAccess.ts +12 -35
  292. package/tests/unit/assignmentTypeDefaults.test.ts +52 -0
  293. package/tests/unit/lib/feePdf.test.ts +15 -0
  294. package/tests/unit/lib/idCardPdf.test.ts +40 -0
  295. package/tests/unit/lib/transcriptPdf.test.ts +111 -0
  296. package/tests/unit/services/attendanceMerge.test.ts +90 -0
  297. package/tests/unit/services/attendanceRate.test.ts +38 -0
  298. package/tests/unit/services/attendanceStats.test.ts +54 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Build present/late/absent/excused lists + per-student records.
3
+ * Active excusal locks always win (status EXCUSED + excusedByExcusalId set).
4
+ */
5
+
6
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6e1acd0c-2620-5bd7-a02a-abc12a114aeb")}catch(e){}}();
7
+ export function mergeAttendanceUpdateWithLocks(input) {
8
+ const lockByStudent = new Map(input.locks.map((lock) => [lock.studentId, lock]));
9
+ const lockedStudentIds = [...lockByStudent.keys()];
10
+ const stripLocked = (students) => students.filter((s) => !lockByStudent.has(s.id));
11
+ const presentIds = stripLocked(input.present).map((s) => s.id);
12
+ const lateIds = stripLocked(input.late).map((s) => s.id);
13
+ const absentIds = stripLocked(input.absent).map((s) => s.id);
14
+ const manualExcusedIds = stripLocked(input.excused ?? []).map((s) => s.id);
15
+ const excusedIds = [...new Set([...manualExcusedIds, ...lockedStudentIds])];
16
+ const records = [];
17
+ for (const studentId of presentIds) {
18
+ records.push({
19
+ studentId,
20
+ status: "PRESENT",
21
+ updatedById: input.updatedById,
22
+ });
23
+ }
24
+ for (const studentId of lateIds) {
25
+ records.push({
26
+ studentId,
27
+ status: "LATE",
28
+ updatedById: input.updatedById,
29
+ });
30
+ }
31
+ for (const studentId of absentIds) {
32
+ records.push({
33
+ studentId,
34
+ status: "ABSENT",
35
+ updatedById: input.updatedById,
36
+ });
37
+ }
38
+ for (const studentId of manualExcusedIds) {
39
+ records.push({
40
+ studentId,
41
+ status: "EXCUSED",
42
+ excusedByExcusalId: null,
43
+ updatedById: input.updatedById,
44
+ });
45
+ }
46
+ for (const lock of input.locks) {
47
+ records.push({
48
+ studentId: lock.studentId,
49
+ status: "EXCUSED",
50
+ note: input.existingNotesByStudentId?.get(lock.studentId) ?? lock.note ?? null,
51
+ excusedByExcusalId: lock.excusalId,
52
+ updatedById: input.updatedById,
53
+ });
54
+ }
55
+ return {
56
+ presentIds,
57
+ lateIds,
58
+ absentIds,
59
+ excusedIds,
60
+ records,
61
+ lockedStudentIds,
62
+ };
63
+ }
64
+ /** Map active excusals (with student join rows) to per-student locks. */
65
+ export function buildExcusalLocks(excusals, studentIds) {
66
+ const allow = studentIds === undefined ? null : new Set(studentIds);
67
+ const locks = [];
68
+ const seen = new Set();
69
+ for (const excusal of excusals) {
70
+ for (const row of excusal.students) {
71
+ if (allow && !allow.has(row.studentId))
72
+ continue;
73
+ if (seen.has(row.studentId))
74
+ continue;
75
+ seen.add(row.studentId);
76
+ locks.push({
77
+ studentId: row.studentId,
78
+ excusalId: excusal.id,
79
+ reason: excusal.reason,
80
+ note: excusal.note,
81
+ });
82
+ }
83
+ }
84
+ return locks;
85
+ }
86
+ //# sourceMappingURL=attendanceMerge.js.map
87
+ //# debugId=6e1acd0c-2620-5bd7-a02a-abc12a114aeb
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendanceMerge.js","sources":["services/attendanceMerge.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Pure helpers for merging teacher attendance updates with excusal locks.\n */\nimport type { AttendanceStatus } from \"@prisma/client\";\n\nexport type StudentRef = { id: string; username: string };\n\nexport type AttendanceLock = {\n studentId: string;\n excusalId: string;\n reason?: string | null;\n note?: string | null;\n};\n\nexport type MergedAttendanceUpdate = {\n presentIds: string[];\n lateIds: string[];\n absentIds: string[];\n excusedIds: string[];\n records: Array<{\n studentId: string;\n status: AttendanceStatus;\n note?: string | null;\n excusedByExcusalId?: string | null;\n updatedById?: string | null;\n }>;\n /** Students whose status was forced to EXCUSED by an active excusal. */\n lockedStudentIds: string[];\n};\n\n/**\n * Build present/late/absent/excused lists + per-student records.\n * Active excusal locks always win (status EXCUSED + excusedByExcusalId set).\n */\nexport function mergeAttendanceUpdateWithLocks(input: {\n present: StudentRef[];\n late: StudentRef[];\n absent: StudentRef[];\n excused?: StudentRef[];\n locks: AttendanceLock[];\n updatedById?: string | null;\n /** Preserve notes for locked students when available. */\n existingNotesByStudentId?: Map<string, string | null | undefined>;\n}): MergedAttendanceUpdate {\n const lockByStudent = new Map(input.locks.map((lock) => [lock.studentId, lock]));\n const lockedStudentIds = [...lockByStudent.keys()];\n\n const stripLocked = (students: StudentRef[]) =>\n students.filter((s) => !lockByStudent.has(s.id));\n\n const presentIds = stripLocked(input.present).map((s) => s.id);\n const lateIds = stripLocked(input.late).map((s) => s.id);\n const absentIds = stripLocked(input.absent).map((s) => s.id);\n const manualExcusedIds = stripLocked(input.excused ?? []).map((s) => s.id);\n const excusedIds = [...new Set([...manualExcusedIds, ...lockedStudentIds])];\n\n const records: MergedAttendanceUpdate[\"records\"] = [];\n\n for (const studentId of presentIds) {\n records.push({\n studentId,\n status: \"PRESENT\",\n updatedById: input.updatedById,\n });\n }\n for (const studentId of lateIds) {\n records.push({\n studentId,\n status: \"LATE\",\n updatedById: input.updatedById,\n });\n }\n for (const studentId of absentIds) {\n records.push({\n studentId,\n status: \"ABSENT\",\n updatedById: input.updatedById,\n });\n }\n for (const studentId of manualExcusedIds) {\n records.push({\n studentId,\n status: \"EXCUSED\",\n excusedByExcusalId: null,\n updatedById: input.updatedById,\n });\n }\n for (const lock of input.locks) {\n records.push({\n studentId: lock.studentId,\n status: \"EXCUSED\",\n note:\n input.existingNotesByStudentId?.get(lock.studentId) ?? lock.note ?? null,\n excusedByExcusalId: lock.excusalId,\n updatedById: input.updatedById,\n });\n }\n\n return {\n presentIds,\n lateIds,\n absentIds,\n excusedIds,\n records,\n lockedStudentIds,\n };\n}\n\n/** Map active excusals (with student join rows) to per-student locks. */\nexport function buildExcusalLocks(\n excusals: Array<{\n id: string;\n reason?: string | null;\n note?: string | null;\n students: Array<{ studentId: string }>;\n }>,\n studentIds?: Iterable<string>\n): AttendanceLock[] {\n const allow =\n studentIds === undefined ? null : new Set(studentIds);\n const locks: AttendanceLock[] = [];\n const seen = new Set<string>();\n\n for (const excusal of excusals) {\n for (const row of excusal.students) {\n if (allow && !allow.has(row.studentId)) continue;\n if (seen.has(row.studentId)) continue;\n seen.add(row.studentId);\n locks.push({\n studentId: row.studentId,\n excusalId: excusal.id,\n reason: excusal.reason,\n note: excusal.note,\n });\n }\n }\n\n return locks;\n}\n"],"names":[],"mappings":"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","debug_id":"6e1acd0c-2620-5bd7-a02a-abc12a114aeb"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Attendance rate helpers for transcripts / progress reports.
3
+ *
4
+ * Reads the current Attendance M2M shape only (present / late / absent).
5
+ * Do NOT write Attendance schema here — A1 may introduce EXCUSED /
6
+ * AttendanceRecord; keep rate logic in this one place so A1 can extend it.
7
+ */
8
+ export type AttendanceStatus = "PRESENT" | "LATE" | "ABSENT";
9
+ export interface AttendanceRateSummary {
10
+ present: number;
11
+ late: number;
12
+ absent: number;
13
+ total: number;
14
+ /** (present + late) / total * 100, or null when total is 0. */
15
+ percent: number | null;
16
+ }
17
+ /**
18
+ * Computes attendance counts and rate from shaped status records.
19
+ * Late counts toward attendance (present for rate purposes).
20
+ */
21
+ export declare function computeAttendanceRate(records: {
22
+ status: AttendanceStatus;
23
+ }[]): AttendanceRateSummary;
24
+ //# sourceMappingURL=attendanceRate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendanceRate.d.ts","sourceRoot":"/","sources":["services/attendanceRate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,EAAE,GACtC,qBAAqB,CAevB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Attendance rate helpers for transcripts / progress reports.
3
+ *
4
+ * Reads the current Attendance M2M shape only (present / late / absent).
5
+ * Do NOT write Attendance schema here — A1 may introduce EXCUSED /
6
+ * AttendanceRecord; keep rate logic in this one place so A1 can extend it.
7
+ */
8
+ /**
9
+ * Computes attendance counts and rate from shaped status records.
10
+ * Late counts toward attendance (present for rate purposes).
11
+ */
12
+
13
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3b5d6840-42f1-543a-8bb1-66c2b53ea1ac")}catch(e){}}();
14
+ export function computeAttendanceRate(records) {
15
+ let present = 0;
16
+ let late = 0;
17
+ let absent = 0;
18
+ for (const record of records) {
19
+ if (record.status === "PRESENT")
20
+ present += 1;
21
+ else if (record.status === "LATE")
22
+ late += 1;
23
+ else if (record.status === "ABSENT")
24
+ absent += 1;
25
+ }
26
+ const total = present + late + absent;
27
+ const percent = total === 0 ? null : ((present + late) / total) * 100;
28
+ return { present, late, absent, total, percent };
29
+ }
30
+ //# sourceMappingURL=attendanceRate.js.map
31
+ //# debugId=3b5d6840-42f1-543a-8bb1-66c2b53ea1ac
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendanceRate.js","sources":["services/attendanceRate.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Attendance rate helpers for transcripts / progress reports.\n *\n * Reads the current Attendance M2M shape only (present / late / absent).\n * Do NOT write Attendance schema here — A1 may introduce EXCUSED /\n * AttendanceRecord; keep rate logic in this one place so A1 can extend it.\n */\n\nexport type AttendanceStatus = \"PRESENT\" | \"LATE\" | \"ABSENT\";\n\nexport interface AttendanceRateSummary {\n present: number;\n late: number;\n absent: number;\n total: number;\n /** (present + late) / total * 100, or null when total is 0. */\n percent: number | null;\n}\n\n/**\n * Computes attendance counts and rate from shaped status records.\n * Late counts toward attendance (present for rate purposes).\n */\nexport function computeAttendanceRate(\n records: { status: AttendanceStatus }[]\n): AttendanceRateSummary {\n let present = 0;\n let late = 0;\n let absent = 0;\n\n for (const record of records) {\n if (record.status === \"PRESENT\") present += 1;\n else if (record.status === \"LATE\") late += 1;\n else if (record.status === \"ABSENT\") absent += 1;\n }\n\n const total = present + late + absent;\n const percent = total === 0 ? null : ((present + late) / total) * 100;\n\n return { present, late, absent, total, percent };\n}\n"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;;GAGG;;;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAuC;IAEvC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,CAAC;aACzC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,IAAI,IAAI,CAAC,CAAC;aACxC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;IAEtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC","debug_id":"3b5d6840-42f1-543a-8bb1-66c2b53ea1ac"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Pure attendance percentage helpers.
3
+ * EXCUSED days are excluded from both numerator and denominator.
4
+ */
5
+ import type { AttendanceStatus } from "@prisma/client";
6
+ export type AttendanceStatusCount = {
7
+ present: number;
8
+ late: number;
9
+ absent: number;
10
+ excused: number;
11
+ };
12
+ export declare function emptyAttendanceCounts(): AttendanceStatusCount;
13
+ export declare function tallyAttendanceStatuses(statuses: Iterable<AttendanceStatus | string>): AttendanceStatusCount;
14
+ /**
15
+ * Attendance rate as a percentage.
16
+ * Formula: (present + late) / (present + late + absent) * 100
17
+ * Excused records are ignored entirely.
18
+ * Returns null when there are no countable (non-excused) records.
19
+ */
20
+ export declare function computeAttendancePercentage(counts: Pick<AttendanceStatusCount, "present" | "late" | "absent">): number | null;
21
+ export declare function computeAttendancePercentageFromStatuses(statuses: Iterable<AttendanceStatus | string>): number | null;
22
+ //# sourceMappingURL=attendanceStats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendanceStats.d.ts","sourceRoot":"/","sources":["services/attendanceStats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,qBAAqB,CAE7D;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAC5C,qBAAqB,CAqBvB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC,GACjE,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,uCAAuC,CACrD,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAC5C,MAAM,GAAG,IAAI,CAEf"}
@@ -0,0 +1,45 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="06540105-70ee-5c9c-b347-8a5eed8f020d")}catch(e){}}();
3
+ export function emptyAttendanceCounts() {
4
+ return { present: 0, late: 0, absent: 0, excused: 0 };
5
+ }
6
+ export function tallyAttendanceStatuses(statuses) {
7
+ const counts = emptyAttendanceCounts();
8
+ for (const status of statuses) {
9
+ switch (status) {
10
+ case "PRESENT":
11
+ counts.present += 1;
12
+ break;
13
+ case "LATE":
14
+ counts.late += 1;
15
+ break;
16
+ case "ABSENT":
17
+ counts.absent += 1;
18
+ break;
19
+ case "EXCUSED":
20
+ counts.excused += 1;
21
+ break;
22
+ default:
23
+ break;
24
+ }
25
+ }
26
+ return counts;
27
+ }
28
+ /**
29
+ * Attendance rate as a percentage.
30
+ * Formula: (present + late) / (present + late + absent) * 100
31
+ * Excused records are ignored entirely.
32
+ * Returns null when there are no countable (non-excused) records.
33
+ */
34
+ export function computeAttendancePercentage(counts) {
35
+ const countable = counts.present + counts.late + counts.absent;
36
+ if (countable === 0) {
37
+ return null;
38
+ }
39
+ return ((counts.present + counts.late) / countable) * 100;
40
+ }
41
+ export function computeAttendancePercentageFromStatuses(statuses) {
42
+ return computeAttendancePercentage(tallyAttendanceStatuses(statuses));
43
+ }
44
+ //# sourceMappingURL=attendanceStats.js.map
45
+ //# debugId=06540105-70ee-5c9c-b347-8a5eed8f020d
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendanceStats.js","sources":["services/attendanceStats.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Pure attendance percentage helpers.\n * EXCUSED days are excluded from both numerator and denominator.\n */\nimport type { AttendanceStatus } from \"@prisma/client\";\n\nexport type AttendanceStatusCount = {\n present: number;\n late: number;\n absent: number;\n excused: number;\n};\n\nexport function emptyAttendanceCounts(): AttendanceStatusCount {\n return { present: 0, late: 0, absent: 0, excused: 0 };\n}\n\nexport function tallyAttendanceStatuses(\n statuses: Iterable<AttendanceStatus | string>\n): AttendanceStatusCount {\n const counts = emptyAttendanceCounts();\n for (const status of statuses) {\n switch (status) {\n case \"PRESENT\":\n counts.present += 1;\n break;\n case \"LATE\":\n counts.late += 1;\n break;\n case \"ABSENT\":\n counts.absent += 1;\n break;\n case \"EXCUSED\":\n counts.excused += 1;\n break;\n default:\n break;\n }\n }\n return counts;\n}\n\n/**\n * Attendance rate as a percentage.\n * Formula: (present + late) / (present + late + absent) * 100\n * Excused records are ignored entirely.\n * Returns null when there are no countable (non-excused) records.\n */\nexport function computeAttendancePercentage(\n counts: Pick<AttendanceStatusCount, \"present\" | \"late\" | \"absent\">\n): number | null {\n const countable = counts.present + counts.late + counts.absent;\n if (countable === 0) {\n return null;\n }\n return ((counts.present + counts.late) / countable) * 100;\n}\n\nexport function computeAttendancePercentageFromStatuses(\n statuses: Iterable<AttendanceStatus | string>\n): number | null {\n return computeAttendancePercentage(tallyAttendanceStatuses(statuses));\n}\n"],"names":[],"mappings":";;AAaA,MAAM,UAAU,qBAAqB;IACnC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAA6C;IAE7C,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,SAAS;gBACZ,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;gBACpB,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;gBACjB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;gBACnB,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;gBACpB,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAkE;IAElE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/D,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,QAA6C;IAE7C,OAAO,2BAA2B,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxE,CAAC","debug_id":"06540105-70ee-5c9c-b347-8a5eed8f020d"}
@@ -226,6 +226,7 @@ export declare function getClass(userId: string, classId: string): Promise<{
226
226
  discussionsEnabled: boolean;
227
227
  studentsCanCreateDiscussions: boolean;
228
228
  studentsCanReply: boolean;
229
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
229
230
  treatMissingAsZero: boolean;
230
231
  gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
231
232
  };
@@ -240,18 +241,24 @@ export declare function updateClass(classId: string, data: {
240
241
  discussionsEnabled?: boolean;
241
242
  studentsCanCreateDiscussions?: boolean;
242
243
  studentsCanReply?: boolean;
244
+ sidebarFeatures?: Record<string, boolean> | null;
243
245
  }): Promise<{
244
246
  updatedClass: {
245
247
  symbol: string | null;
246
248
  section: string;
247
249
  id: string;
248
250
  name: string;
251
+ schoolId: string | null;
249
252
  color: string | null;
250
253
  subject: string;
254
+ syllabus: string | null;
251
255
  departmentId: string | null;
252
256
  discussionsEnabled: boolean;
253
257
  studentsCanCreateDiscussions: boolean;
254
258
  studentsCanReply: boolean;
259
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
260
+ treatMissingAsZero: boolean;
261
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
255
262
  };
256
263
  }>;
257
264
  export declare function createClass(userId: string, input: {
@@ -298,6 +305,7 @@ export declare function createClass(userId: string, input: {
298
305
  discussionsEnabled: boolean;
299
306
  studentsCanCreateDiscussions: boolean;
300
307
  studentsCanReply: boolean;
308
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
301
309
  treatMissingAsZero: boolean;
302
310
  gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
303
311
  }>;
@@ -332,6 +340,7 @@ export declare function changeRole(classId: string, userId: string, type: "teach
332
340
  discussionsEnabled: boolean;
333
341
  studentsCanCreateDiscussions: boolean;
334
342
  studentsCanReply: boolean;
343
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
335
344
  treatMissingAsZero: boolean;
336
345
  gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
337
346
  };
@@ -355,6 +364,7 @@ export declare function removeMember(classId: string, userId: string): Promise<{
355
364
  discussionsEnabled: boolean;
356
365
  studentsCanCreateDiscussions: boolean;
357
366
  studentsCanReply: boolean;
367
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
358
368
  treatMissingAsZero: boolean;
359
369
  gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
360
370
  };
@@ -529,6 +539,7 @@ export declare function updateSyllabus(classId: string, contents: string): Promi
529
539
  discussionsEnabled: boolean;
530
540
  studentsCanCreateDiscussions: boolean;
531
541
  studentsCanReply: boolean;
542
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
532
543
  treatMissingAsZero: boolean;
533
544
  gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
534
545
  }>;
@@ -558,6 +569,9 @@ export declare function listLabDrafts(classId: string, teacherId: string): Promi
558
569
  order: number | null;
559
570
  gradingBoundaryId: string | null;
560
571
  gradeCategoryId: string | null;
572
+ timeLimitMinutes: number | null;
573
+ singleAttempt: boolean;
574
+ allowLateSubmissions: boolean;
561
575
  }[]>;
562
576
  export declare function createLabDraft(classId: string, teacherId: string, input: {
563
577
  title: string;
@@ -596,6 +610,9 @@ export declare function createLabDraft(classId: string, teacherId: string, input
596
610
  order: number | null;
597
611
  gradingBoundaryId: string | null;
598
612
  gradeCategoryId: string | null;
613
+ timeLimitMinutes: number | null;
614
+ singleAttempt: boolean;
615
+ allowLateSubmissions: boolean;
599
616
  }>;
600
617
  export declare function updateLabDraft(classId: string, teacherId: string, draftId: string, input: Record<string, unknown>): Promise<{
601
618
  type: import(".prisma/client").$Enums.AssignmentType;
@@ -623,6 +640,9 @@ export declare function updateLabDraft(classId: string, teacherId: string, draft
623
640
  order: number | null;
624
641
  gradingBoundaryId: string | null;
625
642
  gradeCategoryId: string | null;
643
+ timeLimitMinutes: number | null;
644
+ singleAttempt: boolean;
645
+ allowLateSubmissions: boolean;
626
646
  }>;
627
647
  export declare function deleteLabDraft(classId: string, teacherId: string, draftId: string): Promise<{
628
648
  type: import(".prisma/client").$Enums.AssignmentType;
@@ -650,6 +670,9 @@ export declare function deleteLabDraft(classId: string, teacherId: string, draft
650
670
  order: number | null;
651
671
  gradingBoundaryId: string | null;
652
672
  gradeCategoryId: string | null;
673
+ timeLimitMinutes: number | null;
674
+ singleAttempt: boolean;
675
+ allowLateSubmissions: boolean;
653
676
  }>;
654
677
  export declare function publishLabDraft(classId: string, teacherId: string, draftId: string, input: {
655
678
  dueDate?: Date;
@@ -682,6 +705,9 @@ export declare function publishLabDraft(classId: string, teacherId: string, draf
682
705
  order: number | null;
683
706
  gradingBoundaryId: string | null;
684
707
  gradeCategoryId: string | null;
708
+ timeLimitMinutes: number | null;
709
+ singleAttempt: boolean;
710
+ allowLateSubmissions: boolean;
685
711
  }>;
686
712
  export declare function getFiles(classId: string): Promise<{
687
713
  id: string;
@@ -819,6 +845,7 @@ export declare function exportClass(classId: string, userId: string): Promise<{
819
845
  discussionsEnabled: boolean;
820
846
  studentsCanCreateDiscussions: boolean;
821
847
  studentsCanReply: boolean;
848
+ sidebarFeatures: import("@prisma/client/runtime/library.js").JsonValue | null;
822
849
  treatMissingAsZero: boolean;
823
850
  gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
824
851
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["services/class.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["services/class.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * syllabus, lab drafts, and invite codes.
4
4
  */
5
5
 
6
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="325b76aa-1975-5406-b6b2-75135b1cf32a")}catch(e){}}();
6
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6ff53d14-571e-52bf-9cfe-dd4a7758c1d0")}catch(e){}}();
7
7
  import { SessionType } from "@prisma/client";
8
8
  import { TRPCError } from "@trpc/server";
9
9
  import { prisma } from "../lib/prisma.js";
@@ -173,7 +173,29 @@ export async function updateClass(classId, data) {
173
173
  }
174
174
  const updatedClass = await prisma.class.update({
175
175
  where: { id: classId },
176
- data,
176
+ // Prisma Exact<> rejects mixed relation/unchecked shapes; pass unchecked scalars.
177
+ data: {
178
+ ...(data.name !== undefined && { name: data.name }),
179
+ ...(data.section !== undefined && { section: data.section }),
180
+ ...(data.subject !== undefined && { subject: data.subject }),
181
+ ...(data.color !== undefined && { color: data.color }),
182
+ ...(data.symbol !== undefined && { symbol: data.symbol }),
183
+ ...(data.departmentId !== undefined && {
184
+ departmentId: data.departmentId,
185
+ }),
186
+ ...(data.discussionsEnabled !== undefined && {
187
+ discussionsEnabled: data.discussionsEnabled,
188
+ }),
189
+ ...(data.studentsCanCreateDiscussions !== undefined && {
190
+ studentsCanCreateDiscussions: data.studentsCanCreateDiscussions,
191
+ }),
192
+ ...(data.studentsCanReply !== undefined && {
193
+ studentsCanReply: data.studentsCanReply,
194
+ }),
195
+ ...(data.sidebarFeatures !== undefined && {
196
+ sidebarFeatures: data.sidebarFeatures,
197
+ }),
198
+ },
177
199
  select: {
178
200
  id: true,
179
201
  name: true,
@@ -185,6 +207,7 @@ export async function updateClass(classId, data) {
185
207
  discussionsEnabled: true,
186
208
  studentsCanCreateDiscussions: true,
187
209
  studentsCanReply: true,
210
+ sidebarFeatures: true,
188
211
  },
189
212
  });
190
213
  return { updatedClass };
@@ -655,4 +678,4 @@ export async function importClass(classId, userId, year, classData) {
655
678
  }
656
679
  }
657
680
  //# sourceMappingURL=class.js.map
658
- //# debugId=325b76aa-1975-5406-b6b2-75135b1cf32a
681
+ //# debugId=6ff53d14-571e-52bf-9cfe-dd4a7758c1d0