Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,8 @@ type ExamWithRegs {
type ExamWithRegsAndRooms {
exam: PlannedExam!
normalRegsMtknr: [String!]!
ntas: [NTA!]!
ntasInAloneRooms: [NTA!]!
ntasInNormalRooms: [NTA!]!
rooms: [PlannedRoom!]!
}

Expand Down Expand Up @@ -416,6 +417,8 @@ type PreExam {

type PrePlannedRoom {
ancode: Int!
mtknr: String
reserve: Boolean!
roomName: String!
}

Expand Down Expand Up @@ -498,6 +501,7 @@ type Query {
plannedRoomForStudent(ancode: Int!, mtknr: String!): PlannedRoom
plannedRoomNames: [String!]
plannedRoomNamesInSlot(day: Int!, time: Int!): [String!]
plannedRooms: [PlannedRoom!]!
plannedRoomsInSlot(day: Int!, time: Int!): [PlannedRoom!]
preExamsInSlot(day: Int!, time: Int!): [PreExam!]
primussExam(ancode: Int!, program: String!): PrimussExam!
Expand Down
2 changes: 1 addition & 1 deletion src/lib/Nav.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
<li><a href="/plan/calendar">Kalenderansicht</a></li>
<!-- <li><a href="/plan/ntas">geplante Prüfungen mit NTAs</a></li> -->
<li><a href="/plan/rooms">Raumplanung</a></li>
<li><a href="/plan/roomsForSlots">Verfügbare Räume</a></li>
<li><a href="/plan/plannedRooms">Geplante Räume</a></li>
<li><a href="/plan/invigilation/1">Aufsichtenplanung</a></li>
<li><a href="/plan/examsInPlanZPA">Prüfungsliste für ZPA</a></li>
</ul>
Expand Down
53 changes: 53 additions & 0 deletions src/routes/plan/plannedRooms/+page.server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { env } from '$env/dynamic/private';
import { request, gql } from 'graphql-request';

export async function load({ params }) {
const semesterQuery = gql`
query {
semesterConfig {
days {
number
date
}
starttimes {
number
start
}
}
}
`;

const semesterData = await request(env.PLEXAMS_SERVER, semesterQuery);

const roomQuery = gql`
query {
plannedRoomNames
}
`;

const roomData = await request(env.PLEXAMS_SERVER, roomQuery);

const plannedRoomsQuery = gql`
query {
plannedRooms {
day
slot
room {
name
}
}
}
`;

const plannedRoomsData = await request(env.PLEXAMS_SERVER, plannedRoomsQuery);

const plannedRoomsSet = new Set(
plannedRoomsData.plannedRooms.map((room: any) => `${room.day}-${room.slot}-${room.room.name}`)
);

return {
semesterConfig: semesterData.semesterConfig,
plannedRoomNames: roomData.plannedRoomNames,
plannedRooms: plannedRoomsSet
};
}
108 changes: 108 additions & 0 deletions src/routes/plan/plannedRooms/+page.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<script>
export let data;
import ExamsForRoomPlanning from '$lib/slot/ExamsForRoomPlanning.svelte';
import RoomNamesInSlot from '$lib/slot/RoomNamesInSlot.svelte';
import { mkDateShort } from '$lib/jshelper/misc';

let showOnlyExamsWithNTAs = false;
let details = false;

let showRooms = 'all';

let showDays = new Map();

for (let day of data.semesterConfig.days) {
showDays[day.number] = false;
}

let showAllDays = false;

$: if (showAllDays) {
for (let day of data.semesterConfig.days) {
showDays[day.number] = true;
}
} else {
for (let day of data.semesterConfig.days) {
showDays[day.number] = false;
}
}

console.log('Planned Rooms Set:', data.plannedRooms);

function roomPlanned(day, slot, roomName) {
const entry = `${day}-${slot}-${roomName}`;
console.log('Checking if room is planned:', entry);
return data.plannedRooms.has(entry);
}

function bg(day, slot, roomName) {
if (roomPlanned(day.number, slot, roomName)) {
return 'border border-black bg-green-500';
} else {
return '';
}
}
function showSlotNumber(day, slot, roomName) {
if (roomPlanned(day.number, slot, roomName)) {
return slot;
} else {
return '';
}
}
</script>

<div class="text-center m-2">
<div class="text-4xl text-center mt-8 uppercase">Geplante Räume</div>
</div>

<div class="flex">
<select class="select select-primary w-full max-w-xs my-2" bind:value={showRooms}>
<option selected value="all">Alle Räume</option>
{#each data.plannedRoomNames as plannedRoomName}
<option>{plannedRoomName}</option>
{/each}
</select>
<div class="form-control m-3">
<label class="label cursor-pointer">
<span class="label-text">Alle Tage anzeigen</span>
<input
type="checkbox"
class="toggle mx-3"
on:click={() => {
showAllDays = !showAllDays;
}}
/>
</label>
</div>
</div>

<div class="overflow-x-auto">
<table class="table table-bordered table-zebra w-full">
<thead>
<tr>
<th>Raum</th>
{#each data.semesterConfig.days as day}
<th>Tag {day.number}<br />{mkDateShort(day.date)}</th>
{/each}
</tr>
</thead>
<tbody>
{#each data.plannedRoomNames as roomName}
<tr>
<td class="font-semibold">{roomName}</td>
{#each data.semesterConfig.days as day}
<td>
<div class="flex">
{#each data.semesterConfig.starttimes as slot}
<div class="p-1 w-5 {bg(day, slot.number, roomName)}">
{showSlotNumber(day, slot.number, roomName)}
</div>
{/each}
</div>
</td>
{/each}
</tr>
{/each}
</tbody>
</table>
</div>