diff options
| author | Furkan Sahin <furkan-dev@proton.me> | 2021-09-05 23:57:27 -0500 |
|---|---|---|
| committer | Furkan Sahin <furkan-dev@proton.me> | 2021-09-05 23:57:27 -0500 |
| commit | 9bce000c7b5799837fac15bd6339dfd27401b630 (patch) | |
| tree | 3ce2be612b0ae9b71db21ab1e6ccb08e0809ef5f | |
| parent | bc95a18a5daf1c0b08bcfac04c543ddf194dd049 (diff) | |
Add ability to assign labs to PTs
| -rw-r--r-- | src/components/EditorLists.svelte | 99 | ||||
| -rw-r--r-- | src/models/EventInfo.ts | 5 | ||||
| -rw-r--r-- | src/models/PeerTeacher.ts | 8 |
3 files changed, 84 insertions, 28 deletions
diff --git a/src/components/EditorLists.svelte b/src/components/EditorLists.svelte index 2d9b9e9..1b2084a 100644 --- a/src/components/EditorLists.svelte +++ b/src/components/EditorLists.svelte @@ -7,8 +7,11 @@ SecondaryText, Text, } from "@smui/list"; + import type PeerTeacher from "../models/PeerTeacher"; import { labStore, ptStore } from "../stores"; + let selectedPeerTeacher: PeerTeacher | undefined; + $: peerTeachers = [...$ptStore.values()].sort((a, b) => a.lastname.toUpperCase() === b.lastname.toUpperCase() ? a.firstname.toUpperCase().localeCompare(b.firstname.toUpperCase()) @@ -17,7 +20,44 @@ $: labs = [...$labStore.values()].sort((a, b) => a.id - b.id); - const nothing: any[] = []; + $: assignedLabs = [...(selectedPeerTeacher?.labs.values() ?? [])] + .flatMap((labId) => { + const lab = $labStore.get(labId); + return lab === undefined ? [] : [lab]; + }) + .sort((a, b) => a.id - b.id); + + $: compatibleLabs = labs.filter( + (lab) => + !selectedPeerTeacher?.labs.has(lab.id) && + !selectedPeerTeacher?.conflictsWith(lab.event) && + !assignedLabs.some((assignment) => + assignment.event.conflictsWith(lab.event) + ) + ); + + function deletePT(id: number) { + if (selectedPeerTeacher?.id === id) { + selectedPeerTeacher = undefined; + } + + ptStore.update((val) => { + val.delete(id); + return val; + }); + } + + function assignLab(id: number) { + selectedPeerTeacher?.labs.add(id); + // Self assignemnt to update `assignedLabs` and `compatibleLabs` + selectedPeerTeacher = selectedPeerTeacher; + } + + function unassignLab(id: number) { + selectedPeerTeacher?.labs.delete(id); + // Self assignemnt to update `assignedLabs` and `compatibleLabs` + selectedPeerTeacher = selectedPeerTeacher; + } </script> <div id="editor-lists"> @@ -25,21 +65,20 @@ <h3 class="col-header">Peer Teachers</h3> <List twoLine singleSelection class="editor-list"> {#each peerTeachers as pt} - <Item> + <Item on:SMUI:action={() => (selectedPeerTeacher = pt)}> <Text> - <PrimaryText>{pt.firstname} {pt.lastname}</PrimaryText> + <PrimaryText>{pt.name}</PrimaryText> <SecondaryText>{pt.id}</SecondaryText> </Text> <Meta> <IconButton class="material-icons" on:click$stopPropagation={() => { - ptStore.update((val) => { - val.delete(pt.id); - return val; - }); - }}>remove_circle</IconButton + deletePT(pt.id); + }} > + remove_circle + </IconButton> </Meta> </Item> {/each} @@ -48,45 +87,49 @@ <div class="column"> <h3 class="col-header">Labs</h3> <List threeLine class="editor-list"> - {#each labs as lab} + {#each compatibleLabs as lab} <Item> <Text> <PrimaryText>{lab.course}-{lab.section}</PrimaryText> <SecondaryText>{lab.time}</SecondaryText> <SecondaryText>{lab.location}</SecondaryText> </Text> - <Meta class="material-icons" - ><IconButton + <Meta class="material-icons"> + <IconButton class="material-icons" on:click$stopPropagation={() => { - console.log("hello"); - }}>add_circle</IconButton - ></Meta - > + assignLab(lab.id); + }} + > + add_circle + </IconButton> + </Meta> </Item> {/each} </List> </div> <div class="column"> - <h3 class="col-header">PT - Assigned Labs</h3> + <h3 class="col-header"> + {selectedPeerTeacher?.name ?? "PT"} - Assigned Labs + </h3> <List threeLine class="editor-list"> - {#each nothing as n} + {#each assignedLabs as lab} <Item> <Text> - <PrimaryText>{n.course} {n.section}</PrimaryText> - <SecondaryText> - {n.event.days} - {n.event.start}-{n.event.end} - </SecondaryText> + <PrimaryText>{lab.course}-{lab.section}</PrimaryText> + <SecondaryText>{lab.time}</SecondaryText> + <SecondaryText>{lab.location}</SecondaryText> </Text> - <Meta class="material-icons" - ><IconButton + <Meta class="material-icons"> + <IconButton class="material-icons" on:click$stopPropagation={() => { - console.log("hello"); - }}>remove_circle</IconButton - ></Meta - > + unassignLab(lab.id); + }} + > + remove_circle + </IconButton> + </Meta> </Item> {/each} </List> diff --git a/src/models/EventInfo.ts b/src/models/EventInfo.ts index 6fce60b..b0ac25b 100644 --- a/src/models/EventInfo.ts +++ b/src/models/EventInfo.ts @@ -43,6 +43,11 @@ export default class EventInfo { return `${hour}:${minute} ${meridiem}`; } + conflictsWith(event: EventInfo) { + const daysConflict = event.days.match(new RegExp(`[${this.days}]`)); + return daysConflict && this.start <= event.end && event.start <= this.end; + } + get info() { if(this.days === "") { return `WEB`; diff --git a/src/models/PeerTeacher.ts b/src/models/PeerTeacher.ts index f1a8739..5d955fd 100644 --- a/src/models/PeerTeacher.ts +++ b/src/models/PeerTeacher.ts @@ -37,4 +37,12 @@ export default class PeerTeacher { pt.labs = new Set(labs); return pt; } + + conflictsWith(event: EventInfo) { + return this.events.some(item => item.conflictsWith(event)); + } + + get name() { + return `${this.firstname} ${this.lastname}`; + } }
\ No newline at end of file |
