Commit 7ee01eac authored by Yechang's avatar Yechang
Browse files

feat(gradebook): gradebook and export csv

parent fec23592
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@
		"bunyan": "^1.8.15",
		"clsx": "^2.1.0",
		"cmdk-sv": "^0.0.15",
		"export-to-csv": "^1.2.4",
		"formsnap": "^0.5.1",
		"github-markdown-css": "^5.5.1",
		"gravatar": "^1.8.2",
+8 −0
Original line number Diff line number Diff line
@@ -80,6 +80,9 @@ dependencies:
  cmdk-sv:
    specifier: ^0.0.15
    version: 0.0.15(svelte@4.2.12)
  export-to-csv:
    specifier: ^1.2.4
    version: 1.2.4
  formsnap:
    specifier: ^0.5.1
    version: 0.5.1(svelte@4.2.12)(sveltekit-superforms@2.8.0)
@@ -4104,6 +4107,11 @@ packages:
      homedir-polyfill: 1.0.3
    dev: true

  /export-to-csv@1.2.4:
    resolution: {integrity: sha512-mniFCil3DPLb4esJX00Nm6R77WbTMAqlzgYBlqN++QXZ2juNu19RMnRgmjuPH2pyRbrQvOieKg8zTp5lCwUFyQ==}
    engines: {node: ^v12.20.0 || >=v14.13.0}
    dev: false

  /extend-shallow@2.0.1:
    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
    engines: {node: '>=0.10.0'}
+7 −6
Original line number Diff line number Diff line
@@ -4,13 +4,13 @@ import { getAssignmentsByClassId } from '$lib/server/db/assignment';
import _ from 'lodash';
import { db } from '$lib/server/db';

export const load = (async ({ parent }) => {
	const data: PageParentData = await parent();

	const { currentClass } = data;
	if (_.isNil(currentClass)) {
export const load = (async ({ parent, locals }) => {
	const { user } = locals
	if (_.isNil(user)) {
		redirect(302, '/login');
	}
	const data: PageParentData = await parent();
	const { currentClass } = data;

	const entries = await db.gradeEntry.findMany({
		where: {
@@ -20,6 +20,7 @@ export const load = (async ({ parent }) => {
			groups: {
				include: {
					records: {
						where: { studentId: user.id },
						orderBy: { id: 'asc' }
					}
				}
@@ -37,7 +38,7 @@ export const load = (async ({ parent }) => {
				LAST: _.last<number>
			};

			const score = strategyFn[strategy](records.map((record) => record.grade));
			const score = strategyFn[strategy](records.map((record) => record.grade)) || 0;

			return {
				...group,
+5 −5
Original line number Diff line number Diff line
@@ -11,10 +11,10 @@
	export let data: PageData;
	const table = createTable(readable(data.entries));
	const columns = table.createColumns([
		table.column({
			accessor: 'id',
			header: 'ID'
		}),
		// table.column({
		// 	accessor: 'id',
		// 	header: 'ID'
		// }),
		// table.column({
		// 	accessor: 'name',
		// 	header: 'Name'
@@ -39,7 +39,7 @@

<div class="h-full px-4 py-6 lg:px-8">
	<div class="flex items-center justify-between space-y-2">
		<h2 class="text-3xl font-bold tracking-tight">Grades</h2>
		<h2 class="text-3xl font-bold tracking-tight">My Grade</h2>
	</div>
	<div class="space-y-4 py-6">
		<div class="rounded-md border">
+63 −0
Original line number Diff line number Diff line
import { error } from '@sveltejs/kit';
import type { PageParentData, PageServerLoad } from './$types';

import { message, superValidate } from 'sveltekit-superforms';
import { zod } from 'sveltekit-superforms/adapters';
import { accountFormSchema } from './form.svelte';
import { fail, type Actions } from '@sveltejs/kit';
import _ from 'lodash';
import { db } from '$lib/server/db';
import { GradeGroupStrategy } from '@prisma/client';

export const load = (async ({ parent }) => {
	const parentData: PageParentData = await parent();

	const { currentClass } = parentData;
	if (currentClass.role === 'STUDENT') {
		error(403, 'Hey boy, you should not be here');
	}

	return {
		form: await superValidate({ classId: currentClass.id }, zod(accountFormSchema))
	};
}) satisfies PageServerLoad;

export const actions: Actions = {
	default: async (event) => {
		const form = await superValidate(event, zod(accountFormSchema));
		if (!form.valid) {
			return fail(400, {
				form
			});
		}
		const { ...data } = form.data;

		const strategyFn = {
			'max': GradeGroupStrategy.MAX,
			'min': GradeGroupStrategy.MIN,
			'last': GradeGroupStrategy.LAST,
		};

		const assignment = await db.gradeEntry.create({
			data: {
				...data,
				groups: {
					createMany: {
						data: data.groups.map(({ id, ...rest }) => {
							return {
								...rest,
								strategy: strategyFn[rest.strategy]
							}
						})
					}
				}
			}
		})

		if (_.isNil(assignment)) {
			return message(form, 'Failed');
		}

		return message(form, 'Created');
	}
};
Loading