Skip to content

Commit c02f90c

Browse files
committed
Merge branch 'release/0.3.0'
2 parents dc1c4f7 + be9fbe9 commit c02f90c

15 files changed

+190
-213
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "elexams",
3-
"version": "0.2.0",
3+
"version": "0.3.0",
44
"description": "A frontend for obcode/plexams server",
55
"main": "dist/main.js",
66
"private": true,

src/components/App.svelte

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,47 @@
11
<script>
22
import { semesterConfig, validation } from "../stores/main.js";
3-
import { lecturers } from "../stores/lecturers.js";
4-
import { plannedRooms } from "../stores/rooms.js";
5-
import { allAncodes } from "../stores/exams.js";
63
74
import Plan from "./ExamPlanning/Plan.svelte";
85
import Rooms from "./RoomPlanning/Rooms.svelte";
96
import Invigilation from "./InvigilationPlanning/Invigilation.svelte";
107
import NTA from "./NTA.svelte";
11-
let info = 3;
12-
let l = $lecturers; // FIXME: Problem ist Promise in readable
13-
let p = $plannedRooms; // FIXME: Problem ist Promise in readable
14-
let a = $allAncodes; // FIXME: Problem ist Promise in readable
8+
let info = "invigs";
159
</script>
1610

1711
<style>
1812
1913
</style>
2014

2115
<main>
22-
2316
{#if $semesterConfig === undefined || $semesterConfig === null}
2417
Loading...
2518
{:else}
2619
<h1>Prüfungsplan {$semesterConfig.semester}</h1>
2720
<div>
2821
<label>
29-
<input type="radio" bind:group={info} value={1} />
22+
<input type="radio" bind:group={info} value="plan" />
3023
Prüfungsplanung
3124
</label>
3225
<label>
33-
<input type="radio" bind:group={info} value={2} />
26+
<input type="radio" bind:group={info} value="rooms" />
3427
Raumplanung
3528
</label>
3629
<label>
37-
<input type="radio" bind:group={info} value={3} />
30+
<input type="radio" bind:group={info} value="invigs" />
3831
Aufsichtenplanung
3932
</label>
4033
<label>
41-
<input type="radio" bind:group={info} value={4} />
34+
<input type="radio" bind:group={info} value="nta" />
4235
NTA
4336
</label>
4437
</div>
45-
{#if info === 1}
38+
{#if info === 'plan'}
4639
<Plan />
47-
{/if}
48-
{#if info === 2}
40+
{:else if info === 'rooms'}
4941
<Rooms />
50-
{/if}
51-
{#if info === 3}
42+
{:else if info === 'invigs'}
5243
<Invigilation />
53-
{/if}
54-
{#if info === 4}
44+
{:else if info === 'nta'}
5545
<NTA />
5646
{/if}
5747
{/if}

src/components/InvigilationPlanning/Invigilation.svelte

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
<script>
2+
import { onMount } from "svelte";
3+
24
import InvigilatorsOverview from "./InvigilatorsOverview.svelte";
35
import InvigilationDay from "./InvigilationDay.svelte";
46
import Validation from "../Validation.svelte";
57
import { fetchInvigilations, refetch } from "../../stores/invigilation.js";
68
import { semesterConfig, validation } from "../../stores/main.js";
79
import { dateString } from "../../misc.js";
810
let dayIndex = 0; // TODO set -1
9-
function refresh() {
10-
fetchInvigilations()
11-
refetch.update(i => i+1)
12-
}
11+
12+
onMount(() => fetchInvigilations());
13+
14+
// function refresh() {
15+
// // fetchInvigilations()
16+
// // refetch.update(i => i+1)
17+
// }
1318
</script>
1419

1520
<style>
@@ -29,11 +34,7 @@
2934

3035
{#if $semesterConfig !== null && $semesterConfig !== undefined && $semesterConfig.examDays.length > 0}
3136
Aufsichten planen:
32-
<select
33-
bind:value={dayIndex}
34-
on:change={refresh}
35-
name="ancode"
36-
id="ancode">
37+
<select bind:value={dayIndex} name="ancode" id="ancode">
3738
<option value="-1">Übersicht</option>
3839
{#each $semesterConfig.examDays as day, index}
3940
<option value={index}>({index}) {dateString(day)} </option>

src/components/InvigilationPlanning/InvigilationDay.svelte

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,19 @@
77
slotsForDay,
88
refetch
99
} from "../../stores/invigilation.js";
10-
fetchInvigilations();
10+
// fetchInvigilations();
1111
import { semesterConfig, validation } from "../../stores/main.js";
1212
import { dateString } from "../../misc.js";
1313
import Invigilator from "./Invigilator.svelte";
1414
import InvigilationSlot from "./InvigilationSlot.svelte";
1515
1616
let slotsForThisDay = [];
17-
fetchSlotsForDay(dayIndex);
18-
refetch.subscribe(_ => fetchSlotsForDay(dayIndex));
17+
$: fetchSlotsForDay(dayIndex);
18+
refetch.subscribe(_ => {
19+
console.log(`refetching for day ${dayIndex}`);
20+
fetchSlotsForDay(dayIndex);
21+
});
1922
slotsForDay.subscribe(s => (slotsForThisDay = s));
20-
function slotForSlot(slotIndex) {
21-
return slotsForDay[slotIndex];
22-
}
23-
let invigs;
2423
</script>
2524

2625
<style>
@@ -40,10 +39,11 @@
4039
<tr>
4140
<th>Aufsichten</th>
4241
<th>TODO</th>
42+
<th>eingeplant</th>
4343
</tr>
4444
{#each $invigilations[1] as invigilator}
4545
<Invigilator invigilatorID={invigilator.invigilatorID} {dayIndex} />
46-
{/each}
46+
{:else}keine Aufsichten{/each}
4747
</table>
4848
</td>
4949
<td>
@@ -53,7 +53,7 @@
5353
</tr>
5454
{#if slotsForThisDay.length > 0}
5555
{#each $semesterConfig.slotsPerDay as slotTime, slotIndex}
56-
<InvigilationSlot {slotIndex} {slotTime} />
56+
<InvigilationSlot {dayIndex} {slotIndex} {slotTime} />
5757
{/each}
5858
{/if}
5959
</table>
Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,9 @@
11
<script>
2+
export let dayIndex;
23
export let slotIndex;
34
export let slotTime;
4-
import RoomSlot from "./RoomSlot.svelte";
5-
import Reserve from "./Reserve.svelte";
6-
import { slotsForDay, refetch } from "../../stores/invigilation.js";
7-
let mySlot = [];
8-
let dayIndex;
9-
10-
slotsForDay.subscribe(slotsForThisDay => {
11-
if (
12-
slotsForThisDay !== null &&
13-
slotsForThisDay !== undefined &&
14-
slotsForThisDay.length > 0
15-
) {
16-
mySlot = slotsForThisDay[slotIndex];
17-
dayIndex = mySlot[0][0];
18-
} else {
19-
mySlot = [];
20-
dayIndex = -1;
21-
}
22-
});
23-
24-
refetch.update(i => i + 1);
25-
5+
import RoomSlot from "./RoomSlot.svelte";
6+
import Reserve from "./Reserve.svelte";
267
</script>
278

289
<style>
@@ -31,15 +12,13 @@
3112
}
3213
</style>
3314

34-
{#if mySlot.length > 0 || dayIndex >= 0}
35-
<tr>
36-
<td class="bordered">
37-
({dayIndex}, {slotIndex}) {slotTime}
38-
<br />
39-
<Reserve {dayIndex} {slotIndex} />
40-
</td>
41-
<td class="bordered">
42-
<RoomSlot {dayIndex} {slotIndex} />
43-
</td>
44-
</tr>
45-
{/if}
15+
<tr>
16+
<td class="bordered">
17+
({dayIndex}, {slotIndex}) {slotTime}
18+
<br />
19+
<Reserve {dayIndex} {slotIndex} />
20+
</td>
21+
<td class="bordered">
22+
<RoomSlot {dayIndex} {slotIndex} />
23+
</td>
24+
</tr>

src/components/InvigilationPlanning/Invigilator.svelte

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,53 @@
11
<script>
22
export let invigilatorID;
33
export let dayIndex;
4-
import { invigilations, refetchInvigilator, fetchInvigilations } from "../../stores/invigilation.js";
4+
5+
import { onMount } from "svelte";
6+
import {
7+
invigilations,
8+
refetchInvigilator,
9+
fetchInvigilations
10+
} from "../../stores/invigilation.js";
511
let invigilator;
612
let want;
713
let can;
814
let notAvailable;
15+
let alreadyEnough;
916
let draggable;
1017
11-
refetchInvigilator.subscribe(id => {
12-
if (id === invigilatorID) {
13-
fetchInvigilations()
14-
}
15-
})
18+
$: {
19+
invigilator = $invigilations[1].find(i => i.invigilatorID == invigilatorID);
20+
setInvigilatorDetails(invigilator, dayIndex);
21+
}
1622
17-
invigilations.subscribe(is => {
18-
invigilator = is[1].find(i => i.invigilatorID == invigilatorID);
23+
function setInvigilatorDetails(invigilator) {
1924
want =
2025
invigilator !== null &&
2126
invigilator !== undefined &&
22-
(invigilator.invigilatorWantDays.includes(dayIndex)
23-
|| invigilator.invigilatorInvigilationDays.includes(dayIndex))
24-
;
25-
can = !want &&
27+
(invigilator.invigilatorWantDays.includes(dayIndex) ||
28+
invigilator.invigilatorInvigilationDays.includes(dayIndex));
29+
can =
30+
!want &&
2631
invigilator !== null &&
2732
invigilator !== undefined &&
2833
invigilator.invigilatorCanDays.includes(dayIndex);
29-
notAvailable =
30-
(!want && !can) ||
34+
notAvailable = !want && !can;
35+
alreadyEnough =
3136
invigilator.invigilatorMinutesTodo -
3237
invigilator.invigilatorsMinutesPlanned <
33-
0;
38+
0;
3439
draggable = !notAvailable;
40+
}
41+
42+
refetchInvigilator.subscribe(id => {
43+
if (id === invigilatorID) {
44+
fetchInvigilations();
45+
}
46+
});
47+
48+
invigilations.subscribe(is => {
49+
invigilator = is[1].find(i => i.invigilatorID == invigilatorID);
50+
setInvigilatorDetails(invigilator);
3551
});
3652
3753
let dragged = false;
@@ -64,6 +80,9 @@
6480
.can {
6581
background-color: yellow;
6682
}
83+
.alreadyEnough {
84+
background-color: orange;
85+
}
6786
.notAvailable {
6887
background-color: grey;
6988
color: darkgrey;
@@ -85,10 +104,11 @@
85104
class:dragged
86105
class:want
87106
class:can
107+
class:alreadyEnough
88108
class:notAvailable
89109
on:dragstart={dragStart}
90110
on:dragend={dragEnd}>
91-
<td> {invigilator.invigilatorName} </td>
111+
<td>{invigilator.invigilatorName} </td>
92112
<td class="right">
93113
{invigilator.invigilatorMinutesTodo - invigilator.invigilatorsMinutesPlanned}
94114

src/components/InvigilationPlanning/InvigilatorsOverview.svelte

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<script>
2+
import { onMount } from 'svelte';
23
import {
34
invigilations,
45
fetchInvigilations
56
} from "../../stores/invigilation.js";
67
import InvigilatorTR from "./InvigilatorTR.svelte";
7-
fetchInvigilations();
88
import { semesterConfig } from "../../stores/main.js";
9+
onMount(() => fetchInvigilations())
910
</script>
1011

1112
<style>

src/components/InvigilationPlanning/Reserve.svelte

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,26 @@
1212
let slot = [];
1313
let reserveInvigilator = null;
1414
let hasInvigilator = reserveInvigilator !== null;
15+
let needsInvigilator = true;
16+
17+
$: setDetails($slotsForDay, dayIndex, slotIndex);
1518
1619
slotsForDay.subscribe(s => {
1720
slot = [];
1821
reserveInvigilator = null;
22+
setDetails(s);
23+
});
24+
25+
function setDetails(s) {
1926
if (s !== null && s !== undefined && s.length > 1) {
2027
slot = s.find(sl => sl[0][0] == dayIndex && sl[0][1] == slotIndex);
2128
}
2229
if (slot !== undefined && slot !== null && slot.length > 0) {
30+
needsInvigilator = Object.entries(slot[1].examsInSlot).length !== 0;
2331
reserveInvigilator = slot[1].reserveInvigilator;
2432
}
2533
hasInvigilator = reserveInvigilator !== null;
26-
});
34+
}
2735
2836
let draggedOver = false;
2937
function dragOver(event) {
@@ -77,18 +85,20 @@
7785
}
7886
</style>
7987

80-
{#if slot !== null && slot !== undefined && slot.length > 0}
81-
<div
82-
class="missing"
83-
class:draggedOver
84-
class:hasInvigilator
85-
on:dragover={dragOver}
86-
on:dragenter={dragEnter}
87-
on:dragleave={dragLeave}
88-
on:drop={dragDrop}>
89-
({slot[0][0]}, {slot[0][1]})
90-
<br />
91-
Reserve:
92-
{#if hasInvigilator}{reserveInvigilator.invigilatorName}{:else}fehlt{/if}
93-
</div>
88+
{#if needsInvigilator}
89+
{#if slot !== null && slot !== undefined && slot.length > 0}
90+
<div
91+
class="missing"
92+
class:draggedOver
93+
class:hasInvigilator
94+
on:dragover={dragOver}
95+
on:dragenter={dragEnter}
96+
on:dragleave={dragLeave}
97+
on:drop={dragDrop}>
98+
({slot[0][0]}, {slot[0][1]})
99+
<br />
100+
Reserve:
101+
{#if hasInvigilator}{reserveInvigilator.invigilatorName}{:else}fehlt{/if}
102+
</div>
103+
{/if}
94104
{/if}

0 commit comments

Comments
 (0)