mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-12 17:49:28 +00:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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>-->
|
||||
<!--<!– <p class="fhc-bullet" :class="{ 'fhc-bullet-red': termin.fixtermin, 'fhc-bullet-green': !termin.fixtermin }"></p>–>-->
|
||||
<!-- </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">
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user