Commit b3592a81 authored by Yechang's avatar Yechang
Browse files

feat(submission): student filter

parent 933a01e1
Loading
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -19,12 +19,20 @@ export const load = (async ({ parent, depends, url }) => {
	}
	page += 1

	let submitter: number | undefined = Number(url.searchParams.get('submitter'))
	if (_.isNaN(submitter) || submitter === 0) {
		submitter = undefined
	}

	async function getSubmissions() {
		const submissions = await db.submission.findMany({
			where: {
				problem: {
					classId: currentClass.id
				},
				submitter: {
					sustechId: submitter
				}
			},
			include: {
				problem: true,
@@ -46,6 +54,9 @@ export const load = (async ({ parent, depends, url }) => {
			where: {
				problem: {
					classId: currentClass.id
				},
				submitter: {
					sustechId: submitter
				}
			},
		})
+22 −15
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
	import { goto } from '$app/navigation';
	import type { PageData } from './$types';
	import Link from '$lib/components/link.svelte';
	import { writable } from 'svelte/store';
	import { derived, writable } from 'svelte/store';

	import { createRender, createTable, Render, Subscribe } from 'svelte-headless-table';

@@ -23,7 +23,9 @@

	export let data: PageData;
	const submissions = writable(data.submissions);
	const count = writable(data.count)
	$: submissions.set(data.submissions);
	$: count.set(data.count);

	const table = createTable(submissions, {
		sort: addSortBy({ disableMultiSort: true }),
@@ -31,10 +33,11 @@
			serverSide: true,
			initialPageSize: 15,
			initialPageIndex: 0,
			serverItemCount: writable(data.count)
			serverItemCount: count
		}),
		filter: addTableFilter({
			fn: ({ filterValue, value }) => value.includes(filterValue)
			serverSide: true
			// fn: ({ filterValue, value }) => value.includes(filterValue)
		}),
		// select: addSelectedRows(),
		hide: addHiddenColumns()
@@ -67,13 +70,13 @@
			accessor: 'submitter',
			header: 'Submitter',
			cell: ({ value }) => createRender(Card, value).slot(`${value.sustechId}`),
			plugins: {
				filter: {
					getFilterValue(value) {
						return value.sustechId;
					}
				}
			}
			// plugins: {
			// 	filter: {
			// 		getFilterValue(value) {
			// 			return value.sustechId;
			// 		}
			// 	}
			// }
		}),
		table.column({
			accessor: 'feedback',
@@ -103,10 +106,12 @@
	const { filterValue } = pluginStates.filter;

	// const { selectedDataIds } = pluginStates.select;

	const input = writable("")
	const param = derived([pageIndex, filterValue], ([$s1, $s2]) => 
		 new URLSearchParams({ page: `${$s1}`, submitter: `${$s2}` }));
	if (browser) {
		pageIndex.subscribe((p) => {
			goto(`?page=${p}`, {
		param.subscribe((p) => {
			goto(`?${p.toString()}`, {
				keepFocus: true,
				noScroll: true,
				replaceState: false
@@ -125,10 +130,12 @@
			<div class="mb-4 flex items-center gap-4">
				<Input
					class="max-w-sm"
					placeholder="Filter students..."
					placeholder="Filter submitter..."
					type="text"
					bind:value={$filterValue}
					bind:value={$input}
					on:keydown={e => e.code === "Enter" &&filterValue.set($input) }
				/>
				<Button on:click={()=> filterValue.set($input)}>Apply</Button>
				<!-- <DropdownMenu.Root>
					<DropdownMenu.Trigger asChild let:builder>
						<Button variant="outline" class="ml-auto" builders={[builder]}>