diff options
| author | Furkan Sahin <furkan-dev@proton.me> | 2021-11-05 09:27:35 -0500 |
|---|---|---|
| committer | Furkan Sahin <furkan-dev@proton.me> | 2021-11-05 09:27:35 -0500 |
| commit | 85380b4b60bf74507a01957b29bd6e3808e216db (patch) | |
| tree | a43784660fdc29e5b95df3e358cf722eec2b092b /src/components/EditorLists.svelte | |
| parent | ffef3a6be19d1139b6378c8119d444082dd0cbac (diff) | |
| parent | 29fc563863f561cdc707485289c5580b4397a580 (diff) | |
Merge pull request #10 from cobraguy/rewrite
Update to Svelte app
Diffstat (limited to 'src/components/EditorLists.svelte')
| -rw-r--r-- | src/components/EditorLists.svelte | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/components/EditorLists.svelte b/src/components/EditorLists.svelte new file mode 100644 index 0000000..1b2084a --- /dev/null +++ b/src/components/EditorLists.svelte @@ -0,0 +1,160 @@ +<script lang="ts"> + import IconButton from "@smui/icon-button"; + import List, { + Item, + Meta, + PrimaryText, + 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()) + : a.lastname.toUpperCase().localeCompare(b.lastname.toUpperCase()) + ); + + $: labs = [...$labStore.values()].sort((a, b) => a.id - b.id); + + $: 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"> + <div class="column"> + <h3 class="col-header">Peer Teachers</h3> + <List twoLine singleSelection class="editor-list"> + {#each peerTeachers as pt} + <Item on:SMUI:action={() => (selectedPeerTeacher = pt)}> + <Text> + <PrimaryText>{pt.name}</PrimaryText> + <SecondaryText>{pt.id}</SecondaryText> + </Text> + <Meta> + <IconButton + class="material-icons" + on:click$stopPropagation={() => { + deletePT(pt.id); + }} + > + remove_circle + </IconButton> + </Meta> + </Item> + {/each} + </List> + </div> + <div class="column"> + <h3 class="col-header">Labs</h3> + <List threeLine class="editor-list"> + {#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 + class="material-icons" + on:click$stopPropagation={() => { + assignLab(lab.id); + }} + > + add_circle + </IconButton> + </Meta> + </Item> + {/each} + </List> + </div> + <div class="column"> + <h3 class="col-header"> + {selectedPeerTeacher?.name ?? "PT"} - Assigned Labs + </h3> + <List threeLine class="editor-list"> + {#each assignedLabs as lab} + <Item> + <Text> + <PrimaryText>{lab.course}-{lab.section}</PrimaryText> + <SecondaryText>{lab.time}</SecondaryText> + <SecondaryText>{lab.location}</SecondaryText> + </Text> + <Meta class="material-icons"> + <IconButton + class="material-icons" + on:click$stopPropagation={() => { + unassignLab(lab.id); + }} + > + remove_circle + </IconButton> + </Meta> + </Item> + {/each} + </List> + </div> +</div> + +<style> + #editor-lists { + display: flex; + max-height: inherit; + min-height: 0; + overflow-x: auto; + } + + .col-header { + font-family: Roboto, sans-serif; + } + + .column { + flex: 1; + min-width: 15em; + overflow: auto; + } + + * :global(.editor-list) { + border: 1px solid black; + } +</style> |
