klickibunti farben in accordion headers je nach datum/abgabedatum combo; more color definitions cis4 default.css; nomore legacy classes in Abgabe.php, CI3 models only; confirm delete Termin prompt; endupload validation stub, not sure about the technical min requirements here; mitarbeiter table format fix; show noten in projektarbeit view for students so there is some distinction; fhc isMobile computed revamp; order projektarbeiten by insertamum DESC to get most recent ones at the top of lists;

This commit is contained in:
Johann Hoffmann
2025-10-02 16:53:41 +02:00
parent c796536417
commit dab34eff35
10 changed files with 494 additions and 407 deletions
@@ -18,15 +18,6 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
//require_once('../../../include/studiengang.class.php');
//require_once('../../../include/student.class.php');
//require_once('../../../include/datum.class.php');
//require_once('../../../include/mail.class.php');
//require_once('../../../include/benutzerberechtigung.class.php');
//require_once('../../../include/phrasen.class.php');
//require_once('../../../include/projektarbeit.class.php');
//require_once('../../../include/projektbetreuer.class.php');
class Abgabe extends FHCAPI_Controller
{
@@ -61,11 +52,6 @@ class Abgabe extends FHCAPI_Controller
);
$this->load->helper('hlp_sancho_helper');
require_once(FHCPATH . 'include/studiengang.class.php');
require_once(FHCPATH . 'include/student.class.php');
require_once(FHCPATH . 'include/projektarbeit.class.php');
require_once(FHCPATH . 'include/projektbetreuer.class.php');
}
//------------------------------------------------------------------------------------------------------------------
@@ -92,26 +78,24 @@ class Abgabe extends FHCAPI_Controller
*/
public function getStudentProjektabgaben() {
$projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
// TODO: error messages
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$projektarbeit_obj = new projektarbeit();
if($projektarbeit_id==-1)
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
$result = $this->ProjektarbeitModel->load($projektarbeit_id);
$projektarbeitArr = $this->getDataOrTerminateWithError($result);
if(!$projektarbeit_obj->load($projektarbeit_id))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
if(count($projektarbeitArr) > 0) {
$projektarbeit = $projektarbeitArr[0];
} else {
$this->terminateWithError($this->p->t('global','projektarbeitNichtGefunden'), 'general');
}
$paIsCurrent = $this->ProjektarbeitModel->projektarbeitIsCurrent($projektarbeit_id);
$paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
// TODO: fetch zweitbetreuer
$this->terminateWithSuccess(array($ret, $paIsCurrent));
}
@@ -141,15 +125,26 @@ class Abgabe extends FHCAPI_Controller
$projektarbeiten = getData($result);
if(count($projektarbeiten)) {
// TODO: save access to this, array could be empty
foreach($projektarbeiten as $pa) {
$result = $this->ProjektarbeitModel->getProjektbetreuerEmail($pa->projektarbeit_id);
// TODO: save access
$data = getData($result);
if(count($data) > 0) {
$pa->email = $data[0]->private_email;
}
if($pa->zweitbetreuer_person_id !== null) {
// zweitbetreuer info since the 'getStudentProjektarbeitenWithBetreuer' query got quiete large,
// enjoy optimizing that one in 2038. we need this to render a string like
// Zweitbegutachter: FH-Prof. PD DI Dr. techn. Vorname Nachname MBA
$result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->zweitbetreuer_person_id);
$data = getData($result);
if(count($data) > 0) {
$pa->zweitbetreuer = $data[0];
}
}
}
}
@@ -225,11 +220,12 @@ class Abgabe extends FHCAPI_Controller
if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
|| !isset($paabgabe_id) || isEmptyString($paabgabe_id)
|| !isset($student_uid) || isEmptyString($student_uid)
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
|| !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz)
|| !isset($abstract) || !isset($abstract_en) // endupload zusatzdaten can be empty but should never be null
|| !isset($schlagwoerter) || !isset($schlagwoerter_en)
|| !isset($seitenanzahl))
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
// TODO: maybe check for other params aswell?
if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
@@ -261,8 +257,7 @@ class Abgabe extends FHCAPI_Controller
{
$this->signaturFehltEmail($student_uid);
}
// TODO error handle get data has data the updates
// update projektarbeit cols
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
@@ -291,15 +286,26 @@ class Abgabe extends FHCAPI_Controller
}
private function signaturFehltEmail($student_uid) {
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('education/Studiengang_model', 'StudiengangModel');
// Mail an Studiengang wenn keine Signatur gefunden wurde
$student = new student();
if(!$student->load($student_uid))
$result = $this->StudentModel->load($student_uid);
$studentArr = $this->getDataOrTerminateWithError($result);
if(count($studentArr) > 0) {
$student = $studentArr[0];
} else {
$this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
}
$stg_obj = new studiengang();
if(!$stg_obj->load($student->studiengang_kz))
$result = $this->Studiengang_model->load($student->studiengang_kz);
$studiengangArr = $this->getDataOrTerminateWithError($result);
if(count($studiengangArr) > 0) {
$stg_obj = $studiengangArr[0];
} else {
$this->terminateWithError($this->p->t('global','fehlerBeimLesenAusDatenbank'), 'general');
}
$subject = 'Abgabe ohne Signatur';
$tomail = $stg_obj->email;
@@ -325,15 +331,19 @@ class Abgabe extends FHCAPI_Controller
$resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id);
$projektarbeit_obj = new projektarbeit();
if(!$projektarbeit_obj->load($projektarbeit_id))
$this->terminateWithError('Ungueltiger Eintrag');
$result = $this->ProjektarbeitModel->load($projektarbeit_id);
$projektarbeitArr = $this->getDataOrTerminateWithError($result);
$num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
if(count($projektarbeitArr) > 0) {
$projektarbeit = $projektarbeitArr[0];
} else {
$this->terminateWithError($this->p->t('global','projektarbeitNichtGefunden'), 'general');
}
if( null === $num_rows_sem || false === $num_rows_sem )
{
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$projektarbeitIsCurrent = $this->ProjektarbeitModel->projektarbeitIsCurrent($projektarbeit_id);
if(!$projektarbeitIsCurrent) {
$this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
}
@@ -341,14 +351,12 @@ class Abgabe extends FHCAPI_Controller
// query student benutzer view for every betreuer row
$studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
// TODO: hasdata, getData etc
// 1. Begutachter mail ohne Token
$mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
$mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
$projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz;
$subject = $projektarbeit_obj->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
$projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz;
$subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
$abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
$maildata = array();
@@ -359,7 +367,7 @@ class Abgabe extends FHCAPI_Controller
$maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
$maildata['abgabetyp'] = $abgabetyp;
$maildata['parbeituebersichtlink'] = "<p><a href='".APP_ROOT."cis/private/lehre/abgabe_lektor_frameset.html'>Zur Projektarbeitsübersicht</a></p>";
$maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
$maildata['bewertunglink'] = $projektarbeitIsCurrent && $paabgabetyp_kurzbz == 'end' ? "<p><a href='$mail_fulllink'>Zur Beurteilung der Arbeit</a></p>" : "";
$maildata['token'] = "";
$email = $this->getProjektbetreuerEmail($projektarbeit_id);
@@ -384,12 +392,14 @@ class Abgabe extends FHCAPI_Controller
if ($paabgabetyp_kurzbz == 'end')
{
// Zweitbegutachter holen
$zweitbegutachter = new projektbetreuer();
$zweitbegutachterRes = $zweitbegutachter->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid);
$this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
$zweitbegutachterRes = $this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid);
$this->addMeta('$zweitbegutachterRes', $zweitbegutachterRes);
if ($zweitbegutachterRes)
{
$zweitbegutachterResults = $zweitbegutachter->result;
$zweitbegutachterResults = $zweitbegutachterRes->retval;
foreach ($zweitbegutachterResults as $begutachter)
{
@@ -400,10 +410,9 @@ class Abgabe extends FHCAPI_Controller
{
$this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
}
// Zweitbegutachter (evtl. mit Token) holen
$zweitbegutachterMitToken = new projektbetreuer();
$begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
$begutachterMitTokenRes = $this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
// $begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
if (!$begutachterMitTokenRes)
{
@@ -429,8 +438,8 @@ class Abgabe extends FHCAPI_Controller
$zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
$zweitbetmaildata['abgabetyp'] = $abgabetyp;
$zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
$zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
$zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
$zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "<p><a href='$mail_link'>Zur Beurteilung der Arbeit</a></p>" : "";
$zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "<p>Zugangstoken: " . $begutachterMitToken->zugangstoken . "</p>" : "";
$mailres = sendSanchoMail(
@@ -558,9 +567,6 @@ class Abgabe extends FHCAPI_Controller
$note = $noteArr[0];
if($note->positiv === false) {
// $this->addMeta('noteNegativ', true);
// TODO: somewhere in here check if there has been an existingPaabgabe and if that existing abgabe was
// already negativ -> dont send mail
if($existingPaabgabe && $existingPaabgabe->note) {
$result = $this->NoteModel->load($paabgabe->note);
@@ -596,8 +602,7 @@ class Abgabe extends FHCAPI_Controller
if(count($result) == 0)
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
// TODO: berechtigung?
if($result[0]->insertvon === getAuthUID()) {
$result = $this->PaabgabeModel->delete($paabgabe_id);
$result = $this->getDataOrTerminateWithError($result);
@@ -636,7 +641,7 @@ class Abgabe extends FHCAPI_Controller
// old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui
// and should never unintentionally happen
// TODO: check berechtigung &/|| zuordnung?
// TODO: maybe check for betreuer zuordnung?
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
@@ -768,24 +773,29 @@ class Abgabe extends FHCAPI_Controller
$paabgabetyp_kurzbz = $paabgabetyp_kurzbzArr[0];
// Mail an Student wenn Qualgate negativ beurteilt wurde
$student = new student();
if(!$student->load($student_uid))
$this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->load($paabgabe->paabgabetyp_kurzbz);
$studentArr = $this->getDataOrTerminateWithError($result);
$student = $studentArr[0];
// TODO: frasen
$subject = 'Quality Gate Negativ';
if(!$student) {
$this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
}
$subject = $this->p->t('abgabetool', 'c4qualgateNegativEmailSubject');
$tomail = $student_uid.'@'.DOMAIN;
$datetime = new DateTime($paabgabe->datum);
$dateEmailFormatted = $datetime->format('d.m.Y');
// TODO: datum format
$data = array(
'betreuerfullname' => $anrede->first,
'qualgatebezeichnung' => $paabgabetyp_kurzbz->bezeichnung,
'datum' => $paabgabe->datum,
'datum' => $dateEmailFormatted,
'projektarbeitname' => $projektarbeit->titel
);
$this->addMeta('$emaildata', $data);
// $this->addMeta('$emaildata', $data);
$mailres = sendSanchoMail(
'QualGateNegativ',
@@ -97,12 +97,11 @@ class Projektarbeit_model extends DB_Model
*/
public function getStudentProjektarbeitenWithBetreuer($studentUID)
{
$betreuerQuery = "SELECT DISTINCT ON(projektarbeit_id)
$betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
vorname as bvorname,
nachname as bnachname,
titelpre as btitelpre,
titelpost AS btitelpost,
titelpost AS btitelpost,
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
(SELECT person_id
@@ -125,7 +124,8 @@ class Projektarbeit_model extends DB_Model
lehre.tbl_lehreinheit.studiensemester_kurzbz,
lehre.tbl_lehrveranstaltung.studiengang_kz,
public.tbl_studiengang.kurzbzlang,
lehre.tbl_projektbetreuer.note as note,
lehre.tbl_projektarbeit.note as note,
lehre.tbl_note.bezeichnung as note_bezeichnung,
public.tbl_mitarbeiter.mitarbeiter_uid,
lehre.tbl_projektarbeit.titel as titel,
lehre.tbl_projektarbeit.sprache as sprache,
@@ -135,6 +135,7 @@ class Projektarbeit_model extends DB_Model
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
lehre.tbl_projektarbeit.abstract as abstract,
lehre.tbl_projektarbeit.abstract_en as abstract_en,
lehre.tbl_projektarbeit.insertamum as insertamum,
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt,
(SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben
@@ -149,10 +150,12 @@ class Projektarbeit_model extends DB_Model
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note)
WHERE
tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
ORDER BY insertamum DESC";
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
}
@@ -284,4 +287,121 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
/**
* Prüft ob Projektarbeit aktuell ist (also zurzeit online bewertet wird).
* @param $projektarbeit_id
* @return boolean
*/
public function projektarbeitIsCurrent($projektarbeit_id) {
$version = $this->getVersion($projektarbeit_id);
// paarbeit sollte nur ab einem Studiensemester online bewertet werden
return $version === null ? null : $version->isCurrent;
}
/**
* Holt sich Version der Projektarbeit.
* Liefert auch mit, ob die Version die aktuellste ist.
* z.B.: Masterarbeiten waren ab der Änderung zur Gewichtung der Punkte aktuell,
* Bachelorarbeiten waren ab dem Umstieg auf das Online Beurteilungsformular aktuell.
* @param $projektarbeit_id
* @return objekt mit Versionsinfo, null im Fehlerfall
*/
private function getVersion($projektarbeit_id) {
$_versions_query = array(
'Diplom' => array(
'SS2025',
'SS2023',
'SS2022'
),
'Others' => array(
'SS2025',
'SS2022',
)
);
$_versions_check = array(
'Diplom' => array(
'SS2025' => 3,
'SS2023' => 2,
'SS2022' => 1
),
'Others' => array(
'SS2025' => 2,
'SS2022' => 1
)
);
// paarbeit sollte nur ab einem Studiensemester online bewertet werden
$qry="
SELECT
CASE
WHEN semesters_diplom.studiensemester_kurzbz IS NOT NULL
THEN semesters_diplom.studiensemester_kurzbz
ELSE semesters.studiensemester_kurzbz
END AS version_studiensemester_kurzbz,
pa.projekttyp_kurzbz
FROM
lehre.tbl_projektarbeit pa
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz)
LEFT JOIN (
SELECT
start, studiensemester_kurzbz
FROM
public.tbl_studiensemester
WHERE
studiensemester_kurzbz IN ?
) semesters ON sem.start >= semesters.start AND pa.projekttyp_kurzbz <> 'Diplom'
LEFT JOIN (
SELECT
start, studiensemester_kurzbz
FROM
public.tbl_studiensemester
WHERE
studiensemester_kurzbz IN ?
) semesters_diplom ON sem.start >= semesters_diplom.start AND pa.projekttyp_kurzbz = 'Diplom'
WHERE
projektarbeit_id = ?
ORDER BY
semesters.start DESC, semesters_diplom.start DESC
LIMIT 1";
$resultociniBambini = $this->execReadOnlyQuery($qry, array($_versions_query['Others'], $_versions_query['Diplom'], $projektarbeit_id));
if(hasData($resultociniBambini)) {
$data = getData($resultociniBambini);
if(count($data) > 0) {
$row = $data[0];
// known project types
if (isset($_versions_check[$row->projekttyp_kurzbz][$row->version_studiensemester_kurzbz]))
{
$row->versionNumber = $_versions_check[$row->projekttyp_kurzbz][$row->version_studiensemester_kurzbz];
$row->isCurrent =
$_versions_check[$row->projekttyp_kurzbz][$row->version_studiensemester_kurzbz]
== max($_versions_check[$row->projekttyp_kurzbz]);
}
elseif (isset($_versions_check['Others'][$row->version_studiensemester_kurzbz]))
{
$row->versionNumber = $_versions_check['Others'][$row->version_studiensemester_kurzbz];
$row->isCurrent =
$_versions_check['Others'][$row->version_studiensemester_kurzbz]
== max($_versions_check['Others']);
}
else
{
$row->isCurrent = false;
$row->versionNumber = 0;
}
return $row;
} else {
return null;
}
} else {
return null;
}
}
}
+39 -12
View File
@@ -1,6 +1,6 @@
/* Base Header */
.verpasst-header {
background-color: var(--fhc-red-40);
background-color: var(--fhc-red-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -10,7 +10,7 @@
/* Hover State */
.verpasst-header:hover {
background-color: var(--fhc-red-30);
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -22,13 +22,13 @@
/* Hover State Active*/
.p-accordion-tab-active > .verpasst-header:hover {
background-color: var(--fhc-red-40);
background-color: var(--fhc-red-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.abzugeben-header {
background-color: var(--fhc-yellow-40);
background-color: var(--fhc-yellow-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -38,7 +38,7 @@
/* Hover State */
.abzugeben-header:hover {
background-color: var(--fhc-yellow-30);
background-color: var(--fhc-yellow-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -50,13 +50,13 @@
/* Hover State Active*/
.p-accordion-tab-active > .abzugeben-header:hover {
background-color: var(--fhc-yellow-40);
background-color: var(--fhc-yellow-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.verspaetet-header {
background-color: var(--fhc-pink-40);
background-color: var(--fhc-pink-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -66,7 +66,7 @@
/* Hover State */
.verspaetet-header:hover {
background-color: var(--fhc-pink-30);
background-color: var(--fhc-pink-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -78,13 +78,13 @@
/* Hover State Active*/
.p-accordion-tab-active > .verspaetet-header:hover {
background-color: var(--fhc-pink-40);
background-color: var(--fhc-pink-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.abgegeben-header {
background-color: var(--fhc-green-40);
background-color: var(--fhc-green-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
@@ -94,7 +94,7 @@
/* Hover State */
.abgegeben-header:hover {
background-color: var(--fhc-green-30);
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
@@ -106,8 +106,35 @@
/* Hover State Active*/
.p-accordion-tab-active > .abgegeben-header:hover {
background-color: var(--fhc-green-40);
background-color: var(--fhc-green-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Base Header */
.standard-header {
background-color: var(--fhc-white-70);
font-weight: 600;
border-radius: 6px;
padding: 0px 0px 0px 32px;
transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
}
/* Hover State */
.standard-header:hover {
background-color: var(--fhc-white-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
/* Active / Expanded State */
.p-accordion-tab-active > .standard-header {
background-color: var(--fhc-white-50);
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
/* Hover State Active*/
.p-accordion-tab-active > .standard-header:hover {
background-color: var(--fhc-white-60);
box-shadow: 0 2px 6px rgba(0,0,0,0.12);
}
+41 -21
View File
@@ -39,33 +39,53 @@
--fhc-blue-primary-highlight: #0086CB;
/* --- Green --- */
--fhc-green-10: #dff4df;
--fhc-green-20: #a8e0a2;
--fhc-green-30: #008000;
--fhc-green-40: #006600;
--fhc-green-50: #004d00;
--fhc-green-5: rgb(240, 250, 240);
--fhc-green-10: rgb(220, 245, 220);
--fhc-green-20: rgb(190, 235, 190);
--fhc-green-30: rgb(150, 220, 150);
--fhc-green-40: rgb(110, 200, 110);
--fhc-green-50: rgb(70, 170, 70);
--fhc-green-60: rgb(50, 145, 50);
--fhc-green-70: rgb(35, 120, 35);
--fhc-green-80: rgb(25, 95, 25);
--fhc-green-90: rgb(15, 70, 15);
/* --- Red --- */
--fhc-red-10: #fde6e8;
--fhc-red-20: #f5a3a8;
--fhc-red-30: #842029;
--fhc-red-40: #600018;
--fhc-red-50: #400010;
--fhc-red-5: rgb(255, 245, 246);
--fhc-red-10: rgb(255, 225, 228);
--fhc-red-20: rgb(250, 190, 195);
--fhc-red-30: rgb(240, 150, 160);
--fhc-red-40: rgb(225, 110, 120);
--fhc-red-50: rgb(200, 70, 85);
--fhc-red-60: rgb(170, 50, 65);
--fhc-red-70: rgb(140, 35, 50);
--fhc-red-80: rgb(110, 20, 35);
--fhc-red-90: rgb(85, 10, 25);
/* --- Yellow --- */
--fhc-yellow-10: #fff9e6;
--fhc-yellow-20: #fff0b3;
--fhc-yellow-30: #ffeb3b;
--fhc-yellow-40: #f5d600;
--fhc-yellow-50: #c8aa00;
--fhc-yellow-5: rgb(255, 255, 240);
--fhc-yellow-10: rgb(255, 250, 210);
--fhc-yellow-20: rgb(255, 240, 160);
--fhc-yellow-30: rgb(255, 225, 100);
--fhc-yellow-40: rgb(250, 210, 50);
--fhc-yellow-50: rgb(240, 190, 0);
--fhc-yellow-60: rgb(220, 165, 0);
--fhc-yellow-70: rgb(190, 135, 0);
--fhc-yellow-80: rgb(160, 105, 0);
--fhc-yellow-90: rgb(120, 75, 0);
/* --- Pink --- */
--fhc-pink-10: #ffe6f0;
--fhc-pink-20: #f8c1d6;
--fhc-pink-30: #e91e63;
--fhc-pink-40: #c2185b;
--fhc-pink-50: #8b1050;
--fhc-pink-5: rgb(255, 245, 250);
--fhc-pink-10: rgb(255, 225, 235);
--fhc-pink-20: rgb(250, 195, 215);
--fhc-pink-30: rgb(245, 160, 190);
--fhc-pink-40: rgb(235, 120, 160);
--fhc-pink-50: rgb(220, 80, 130);
--fhc-pink-60: rgb(190, 60, 110);
--fhc-pink-70: rgb(160, 40, 90);
--fhc-pink-80: rgb(130, 25, 70);
--fhc-pink-90: rgb(100, 15, 50);
--fhc-beige-10: rgba(245, 233, 215, 0.5);
--fhc-beige-20: rgba(172, 153, 125, 0.5);
+3 -1
View File
@@ -227,7 +227,9 @@ const app = Vue.createApp({
components: {},
computed: {
isMobile() {
return /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
const smallScreen = window.matchMedia("(max-width: 767px)").matches;
const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
return smallScreen;// && touchCapable;
}
},
provide() {
@@ -102,7 +102,7 @@ export const AbgabeMitarbeiterDetail = {
'paabgabe_id': -1,
'projektarbeit_id': this.projektarbeit.projektarbeit_id,
'fixtermin': false,
'kurzbz': '',
'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates
'datum': new Date().toISOString().split('T')[0],
'note': this.allowedNotenOptions.find(opt => opt.note == 9),
'beurteilungsnotiz': '',
@@ -114,12 +114,27 @@ export const AbgabeMitarbeiterDetail = {
}
this.showAutomagicModalPhrase = true
} else {
this.showAutomagicModalPhrase = false
}
} else if(res?.meta?.status == 'error'){
this.$fhcAlert.alertError()
}
})
},
async handleDeleteTermin(termin){
if(await this.$fhcAlert.confirm({
message: this.$p.t('abgabetool/c4confirm_delete'),
acceptLabel: 'Löschen',
acceptClass: 'btn btn-danger',
rejectLabel: 'Zurück',
rejectClass: 'btn btn-outline-secondary'
}) === false) {
return false
} else {
this.deleteTermin(termin)
}
},
deleteTermin(termin) {
this.$api.call(ApiAbgabe.deleteProjektarbeitAbgabe(termin.paabgabe_id)).then( (res) => {
if(res?.meta?.status == 'success') {
@@ -151,34 +166,19 @@ export const AbgabeMitarbeiterDetail = {
const datum = new Date(termin.datum)
const abgabedatum = new Date(termin.abgabedatum)
// todo: rework styling but keep the color pattern logic
// https://wiki.fhcomplete.info/doku.php?id=cis:abgabetool_fuer_studierende
let color = 'white'
let fontColor = 'black'
let icon = '';
if (termin.abgabedatum === null) {
if(datum < today) {
color = 'red'
fontColor = 'white'
icon = 'fa-triangle-exclamation'
return 'verpasst-header'
} else if (datum > today && this.dateDiffInDays(datum, today) <= 12) {
color = 'yellow'
icon = 'fa-circle-exclamation'
}
return 'abzugeben-header'
} else {
return 'standard-header'
}
} else if(abgabedatum > datum) {
color = 'pink' // aka "hellrot"
fontColor = 'white'
icon = 'fa-circle-question'
return 'verspaetet-header'
} else {
color = 'green'
icon = 'fa-square-check'
}
//return `font-color: ${fontColor} ; background-color: ${color}; border-radius: 50%;`
if( typeof mode !== 'undefined' || mode === 'icon') {
return icon;
} else {
return 'abgabe-zieldatum-border-' + color;
return 'abgegeben-header'
}
},
openBeurteilungLink(link) {
@@ -246,8 +246,18 @@ export const AbgabeMitarbeiterDetail = {
console.log(this.$refs.modalContainerCreateNewAbgabe)
this.$refs.modalContainerCreateNewAbgabe.show()
},
validateTermin(termin) {
// compare new termin to existing ones to block illegal termin constellations, if they exist
return true
},
async handleSaveNewAbgabe(termin) {
// TODO: validate termin type & date
if(!this.validateTermin(termin)) {
this.$fhcAlert.alertWarning('invalid termin')
return false
}
await this.saveTermin(termin)
@@ -368,7 +378,8 @@ export const AbgabeMitarbeiterDetail = {
v-model="newTermin.bezeichnung"
@change="handleChangeAbgabetyp(newTermin)"
:options="abgabeTypeOptions"
:optionLabel="getOptionLabelAbgabetyp">
:optionLabel="getOptionLabelAbgabetyp"
scrollHeight="300px">
</Dropdown>
</div>
</div>
@@ -430,53 +441,21 @@ export const AbgabeMitarbeiterDetail = {
<h5>{{$p.t('abgabetool/c4abgabeMitarbeiterbereich')}}</h5>
<div class="row">
<div class="col-8">
<div class="col-6">
<p> {{projektarbeit?.student}}</p>
<p> {{projektarbeit?.titel}}</p>
<p v-if="projektarbeit?.zweitbegutachter"> {{projektarbeit?.zweitbegutachter}}</p>
</div>
<div class="col-4 d-flex">
<div class="col">
<div class="row">
<button :disabled="!getSemesterBenotbar || !endUploadVorhanden" class="btn btn-secondary border-0" @click="openBenotung" style="width: 80%;">
{{ $p.t('abgabetool/c4benoten') }}
<i class="fa-solid fa-user-check"></i>
</button>
</div>
<div class="row" style="width: 90%;">
<span v-if="!getSemesterBenotbar" v-html="$p.t('abgabetool/c4aeltereParbeitBenoten', oldPaBeurteilungLink)"></span>
<span v-else-if="!endUploadVorhanden">{{ $p.t('abgabetool/c4noEnduploadFound') }}</span>
</div>
</div>
<div class="col">
<div class="row">
<button v-if="projektarbeit?.betreuerart_kurzbz !== 'Zweitbegutachter'" class="btn btn-secondary border-0" @click="openPlagiatcheck" style="width: 80%;">
{{ $p.t('abgabetool/c4plagiatcheck_link')}}
<i class="fa-solid fa-user-check"></i>
</button>
</div>
</div>
<div class="col">
<div class="row">
<button class="btn btn-secondary border-0" @click="openStudentPage" style="width: 80%;">
{{ $p.t('abgabetool/c4student_perspective')}}
<i class="fa-solid fa-eye"></i>
</button>
</div>
</div>
</div>
</div>
<Accordion :multiple="true" :activeIndex="[0]">
<template v-for="termin in this.projektarbeit?.abgabetermine">
<AccordionTab :header="getAccTabHeaderForTermin(termin)">
<AccordionTab :header="getAccTabHeaderForTermin(termin)" :headerClass="getDateStyle(termin)">
<div class="row">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4fixtermin')}}</div>
<div class="col-8 col-md-9">
<!-- always keep fixtermin checkbox disabled for mitarbeiter tool -->
<!-- always keep fixtermin checkbox disabled for mitarbeiter tool -->
<Checkbox
v-model="termin.fixtermin"
disabled
@@ -569,7 +548,7 @@ export const AbgabeMitarbeiterDetail = {
</button>
</div>
<div class="col-4">
<button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-primary border-0" @click="deleteTermin(termin)">
<button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-danger border-0" @click="handleDeleteTermin(termin)">
{{ $p.t('abgabetool/c4delete') }}
<i class="fa-solid fa-trash"></i>
</button>
@@ -580,94 +559,6 @@ export const AbgabeMitarbeiterDetail = {
</AccordionTab>
</template>
</Accordion>
<!-- <div id="uploadWrapper">-->
<!-- <div class="row" style="margin-bottom: 12px;">-->
<!-- <div class="fw-bold" style="width: 100px">{{$p.t('abgabetool/c4fixtermin')}}</div>-->
<!-- <div class="row" style="max-width: calc(100% - 100px)">-->
<!-- <div class="col-2 fw-bold">{{$p.t('abgabetool/c4zieldatum')}}</div>-->
<!-- <div class="col-2 fw-bold">{{$p.t('abgabetool/c4abgabetyp')}}</div>-->
<!-- <div v-show="qualityGateTerminAvailable" class="col-2 fw-bold">{{$p.t('abgabetool/c4note')}}</div>-->
<!-- <div v-show="qualityGateTerminAvailable" class="col-1 fw-bold">{{$p.t('abgabetool/c4upload_allowed')}}</div>-->
<!-- <div class="col-2 fw-bold">{{$p.t('abgabetool/c4abgabekurzbz')}}</div>-->
<!-- <div class="col-1 fw-bold">{{$p.t('abgabetool/c4abgabedatum')}}</div>-->
<!-- <div class="col">-->
<!-- -->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div v-if="!projektarbeit?.abgabetermine?.length">keine Termine gefunden!</div>-->
<!-- <div class="row" v-for="termin in projektarbeit.abgabetermine">-->
<!-- <div style="width: 100px" class="d-flex justify-content-center align-items-center">-->
<!-- <i v-if="termin.fixtermin" class="fa-solid fa-2x fa-circle-check fhc-bullet-red"></i>-->
<!-- <i v-else="" class="fa-solid fa-2x fa-circle-xmark fhc-bullet-green"></i>-->
<!--&lt;!&ndash; <p class="fhc-bullet" :class="{ 'fhc-bullet-red': termin.fixtermin, 'fhc-bullet-green': !termin.fixtermin }"></p>&ndash;&gt;-->
<!-- </div>-->
<!-- <div class="row" style="max-width: calc(100% - 100px)">-->
<!-- <div class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <div class="position-relative" :class="getDateStyle(termin)">-->
<!-- <VueDatePicker-->
<!-- style="width: 95%;"-->
<!-- v-model="termin.datum"-->
<!-- :clearable="false"-->
<!-- :disabled="!termin.allowedToSave"-->
<!-- :enable-time-picker="false"-->
<!-- :format="formatDate"-->
<!-- :text-input="true"-->
<!-- auto-apply>-->
<!-- </VueDatePicker>-->
<!-- <i class="position-absolute abgabe-zieldatum-overlay fa-solid fa-2x" :class="getDateStyle(termin, 'icon')"></i>-->
<!-- </div> -->
<!-- </div>-->
<!-- <div class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <Dropdown -->
<!-- :style="{'width': '100%'}"-->
<!-- :disabled="!termin.allowedToSave"-->
<!-- v-model="termin.bezeichnung"-->
<!-- :options="abgabeTypeOptions"-->
<!-- :optionLabel="getOptionLabelAbgabetyp">-->
<!-- </Dropdown>-->
<!-- </div>-->
<!-- <div v-if="qualityGateTerminAvailable || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'" class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <Dropdown -->
<!-- v-if="termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'"-->
<!-- :style="{'width': '100%'}"-->
<!-- v-model="termin.note"-->
<!-- :options="allowedNotenOptions"-->
<!-- :optionLabel="getNotenOptionLabel">-->
<!-- </Dropdown>-->
<!-- </div>-->
<!-- <div v-if="qualityGateTerminAvailable || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'" class="col-1 d-flex justify-content-center align-items-center">-->
<!-- <Checkbox -->
<!-- v-if="termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate1' || termin.bezeichnung?.paabgabetyp_kurzbz === 'qualgate2'"-->
<!-- v-model="termin.upload_allowed"-->
<!-- :binary="true" -->
<!-- :pt="{ root: { class: 'ml-auto' }}"-->
<!-- >-->
<!-- </Checkbox>-->
<!-- </div>-->
<!-- <div class="col-2 d-flex justify-content-center align-items-center">-->
<!-- <Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" rows="1" cols="20" :disabled="!termin.allowedToSave"></Textarea>-->
<!-- </div>-->
<!-- <div class="col-1 d-flex justify-content-center align-items-center">-->
<!-- {{ termin.abgabedatum?.split("-").reverse().join(".") }}-->
<!-- <a v-if="termin?.abgabedatum" @click="downloadAbgabe(termin)" style="margin-left:4px; cursor: pointer;">-->
<!-- <i class="fa-solid fa-2x fa-file-pdf"></i>-->
<!-- </a>-->
<!-- </div>-->
<!-- <div class="col-2 align-content-center">-->
<!-- <button v-if="termin.allowedToSave" style="max-height: 40px;" class="btn btn-primary border-0" @click="saveTermin(termin)">-->
<!-- {{ $p.t('abgabetool/c4save') }}-->
<!-- <i class="fa-solid fa-floppy-disk"></i>-->
<!-- </button>-->
<!-- <button v-if="termin.allowedToDelete && termin.paabgabe_id > 0" style="max-height: 40px;" class="btn btn-primary border-0" @click="deleteTermin(termin)">-->
<!-- {{ $p.t('abgabetool/c4delete') }}-->
<!-- <i class="fa-solid fa-trash"></i>-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
</div>
`,
};
@@ -182,45 +182,20 @@ export const AbgabeStudentDetail = {
const datum = new Date(termin.datum)
const abgabedatum = new Date(termin.abgabedatum)
// todo: rework styling but keep the color pattern logic
// https://wiki.fhcomplete.info/doku.php?id=cis:abgabetool_fuer_studierende
let color = 'white'
let fontColor = 'black'
let icon = '';
if (termin.abgabedatum === null) {
if(datum < today) {
return 'verpasst-header'
// color = 'red'
// fontColor = 'white'
// icon = 'fa-triangle-exclamation'
} else if (datum > today && this.dateDiffInDays(datum, today) <= 12) {
return 'abzugeben-header'
// color = 'yellow'
// icon = 'fa-circle-exclamation'
} else {
return 'standard-header'
}
} else if(abgabedatum > datum) {
return 'verspaetet-header'
// color = 'pink' // aka "hellrot"
// fontColor = 'white'
// icon = 'fa-circle-question'
} else {
return 'abgegeben-header'
// color = 'green'
// icon = 'fa-square-check'
}
// return 'background-color: ' + color;
//
// //return `font-color: ${fontColor} ; background-color: ${color}; border-radius: 50%;`
// if( typeof mode !== 'undefined' || mode === 'icon') {
// return icon;
// } else {
// return 'abgabe-zieldatum-border-' + color;
// }
},
openBeurteilungLink(link) {
window.open(link, '_blank')
@@ -308,6 +283,7 @@ export const AbgabeStudentDetail = {
<!-- <i v-else="" class="fa-solid fa-2x fa-circle-xmark fhc-bullet-green"></i>-->
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4zieldatum')}}</div>
<div class="col-8 col-md-9">
@@ -323,12 +299,14 @@ export const AbgabeStudentDetail = {
<!-- <i class="position-absolute abgabe-zieldatum-overlay fa-solid fa-2x" :class="getDateStyle(termin, 'icon')"></i>-->
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4abgabetyp')}}</div>
<div class="col-8 col-md-9">
{{ termin.bezeichnung }}
</div>
</div>
<div class="row mt-2" v-if="termin.paabgabetyp_kurzbz === 'qualgate1' || termin.paabgabetyp_kurzbz === 'qualgate2'">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4note')}}</div>
<div class="col-8 col-md-9">
@@ -337,12 +315,14 @@ export const AbgabeStudentDetail = {
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4abgabekurzbz')}}</div>
<div class="col-8 col-md-9">
<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" :rows=" isMobile ? 2 : 4" :cols=" isMobile ? 30 : 90" :disabled="true"></Textarea>
<Textarea style="margin-bottom: 4px;" v-model="termin.kurzbz" :rows=" isMobile ? 2 : 4" :cols=" isMobile ? 25 : 90" :disabled="true"></Textarea>
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4abgabedatum')}}</div>
<div class="col-8 col-md-9">
@@ -352,6 +332,7 @@ export const AbgabeStudentDetail = {
</a>
</div>
</div>
<div class="row mt-2" v-if="termin.upload_allowed">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4fileupload')}}</div>
<div class="col-8 col-md-9">
@@ -376,7 +357,6 @@ export const AbgabeStudentDetail = {
</div>
</div>
</div>
</div>
</AccordionTab>
</template>
</Accordion>
@@ -65,10 +65,11 @@ export const AbgabetoolMitarbeiter = {
abgabeTableOptions: {
minHeight: 250,
index: 'projektarbeit_id',
layout: 'fitColumns',
layout: 'fitDataStretch',
placeholder: this.$p.t('global/noDataAvailable'),
selectable: true,
selectableCheck: this.selectionCheck,
rowHeight: 80,
columns: [
{
formatter: 'rowSelection',
@@ -82,14 +83,14 @@ export const AbgabetoolMitarbeiter = {
width: 70
},
{title: Vue.computed(() => this.$p.t('abgabetool/c4details')), field: 'details', formatter: this.detailFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4personenkennzeichen')), field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4personenkennzeichen')), headerFilter: true, field: 'pkz', formatter: this.pkzTextFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4kontakt')), field: 'mail', formatter: this.mailFormatter, widthGrow: 1, tooltip: false},
{title: Vue.computed(() => this.$p.t('abgabetool/c4vorname')), field: 'vorname', formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4nachname')), field: 'nachname', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4vorname')), field: 'vorname', headerFilter: true, formatter: this.centeredTextFormatter,widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4nachname')), field: 'nachname', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4projekttyp')), field: 'projekttyp_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'studiensemester_kurzbz', formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel', formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
{title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'studiensemester_kurzbz', headerFilter: true, formatter: this.centeredTextFormatter, widthGrow: 1},
{title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel', headerFilter: true, formatter: this.centeredTextFormatter, maxWidth: 500, widthGrow: 8},
{title: Vue.computed(() => this.$p.t('abgabetool/c4betreuerart')), field: 'betreuerart_beschreibung',formatter: this.centeredTextFormatter, widthGrow: 1}
],
persistence: false,
@@ -442,7 +443,6 @@ export const AbgabetoolMitarbeiter = {
</template>
</bs-modal>
<bs-modal ref="modalContainerAbgabeDetail" class="bootstrap-prompt"
dialogClass="modal-fullscreen">
<template v-slot:title>
@@ -39,108 +39,7 @@ export const AbgabetoolStudent = {
student_uid: null,
detail: null,
projektarbeiten: null,
selectedProjektarbeit: null,
// abgabeTableOptions: {
// minHeight: 250,
// index: 'projektarbeit_id',
// layout: 'fitColumns',
// responsiveLayout: "collapse",
// placeholder: this.$p.t('global/noDataAvailable'),
// columns: [
// {
// formatter:"responsiveCollapse",
// width:30, minWidth:30, hozAlign:"center", resizable:false, headerSort:false
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4details')), field: 'details',
// formatter: this.detailFormatter,
// widthGrow: 1, tooltip: false
// , responsive: 0, minWidth: 80
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4beurteilung')), field: 'beurteilung',
// formatter: this.beurteilungFormatter,
// widthGrow: 1, tooltip: false
// , responsive: 0, minWidth: 80
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4sem')), field: 'sem',
// formatter: this.centeredTextFormatter,
// widthGrow: 1
// , responsive: 5, minWidth: 120
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4stg')), field: 'stg',
// formatter: this.centeredTextFormatter,
// widthGrow: 1
// , responsive: 6, minWidth: 120
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4kontakt')), field: 'mail',
// formatter: this.mailFormatter,
// widthGrow: 1
// , responsive: 0, minWidth: 80
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4betreuer')), field: 'betreuer',
// formatter: this.centeredTextFormatter,
// widthGrow: 2
// , responsive: 7, minWidth: 300
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4projekttyp')), field: 'typ',
// formatter: this.centeredTextFormatter,
// widthGrow: 1
// , responsive: 8, minWidth: 200
// },
// {
// title: Vue.computed(() => this.$p.t('abgabetool/c4titel')), field: 'titel',
// formatter: this.centeredTextFormatter,
// widthGrow: 8
// , responsive: 1, minWidth: 420
// }
// ],
// persistence: false,
// },
// abgabeTableEventHandlers: [
// {
// event: "tableBuilt",
// handler: async () => {
// this.tableBuiltResolve()
// }
// },
// {
// event: "dataProcessed",
// handler: async () => {
// console.log('dataProcessed event')
// this.dataProcessedResolve()
// }
// },
// {
// event: "cellClick",
// handler: async (e, cell) => {
//
// if(cell.getColumn().getField() === "details") {
// const val = cell.getValue()
//
// if(val.mode === 'detailTermine') {
// this.setDetailComponent(cell.getValue())
// } else if (val.mode === 'beurteilungDownload') {
// const pdfExportLink = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/pdfExport.php?xml=projektarbeitsbeurteilung.xml.php&xsl=Projektbeurteilung&betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id
// // const pdfExportLink2 = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'cis/private/lehre/projektbeurteilungDocumentExport.php?betreuerart_kurzbz='+val.betreuerart_kurzbz+'&projektarbeit_id='+val.projektarbeit_id+'&person_id=' + val.betreuer_person_id
// window.open(pdfExportLink, '_blank')
// }
//
// } else if (cell.getColumn().getField() === "beurteilung") {
// const val = cell.getValue()
//
// if(val != '-') window.open(val, '_blank')
// }
// e.stopPropagation()
//
// }
// }
// ]
selectedProjektarbeit: null
};
},
methods: {
@@ -236,7 +135,9 @@ export const AbgabetoolStudent = {
// this.projektarbeiten = data[0]
this.domain = data[1]
this.student_uid = data[2]
this.projektarbeiten = data[0]?.map(projekt => {
this.projektarbeiten = data[0] ?? null
if(!this.projektarbeiten) return
this.projektarbeiten = this.projektarbeiten.map(projekt => {
let mode = 'detailTermine'
if (projekt.babgeschickt || projekt.zweitbetreuer_abgeschickt) {
@@ -288,6 +189,19 @@ export const AbgabetoolStudent = {
title += projektarbeit.titel
return title
},
getMailLink(projektarbeit) {
if(projektarbeit.email) {
return 'mailto:'+projektarbeit.email
} else return ''
},
getNoteBezeichnung(projektarbeit) {
if(projektarbeit.note) {
const noteOpt = this.notenOptions.find(opt => opt.note == projektarbeit.note)
return noteOpt?.bezeichnung
} else {
return ''
}
}
},
watch: {
@@ -328,19 +242,30 @@ export const AbgabetoolStudent = {
<h2>{{$p.t('abgabetool/abgabetoolTitle')}}</h2>
<hr>
<div v-if="projektarbeiten === null || projektarbeiten === []">
<div v-if="projektarbeiten === null">
{{$p.t('abgabetool/c4abgabeStudentNoProjectsFound')}}
</div>
<Accordion :multiple="true" :activeIndex="[0]">
<template v-for="projektarbeit in projektarbeiten">
<AccordionTab :header="getAccTabHeaderForProjektarbeit(projektarbeit)">
<AccordionTab>
<template #header>
<div class="d-flex row w-100">
<div class="col-6 text-start">
<span>{{getAccTabHeaderForProjektarbeit(projektarbeit)}}</span>
</div>
<div class="col-6 text-end">
<span>{{getNoteBezeichnung(projektarbeit)}}</span>
</div>
</div>
</template>
<div class="row">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4details')}}</div>
<div class="col-8 col-md-9">
<button @click="setDetailComponent(projektarbeit.details)" class="btn btn-primary">
Projektdetails öffnen <a><i class="fa fa-folder-open"></i></a>
{{$p.t('abgabetool/c4projektdetailsOeffnen')}} <a><i class="fa fa-folder-open"></i></a>
</button>
</div>
</div>
@@ -348,7 +273,7 @@ export const AbgabetoolStudent = {
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4beurteilung')}}</div>
<div class="col-8 col-md-9">
<a v-if="projektarbeit.beurteilung"><i class="fa fa-file-pdf" style="color:#00649C"></i></a>
<a v-else>Keine Beurteilung vorhanden</a>
<a v-else>{{$p.t('abgabetool/c4nobeurteilungVorhanden')}}</a>
</div>
</div>
<div class="row mt-2">
@@ -371,6 +296,18 @@ export const AbgabetoolStudent = {
{{ projektarbeit.betreuer }}
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4betreuerEmailKontakt')}}</div>
<div class="col-8 col-md-9">
<a :href="getMailLink(projektarbeit)"><i class="fa fa-envelope" style="color:#00649C"></i></a>
</div>
</div>
<div v-if="projektarbeit.zweitbetreuer" class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{ projektarbeit.zweitbetreuer_betreuerart_kurzbz}}</div>
<div class="col-8 col-md-9">
{{ projektarbeit.zweitbetreuer_betreuerart_beschreibung}}: {{ projektarbeit.zweitbetreuer?.first }}
</div>
</div>
<div class="row mt-2">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4projekttyp')}}</div>
<div class="col-8 col-md-9">
+100
View File
@@ -42836,6 +42836,26 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4confirm_delete',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Möchten Sie w",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No projects found!',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
@@ -42856,6 +42876,26 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4qualgateNegativEmailSubject',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Quality Gate Negativ beurteilt",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Quality Gate graded negative',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
@@ -42876,6 +42916,66 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4betreuerEmailKontakt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Emailkontakt Betreuer",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Emailcontact Assesor',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4projektdetailsOeffnen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Projektdetails öffnen",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'open Project Details',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4nobeurteilungVorhanden',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Keine Beurteilung vorhanden",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No Project evaluation found',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',