diff --git a/src/lib/Nav.svelte b/src/lib/Nav.svelte index cd5ec0f..dcfbfbc 100644 --- a/src/lib/Nav.svelte +++ b/src/lib/Nav.svelte @@ -45,6 +45,7 @@ class="mt-3 p-2 z-30 shadow menu menu-compact dropdown-content bg-base-100 rounded-box w-max" >
  • generierte Prüfungen mit Anmeldungen, etc.
  • +
  • Vorab-Planung (ohne Primuss-Daten)
  • Prüfungen planen
  • Raumplanung
  • diff --git a/src/lib/examsInPlan/PreSlotExam.svelte b/src/lib/examsInPlan/PreSlotExam.svelte new file mode 100644 index 0000000..9b94e06 --- /dev/null +++ b/src/lib/examsInPlan/PreSlotExam.svelte @@ -0,0 +1,569 @@ + + +{#if show} + + +
    + + {#if showConflictCount} +
    +
    + + {conflictCount} + {#if details || !inSlot} + {#if conflictCount == 1}Konflikt{:else}Konflikte{/if} + {/if} + +
    +
    + {/if} + + {#if !details && inSlot} + {ancodeToShow} + {:else} +
    +
    +
    +
    + {#if exam.planEntry != null && exam.planEntry.locked} +
    + + + +
    + {/if} + {#if exam.zpaExam.isRepeaterExam} +
    + + + + + + +
    + {/if} +
    +
    +
    +
    +
    + {ancodeToShow}. + {exam.zpaExam.module} + ({exam.zpaExam.mainExamer}) +
    +
    + {#if exam.primussExams.length > 0} +
    + ∑ {exam.studentRegsCount} +
    +
    + + + + + + + {exam.zpaExam.duration} +
    + {#if exam.maxDuration > exam.zpaExam.duration} +
    + + + + + + + {exam.maxDuration} +
    + {/if} + {/if} +
    +
    + {/if} + + {#if details || !inSlot} +
    + {#each exam.primussExams as primussExam} + {#if primussExam.exam.ancode != exam.ancode} +
    {primussExam.exam.program}/{primussExam.exam.ancode}
    + {/if} + {/each} +
    + + + {#each exam.primussExams as primussExam} + {#if primussExam.studentRegs.length > 0} +
    + {primussExam.exam.program} + {primussExam.studentRegs.length} +
    + {/if} + {/each} +
    + + {#if exam.constraints && exam.constraints.online} +
    online
    + {/if} + {#if exam.constraints && exam.constraints.roomConstraints && exam.constraints.roomConstraints.exahm} +
    EXaHM
    + {/if} + {#if exam.constraints && exam.constraints.roomConstraints && exam.constraints.roomConstraints.seb} +
    S.E.B.
    + {/if} + {#if exam.constraints != null && exam.constraints.sameSlot != null && exam.constraints.sameSlot.length > 0} +
    sameSlot
    + {/if} + {/if} +
    + + +{/if} diff --git a/src/lib/slot/PreSlot.svelte b/src/lib/slot/PreSlot.svelte new file mode 100644 index 0000000..a079f08 --- /dev/null +++ b/src/lib/slot/PreSlot.svelte @@ -0,0 +1,115 @@ + + +
    +
    {mkDateShort(day.date)}, {time.start}
    + {#if exams.length > 0} + {#if conflicts > 0} +
    +
    + + {conflicts} Konflikte +
    +
    + {/if} +
    + {#if count > 0} +
    {count}
    + {/if} +
    + {/if} +
    +{#if showOnlyEXaHMRooms} +
    + {#each exahm as room} +
    {room.name}
    + {/each} +
    +{/if} + +{#each exams as exam} + +{/each} diff --git a/src/routes/api/preExamsInSlot/+server.js b/src/routes/api/preExamsInSlot/+server.js new file mode 100644 index 0000000..f6f3d81 --- /dev/null +++ b/src/routes/api/preExamsInSlot/+server.js @@ -0,0 +1,150 @@ +import { env } from '$env/dynamic/private'; +import { json } from '@sveltejs/kit'; +import { request as gqlrequest, gql } from 'graphql-request'; + +/** @type {import('./$types').RequestHandler} */ +export async function POST({ request }) { + const query = gql` + query ($day: Int!, $time: Int!) { + examsInSlot(day: $day, time: $time) { + ancode + zpaExam { + zpaID + semester + + ancode + module + mainExamer + mainExamerID + examType + examTypeFull + duration + isRepeaterExam + groups + primussAncodes { + program + ancode + } + } + primussExams { + exam { + ancode + module + mainExamer + program + examType + presence + } + studentRegs { + mtknr + ancode + program + group + name + presence + } + conflicts { + ancode + numberOfStuds + } + ntas { + name + mtknr + compensation + deltaDurationPercent + needsRoomAlone + program + from + until + lastSemester + exams { + semester + ancode + module + mainExamer + } + } + } + constraints { + ancode + notPlannedByMe + excludeDays + possibleDays + fixedDay + fixedTime + sameSlot + online + roomConstraints { + placesWithSocket + lab + exahm + seb + } + } + conflicts { + ancode + numberOfStuds + primussAncodes { + ancode + program + numberOfStuds + } + } + studentRegsCount + ntas { + name + mtknr + compensation + deltaDurationPercent + needsRoomAlone + program + from + until + lastSemester + exams { + semester + ancode + module + mainExamer + } + } + maxDuration + planEntry { + dayNumber + slotNumber + ancode + locked + } + plannedRooms { + room { + name + seats + handicap + lab + placesWithSocket + needsRequest + exahm + seb + } + duration + handicap + handicapRoomAlone + reserve + studentsInRoom + ntaMtknr + } + } + } + `; + + const { day, time } = await request.json(); + + const variables = { + day, + time + }; + + const data = await gqlrequest(env.PLEXAMS_SERVER, query, variables); + + return json(data); +} diff --git a/src/routes/plan/pre/+page.server.js b/src/routes/plan/pre/+page.server.js new file mode 100644 index 0000000..b49c68a --- /dev/null +++ b/src/routes/plan/pre/+page.server.js @@ -0,0 +1,29 @@ +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 + } + goSlots { + dayNumber + slotNumber + } + starttimes { + number + start + } + } + } + `; + + const semesterData = await request(env.PLEXAMS_SERVER, semesterQuery); + + return { + semesterConfig: semesterData.semesterConfig + }; +} diff --git a/src/routes/plan/pre/+page.svelte b/src/routes/plan/pre/+page.svelte new file mode 100644 index 0000000..5ab327e --- /dev/null +++ b/src/routes/plan/pre/+page.svelte @@ -0,0 +1,359 @@ + + +
    +
    Vorab-Planung (ohne Primuss-Daten)
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + {/each} + + + + {#each data.semesterConfig.starttimes as time} + + + {#each data.semesterConfig.days as day} + + {/each} + + {/each} + +
    + {#each data.semesterConfig.days as day} + +
    +
    #{day.number}
    +
    {mkDateShort(day.date)}
    +
    +
    +
    +
    #{time.number}
    +
    {time.start}
    +
    +
    +
    + +
    +
    +