mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
hinweistexte import/freigabe; distinct css for editable table cols notenvorschlag & freigabe; trigger 'getEntschuldigungsStatusForStudentOnDate' event when saving a pruefungstermin -> if akzeptierte entschuldigung is found for student on pruefungsdate it is automatically set to entschuldigt; fix event unmount lifecycle;
This commit is contained in:
@@ -531,13 +531,33 @@ class Noten extends FHCAPI_Controller
|
||||
*/
|
||||
private function savePruefungstermin($typ, $student_uid, $lva_id, $stsem, $lehreinheit_id, $note, $punkte, $datum)
|
||||
{
|
||||
|
||||
$status = [];
|
||||
|
||||
// send $grades reference to moodle addon
|
||||
Events::trigger(
|
||||
'getEntschuldigungsStatusForStudentOnDate',
|
||||
function & () use (&$status)
|
||||
{
|
||||
return $status;
|
||||
},
|
||||
[
|
||||
'student_uid' => $student_uid,
|
||||
'datum' => $datum
|
||||
]
|
||||
);
|
||||
|
||||
if(count($status) > 0 && $status[0] == true) {
|
||||
$note = 17; //entschuldigt
|
||||
}
|
||||
|
||||
$jetzt = date("Y-m-d H:i:s");
|
||||
|
||||
$pruefungenChanged = [];
|
||||
|
||||
$this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel');
|
||||
|
||||
if($typ == "Termin2")
|
||||
if($typ == "Termin2" && defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2)
|
||||
{
|
||||
|
||||
// Wenn eine Nachprüfung angelegt wird, wird zuerst eine Pruefung mit 1. Termin angelegt welche für die ursprüngliche Note
|
||||
@@ -640,7 +660,7 @@ class Noten extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
|
||||
} else if($typ == "Termin3")
|
||||
} else if($typ == "Termin3" && defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3)
|
||||
{
|
||||
|
||||
$result3 = $this->LePruefungModel->getPruefungenByUidTypLvStudiensemester($student_uid, "Termin3", $lva_id, $stsem);
|
||||
|
||||
@@ -854,4 +854,21 @@ html {
|
||||
#cis-main .modal-footer {
|
||||
background-color: var(--fhc-secondary);
|
||||
|
||||
}
|
||||
|
||||
/* styling for editable dropdown column of notenvorschläge in benotungstool*/
|
||||
#notentable .tabulator-tableholder .tabulator-editable {
|
||||
position: relative;
|
||||
background-color: rgba(255, 255, 157, 0.73);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#notentable .tabulator-tableholder .tabulator-editable::after {
|
||||
content: "▾";
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
color: rgba(176, 176, 106, 0.73);;
|
||||
font-size: x-large;
|
||||
bottom: 6px;
|
||||
pointer-events: none;
|
||||
}
|
||||
@@ -423,6 +423,7 @@ export const Benotungstool = {
|
||||
},
|
||||
getNotenTableOptions() {
|
||||
return {
|
||||
rowHeight: 40,
|
||||
height: 700,
|
||||
index: 'uid',
|
||||
layout: 'fitDataStretch',
|
||||
@@ -488,8 +489,8 @@ export const Benotungstool = {
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4mail')), field: 'email', formatter: this.mailFormatter, tooltip: false, widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4antrittCount')), field: 'hoechsterAntritt', tooltip: false, widthGrow: 1},
|
||||
{title: 'UID', field: 'uid', tooltip: false, widthGrow: 1, topCalc: this.sumCalcFunc},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4vorname')), field: 'vorname', tooltip: false, widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4nachname')), field: 'nachname', widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4vorname')), field: 'vorname', headerFilter: true, tooltip: false, widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4nachname')), field: 'nachname', headerFilter: true, widthGrow: 1},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4teilnoten')), field: 'teilnote', widthGrow: 1, formatter: this.teilnotenFormatter},
|
||||
{title: Vue.computed(() => this.$p.t('benotungstool/c4note')), field: 'note_vorschlag',
|
||||
editor: 'list',
|
||||
@@ -608,7 +609,7 @@ export const Benotungstool = {
|
||||
},
|
||||
terminCalcFormatter(cell) {
|
||||
const cellval = cell.getValue()
|
||||
return this.$p.t('benotungstool/prueflingSelection')+': ' + cellval
|
||||
return this.$p.t('benotungstool/prueflingSelectionv2')+': ' + cellval
|
||||
},
|
||||
negativeNotenCalcFormatter(cell) {
|
||||
const cellval = cell.getValue()
|
||||
@@ -903,7 +904,7 @@ export const Benotungstool = {
|
||||
|
||||
// can save a notenvorschlag -> colored
|
||||
return '<div style="display: flex; justify-content: center; align-items: center; height: 100%">' +
|
||||
'<i class="fa fa-arrow-right" style="color:#00649C"></i></div>'
|
||||
'<i class="fa fa-arrow-right fa-2xl" style="color:#00649C"></i></div>'
|
||||
},
|
||||
mailFormatter(cell) {
|
||||
const val = cell.getValue()
|
||||
@@ -1215,10 +1216,10 @@ export const Benotungstool = {
|
||||
// const pOffset = this.pruefung === null && this.pruefungStudent.pruefungen.length === 0 ? 2 : 1
|
||||
|
||||
const typ = this.pruefung ? this.pruefung.pruefungstyp_kurzbz : this.getPruefungstypForStudentByAntritt(this.pruefungStudent)
|
||||
|
||||
const note = this.selectedPruefungNote?.note ?? 9 // noch nicht eingetragen
|
||||
this.$api.call(ApiNoten.saveStudentPruefung(
|
||||
this.pruefungStudent.uid,
|
||||
this.selectedPruefungNote.note,
|
||||
note,
|
||||
this.pruefung?.punkte ?? '',
|
||||
dateStr,
|
||||
this.lv_id,
|
||||
@@ -1388,13 +1389,12 @@ export const Benotungstool = {
|
||||
|
||||
// filter students that already have a pruefung on datum
|
||||
|
||||
// TODO: save new pruefungs entry for all selected students on selected date with default note "noch nicht eingetragen" aka 9
|
||||
|
||||
const year = this.selectedPruefungDate.getFullYear();
|
||||
const month = String(this.selectedPruefungDate.getMonth() + 1).padStart(2, '0'); // Months are 0-based
|
||||
const day = String(this.selectedPruefungDate.getDate()).padStart(2, '0');
|
||||
const dateStr = `${year}-${month}-${day}`;
|
||||
|
||||
const dateStrDb = `${year}-${month}-${day}`;
|
||||
const dateStrFront = `${day}.${month}.${year}`;
|
||||
|
||||
const uids = this.selectedUids.map(student => {
|
||||
return {
|
||||
uid: student.uid,
|
||||
@@ -1405,13 +1405,13 @@ export const Benotungstool = {
|
||||
|
||||
this.loading = true;
|
||||
this.$api.call(ApiNoten.createPruefungen(
|
||||
uids,
|
||||
dateStr,
|
||||
uids,
|
||||
dateStrDb,
|
||||
this.lv_id,
|
||||
this.sem_kurzbz,
|
||||
)).then(res => {
|
||||
if(res.meta.status === "success") {
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('benotungstool/pruefungAngelegtAn', [dateStr]))
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('benotungstool/pruefungAngelegtAn', [dateStrFront]))
|
||||
|
||||
|
||||
this.handleAddNewPruefungenResponse(res, uids)
|
||||
@@ -1532,6 +1532,12 @@ export const Benotungstool = {
|
||||
}, []) : []
|
||||
return cs
|
||||
},
|
||||
getNotenfreigabeHinweistext() {
|
||||
return this.$p.t('benotungstool/notenfreigabeHinweistextv3')
|
||||
},
|
||||
getNotenimportHinweistext() {
|
||||
return this.$p.t('benotungstool/notenimportHinweistextv3')
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.setupCreated()
|
||||
@@ -1540,15 +1546,20 @@ export const Benotungstool = {
|
||||
this.setupMounted()
|
||||
},
|
||||
unmounted() {
|
||||
this.headerEl.removeEventlistener(this.handleSidebar)
|
||||
this.headerEl.removeEventlistener(this.handleSidebar)
|
||||
if(this.headerEl) {
|
||||
this.headerEl.removeEventListener("shown.bs.collapse", this.handleSidebar)
|
||||
this.headerEl.removeEventListener("hidden.bs.collapse", this.handleSidebar)
|
||||
this.headerEl = null
|
||||
}
|
||||
},
|
||||
template: `
|
||||
|
||||
<bs-modal ref="modalContainerNotenImport" class="bootstrap-prompt" dialogClass="modal-lg">
|
||||
<template v-slot:title>{{$p.t('benotungstool/c4notenImportieren')}}</template>
|
||||
<template v-slot:default>
|
||||
|
||||
<div class="row mt-4 justify-content-center">
|
||||
<div v-html="getNotenimportHinweistext"></div>
|
||||
</div>
|
||||
<div class="row mt-4 justify-content-center">
|
||||
<Textarea v-model="importString" rows="5"></Textarea>
|
||||
</div>
|
||||
@@ -1567,7 +1578,7 @@ export const Benotungstool = {
|
||||
<template v-slot:default>
|
||||
<div class="row justify-content-center">
|
||||
|
||||
<div class="col-auto text-center">{{$p.t('benotungstool/c4date')}}:</div>
|
||||
<div class="col-3 text-center">{{$p.t('benotungstool/c4date')}}:</div>
|
||||
<div class="col-6">
|
||||
<datepicker
|
||||
v-model="selectedPruefungDate"
|
||||
@@ -1581,7 +1592,7 @@ export const Benotungstool = {
|
||||
</div>
|
||||
|
||||
<div class="row mt-4 justify-content-center">
|
||||
<div class="col-auto text-center">{{$p.t('benotungstool/prueflingSelection')}}:</div>
|
||||
<div class="col-3 text-center">{{$p.t('benotungstool/prueflingSelectionv2')}}:</div>
|
||||
<div class="col-6">
|
||||
<Multiselect
|
||||
v-model="selectedUids"
|
||||
@@ -1603,7 +1614,10 @@ export const Benotungstool = {
|
||||
<bs-modal ref="modalContainerNotenSpeichern" class="bootstrap-prompt" dialogClass="modal-lg">
|
||||
<template v-slot:title>{{ $p.t('benotungstool/noteneingabeSpeichern') }}</template>
|
||||
<template v-slot:default>
|
||||
<div class="row justify-content-center">
|
||||
<div class="row mt-4 justify-content-center">
|
||||
<div v-html="getNotenfreigabeHinweistext"> </div>
|
||||
</div>
|
||||
<div class="row mt-4 justify-content-center">
|
||||
<div class="col-auto">
|
||||
<Password v-model="password" :feedback="false" showIcon="fa fa-eye" :toggleMask="true" :promptLabel="$p.t('benotungstool/passwort')"></Password>
|
||||
</div>
|
||||
@@ -1629,7 +1643,6 @@ export const Benotungstool = {
|
||||
:auto-apply="true">
|
||||
</datepicker>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row justify-content-center mt-4">
|
||||
<div class="col-1 text-center">{{$p.t('lehre/note')}}:</div>
|
||||
@@ -1699,7 +1712,7 @@ export const Benotungstool = {
|
||||
</div>
|
||||
<hr>
|
||||
|
||||
<div class="row" :style="'overflow-x: auto; max-width: calc(98vw - ' + offsetLeft + 'px);'">
|
||||
<div id="notentable" class="row" :style="'overflow-x: auto; max-width: calc(98vw - ' + offsetLeft + 'px);'">
|
||||
<core-filter-cmpt
|
||||
v-if="tabulatorCanBeBuilt"
|
||||
@uuidDefined="handleUuidDefined"
|
||||
|
||||
@@ -31,7 +31,7 @@ async function fetchLehreinheiten(lv_id, sem_kurzbz) {
|
||||
if (existing) {
|
||||
// supplement info
|
||||
existing.infoString += ', '
|
||||
if (entry.gruppe_kurzbz !== null) {
|
||||
if (entry.gruppe_kurzbz !== null && entry.direktinskription == false) {
|
||||
existing.infoString += entry.gruppe_kurzbz
|
||||
} else {
|
||||
existing.infoString += entry.kurzbzlang + '-' + entry.semester
|
||||
@@ -42,7 +42,7 @@ async function fetchLehreinheiten(lv_id, sem_kurzbz) {
|
||||
// entries are supposed to be fetched ordered by non null gruppe_kurzbz first
|
||||
// so a new entry will always start with those groups, others are appended afterwards
|
||||
entry.infoString = entry.kurzbz + ' - ' + entry.lehrform_kurzbz + ' - '
|
||||
if (entry.gruppe_kurzbz !== null) {
|
||||
if (entry.gruppe_kurzbz !== null && entry.direktinskription == false) {
|
||||
entry.infoString += entry.gruppe_kurzbz
|
||||
} else {
|
||||
entry.infoString += entry.kurzbzlang + '-' + entry.semester
|
||||
|
||||
@@ -48267,12 +48267,12 @@ and represent the current state of research on the topic. The prescribed citatio
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'benotungstool',
|
||||
'phrase' => 'prueflingSelection',
|
||||
'phrase' => 'prueflingSelectionv2',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Prüflinge',
|
||||
'text' => 'Studierende',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
@@ -48372,7 +48372,7 @@ and represent the current state of research on the topic. The prescribed citatio
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Prüfung für Student {0} gespeichert',
|
||||
'text' => 'Prüfung für Studierenden {0} gespeichert',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
@@ -48472,7 +48472,7 @@ and represent the current state of research on the topic. The prescribed citatio
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Prüfung für Student {0} konnte nicht bearbeitet werden, {1} ist keine gültiger Prüfungstyp.',
|
||||
'text' => 'Prüfung für Studierenden {0} konnte nicht bearbeitet werden, {1} ist keine gültiger Prüfungstyp.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
@@ -48504,6 +48504,98 @@ and represent the current state of research on the topic. The prescribed citatio
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'benotungstool',
|
||||
'phrase' => 'notenfreigabeHinweistextv3',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Notenfreigabe
|
||||
<br><br>
|
||||
Wenn alle einzutragenden Noten vermerkt sind (Nachtragung jederzeit möglich) können diese per Klick auf Freigabe für die Studiengangsassistenz freigegeben werden.
|
||||
<br><br>
|
||||
Aus Gründen der erhöhten Sicherheit ist bei der Freigabe der Noten die Eingabe Ihres Passwortes erforderlich.
|
||||
<br><br>
|
||||
Zulässige Noten: 1-5, Nicht beurteilt (nb), Noch nicht eingetragen (), Bestanden (b), Mit Erfolg teilgenommen (met), entschuldigt (en), unentschuldigt (ue)
|
||||
<br><br>
|
||||
Bei der Freigabe wird ein Info-Email an Sie und die zuständige Studiengangsassistenz geschickt. Enthalten sind Mat.Nr., Vor- und Zuname sowie die Note der neuen oder geänderten Einträge.
|
||||
<br><br>
|
||||
Freigegebene Einträge sind mit einem grün hinterlegten Häkchen gekennzeichnet.
|
||||
<br><br>
|
||||
Wenn Sie bereits freigegebene Noten verändern, werden diese mit einem grau hinterlegten Häkchen markiert (als Hinweis für Sie, dass die Assistenz bislang darüber noch nicht per Mail informiert wurde. Sie sieht allerdings diese neue Note sofort in ihrer Oberfläche)
|
||||
<br><br>
|
||||
Freigegebene Noten kann die Assistenz nun als Zeugnisnote übernehmen (wird im nächsten Feld für Sie zur Kontrolle angezeigt)
|
||||
<br><br>
|
||||
Wenn sich die Zeugnisnote von der von Ihnen freigegebenen Note unterscheidet wird erstere rot umrandet markiert.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Grade Release
|
||||
<br><br>
|
||||
Once all grades to be entered have been recorded (additions are possible at any time), they can be released to the program assistant by clicking on "Release."
|
||||
<br><br>
|
||||
For increased security reasons, you will be required to enter your password when releasing grades.2)
|
||||
<br><br>
|
||||
Permissible grades: 1-5, Not Assessed (nb), Not Yet Entered (), Passed (b), Successfully Participated (met), Excused (en), Unexcused (ue)
|
||||
<br><br>
|
||||
When the grade is released, an information email will be sent to you and the responsible program assistant. This email contains the student ID number, first and last name, and the grade for the new or changed entries.
|
||||
<br><br>
|
||||
Released entries are marked with a green check mark.
|
||||
<br><br>
|
||||
If you change grades that have already been approved, they will be marked with a gray checkmark (indicating that the assistant has not yet been notified by email. However, they will immediately see this new grade in their interface).
|
||||
<br><br>
|
||||
The assistant can now adopt approved grades as the grade on their report card (this will be displayed in the next field for your review).
|
||||
<br><br>
|
||||
If the report card grade differs from the grade you approved, the former will be highlighted with a red border.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'benotungstool',
|
||||
'phrase' => 'notenimportHinweistextv3',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Laden Sie sich die Notenliste im Excel-Format unter CIS → Lehrveranstaltungen → Anwesenheits- und Notenlisten → Notenliste herunter.
|
||||
<br><br>
|
||||
Tragen Sie die Noten in das Dokument und speichern Sie dieses.
|
||||
<br><br>
|
||||
Markieren Sie im Excel-Dokument die Inhalte der Spalten Personenkennzeichen und Note für jene Studierende, deren Noten Sie importieren möchten (ohne Überschrift !)
|
||||
<br><br>
|
||||
Kopieren Sie die markierten Inhalte mittels strg + c oder Bearbeiten → Kopieren in die Zwischenablage
|
||||
<br><br>
|
||||
Einfügen der Inhalte mittels strg + v oder Bearbeiten → Einfügen
|
||||
<br><br>
|
||||
Mit einem Klick auf Import werden die Noten übernommen.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Download the grade list in Excel format from CIS → Courses → Attendance and Grade Lists → Grade List.
|
||||
<br><br>
|
||||
Enter the grades into the document and save it.
|
||||
<br><br>
|
||||
In the Excel document, select the contents of the Person ID and Grade columns for the students whose grades you want to import (without headings!).
|
||||
<br><br>
|
||||
Copy the selected content to the clipboard using Ctrl + c or Edit → Copy.
|
||||
<br><br>
|
||||
Paste the content using Ctrl + v or Edit → Paste.
|
||||
<br><br>
|
||||
Click Import to import the grades.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
|
||||
// CIS4 GESAMTNOTENEINGABE ENDE ------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user