mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
Merge branch 'master' into benutzerberechtigungGUIneu
This commit is contained in:
@@ -159,3 +159,11 @@ $config['stgkz_blacklist_unterbrechung'] = [];
|
||||
* @var array An array of tbl_studiengang.studiengang_kz's
|
||||
*/
|
||||
$config['stgkz_blacklist_wiederholung'] = [];
|
||||
|
||||
/**
|
||||
* Blacklisted noten for negative committee exams
|
||||
* noten with this ids won't be seen as negative
|
||||
*
|
||||
* @var array An array of noten ids
|
||||
*/
|
||||
$config['note_blacklist_wiederholung'] = [];
|
||||
|
||||
@@ -26,6 +26,9 @@ class Filter extends FHC_Controller
|
||||
// Loads authentication library and starts authentication
|
||||
$this->load->library('AuthLib');
|
||||
|
||||
// Loads the FiltersModel
|
||||
$this->load->model('system/Filters_model', 'FiltersModel');
|
||||
|
||||
// Loads the FilterCmptLib with HTTP GET/POST parameters
|
||||
$this->_startFilterCmptLib();
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@ class AntragJob extends JOB_Controller
|
||||
}
|
||||
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
|
||||
|
||||
$result = $this->StudiengangModel->load($antrag->studiengang_kz);
|
||||
$result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
|
||||
if (isError($result))
|
||||
{
|
||||
$this->logError(getError($result));
|
||||
@@ -214,8 +214,7 @@ class AntragJob extends JOB_Controller
|
||||
$count = 0;
|
||||
foreach ($antraege as $antrag)
|
||||
{
|
||||
$this->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
|
||||
$res = $this->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
|
||||
$res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
|
||||
$stg = '';
|
||||
$orgform = '';
|
||||
if (hasData($res)) {
|
||||
@@ -350,6 +349,7 @@ class AntragJob extends JOB_Controller
|
||||
$this->StudierendenantragModel->addSelect('prestudent_id');
|
||||
$this->StudierendenantragModel->addSelect('studiensemester_kurzbz');
|
||||
$this->StudierendenantragModel->addSelect('s.insertamum');
|
||||
$this->StudierendenantragModel->addSelect('s.insertvon');
|
||||
|
||||
$this->StudierendenantragModel->db->where_in('public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
|
||||
@@ -373,9 +373,11 @@ class AntragJob extends JOB_Controller
|
||||
$result = $this->prestudentlib->setAbbrecher(
|
||||
$antrag->prestudent_id,
|
||||
$antrag->studiensemester_kurzbz,
|
||||
$insertvon,
|
||||
'AntragJob',
|
||||
'abbrecherStgl',
|
||||
$antrag->insertamum
|
||||
$antrag->insertamum,
|
||||
null,
|
||||
$antrag->insertvon ?: $insertvon
|
||||
);
|
||||
if (isError($result))
|
||||
$this->logError(getError($result));
|
||||
@@ -414,7 +416,7 @@ class AntragJob extends JOB_Controller
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->logInfo($count . " Students set to Abbrecher");
|
||||
$this->logInfo($count . "/" . count($antraege) . " Students set to Abbrecher");
|
||||
}
|
||||
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
|
||||
}
|
||||
|
||||
@@ -81,42 +81,9 @@ class Studierendenantrag extends FHC_Controller
|
||||
|
||||
public function leitung()
|
||||
{
|
||||
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
|
||||
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
|
||||
$stgL = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
|
||||
|
||||
$stgL = [];
|
||||
if ($studiengaenge) {
|
||||
$result = $this->StudiengangModel->loadWithOrgform($studiengaenge);
|
||||
if (isError($result))
|
||||
return show_error(getError($result));
|
||||
$antraege = getData($result) ?: [];
|
||||
|
||||
foreach ($antraege as $antrag) {
|
||||
if (!isset($stgL[$antrag->studiengang_kz])) {
|
||||
$stgL[$antrag->studiengang_kz] = new stdClass();
|
||||
$stgL[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
|
||||
$stgL[$antrag->studiengang_kz]->orgform = $antrag->orgform;
|
||||
$stgL[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$stgA = [];
|
||||
if ($stgsNeuanlage) {
|
||||
$result = $this->StudiengangModel->loadWithOrgform($stgsNeuanlage);
|
||||
if (isError($result))
|
||||
return show_error(getError($result));
|
||||
$antraege = getData($result) ?: [];
|
||||
|
||||
foreach ($antraege as $antrag) {
|
||||
if (!isset($stgA[$antrag->studiengang_kz])) {
|
||||
$stgA[$antrag->studiengang_kz] = new stdClass();
|
||||
$stgA[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
|
||||
$stgA[$antrag->studiengang_kz]->orgform = $antrag->orgform;
|
||||
$stgA[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
|
||||
}
|
||||
}
|
||||
}
|
||||
$stgA = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: [];
|
||||
|
||||
$this->load->view('lehre/Antrag/Leitung/List', [
|
||||
'stgA' => $stgA,
|
||||
|
||||
@@ -123,6 +123,8 @@ class AntragLib
|
||||
*/
|
||||
public function approveAbmeldung($studierendenantrag_ids, $insertvon)
|
||||
{
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$errors = [];
|
||||
foreach ($studierendenantrag_ids as $studierendenantrag_id) {
|
||||
$result = $this->_ci->StudierendenantragModel->load($studierendenantrag_id);
|
||||
@@ -156,7 +158,6 @@ class AntragLib
|
||||
if (hasData($result)) {
|
||||
$studiengang = current(getData($result));
|
||||
$stg = $studiengang->bezeichnung;
|
||||
$orgform = $studiengang->orgform_kurzbz;
|
||||
}
|
||||
if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG)
|
||||
{
|
||||
@@ -166,6 +167,7 @@ class AntragLib
|
||||
|
||||
else {
|
||||
$prestudent_status = getData($resultPrestudentStatus)[0];
|
||||
$orgform = $prestudent_status->orgform_kurzbz;
|
||||
|
||||
$vorlage ='Sancho_Mail_Antrag_A_Approve';
|
||||
$subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve');
|
||||
@@ -202,14 +204,14 @@ class AntragLib
|
||||
$data['UID'] = $student->student_uid;
|
||||
}
|
||||
|
||||
$data['Orgform'] = $orgform;
|
||||
$data['Orgform'] = $prestudent_status->orgform;
|
||||
$data['stg'] = $stg;
|
||||
|
||||
// NOTE(chris): Sancho mail
|
||||
sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject);
|
||||
}
|
||||
} else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
|
||||
$result = $this->_ci->PrestudentstatusModel->getLastStatus($antrag->prestudent_id, '', 'Student');
|
||||
$result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student');
|
||||
if (isError($result))
|
||||
{
|
||||
$errors[] = getError($result);
|
||||
@@ -221,6 +223,7 @@ class AntragLib
|
||||
continue;
|
||||
}
|
||||
$prestudentstatus = getData($result)[0];
|
||||
$orgform = $prestudentstatus->orgform_kurzbz;
|
||||
|
||||
$result = $this->_ci->PrestudentstatusModel->withGrund('preabbrecher')->update([
|
||||
'prestudent_id' => $prestudentstatus->prestudent_id,
|
||||
@@ -250,10 +253,9 @@ class AntragLib
|
||||
$vorname = '';
|
||||
$nachname = $name;
|
||||
}
|
||||
$res = $this->_ci->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']);
|
||||
$res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
|
||||
if (hasData($res)) {
|
||||
$kontakt = current(getData($res));
|
||||
$email = $kontakt->kontakt;
|
||||
$email = $this->_ci->StudentModel->getEmailFH(current(getData($res))->student_uid);
|
||||
$vorlage = $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG ? 'Student' : 'Stgl';
|
||||
|
||||
// NOTE(chris): Sancho mail
|
||||
@@ -334,6 +336,8 @@ class AntragLib
|
||||
$res = $this->_ci->PrestudentModel->load($antrag->prestudent_id);
|
||||
|
||||
if (hasData($res)) {
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$prestudent = current(getData($res));
|
||||
$res = $this->_ci->PersonModel->load($prestudent->person_id);
|
||||
if (hasData($res)) {
|
||||
@@ -344,13 +348,12 @@ class AntragLib
|
||||
} else {
|
||||
$name = $this->_ci->p->t('person', 'studentIn');
|
||||
}
|
||||
$res = $this->_ci->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']);
|
||||
if (hasData($res)) {
|
||||
$kontakt = current(getData($res));
|
||||
$email = $kontakt->kontakt;
|
||||
|
||||
$this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
|
||||
$res = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
|
||||
$res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
|
||||
if (hasData($res)) {
|
||||
$email = $this->_ci->StudentModel->getEmailFH(current(getData($res))->student_uid);
|
||||
|
||||
$res = $this->_ci->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
|
||||
$stg = '';
|
||||
$orgform = '';
|
||||
if (hasData($res)) {
|
||||
@@ -432,6 +435,7 @@ class AntragLib
|
||||
public function approveUnterbrechung($studierendenantrag_ids, $insertvon)
|
||||
{
|
||||
$this->_ci->load->model('person/Kontakt_model', 'KontaktModel');
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$errors = [];
|
||||
|
||||
@@ -555,7 +559,7 @@ class AntragLib
|
||||
[
|
||||
'name' => $mail['ass'],
|
||||
'stg' => $data['studiengang']->bezeichnung,
|
||||
'Orgform' => $data['studiengang']->orgform_kurzbz,
|
||||
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
|
||||
'vorname' => $data['person']->vorname,
|
||||
'nachname' => $data['person']->nachname,
|
||||
'UID' => $data['UID'],
|
||||
@@ -579,7 +583,7 @@ class AntragLib
|
||||
[
|
||||
'name' => $mail['stu'],
|
||||
'stg' => $data['studiengang']->bezeichnung,
|
||||
'Orgform' => $data['studiengang']->orgform_kurzbz,
|
||||
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
|
||||
'vorname' => $data['person']->vorname,
|
||||
'nachname' => $data['person']->nachname
|
||||
],
|
||||
@@ -609,6 +613,7 @@ class AntragLib
|
||||
public function rejectUnterbrechung($studierendenantrag_ids, $insertvon, $grund)
|
||||
{
|
||||
$this->_ci->load->model('person/Kontakt_model', 'KontaktModel');
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$errors = [];
|
||||
|
||||
@@ -673,7 +678,7 @@ class AntragLib
|
||||
'nachname' => $nachname,
|
||||
'grund' => $grund,
|
||||
'stg' => $data['studiengang']->bezeichnung,
|
||||
'Orgform' => $data['studiengang']->orgform_kurzbz,
|
||||
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
|
||||
'prestudent_id' => $data['prestudent_status']->prestudent_id,
|
||||
'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id),
|
||||
'abmeldungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id
|
||||
@@ -719,7 +724,6 @@ class AntragLib
|
||||
else{
|
||||
$result['studiengang'] = new stdClass();
|
||||
$result['studiengang']->bezeichnung = "";
|
||||
$result['studiengang']->orgform_kurzbz = "";
|
||||
}
|
||||
|
||||
$res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id);
|
||||
@@ -756,7 +760,7 @@ class AntragLib
|
||||
}
|
||||
}
|
||||
|
||||
$res = $this->_ci->KontaktModel->getZustellKontakt($person_id, ['email']);
|
||||
$res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
|
||||
if (isError($res)) {
|
||||
$errors['email'] = getError($res);
|
||||
} else {
|
||||
@@ -765,7 +769,7 @@ class AntragLib
|
||||
if (!$res) {
|
||||
$errors['email'] = $this->_ci->p->t('studierendenantrag', 'error_no_email', ['person_id' => $person_id]);
|
||||
} else {
|
||||
$result['email'] = current($res)->kontakt;
|
||||
$result['email'] = $this->_ci->StudentModel->getEmailFH(current($res)->student_uid);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -855,14 +859,18 @@ class AntragLib
|
||||
$prestudent_status = current($res);
|
||||
$email = $prestudent_status->email;
|
||||
// NOTE(chris): Sancho mail
|
||||
$lvzuweisungLink = site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id);
|
||||
if( defined('VILESCI_ROOT') )
|
||||
{
|
||||
$lvzuweisungLink = VILESCI_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id;
|
||||
}
|
||||
sendSanchoMail(
|
||||
'Sancho_Mail_Antrag_W_New',
|
||||
[
|
||||
'antrag_id' => $antrag_id,
|
||||
'stg' => $prestudent_status->stg_bezeichnung,
|
||||
'Orgform' => $prestudent_status->orgform,
|
||||
'lvzuweisungLink' => site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id),
|
||||
'lvzuweisungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id
|
||||
'lvzuweisungLink' => $lvzuweisungLink
|
||||
],
|
||||
$email,
|
||||
$this->_ci->p->t('studierendenantrag', 'mail_subject_W_New')
|
||||
@@ -1514,6 +1522,8 @@ class AntragLib
|
||||
|
||||
public function approveWiederholung($antrag_id, $insertvon)
|
||||
{
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
$result = $this->_ci->StudierendenantragstatusModel->insert([
|
||||
'studierendenantrag_id' => $antrag_id,
|
||||
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
|
||||
@@ -1540,18 +1550,9 @@ class AntragLib
|
||||
if (!$result)
|
||||
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id]));
|
||||
|
||||
$result = current($result);
|
||||
$studiengang_kz = $result->studiengang_kz;
|
||||
$semester = $result->ausbildungssemester;
|
||||
|
||||
$result = $this->_ci->StudiengangModel->load($studiengang_kz);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id]));
|
||||
|
||||
$stg = current($result);
|
||||
$studiengang_kz = $stg->studiengang_kz;
|
||||
$semester = $stg->ausbildungssemester;
|
||||
|
||||
$result = $this->_ci->StudierendenantragModel->load($antrag_id);
|
||||
if (isError($result))
|
||||
@@ -1577,10 +1578,10 @@ class AntragLib
|
||||
$mitarbeiter = getData($result);
|
||||
}
|
||||
|
||||
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $antrag->prestudent_id]);
|
||||
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $prestudent_id]);
|
||||
if (hasData($result)) {
|
||||
$student = current(getData($result));
|
||||
$student_uid = $student->student_uid;
|
||||
$studentObj = current(getData($result));
|
||||
$student_uid = $studentObj->student_uid;
|
||||
}
|
||||
else
|
||||
$student_uid = '';
|
||||
@@ -1602,10 +1603,8 @@ class AntragLib
|
||||
))
|
||||
return error($this->_ci->p->t('studierendenantrag', 'error_mail_to', ['email' => $email]));
|
||||
|
||||
$result = $this->_ci->KontaktModel->getZustellKontakt($person->person_id, ['email']);
|
||||
if (hasData($result)) {
|
||||
$kontakt = current(getData($result));
|
||||
$email = $kontakt->kontakt;
|
||||
if ($student_uid) {
|
||||
$email = $this->_ci->StudentModel->getEmailFH($student_uid);
|
||||
|
||||
$sem_not_allowed = $sem_to_repeat = '';
|
||||
$list_not_allowed = $list_to_repeat = $this->_ci->p->t('studierendenantrag', 'mail_part_error_no_lvs');
|
||||
@@ -1615,7 +1614,7 @@ class AntragLib
|
||||
$lvs = getData($result);
|
||||
foreach ($lvs as $sem => $lv_list) {
|
||||
$lvs_filtered = array_filter($lv_list, function ($el) {
|
||||
return $el->antrag_zugelassen;
|
||||
return property_exists($el, 'antrag_zugelassen') && $el->antrag_zugelassen;
|
||||
});
|
||||
if (substr($sem, 0, 1) == '1') {
|
||||
$sem_not_allowed = substr($sem, 1);
|
||||
|
||||
@@ -35,10 +35,12 @@ class PrestudentLib
|
||||
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
}
|
||||
|
||||
public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null, $statusgrund_kurzbz = null, $datum = null, $bestaetigtam = null)
|
||||
public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null, $statusgrund_kurzbz = null, $datum = null, $bestaetigtam = null, $bestaetigtvon = null)
|
||||
{
|
||||
if (!$insertvon)
|
||||
$insertvon = getAuthUID();
|
||||
if (!$bestaetigtvon)
|
||||
$bestaetigtvon = $insertvon;
|
||||
|
||||
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz);
|
||||
if (isError($result))
|
||||
@@ -79,7 +81,7 @@ class PrestudentLib
|
||||
'insertamum' => date('c'),
|
||||
'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz,
|
||||
'studienplan_id'=> $prestudent_status->studienplan_id,
|
||||
'bestaetigtvon' => $insertvon,
|
||||
'bestaetigtvon' => $bestaetigtvon,
|
||||
'bestaetigtam' => $bestaetigtam
|
||||
]);
|
||||
|
||||
|
||||
@@ -238,7 +238,7 @@ class Prestudentstatus_model extends DB_Model
|
||||
{
|
||||
$this->addSelect('tbl_prestudentstatus.*,
|
||||
tbl_studienplan.bezeichnung AS studienplan_bezeichnung,
|
||||
tbl_studienplan.orgform_kurzbz AS orgform,
|
||||
tbl_orgform.orgform_kurzbz AS orgform,
|
||||
tbl_studienplan.sprache,
|
||||
tbl_orgform.bezeichnung_mehrsprachig AS bezeichnung_orgform,
|
||||
tbl_status.bezeichnung_mehrsprachig,
|
||||
@@ -250,7 +250,7 @@ class Prestudentstatus_model extends DB_Model
|
||||
$this->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
|
||||
$this->addJoin('public.tbl_status', 'tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz');
|
||||
$this->addJoin('public.tbl_status_grund', 'statusgrund_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform', 'tbl_studienplan.orgform_kurzbz = tbl_orgform.orgform_kurzbz', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform', 'COALESCE(tbl_studienplan.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) = tbl_orgform.orgform_kurzbz', 'LEFT');
|
||||
$this->db->where('tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz');
|
||||
|
||||
$where = array('prestudent_id' => $prestudent_id);
|
||||
@@ -295,7 +295,8 @@ class Prestudentstatus_model extends DB_Model
|
||||
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
$this->addJoin('public.tbl_studiengang g', 'p.studiengang_kz=g.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
|
||||
|
||||
$this->addOrder($this->dbTable . '.datum', 'DESC');
|
||||
$this->addOrder($this->dbTable . '.insertamum', 'DESC');
|
||||
|
||||
@@ -84,7 +84,7 @@ class Student_model extends DB_Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the FH-Email for a student (not the private kontakt emailt)
|
||||
* Get the FH-Email for a student (not the private kontakt email)
|
||||
* @param $student_uid
|
||||
* @return string
|
||||
*/
|
||||
|
||||
@@ -39,6 +39,7 @@ class Pruefung_model extends DB_Model
|
||||
|
||||
|
||||
/**
|
||||
* NOTE(chris): not used
|
||||
* @return string
|
||||
*/
|
||||
protected function loadWhereThreeExamsFailed()
|
||||
@@ -86,8 +87,10 @@ class Pruefung_model extends DB_Model
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
|
||||
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
|
||||
$this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
|
||||
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
|
||||
|
||||
$this->db->where("n.positiv", false);
|
||||
/* $this->db->where_in("p.pruefungstyp_kurzbz1", ['kommPruef','zusKommPruef']);*/
|
||||
@@ -122,6 +125,8 @@ class Pruefung_model extends DB_Model
|
||||
*/
|
||||
public function loadWhereCommitteeExamsFailed()
|
||||
{
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
$this->dbTable = 'lehre.tbl_pruefung p';
|
||||
|
||||
$this->addSelect('p.datum');
|
||||
@@ -129,6 +134,9 @@ class Pruefung_model extends DB_Model
|
||||
$this->addJoin('lehre.tbl_note n', 'note');
|
||||
|
||||
$this->db->where("n.positiv", false);
|
||||
$note_blacklist = $this->config->item('note_blacklist_wiederholung');
|
||||
if ($note_blacklist)
|
||||
$this->db->where_not_in("n.note", $note_blacklist);
|
||||
$this->db->where_in("p.pruefungstyp_kurzbz", ['kommPruef','zusKommPruef']);
|
||||
|
||||
return $this->load();
|
||||
@@ -164,7 +172,9 @@ class Pruefung_model extends DB_Model
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
|
||||
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
|
||||
$this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT');
|
||||
|
||||
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
@@ -212,9 +222,9 @@ class Pruefung_model extends DB_Model
|
||||
$this->withDetailsForStudierendenAntrag();
|
||||
|
||||
if ($maxDate)
|
||||
$this->db->where("p.datum < ", $maxDate->format('c'));
|
||||
$this->db->where("p.datum <= ", $maxDate->format('Y-m-d'));
|
||||
if ($minDate)
|
||||
$this->db->where("p.datum > ", $minDate->format('c'));
|
||||
$this->db->where("p.datum > ", $minDate->format('Y-m-d'));
|
||||
|
||||
$this->db->where("b.aktiv", true);
|
||||
|
||||
|
||||
@@ -37,11 +37,11 @@ class Studierendenantrag_model extends DB_Model
|
||||
$this->addSelect('studienjahr_kurzbz');
|
||||
$this->addSelect('vorname');
|
||||
$this->addSelect('nachname');
|
||||
$this->addSelect('prestudent_id');
|
||||
$this->addSelect('p.prestudent_id');
|
||||
$this->addSelect('p.studiengang_kz');
|
||||
$this->addSelect('semester');
|
||||
$this->addSelect($this->dbTable . '.grund');
|
||||
$this->addSelect('datum');
|
||||
$this->addSelect($this->dbTable . '.datum');
|
||||
$this->addSelect('datum_wiedereinstieg');
|
||||
$this->addSelect($this->dbTable . '.typ');
|
||||
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
|
||||
@@ -52,8 +52,10 @@ class Studierendenantrag_model extends DB_Model
|
||||
$this->addJoin('public.tbl_student', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_person', 'person_id');
|
||||
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
|
||||
$this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||
$this->addJoin('bis.tbl_orgform', 'orgform_kurzbz');
|
||||
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
|
||||
$this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
|
||||
$this->addJoin(
|
||||
'campus.tbl_studierendenantrag_status as s',
|
||||
'campus.get_status_id_studierendenantrag('. $this->dbTable .'.studierendenantrag_id) = studierendenantrag_status_id'
|
||||
@@ -120,14 +122,17 @@ class Studierendenantrag_model extends DB_Model
|
||||
public function getStgAndSem($antrag_id)
|
||||
{
|
||||
$this->addSelect('p.studiengang_kz');
|
||||
$this->addSelect('stg.bezeichnung');
|
||||
$this->addSelect('s.ausbildungssemester');
|
||||
$this->addSelect('s.orgform_kurzbz');
|
||||
$this->addSelect('COALESCE(plan.orgform_kurzbz, s.orgform_kurzbz, stg.orgform_kurzbz) AS orgform_kurzbz');
|
||||
|
||||
$this->addJoin(
|
||||
'public.tbl_prestudentstatus s',
|
||||
$this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz'
|
||||
);
|
||||
$this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id');
|
||||
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
|
||||
|
||||
$this->addOrder('s.datum', 'DESC');
|
||||
$this->addOrder('s.insertamum', 'DESC');
|
||||
@@ -192,7 +197,9 @@ class Studierendenantrag_model extends DB_Model
|
||||
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT');
|
||||
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform', 'orgform_kurzbz');
|
||||
$this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
|
||||
$this->addJoin(
|
||||
'campus.tbl_studierendenantrag_statustyp st',
|
||||
'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz',
|
||||
|
||||
@@ -525,20 +525,6 @@ class Studiengang_model extends DB_Model
|
||||
return $this->execQuery($query, $params);
|
||||
}
|
||||
|
||||
public function loadWithOrgform($studiengang_kzs)
|
||||
{
|
||||
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
|
||||
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
$this->addSelect('o.bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform');
|
||||
|
||||
$this->addJoin('bis.tbl_orgform o', 'orgform_kurzbz');
|
||||
|
||||
$this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs);
|
||||
|
||||
return $this->load();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $studiengang_kzs
|
||||
* @param array $not_antrag_typ (optional) If the prestudent has an antrag with one of the specified types it will be excluded from the result
|
||||
@@ -571,7 +557,8 @@ class Studiengang_model extends DB_Model
|
||||
AND ps.ausbildungssemester=get_absem_prestudent(p.prestudent_id, NULL)
|
||||
AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, NULL)'
|
||||
);
|
||||
$this->addJoin('bis.tbl_orgform o', $this->dbTable . '.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id');
|
||||
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz)=o.orgform_kurzbz');
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
$this->addJoin('public.tbl_student stud', 'p.prestudent_id=stud.prestudent_id', 'LEFT');
|
||||
|
||||
|
||||
@@ -35,13 +35,13 @@ $this->load->view(
|
||||
antrag-type="<?= $antrag_type; ?>"
|
||||
studierendenantrag-id="<?= $studierendenantrag_id; ?>"
|
||||
v-model:info-array="infoArray"
|
||||
v-model:status-msg="statusMsg"
|
||||
v-model:status-severity="statusSeverity"
|
||||
v-model:status-msg="status.msg"
|
||||
v-model:status-severity="status.severity"
|
||||
>
|
||||
</studierendenantrag-antrag>
|
||||
</div>
|
||||
<div class="col-sm-4 mb-3">
|
||||
<studierendenantrag-status :msg="statusMsg" :severity="statusSeverity"></studierendenantrag-status>
|
||||
<studierendenantrag-status :msg="status.msg" :severity="status.severity"></studierendenantrag-status>
|
||||
<studierendenantrag-infoblock :infos="infoArray"></studierendenantrag-infoblock>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -82,7 +82,7 @@ $this->load->view(
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<pre><?= $antrag->grund; ?></pre>
|
||||
<textarea class="form-control" style="width: 100%; height: 250px;" readonly><?= $antrag->grund; ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -110,8 +110,8 @@ $this->load->view(
|
||||
<a class="ms-2" target="_blank" href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&uid=' . getAuthUID()); ?>"><i class="fa-solid fa-download" title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"></i></a>
|
||||
<?php } ?>
|
||||
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
|
||||
<a class="ms-2" href="#modalgrund<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal"><?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?></a>
|
||||
<lv-popup id="modalgrund<?= $antrag->studierendenantrag_id; ?>" antrag-id = "<?= $antrag->studierendenantrag_id; ?>">
|
||||
<a class="ms-2" href="#modallv<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal"><?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?></a>
|
||||
<lv-popup id="modallv<?= $antrag->studierendenantrag_id; ?>" antrag-id = "<?= $antrag->studierendenantrag_id; ?>">
|
||||
<?= $this->p->t('studierendenantrag', 'my_lvs'); ?>
|
||||
</lv-popup>
|
||||
<?php } ?>
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
}
|
||||
|
||||
// Tabulator 5 CSS
|
||||
if ($tabulator5 === true) generateCSSsInclude('vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css');
|
||||
if ($tabulator5 === true) generateCSSsInclude('public/css/Tabulator5.css');
|
||||
|
||||
// Tinymce 4 CSS
|
||||
if ($tinymce4 === true) generateCSSsInclude('public/css/TinyMCE4.css');
|
||||
|
||||
@@ -121,15 +121,15 @@ echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<td><input type="text" name="sprache" id="sprache" value="'.$db->convert_html_chars($row_zd->sprache).'" size="10" maxlength="8" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="30%"><b>'.$p->t('abgabetool/kontrollierteSchlagwoerter').':*</b></td>
|
||||
<td width="30%"><b>'.$p->t('abgabetool/kontrollierteSchlagwoerter').':</b></td>
|
||||
<td width="40%"><input type="text" name="kontrollschlagwoerter" id="kontrollschlagwoerter" value="'.$db->convert_html_chars($row_zd->kontrollschlagwoerter).'" size="60" maxlength="150" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').': </b></td>
|
||||
<td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').':* </b></td>
|
||||
<td><input type="text" name="schlagwoerter" value="'.$db->convert_html_chars($row_zd->schlagwoerter).'" size="60" maxlength="150" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>'.$p->t('abgabetool/englischeSchlagwoerter').': </b></td>
|
||||
<td><b>'.$p->t('abgabetool/englischeSchlagwoerter').':* </b></td>
|
||||
<td><input type="text" name="schlagwoerter_en" value="'.$db->convert_html_chars($row_zd->schlagwoerter_en).'" size="60" maxlength="150" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -64,7 +64,6 @@ if(!isset($_POST['uid']))
|
||||
$fixtermin = false;
|
||||
$datum = '01.01.1980';
|
||||
$kurzbz = '';
|
||||
$kontrollschlagwoerter = '';
|
||||
$schlagwoerter = '';
|
||||
$schlagwoerter_en = '';
|
||||
$abstract = '';
|
||||
@@ -88,7 +87,6 @@ else
|
||||
$kurzbz = (isset($_POST['kurzbz'])?$_POST['kurzbz']:'');
|
||||
$betreuer = (isset($_POST['betreuer'])?$_POST['betreuer']:'-1');
|
||||
$sprache = (isset($_POST['sprache'])?$_POST['sprache']:'German');
|
||||
$kontrollschlagwoerter = (isset($_POST['kontrollschlagwoerter'])?$_POST['kontrollschlagwoerter']:'-1');
|
||||
$schlagwoerter = (isset($_POST['schlagwoerter'])?$_POST['schlagwoerter']:'-1');
|
||||
$schlagwoerter_en = (isset($_POST['schlagwoerter_en'])?$_POST['schlagwoerter_en']:'-1');
|
||||
$abstract = (isset($_POST['abstract'])?$_POST['abstract']:'-1');
|
||||
@@ -211,23 +209,7 @@ if($command=='add')
|
||||
{
|
||||
//zusätzliche Daten bearbeiten
|
||||
//Check der Eingabedaten
|
||||
if(strlen($kontrollschlagwoerter)<1)
|
||||
{
|
||||
$error=true;
|
||||
}
|
||||
if(mb_strlen($kontrollschlagwoerter)>=150)
|
||||
{
|
||||
$kontrollschlagwoerter = mb_substr($kontrollschlagwoerter, 0, 146).'...';
|
||||
}
|
||||
if(strlen($abstract)<1)
|
||||
{
|
||||
$error=true;
|
||||
}
|
||||
if(strlen($abstract_en)<1)
|
||||
{
|
||||
$error=true;
|
||||
}
|
||||
if($seitenanzahl<1)
|
||||
if((strlen($schlagwoerter) < 1) || (strlen($schlagwoerter_en) < 1) || (strlen($abstract) < 1) || (strlen($abstract_en) < 1) || ($seitenanzahl < 1))
|
||||
{
|
||||
$error=true;
|
||||
}
|
||||
@@ -237,7 +219,6 @@ if($command=='add')
|
||||
seitenanzahl = ".$db->db_add_param($seitenanzahl).",
|
||||
abgabedatum = now(),
|
||||
sprache = ".$db->db_add_param($sprache).",
|
||||
kontrollschlagwoerter = ".$db->db_add_param($kontrollschlagwoerter).",
|
||||
schlagwoerter_en = ".$db->db_add_param($schlagwoerter_en).",
|
||||
schlagwoerter = ".$db->db_add_param($schlagwoerter).",
|
||||
abstract = ".$db->db_add_param($abstract).",
|
||||
@@ -413,12 +394,9 @@ if($command=="update" && $error!=true)
|
||||
$htmlstr .= "</SELECT> \n";
|
||||
}
|
||||
$htmlstr .= "</td></tr>\n";
|
||||
$htmlstr .= '<tr><td width="30%"><b>'.$p->t('abgabetool/kontrollierteSchlagwoerter').':*</b></td>
|
||||
<td width="40%"><input type="text" name="kontrollschlagwoerter" id="kontrollschlagwoerter" value="'.$db->convert_html_chars($kontrollschlagwoerter).'" size="60" maxlength="150"></td>
|
||||
<td width="30%" align="left"><input type="button" name="SWD" value=" SWD " onclick="window.open(\'swd.php\')"></td></tr>'."\n";
|
||||
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').':</b></td>
|
||||
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/deutscheSchlagwoerter').':*</b></td>
|
||||
<td><input type="text" name="schlagwoerter" value="'.$db->convert_html_chars($schlagwoerter).'" size="60" maxlength="150"></td></tr>'."\n";
|
||||
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/englischeSchlagwoerter').':</b></td>
|
||||
$htmlstr .= '<tr><td><b>'.$p->t('abgabetool/englischeSchlagwoerter').':*</b></td>
|
||||
<td><input type="text" name="schlagwoerter_en" value="'.$db->convert_html_chars($schlagwoerter_en).'" size="60" maxlength="150"></td></tr>'."\n";
|
||||
$htmlstr .= '<tr><td valign="top"><b>'.$p->t('abgabetool/abstract').' </b>'.$p->t('abgabetool/maxZeichen').':*</td>
|
||||
<td><textarea name="abstract" cols="46" rows="7">'.$db->convert_html_chars($abstract).'</textarea></td></tr>'."\n";
|
||||
@@ -657,7 +635,6 @@ if($command!="add")
|
||||
$htmlstr .= '<input type="hidden" name="uid" value="'.$db->convert_html_chars($uid).'">'."\n";
|
||||
$htmlstr .= '<input type="hidden" name="betreuer" value="'.$db->convert_html_chars($betreuer).'">'."\n";
|
||||
$htmlstr .= '<input type="hidden" name="command" value="update">'."\n";
|
||||
$htmlstr .= '<input type="hidden" name="kontrollschlagwoerter" value="'.$db->convert_html_chars($kontrollschlagwoerter).'">'."\n";
|
||||
$htmlstr .= '<input type="hidden" name="schlagwoerter" value="'.$db->convert_html_chars($schlagwoerter).'">'."\n";
|
||||
$htmlstr .= '<input type="hidden" name="schlagwoerter_en" value="'.$db->convert_html_chars($schlagwoerter_en).'">'."\n";
|
||||
$htmlstr .= '<input type="hidden" name="abstract" value="'.$db->convert_html_chars($abstract).'">'."\n";
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<?php
|
||||
$url = "https://ognd.bsz-bw.de/";
|
||||
$zielfeld = "kontrollschlagwoerter";
|
||||
$url = $url."?zielfeld=".$zielfeld;
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
$content = file_get_contents($url);
|
||||
if($content)
|
||||
print $content;
|
||||
else
|
||||
echo "Der Schlagwortdienst ist derzeit nicht erreichbar. Bitte füllen Sie die Schlagwörter manuell aus um den Upload abzuschließen";
|
||||
?>
|
||||
+3
-3
@@ -230,9 +230,9 @@
|
||||
"type": "package",
|
||||
"package": {
|
||||
"name": "olifolkerd/tabulator5",
|
||||
"version": "5.2.1",
|
||||
"version": "5.5.2",
|
||||
"dist": {
|
||||
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.2.1.zip",
|
||||
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.5.2.zip",
|
||||
"type": "zip"
|
||||
}
|
||||
}
|
||||
@@ -426,7 +426,7 @@
|
||||
"npm-asset/primeicons": "5.0.0",
|
||||
|
||||
"olifolkerd/tabulator4": "4.9.*",
|
||||
"olifolkerd/tabulator5": "5.2.*",
|
||||
"olifolkerd/tabulator5": "5.5.*",
|
||||
|
||||
"phpseclib/phpseclib": "2.0.*",
|
||||
|
||||
|
||||
Generated
+3
-3
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "f6e67e501fdd9ac047cc680abeb3daa9",
|
||||
"content-hash": "b6e875dbd1ec2554abbf9f7513806469",
|
||||
"packages": [
|
||||
{
|
||||
"name": "afarkas/html5shiv",
|
||||
@@ -1511,10 +1511,10 @@
|
||||
},
|
||||
{
|
||||
"name": "olifolkerd/tabulator5",
|
||||
"version": "5.2.1",
|
||||
"version": "5.5.2",
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.2.1.zip"
|
||||
"url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.5.2.zip"
|
||||
},
|
||||
"type": "library"
|
||||
},
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
@import '../../vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css';
|
||||
|
||||
/* Apply borders and background to Cell instead of the Row
|
||||
* otherwise frozen columns won't look good (columns behind
|
||||
* will be partial visible)
|
||||
*/
|
||||
.tabulator-row {
|
||||
border-bottom: none;
|
||||
}
|
||||
.tabulator-row .tabulator-frozen,
|
||||
.tabulator-row .tabulator-cell {
|
||||
border-bottom: 1px solid #dee2e6;
|
||||
}
|
||||
.tabulator-row.tabulator-row-even {
|
||||
background-color: transparent;
|
||||
}
|
||||
.tabulator-headers .tabulator-frozen,
|
||||
.tabulator-row.tabulator-row-odd .tabulator-frozen,
|
||||
.tabulator-row.tabulator-row-odd .tabulator-cell {
|
||||
background-color: #fff;
|
||||
}
|
||||
.tabulator-row.tabulator-row-even .tabulator-frozen,
|
||||
.tabulator-row.tabulator-row-even .tabulator-cell {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
.tabulator-row.tabulator-selectable:hover .tabulator-frozen,
|
||||
.tabulator-row.tabulator-selectable:hover .tabulator-cell {
|
||||
background-color: #ececec;
|
||||
}
|
||||
.tabulator-row.tabulator-selected .tabulator-frozen,
|
||||
.tabulator-row.tabulator-selected .tabulator-cell {
|
||||
background-color: #9abcea;
|
||||
}
|
||||
.tabulator-row.tabulator-selected:hover .tabulator-frozen,
|
||||
.tabulator-row.tabulator-selected:hover .tabulator-cell {
|
||||
background-color: #769bcc;
|
||||
}
|
||||
.tabulator .tabulator-col-resize-handle:last-of-type {
|
||||
z-index: 999999;
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import StudierendenantragAntrag from "../../components/Studierendenantrag/Antrag
|
||||
import StudierendenantragStatus from "../../components/Studierendenantrag/Status.js";
|
||||
import StudierendenantragInfoblock from "../../components/Studierendenantrag/Infoblock.js";
|
||||
import VueDatePicker from "../../components/vueDatepicker.js.php";
|
||||
import Phrasen from '../../plugin/Phrasen.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
@@ -12,10 +13,14 @@ const app = Vue.createApp({
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
statusMsg: "",
|
||||
statusSeverity: "",
|
||||
status: {
|
||||
msg: '',
|
||||
severity: ''
|
||||
},
|
||||
infoArray: []
|
||||
};
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
app
|
||||
.use(Phrasen)
|
||||
.mount('#wrapper');
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
import StudierendenantragLeitung from '../../../components/Studierendenantrag/Leitung.js';
|
||||
import Phrasen from '../../../plugin/Phrasen.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
StudierendenantragLeitung
|
||||
}
|
||||
});
|
||||
app.use(primevue.config.default,{zIndex: {overlay: 9999}}).mount('#wrapper');
|
||||
app
|
||||
.use(Phrasen)
|
||||
.use(primevue.config.default,{zIndex: {overlay: 9999}})
|
||||
.mount('#wrapper');
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import LvZuweisung from '../../../components/Studierendenantrag/Lvzuweisung.js';
|
||||
import Phrasen from '../../../plugin/Phrasen.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
@@ -10,4 +11,6 @@ const app = Vue.createApp({
|
||||
}
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
app
|
||||
.use(Phrasen)
|
||||
.mount('#wrapper');
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import LvPopup from '../../../components/Studierendenantrag/Leitung/LvPopup.js';
|
||||
import Phrasen from '../../../plugin/Phrasen.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
LvPopup
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
app
|
||||
.use(Phrasen)
|
||||
.mount('#wrapper');
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import Phrasen from '../../plugin/Phrasen.js';
|
||||
|
||||
export default {
|
||||
data: () => ({
|
||||
modal: null
|
||||
@@ -86,6 +88,7 @@ export default {
|
||||
}
|
||||
});
|
||||
const wrapper = document.createElement("div");
|
||||
instance.use(Phrasen); // TODO(chris): find a more dynamic way
|
||||
instance.mount(wrapper);
|
||||
document.body.appendChild(wrapper);
|
||||
});
|
||||
|
||||
@@ -2,7 +2,6 @@ import StudierendenantragAbmeldung from './Form/Abmeldung.js';
|
||||
import StudierendenantragAbmeldungStgl from './Form/AbmeldungStgl.js';
|
||||
import StudierendenantragUnterbrechung from './Form/Unterbrechung.js';
|
||||
import StudierendenantragWiederholung from './Form/Wiederholung.js';
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -11,9 +10,6 @@ export default {
|
||||
StudierendenantragUnterbrechung,
|
||||
StudierendenantragWiederholung
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'update:infoArray',
|
||||
'update:statusMsg',
|
||||
@@ -37,13 +33,13 @@ export default {
|
||||
return 'Studierendenantrag' + this.antragType;
|
||||
},
|
||||
infoText() {
|
||||
return this.p.t('studierendenantrag/info_' + this.antragType + '_' + this.status);
|
||||
return this.$p.t('studierendenantrag/info_' + this.antragType + '_' + this.status);
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-antrag card">
|
||||
<div class="card-header">
|
||||
{{p.t('studierendenantrag', 'title_' + antragType)}}
|
||||
{{$p.t('studierendenantrag', 'title_' + antragType)}}
|
||||
</div>
|
||||
<div v-if="infoText && infoText.substr(0, 9) != '<< PHRASE'" class="alert alert-primary m-3" role="alert" v-html="infoText">
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
@@ -7,9 +6,6 @@ export default {
|
||||
components: {
|
||||
CoreFetchCmpt
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus'
|
||||
@@ -56,7 +52,7 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
@@ -67,7 +63,7 @@ export default {
|
||||
createAntrag() {
|
||||
bootstrap.Modal.getOrCreateInstance(this.$refs.modal).hide();
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
@@ -93,7 +89,7 @@ export default {
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -104,13 +100,13 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_open')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_open')})),
|
||||
severity:'success'
|
||||
});
|
||||
}
|
||||
@@ -120,7 +116,7 @@ export default {
|
||||
},
|
||||
cancelAntrag() {
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelling')})),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
@@ -144,7 +140,7 @@ export default {
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
|
||||
severity:'danger'
|
||||
});
|
||||
}
|
||||
@@ -156,13 +152,13 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelled')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -183,37 +179,37 @@ export default {
|
||||
</div>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<th>{{$p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<th>{{$p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studienjahr')}}</th>
|
||||
<th>{{$p.t('lehre', 'studienjahr')}}</th>
|
||||
<td align="right">{{data.studienjahr_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiensemester')}}</th>
|
||||
<th>{{$p.t('lehre', 'studiensemester')}}</th>
|
||||
<td align="right">{{data.studiensemester_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'semester')}}</th>
|
||||
<th>{{$p.t('lehre', 'semester')}}</th>
|
||||
<td align="right">{{data.semester}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div v-if="data.grund" class="mb-3">
|
||||
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<h5>{{$p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<pre>{{data.grund}}</pre>
|
||||
</div>
|
||||
<div v-else class="col-sm-6 mb-3">
|
||||
@@ -239,7 +235,7 @@ export default {
|
||||
@click="cancelAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_cancel')}}
|
||||
{{$p.t('studierendenantrag', 'btn_cancel')}}
|
||||
</button>
|
||||
<button
|
||||
v-else-if="!data.studierendenantrag_id"
|
||||
@@ -249,7 +245,7 @@ export default {
|
||||
:data-bs-target="'#studierendenantrag-form-abmeldung-' + uuid + '-modal'"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
</button>
|
||||
|
||||
<div
|
||||
@@ -266,18 +262,18 @@ export default {
|
||||
class="modal-title"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-modal-label'"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'title_Abmeldung')}}
|
||||
{{$p.t('studierendenantrag', 'title_Abmeldung')}}
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui', 'schliessen')"></button>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="$p.t('ui', 'schliessen')"></button>
|
||||
</div>
|
||||
<div class="modal-body" v-html="p.t('studierendenantrag', 'warning_Abmeldung')">
|
||||
<div class="modal-body" v-html="$p.t('studierendenantrag', 'warning_Abmeldung')">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
@click="createAntrag">
|
||||
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
@@ -7,9 +6,6 @@ export default {
|
||||
components: {
|
||||
CoreFetchCmpt
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus'
|
||||
@@ -30,7 +26,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
statusSeverity() {
|
||||
switch (this.data.status)
|
||||
switch (this.data?.status)
|
||||
{
|
||||
case 'Erstellt': return 'info';
|
||||
case 'Genehmigt': return 'success';
|
||||
@@ -56,7 +52,7 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
@@ -67,7 +63,7 @@ export default {
|
||||
createAntrag() {
|
||||
bootstrap.Modal.getOrCreateInstance(this.$refs.modal).hide();
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
@@ -93,7 +89,7 @@ export default {
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -104,13 +100,13 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_open')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_open')})),
|
||||
severity:'success'
|
||||
});
|
||||
}
|
||||
@@ -123,7 +119,7 @@ export default {
|
||||
|
||||
if(event.target.value)
|
||||
{
|
||||
let templateT= this.p.t('studierendenantrag', event.target.value);
|
||||
let templateT= this.$p.t('studierendenantrag', event.target.value);
|
||||
templateText.value = templateT;
|
||||
}
|
||||
else
|
||||
@@ -140,40 +136,40 @@ export default {
|
||||
<div class="col-12">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<th>{{$p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<th>{{$p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studienjahr')}}</th>
|
||||
<th>{{$p.t('lehre', 'studienjahr')}}</th>
|
||||
<td align="right">{{data.studienjahr_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiensemester')}}</th>
|
||||
<th>{{$p.t('lehre', 'studiensemester')}}</th>
|
||||
<td align="right">{{data.studiensemester_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'semester')}}</th>
|
||||
<th>{{$p.t('lehre', 'semester')}}</th>
|
||||
<td align="right">{{data.semester}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div v-if="data.grund" class="mb-3">
|
||||
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<h5>{{$p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
|
||||
<pre class="text-prewrap">{{data.grund}}</pre>
|
||||
<pre class="text-prewrap">{{data?.grund}}</pre>
|
||||
</div>
|
||||
<div v-else class="col-sm-6 mb-3">
|
||||
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-grund'" class="form-label">Grund:</label>
|
||||
@@ -181,18 +177,20 @@ export default {
|
||||
<select name="grundAv" @change="appendDropDownText
|
||||
($event)">
|
||||
<option value="" > --- bitte auswählen, sofern zutreffend ---- </option>
|
||||
<option value="textLong_NichtantrittStudium">{{p.t('studierendenantrag', 'dropdown_NichtantrittStudium')}}
|
||||
<option value="textLong_NichtantrittStudium">{{$p.t('studierendenantrag', 'dropdown_NichtantrittStudium')}}
|
||||
</option>
|
||||
<option value="textLong_ungenuegendeLeistung">{{p.t('studierendenantrag', 'dropdown_ungenuegendeLeistung')}}
|
||||
<option value="textLong_ungenuegendeLeistung">{{$p.t('studierendenantrag', 'dropdown_ungenuegendeLeistung')}}
|
||||
</option>
|
||||
<option value="textLong_studentNichtAnwesend">{{p.t('studierendenantrag', 'dropdown_nichtAnwesend')}}
|
||||
<option value="textLong_studentNichtAnwesend">{{$p.t('studierendenantrag', 'dropdown_nichtAnwesend')}}
|
||||
</option>
|
||||
<option value="textLong_PruefunstermineNichtEingehalten">{{p.t('studierendenantrag', 'dropdown_PruefunstermineNichtEingehalten')}}
|
||||
<option value="textLong_PruefunstermineNichtEingehalten">{{$p.t('studierendenantrag', 'dropdown_PruefunstermineNichtEingehalten')}}
|
||||
</option>
|
||||
<option value="textLong_studentNichtGezahlt">{{p.t('studierendenantrag', 'dropdown_nichtGezahlt')}}
|
||||
<option value="textLong_studentNichtGezahlt">{{$p.t('studierendenantrag', 'dropdown_nichtGezahlt')}}
|
||||
</option>
|
||||
<option value="textLong_plageat">{{p.t('studierendenantrag', 'dropdown_plageat')}}
|
||||
<option value="textLong_plageat">{{$p.t('studierendenantrag', 'dropdown_plageat')}}
|
||||
</option>
|
||||
<option value="textLong_MissingZgv">{{$p.t('studierendenantrag', 'dropdown_MissingZgv')}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<textarea
|
||||
@@ -211,14 +209,14 @@ export default {
|
||||
|
||||
<div class="col-12 text-end">
|
||||
<button
|
||||
v-if="!data.studierendenantrag_id"
|
||||
v-if="!data?.studierendenantrag_id"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
data-bs-toggle="modal"
|
||||
:data-bs-target="'#studierendenantrag-form-abmeldung-' + uuid + '-modal'"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
</button>
|
||||
<div
|
||||
ref="modal"
|
||||
@@ -234,18 +232,18 @@ export default {
|
||||
class="modal-title"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-modal-label'"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'title_Abmeldung')}}
|
||||
{{$p.t('studierendenantrag', 'title_Abmeldung')}}
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui', 'schliessen')"></button>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="$p.t('ui', 'schliessen')"></button>
|
||||
</div>
|
||||
<div class="modal-body" v-html="p.t('studierendenantrag', 'warning_AbmeldungStgl')">
|
||||
<div class="modal-body" v-html="$p.t('studierendenantrag', 'warning_AbmeldungStgl')">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
@click="createAntrag">
|
||||
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
{{$p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import VueDatepicker from '../../vueDatepicker.js.php';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
@@ -9,9 +8,6 @@ export default {
|
||||
CoreFetchCmpt,
|
||||
VueDatepicker
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus'
|
||||
@@ -79,7 +75,7 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
@@ -89,7 +85,7 @@ export default {
|
||||
},
|
||||
createAntrag() {
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
@@ -126,7 +122,7 @@ export default {
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -137,13 +133,13 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_created')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_created')})),
|
||||
severity: 'info'
|
||||
});
|
||||
}
|
||||
@@ -153,7 +149,7 @@ export default {
|
||||
},
|
||||
cancelAntrag() {
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelling')})),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
@@ -177,7 +173,7 @@ export default {
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -189,13 +185,13 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_cancelled')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -216,28 +212,28 @@ export default {
|
||||
</div>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<th>{{$p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<th>{{$p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studienjahr')}}</th>
|
||||
<th>{{$p.t('lehre', 'studienjahr')}}</th>
|
||||
<td align="right" v-if="data.studierendenantrag_id">{{data.studienjahr_kurzbz}}</td>
|
||||
<td align="right" v-else>{{stsem === null ? '' : data.studiensemester[stsem].studienjahr_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'semester')}}</th>
|
||||
<th>{{$p.t('lehre', 'semester')}}</th>
|
||||
<td align="right" v-if="data.studierendenantrag_id">{{data.semester}}</td>
|
||||
<td align="right" v-else>{{stsem === null ? '' : data.studiensemester[stsem].semester}}</td>
|
||||
</tr>
|
||||
@@ -246,7 +242,7 @@ export default {
|
||||
|
||||
<div class="col-sm-6 mb-3">
|
||||
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-stsem'" class="form-label">
|
||||
{{p.t('lehre', 'studiensemester')}}
|
||||
{{$p.t('lehre', 'studiensemester')}}
|
||||
</label>
|
||||
<div v-if="data.studierendenantrag_id">
|
||||
{{data.studiensemester_kurzbz}}
|
||||
@@ -271,7 +267,7 @@ export default {
|
||||
</div>
|
||||
<div class="col-sm-6 mb-3">
|
||||
<label class="form-label">
|
||||
{{p.t('studierendenantrag', 'antrag_datum_wiedereinstieg')}}
|
||||
{{$p.t('studierendenantrag', 'antrag_datum_wiedereinstieg')}}
|
||||
</label>
|
||||
|
||||
<div v-if="data.studierendenantrag_id">
|
||||
@@ -279,7 +275,7 @@ export default {
|
||||
</div>
|
||||
<div v-else-if="stsem === null">
|
||||
<select class="form-select" disabled>
|
||||
<option selected>{{p.t('ui/select_studiensemester')}}</option>
|
||||
<option selected>{{$p.t('ui/select_studiensemester')}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div v-else>
|
||||
@@ -295,8 +291,8 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="data.studierendenantrag_id" class="mb-3">
|
||||
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<pre>{{data.grund}}</pre>
|
||||
<h5>{{$p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<textarea class="form-control" rows="5" readonly>{{data.grund}}</textarea>
|
||||
</div>
|
||||
<div v-else class="col-sm-6 mb-3">
|
||||
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-grund'" class="form-label">Grund:</label>
|
||||
@@ -316,14 +312,14 @@ export default {
|
||||
<div class="col-12 mb-3">
|
||||
|
||||
<div v-if="data.studierendenantrag_id">
|
||||
<a v-if="data.dms_id" target="_blank" :href="siteUrl + '/lehre/Antrag/Attachment/Show/' + data.dms_id"> {{p.t('studierendenantrag', 'antrag_dateianhaenge')}} </a>
|
||||
<span v-else>{{p.t('studierendenantrag', 'no_attachments')}}</span>
|
||||
<a v-if="data.dms_id" target="_blank" :href="siteUrl + '/lehre/Antrag/Attachment/Show/' + data.dms_id"> {{$p.t('studierendenantrag', 'antrag_dateianhaenge')}} </a>
|
||||
<span v-else>{{$p.t('studierendenantrag', 'no_attachments')}}</span>
|
||||
</div>
|
||||
<div v-else>
|
||||
<label
|
||||
:for="'studierendenantrag-form-abmeldung-' + uuid + '-attachment'"
|
||||
class="form-label">
|
||||
{{p.t('studierendenantrag', 'antrag_dateianhaenge')}}
|
||||
{{$p.t('studierendenantrag', 'antrag_dateianhaenge')}}
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
@@ -341,7 +337,7 @@ export default {
|
||||
@click="createAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_create_Unterbrechung')}}
|
||||
{{$p.t('studierendenantrag', 'btn_create_Unterbrechung')}}
|
||||
</button>
|
||||
<button
|
||||
v-else-if="data.status == 'Erstellt'"
|
||||
@@ -350,7 +346,7 @@ export default {
|
||||
@click="cancelAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_cancel')}}
|
||||
{{$p.t('studierendenantrag', 'btn_cancel')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import VueDatepicker from '../../vueDatepicker.js.php';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
@@ -9,9 +8,6 @@ export default {
|
||||
CoreFetchCmpt,
|
||||
VueDatepicker
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus',
|
||||
@@ -67,11 +63,11 @@ export default {
|
||||
this.data = result.data.retval;
|
||||
if (!this.data.status || this.data.status == 'ErsteAufforderungVersandt' || this.data.status == 'ZweiteAufforderungVersandt') {
|
||||
this.data.status = 'Offen';
|
||||
this.data.statustyp = this.p.t('studierendenantrag', 'status_open');
|
||||
this.data.statustyp = this.$p.t('studierendenantrag', 'status_open');
|
||||
}
|
||||
this.$emit('update:status', this.data.status);
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
return result;
|
||||
@@ -89,7 +85,7 @@ export default {
|
||||
let nextState = repeat ? 'Erstellt' : 'Verzichtet';
|
||||
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_saving')})),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
@@ -116,7 +112,7 @@ export default {
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.$p.t('studierendenantrag', 'status_error')})),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
@@ -129,7 +125,7 @@ export default {
|
||||
this.data.status = nextState;
|
||||
this.$emit('update:status', this.data.status);
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
@@ -143,7 +139,7 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.infos = [...Array(5).keys()].map(n => ({
|
||||
body: this.p.t_ref('studierendenantrag', 'infotext_Wiederholung_' + n)
|
||||
body: Vue.computed(() => this.$p.t('studierendenantrag', 'infotext_Wiederholung_' + n))
|
||||
}));
|
||||
this.$emit('setInfos', this.infos);
|
||||
},
|
||||
@@ -156,27 +152,27 @@ export default {
|
||||
</div>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<th>{{$p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<th>{{$p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<th>{{$p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<th>{{$p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung')}}</th>
|
||||
<th>{{$p.t('studierendenantrag', 'antrag_Wiederholung_pruefung')}}</th>
|
||||
<td align="right">{{data.lvbezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung_date')}}</th>
|
||||
<th>{{$p.t('studierendenantrag', 'antrag_Wiederholung_pruefung_date')}}</th>
|
||||
<td align="right">{{datumPruefungFormatted}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -190,7 +186,7 @@ export default {
|
||||
@click="createAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag/antrag_Wiederholung_button_yes')}}
|
||||
{{$p.t('studierendenantrag/antrag_Wiederholung_button_yes')}}
|
||||
</button>
|
||||
<!-- <button
|
||||
v-if="!data.studierendenantrag_id || data.status == 'Offen'"
|
||||
@@ -199,7 +195,7 @@ export default {
|
||||
@click="cancelAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag/antrag_Wiederholung_button_no')}}
|
||||
{{$p.t('studierendenantrag/antrag_Wiederholung_button_no')}}
|
||||
</button>-->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,6 @@ import GrundPopup from './Leitung/GrundPopup.js';
|
||||
import LvPopup from './Leitung/LvPopup.js';
|
||||
import BsAlert from '../Bootstrap/Alert.js';
|
||||
import FhcLoader from '../Loader.js';
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -14,7 +13,6 @@ export default {
|
||||
LeitungActions,
|
||||
FhcLoader
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
stgL: Array,
|
||||
stgA: Array
|
||||
@@ -31,12 +29,12 @@ export default {
|
||||
stgkzL() {
|
||||
if (!this.stgL)
|
||||
return [];
|
||||
return this.stgL.map(stg => stg.studiengang_kz);
|
||||
return this.stgL.map(stg => parseInt(stg));
|
||||
},
|
||||
stgkzA() {
|
||||
if (!this.stgA)
|
||||
return [];
|
||||
return this.stgA.map(stg => stg.studiengang_kz);
|
||||
return this.stgA.map(stg => parseInt(stg));
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -79,7 +77,7 @@ export default {
|
||||
{
|
||||
let countAntrage = 0;
|
||||
LvPopup
|
||||
.popup(this.p.t('studierendenantrag','title_show_lvs', currentAntrag), {
|
||||
.popup(this.$p.t('studierendenantrag','title_show_lvs', currentAntrag), {
|
||||
antragId: currentAntrag.studierendenantrag_id,
|
||||
footer: true,
|
||||
dialogClass: 'modal-lg',
|
||||
@@ -128,7 +126,7 @@ export default {
|
||||
var currentAntrag = antraege.pop();
|
||||
if (currentAntrag) {
|
||||
GrundPopup
|
||||
.popup(this.p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
|
||||
.popup(this.$p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
|
||||
countRemaining: antraege.length
|
||||
})
|
||||
.then(result => {
|
||||
@@ -211,7 +209,7 @@ export default {
|
||||
var currentAntrag = antraege.pop();
|
||||
if (currentAntrag) {
|
||||
GrundPopup
|
||||
.popup(this.p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
|
||||
.popup(this.$p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id}), {
|
||||
countRemaining : antraege.length,
|
||||
optional: true
|
||||
})
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import ActionsNew from './Actions/New.js';
|
||||
import ActionsColumns from './Actions/Columns.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ActionsNew,
|
||||
ActionsColumns
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
selectedData: Array,
|
||||
columns: Array,
|
||||
@@ -67,17 +65,17 @@ export default {
|
||||
<div class="studierendenantrag-leitung-actions fhc-table-actions d-flex flex-wrap justify-content-between mb-2">
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<actions-new @reload="$emit('reload')"></actions-new>
|
||||
<button type="button" class="btn btn-outline-secondary" @click="$emit('reload')" :title="p.t('table','reload')">
|
||||
<button type="button" class="btn btn-outline-secondary" @click="$emit('reload')" :title="$p.t('table','reload')">
|
||||
<i class="fa-solid fa-rotate-right"></i>
|
||||
</button>
|
||||
<span>{{p.t('table', 'with_selected', {count: selectedData.length})}}</span>
|
||||
<button v-if="stgL.length" :disabled="!selectedCanBeApproved" type="button" class="btn btn-outline-secondary" @click="$emit('action:approve')">{{p.t('studierendenantrag', 'btn_approve')}}</button>
|
||||
<button v-if="stgL.length" :disabled="!selectedCanBeRejected" type="button" class="btn btn-outline-secondary" @click="$emit('action:reject')">{{p.t('studierendenantrag', 'btn_reject')}}</button>
|
||||
<button v-if="stgA.length" :disabled="!selectedCanBeReopened" type="button" class="btn btn-outline-secondary" @click="$emit('action:reopen')">{{p.t('studierendenantrag', 'btn_reopen')}}</button>
|
||||
<span>{{$p.t('table', 'with_selected', {count: selectedData.length})}}</span>
|
||||
<button v-if="stgL.length" :disabled="!selectedCanBeApproved" type="button" class="btn btn-outline-secondary" @click="$emit('action:approve')">{{$p.t('studierendenantrag', 'btn_approve')}}</button>
|
||||
<button v-if="stgL.length" :disabled="!selectedCanBeRejected" type="button" class="btn btn-outline-secondary" @click="$emit('action:reject')">{{$p.t('studierendenantrag', 'btn_reject')}}</button>
|
||||
<button v-if="stgA.length" :disabled="!selectedCanBeReopened" type="button" class="btn btn-outline-secondary" @click="$emit('action:reopen')">{{$p.t('studierendenantrag', 'btn_reopen')}}</button>
|
||||
</div>
|
||||
<div>
|
||||
<button type="button" class="btn btn-link" data-bs-toggle="collapse" href="#columns" :title="p.t('table','spaltenEinAusblenden')"><i class="fa fa-table-columns"></i></button>
|
||||
<button type="button" class="btn btn-link" @click="$emit('download')" :title="p.t('table','download')"><i class="fa fa-download"></i></button>
|
||||
<button type="button" class="btn btn-link" data-bs-toggle="collapse" href="#columns" :title="$p.t('table','spaltenEinAusblenden')"><i class="fa fa-table-columns"></i></button>
|
||||
<button type="button" class="btn btn-link" @click="$emit('download')" :title="$p.t('table','download')"><i class="fa fa-download"></i></button>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<actions-columns id="columns" class="collapse" :columns="columns"></actions-columns>
|
||||
|
||||
@@ -6,9 +6,6 @@ export default {
|
||||
toggleColumn(col) {
|
||||
col.visible = !col.visible;
|
||||
col.original.toggle()
|
||||
},
|
||||
show() {
|
||||
|
||||
}
|
||||
},
|
||||
template: `
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
import BsAlert from '../../../Bootstrap/Alert.js';
|
||||
import BsModal from '../../../Bootstrap/Modal.js';
|
||||
import Phrasen from '../../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal,
|
||||
AutoComplete: primevue.autocomplete
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'reload'
|
||||
],
|
||||
@@ -33,7 +29,7 @@ export default {
|
||||
class: 'position-absolute top-0 start-0 w-100 h-100'
|
||||
}), {
|
||||
dialogClass: 'modal-fullscreen'
|
||||
}, this.p.t('studierendenantrag', 'antrag_header')).then(() => {
|
||||
}, this.$p.t('studierendenantrag', 'antrag_header')).then(() => {
|
||||
this.$emit('reload');
|
||||
this.student = '';
|
||||
});
|
||||
@@ -67,17 +63,17 @@ export default {
|
||||
<div class="studierendenantrag-leitung-actions-new" v-if="data">
|
||||
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#newAntragModal">
|
||||
<i class="fa fa-plus"></i>
|
||||
{{p.t('studierendenantrag','btn_new')}}
|
||||
{{$p.t('studierendenantrag','btn_new')}}
|
||||
</button>
|
||||
<div ref="modal" class="modal fade" id="newAntragModal" tabindex="-1" aria-labelledby="newAntragModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="newAntragModalLabel">{{p.t('studierendenantrag','title_new_Abmeldung')}}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui','schliessen')"></button>
|
||||
<h5 class="modal-title" id="newAntragModalLabel">{{$p.t('studierendenantrag','title_new_Abmeldung')}}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="$p.t('ui','schliessen')"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<label for="newAntragModalAutoComplete">{{p.t('person','studentIn')}}</label>
|
||||
<label for="newAntragModalAutoComplete">{{$p.t('person','studentIn')}}</label>
|
||||
<div>
|
||||
<auto-complete
|
||||
class="w-100"
|
||||
@@ -102,7 +98,7 @@ export default {
|
||||
class="btn btn-primary"
|
||||
:disabled="!this.student"
|
||||
@click.prevent="openForm">
|
||||
{{p.t('studierendenantrag','btn_create')}}
|
||||
{{$p.t('studierendenantrag','btn_create')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
|
||||
import BsAlert from '../../Bootstrap/Alert.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
BsAlert,
|
||||
Phrasen
|
||||
],
|
||||
props: {
|
||||
placeholder: String,
|
||||
@@ -46,17 +43,17 @@ export default {
|
||||
<div>
|
||||
<textarea ref="input" class="form-control" :class="{'is-invalid' : isInvalid}" v-model="value"></textarea>
|
||||
<div v-if="isInvalid" class="invalid-feedback">
|
||||
{{p.t('kvp','new.error.required')}}
|
||||
{{$p.t('kvp','new.error.required')}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:footer>
|
||||
<div v-if="countRemaining > 0" class="form-check flex-grow-1">
|
||||
<input ref="check" type="checkbox" class="form-check-input" id="cbid" v-model="check">
|
||||
<label class="form-check-label" for="cbid">{{p.t('studierendenantrag','fuer_alle_uebernehmen')}}</label>
|
||||
<label class="form-check-label" for="cbid">{{$p.t('studierendenantrag','fuer_alle_uebernehmen')}}</label>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary" @click="submit">{{p.t('ui','ok')}}</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{p.t('ui','cancel')}}</button>
|
||||
<button type="button" class="btn btn-primary" @click="submit">{{$p.t('ui','ok')}}</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{$p.t('ui','cancel')}}</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
stgs: Array
|
||||
},
|
||||
@@ -10,10 +7,10 @@ export default {
|
||||
],
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung-header fhc-table-header d-flex align-items-center mb-2 gap-2">
|
||||
<h3 class="h5 col m-0">{{p.t('studierendenantrag', 'studierendenantraege')}}</h3>
|
||||
<h3 class="h5 col m-0">{{$p.t('studierendenantrag', 'studierendenantraege')}}</h3>
|
||||
<div v-if="stgs.length > 1" class="col-auto">
|
||||
<select ref="stg_select" class="form-select" @input="$emit('input', $event)">
|
||||
<option value="">{{p.t('global', 'alle')}}</option>
|
||||
<option value="">{{$p.t('global', 'alle')}}</option>
|
||||
<option v-for="stg in stgs" :key="stg.studiengang_kz" :value="stg.studiengang_kz">
|
||||
{{stg.bezeichnung}} ({{stg.orgform}})
|
||||
</option>
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import BsAlert from '../../Bootstrap/Alert.js';
|
||||
import {CoreFetchCmpt} from "../../Fetch.js";
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CoreFetchCmpt
|
||||
},
|
||||
mixins: [
|
||||
BsAlert,
|
||||
Phrasen
|
||||
BsAlert
|
||||
],
|
||||
props: {
|
||||
footer: Boolean,
|
||||
@@ -79,29 +77,29 @@ export default {
|
||||
@data-fetched="setlvs">
|
||||
<template #default>
|
||||
<div v-if="lvzugelassenLength == 0">
|
||||
{{p.t('studierendenantrag','error_no_lvs')}}
|
||||
{{$p.t('studierendenantrag','error_no_lvs')}}
|
||||
</div>
|
||||
<table v-else class="table caption-top" v-for="(lv_arr, sem) in lvzugelassen" :key="sem">
|
||||
<caption>
|
||||
<span class="d-flex justify-content-between">
|
||||
<span>{{ p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][sem.substr(0,1)-1]) }}</span>
|
||||
<span>{{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][sem.substr(0,1)-1]) }}</span>
|
||||
<span>{{sem.substr(1)}}</span>
|
||||
</span>
|
||||
</caption>
|
||||
<thead v-if="lv_arr !== null">
|
||||
<tr>
|
||||
<th scope="col">{{p.t('ui','bezeichnung')}}</th>
|
||||
<th scope="col">{{p.t('lehre','lehrform')}}</th>
|
||||
<th scope="col">{{$p.t('ui','bezeichnung')}}</th>
|
||||
<th scope="col">{{$p.t('lehre','lehrform')}}</th>
|
||||
<th scope="col">ECTS</th>
|
||||
<th scope="col">{{p.t('lehre','note')}}</th>
|
||||
<th scope="col">{{$p.t('lehre','note')}}</th>
|
||||
<th scope="col">
|
||||
{{p.t('global','anmerkung')}}
|
||||
{{$p.t('global','anmerkung')}}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-if="lv_arr === null" class="table-warning">
|
||||
<td colspan="5">{{p.t('studierendenantrag/error_stg_last_semester')}}</td>
|
||||
<td colspan="5">{{$p.t('studierendenantrag/error_stg_last_semester')}}</td>
|
||||
</tr>
|
||||
<template v-else>
|
||||
<tr v-for="lv in lv_arr">
|
||||
@@ -140,10 +138,10 @@ export default {
|
||||
<template v-if="footer" v-slot:footer>
|
||||
<div v-if="countRemaining > 0" class="form-check flex-grow-1">
|
||||
<input ref="check" type="checkbox" class="form-check-input" id="cbid" v-model="check">
|
||||
<label class="form-check-label" for="cbid">{{p.t('studierendenantrag','fuer_x_uebernehmen', {count: countRemaining})}}</label>
|
||||
<label class="form-check-label" for="cbid">{{$p.t('studierendenantrag','fuer_x_uebernehmen', {count: countRemaining})}}</label>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary" @click="submit(true)">{{p.t('studierendenantrag','btn_approve')}}</button>
|
||||
<button v-if="countRemaining > 0" type="button" class="btn btn-secondary" @click="submit(false)">{{p.t('ui','skip')}}</button>
|
||||
<button type="button" class="btn btn-primary" @click="submit(true)">{{$p.t('studierendenantrag','btn_approve')}}</button>
|
||||
<button v-if="countRemaining > 0" type="button" class="btn btn-secondary" @click="submit(false)">{{$p.t('ui','skip')}}</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import BsModal from '../../Bootstrap/Modal.js';
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import LvPopup from './LvPopup.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
||||
|
||||
export default {
|
||||
@@ -10,7 +9,6 @@ export default {
|
||||
CoreFetchCmpt,
|
||||
LvPopup
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
selectedData: Array,
|
||||
columnData: Array,
|
||||
@@ -76,7 +74,8 @@ export default {
|
||||
this.$refs.lvList.show();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
async mounted() {
|
||||
await this.$p.loadCategory(['lehre', 'studierendenantrag', 'person', 'global', 'ui']);
|
||||
function dateFormatter(cell)
|
||||
{
|
||||
let val = cell.getValue();
|
||||
@@ -100,7 +99,7 @@ export default {
|
||||
page: true, //persist page
|
||||
columns: ["width", "visible"], //persist columns
|
||||
},
|
||||
persistenceID: 'studierendenantrag_leitung',
|
||||
persistenceID: 'studierendenantrag_leitung_2023-11-14',
|
||||
columns: [{
|
||||
formatter: 'rowSelection',
|
||||
titleFormatter: 'rowSelection',
|
||||
@@ -114,7 +113,7 @@ export default {
|
||||
title: '#'
|
||||
}, {
|
||||
field: 'bezeichnung',
|
||||
title: this.p.t('lehre', 'studiengang'),
|
||||
title: this.$p.t('lehre', 'studiengang'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
@@ -123,7 +122,7 @@ export default {
|
||||
}
|
||||
}, {
|
||||
field: 'orgform',
|
||||
title: this.p.t('lehre', 'organisationsform'),
|
||||
title: this.$p.t('lehre', 'organisationsform'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
@@ -132,7 +131,7 @@ export default {
|
||||
}
|
||||
}, {
|
||||
field: 'typ',
|
||||
title: this.p.t('studierendenantrag', 'antrag_typ'),
|
||||
title: this.$p.t('studierendenantrag', 'antrag_typ'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
@@ -140,11 +139,11 @@ export default {
|
||||
autocomplete: true,
|
||||
},
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
return this.p.t('studierendenantrag','antrag_typ_' + cell.getValue());
|
||||
return this.$p.t('studierendenantrag','antrag_typ_' + cell.getValue());
|
||||
}
|
||||
}, {
|
||||
field: 'statustyp',
|
||||
title: this.p.t('studierendenantrag', 'antrag_status'),
|
||||
title: this.$p.t('studierendenantrag', 'antrag_status'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
@@ -166,38 +165,38 @@ export default {
|
||||
}
|
||||
}, {
|
||||
field: 'matrikelnr',
|
||||
title: this.p.t('person', 'personenkennzeichen'),
|
||||
title: this.$p.t('person', 'personenkennzeichen'),
|
||||
headerFilter: 'input'
|
||||
}, {
|
||||
field: 'prestudent_id',
|
||||
title: this.p.t('lehre', 'prestudent'),
|
||||
title: this.$p.t('lehre', 'prestudent'),
|
||||
headerFilter: 'input'
|
||||
}, {
|
||||
field: 'name',
|
||||
title: this.p.t('global', 'name'),
|
||||
title: this.$p.t('global', 'name'),
|
||||
mutator: (value, data) => (data.vorname + ' ' + data.nachname).replace(/^\s*(.*)\s*$/, '$1'),
|
||||
headerFilter: 'input'
|
||||
}, {
|
||||
field: 'datum',
|
||||
title: this.p.t('global', 'datum'),
|
||||
title: this.$p.t('global', 'datum'),
|
||||
formatter: dateFormatter,
|
||||
headerFilterFunc: 'dates',
|
||||
headerFilter: dateFilter
|
||||
}, {
|
||||
field: 'datum_wiedereinstieg',
|
||||
title: this.p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'),
|
||||
title: this.$p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'),
|
||||
formatter: dateFormatter,
|
||||
headerFilterFunc: 'dates',
|
||||
headerFilter: dateFilter
|
||||
}, {
|
||||
field: 'grund',
|
||||
title: this.p.t('studierendenantrag', 'antrag_grund'),
|
||||
title: this.$p.t('studierendenantrag', 'antrag_grund'),
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let link = document.createElement('a'),
|
||||
val = cell.getValue();
|
||||
link.href = "#modal-grund";
|
||||
link.setAttribute('data-bs-toggle', 'modal');
|
||||
link.innerHTML = this.p.t('studierendenantrag', 'antrag_grund');
|
||||
link.innerHTML = this.$p.t('studierendenantrag', 'antrag_grund');
|
||||
link.addEventListener('click', () => {
|
||||
this.$refs.modalGrundPre.innerHTML = val;
|
||||
});
|
||||
@@ -206,19 +205,25 @@ export default {
|
||||
}
|
||||
}, {
|
||||
field: 'dms_id',
|
||||
title: this.p.t('studierendenantrag', 'antrag_dateianhaenge'),
|
||||
title: this.$p.t('studierendenantrag', 'antrag_dateianhaenge'),
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let val = cell.getValue();
|
||||
if (!val)
|
||||
return '';
|
||||
return '<a href="' + FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
let link = document.createElement('a');
|
||||
link.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/lehre/Antrag/Attachment/show/' + val + '" target="_blank"><i class="fa fa-paperclip" aria-hidden="true"></i> ' + this.p.t('studierendenantrag', 'antrag_anhang') + '</a>';
|
||||
'/lehre/Antrag/Attachment/show/' +
|
||||
val;
|
||||
link.setAttribute('target', '_blank');
|
||||
link.innerHTML = '<i class="fa fa-paperclip" aria-hidden="true"></i>';
|
||||
link.append(this.$p.t('studierendenantrag/antrag_anhang'));
|
||||
return link;
|
||||
}
|
||||
}, {
|
||||
field: 'actions',
|
||||
frozen: true,
|
||||
title: this.p.t('ui', 'aktion'),
|
||||
title: this.$p.t('ui', 'aktion'),
|
||||
headerFilter: false,
|
||||
headerSort: false,
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
@@ -230,7 +235,9 @@ export default {
|
||||
if ((data.typ == 'Abmeldung' || data.typ == 'AbmeldungStgl' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt' || data.status == 'Beeinsprucht' || data.status == 'EinspruchAbgelehnt' || data.status == 'EmailVersandt')) {
|
||||
// NOTE(chris): Download PDF
|
||||
let button = document.createElement('a');
|
||||
button.innerHTML = '<i class="fa-solid fa-download" title="' + this.p.t('studierendenantrag', 'btn_download_antrag') + '"></i>';
|
||||
// NOTE(chris): phrasen in attribues don't work if they are not preloaded
|
||||
// it work in this case because the category has already been loaded before
|
||||
button.innerHTML = '<i class="fa-solid fa-download" title="' + this.$p.t('studierendenantrag', 'btn_download_antrag') + '"></i>';
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.target = "_blank";
|
||||
button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
@@ -240,7 +247,7 @@ export default {
|
||||
if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') {
|
||||
// NOTE(chris): Object
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_object');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_object'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:object', [cell.getData()]));
|
||||
container.append(button);
|
||||
@@ -249,14 +256,14 @@ export default {
|
||||
if (data.typ == 'AbmeldungStgl' && data.status == 'Beeinsprucht') {
|
||||
// NOTE(chris): Deny Objection
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_deny');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_objection_deny'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:objectionDeny', [cell.getData()]));
|
||||
container.append(button);
|
||||
|
||||
// NOTE(chris): Approve Objection
|
||||
button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_approve');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_objection_approve'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:objectionApprove', [cell.getData()]));
|
||||
container.append(button);
|
||||
@@ -266,7 +273,7 @@ export default {
|
||||
// NOTE(chris): Reopen
|
||||
if (data.typ == 'Wiederholung' && data.status == 'Verzichtet') {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_reopen');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_reopen'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:reopen', [cell.getData()]));
|
||||
container.append(button);
|
||||
@@ -274,7 +281,7 @@ export default {
|
||||
// NOTE(chris): Lv Zuweisen
|
||||
if (data.typ == 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'Lvszugewiesen')) {
|
||||
let button = document.createElement('a');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_lvzuweisen');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_lvzuweisen'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
@@ -287,7 +294,7 @@ export default {
|
||||
class: 'position-absolute top-0 start-0 w-100 h-100'
|
||||
}), {
|
||||
dialogClass: 'modal-fullscreen'
|
||||
}, this.p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => {
|
||||
}, this.$p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => {
|
||||
this.$emit('reload');
|
||||
});
|
||||
};
|
||||
@@ -296,7 +303,7 @@ export default {
|
||||
// NOTE(chris): Cancel
|
||||
if (data.typ == 'AbmeldungStgl' && (data.status == 'Erstellt' || data.status == 'Genehmigt' )) {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_cancel');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_cancel'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click',() => this.$emit('action:cancel', [cell.getData()]));
|
||||
container.append(button);
|
||||
@@ -307,7 +314,7 @@ export default {
|
||||
// NOTE(chris): Approve
|
||||
if ((data.typ == 'Wiederholung' && data.status == 'Lvszugewiesen') || (data.typ != 'Wiederholung' && data.status == 'Erstellt')) {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_approve');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_approve'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:approve', [cell.getData()]));
|
||||
container.append(button);
|
||||
@@ -315,7 +322,7 @@ export default {
|
||||
// NOTE(chris): Reject (Unterbrechung braucht grund)
|
||||
if (data.status == 'Erstellt' && data.typ == 'Unterbrechung') {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_reject');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_reject'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:reject', [cell.getData()]));
|
||||
container.append(button);
|
||||
@@ -325,7 +332,7 @@ export default {
|
||||
// NOTE(chris): Show LVs
|
||||
if (data.typ == 'Wiederholung' && (data.status == 'Lvszugewiesen' || data.status == 'Genehmigt')) {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_show_lvs');
|
||||
button.append(this.$p.t('studierendenantrag', 'btn_show_lvs'));
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.showLVs(cell.getData()));
|
||||
container.append(button);
|
||||
@@ -358,11 +365,11 @@ export default {
|
||||
<div class="studierendenantrag-leitung-table">
|
||||
<div ref="table"></div>
|
||||
<bs-modal ref="modalGrund" id="modal-grund" class="fade">
|
||||
<template #title>{{p.t('studierendenantrag', 'antrag_grund')}}</template>
|
||||
<pre ref="modalGrundPre"></pre>
|
||||
<template #title>{{$p.t('studierendenantrag', 'antrag_grund')}}</template>
|
||||
<textarea class="form-control" ref="modalGrundPre" style="width: 100%; height: 250px;" readonly></textarea>
|
||||
</bs-modal>
|
||||
<bs-modal ref="history" class="fade">
|
||||
<template #title>{{p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}</template>
|
||||
<template #title>{{$p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}</template>
|
||||
<core-fetch-cmpt ref="historyLoader" :api-function="getHistory">
|
||||
<table v-if="historyData.length" class="table">
|
||||
<tr v-for="status in historyData" :key="status.studierendenantrag_status_id">
|
||||
@@ -371,7 +378,7 @@ export default {
|
||||
<td>{{status.typ}}</td>
|
||||
<td>
|
||||
<a v-if="status.grund" href="#modal-grund" data-bs-toggle="modal" @click="showHistoryGrund(status.grund)">
|
||||
{{p.t('studierendenantrag', 'antrag_grund')}}
|
||||
{{$p.t('studierendenantrag', 'antrag_grund')}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -379,7 +386,7 @@ export default {
|
||||
</core-fetch-cmpt>
|
||||
</bs-modal>
|
||||
<lv-popup ref="lvList" class="fade" :antrag-id="lvsData ? lvsData.studierendenantrag_id : null">
|
||||
{{p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }}
|
||||
{{$p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }}
|
||||
</lv-popup>
|
||||
</div>
|
||||
`
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import StudierendenantragStatus from './Status.js';
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
StudierendenantragStatus
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
antragId: Number,
|
||||
initialStatusCode: String,
|
||||
@@ -64,7 +62,7 @@ export default {
|
||||
this.statusCode = response.data.retval[0].studierendenantrag_statustyp_kurzbz;
|
||||
this.statusMsg = response.data.retval[0].typ;
|
||||
} else {
|
||||
this.addAlert(response.data.retval, 'alert-danger');
|
||||
this.addAlert(response.data.retval.message || response.data.retval, 'alert-danger');
|
||||
this.statusCode = 0;
|
||||
this.statusMsg = 'Error';
|
||||
}
|
||||
@@ -107,119 +105,125 @@ export default {
|
||||
else
|
||||
{
|
||||
let res = {};
|
||||
for (var k in result.data.retval) {
|
||||
if (result.data.retval[k] === null) {
|
||||
const alert = document.createElement('div');
|
||||
alert.innerHTML = this.p.t('studierendenantrag', 'error_stg_last_semester');
|
||||
alert.className = 'alert alert-warning';
|
||||
alert.role = 'alert';
|
||||
this.$refs["lvtable" + k.substr(0,1)].append(alert);
|
||||
continue;
|
||||
}
|
||||
let lvs = result.data.retval[k].reduce((obj,lv) => {
|
||||
obj[lv.studienplan_lehrveranstaltung_id] = lv;
|
||||
return obj;
|
||||
}, {});
|
||||
for (var lv of Object.values(lvs)) {
|
||||
if (!lv.studienplan_lehrveranstaltung_id_parent)
|
||||
continue;
|
||||
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent])
|
||||
console.error('parent not available');
|
||||
else {
|
||||
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children)
|
||||
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = [];
|
||||
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv);
|
||||
}
|
||||
}
|
||||
res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent);
|
||||
let current = res[k];
|
||||
let index = k.substr(0,1);
|
||||
var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], {
|
||||
data: current,
|
||||
dataTree: true,
|
||||
dataTreeStartExpanded: true, //start with an expanded tree
|
||||
dataTreeChildIndent: 15,
|
||||
layout: "fitDataStretch",
|
||||
columns: [
|
||||
{title: this.p.t('ui','bezeichnung'), field: "bezeichnung"},
|
||||
{title: this.p.t('lehre','lehrform'), field: "lehrform_kurzbz"},
|
||||
{title: "ECTS", field: "ects"},
|
||||
{title: this.p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"},
|
||||
{title: (index==1) ? this.p.t('studierendenantrag','lv_nicht_zulassen') : this.p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => {
|
||||
let data = cell.getData();
|
||||
if(data._children || !data.zeugnis)
|
||||
return "";
|
||||
let input = document.createElement('input');
|
||||
input.className = "form-check-input";
|
||||
input.type = "checkbox";
|
||||
input.role = "switch";
|
||||
input.checked = cell.getValue();
|
||||
input.addEventListener('input', () => {
|
||||
lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked;
|
||||
cell.getRow().reformat();
|
||||
});
|
||||
if (this.disabled) {
|
||||
input.disabled = true;
|
||||
}
|
||||
|
||||
let div = document.createElement('div');
|
||||
div.className = 'form-check form-switch';
|
||||
div.append(input);
|
||||
|
||||
return div;
|
||||
}},
|
||||
{
|
||||
title: this.p.t('global','anmerkung'),
|
||||
field: "antrag_anmerkung",
|
||||
headerSort:false,
|
||||
titleFormatter:(cell, formatterParams, onRendered)=>{
|
||||
let link = document.createElement('a');
|
||||
link.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
link.href ="#";
|
||||
link.title = this.p.t('studierendenantrag','anmerkung_tooltip');
|
||||
new bootstrap.Tooltip(link);
|
||||
let tooltip = document.createElement('span');
|
||||
tooltip.innerHTML = this.p.t('global','anmerkung') + " ";
|
||||
tooltip.append(link);
|
||||
|
||||
let icon = document.createElement('i');
|
||||
link.append(icon);
|
||||
icon.className = "fa fa-info-circle";
|
||||
icon.setAttribute("aria-hidden", "true");
|
||||
icon.style.minWidth = '1em';
|
||||
|
||||
return tooltip;
|
||||
|
||||
},
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
if (this.disabled) {
|
||||
return cell.getValue() || "";
|
||||
}
|
||||
var data = cell.getData();
|
||||
if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen)
|
||||
{
|
||||
let input = document.createElement('input');
|
||||
input.className = "form-control";
|
||||
input.type = "text";
|
||||
input.value = cell.getValue() || "";
|
||||
input.addEventListener('input', () => {
|
||||
lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value;
|
||||
});
|
||||
return input;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
this.$p
|
||||
.loadCategory(['ui', 'lehre', 'studierendenantrag', 'global'])
|
||||
.then(() => {
|
||||
for (var k in result.data.retval) {
|
||||
if (result.data.retval[k] === null) {
|
||||
const alert = document.createElement('div');
|
||||
alert.innerHTML = this.$p.t('studierendenantrag', 'error_stg_last_semester');
|
||||
alert.className = 'alert alert-warning';
|
||||
alert.role = 'alert';
|
||||
this.$refs["lvtable" + k.substr(0,1)].append(alert);
|
||||
continue;
|
||||
}
|
||||
let lvs = result.data.retval[k].reduce((obj,lv) => {
|
||||
obj[lv.studienplan_lehrveranstaltung_id] = lv;
|
||||
return obj;
|
||||
}, {});
|
||||
for (var lv of Object.values(lvs)) {
|
||||
if (!lv.studienplan_lehrveranstaltung_id_parent)
|
||||
continue;
|
||||
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent])
|
||||
console.error('parent not available');
|
||||
else {
|
||||
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children)
|
||||
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = [];
|
||||
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv);
|
||||
}
|
||||
}
|
||||
]
|
||||
res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent);
|
||||
let current = res[k];
|
||||
let index = k.substr(0,1);
|
||||
|
||||
const options = {
|
||||
data: current,
|
||||
dataTree: true,
|
||||
dataTreeStartExpanded: true, //start with an expanded tree
|
||||
dataTreeChildIndent: 15,
|
||||
layout: "fitDataStretch",
|
||||
columns: [
|
||||
{title: this.$p.t('ui', 'bezeichnung'), field: "bezeichnung"},
|
||||
{title: this.$p.t('lehre','lehrform'), field: "lehrform_kurzbz"},
|
||||
{title: "ECTS", field: "ects"},
|
||||
{title: this.$p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"},
|
||||
{title: (index==1) ? this.$p.t('studierendenantrag','lv_nicht_zulassen') : this.$p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => {
|
||||
let data = cell.getData();
|
||||
if(data._children || !data.zeugnis)
|
||||
return "";
|
||||
let input = document.createElement('input');
|
||||
input.className = "form-check-input";
|
||||
input.type = "checkbox";
|
||||
input.role = "switch";
|
||||
input.checked = cell.getValue();
|
||||
input.addEventListener('input', () => {
|
||||
lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked;
|
||||
cell.getRow().reformat();
|
||||
});
|
||||
if (this.disabled) {
|
||||
input.disabled = true;
|
||||
}
|
||||
|
||||
let div = document.createElement('div');
|
||||
div.className = 'form-check form-switch';
|
||||
div.append(input);
|
||||
|
||||
return div;
|
||||
}},
|
||||
{
|
||||
title: this.$p.t('global','anmerkung'),
|
||||
field: "antrag_anmerkung",
|
||||
headerSort:false,
|
||||
titleFormatter:(cell, formatterParams, onRendered)=>{
|
||||
let link = document.createElement('a');
|
||||
link.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
link.href ="#";
|
||||
link.title = this.$p.t('studierendenantrag','anmerkung_tooltip');
|
||||
new bootstrap.Tooltip(link);
|
||||
let tooltip = document.createElement('span');
|
||||
tooltip.innerHTML = this.$p.t('global','anmerkung') + " ";
|
||||
tooltip.append(link);
|
||||
|
||||
let icon = document.createElement('i');
|
||||
link.append(icon);
|
||||
icon.className = "fa fa-info-circle";
|
||||
icon.setAttribute("aria-hidden", "true");
|
||||
icon.style.minWidth = '1em';
|
||||
|
||||
return tooltip;
|
||||
|
||||
},
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
if (this.disabled) {
|
||||
return cell.getValue() || "";
|
||||
}
|
||||
var data = cell.getData();
|
||||
if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen)
|
||||
{
|
||||
let input = document.createElement('input');
|
||||
input.className = "form-control";
|
||||
input.type = "text";
|
||||
input.value = cell.getValue() || "";
|
||||
input.addEventListener('input', () => {
|
||||
lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value;
|
||||
});
|
||||
return input;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], options);
|
||||
}
|
||||
this.lvs = result.data.retval;
|
||||
});
|
||||
}
|
||||
this.lvs = result.data.retval;
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -229,20 +233,20 @@ export default {
|
||||
<div ref="alertbox"></div>
|
||||
|
||||
<span class="d-flex justify-content-between h4">
|
||||
<span>{{p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
|
||||
<span>{{$p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
|
||||
<span>{{lvs1sem}}</span>
|
||||
</span>
|
||||
<div ref="lvtable1" class="mb-3">
|
||||
</div>
|
||||
|
||||
<span class="d-flex justify-content-between h4">
|
||||
<span>{{p.t('studierendenantrag', 'title_lv_wiederholen')}}</span>
|
||||
<span>{{$p.t('studierendenantrag', 'title_lv_wiederholen')}}</span>
|
||||
<span>{{lvs2sem}}</span>
|
||||
</span>
|
||||
<div ref="lvtable2">
|
||||
</div>
|
||||
|
||||
<button type="button" @click="save" :disabled="isloading || disabled" class="btn btn-primary my-3">{{p.t('studierendenantrag', 'btn_save_lvs')}}</button>
|
||||
<button type="button" @click="save" :disabled="isloading || disabled" class="btn btn-primary my-3">{{$p.t('studierendenantrag', 'btn_save_lvs')}}</button>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<studierendenantrag-status :msg="statusMsg" :severity="statusSeverity"></studierendenantrag-status>
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
import {CoreFilterAPIs} from './API.js';
|
||||
import {CoreRESTClient} from '../../RESTClient.js';
|
||||
import {CoreFetchCmpt} from '../../components/Fetch.js';
|
||||
import FilterConfig from './Filter/Config.js';
|
||||
import FilterColumns from './Filter/Columns.js';
|
||||
import TableDownload from './Table/Download.js';
|
||||
|
||||
//
|
||||
const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';
|
||||
@@ -29,11 +32,18 @@ var _uuid = 0;
|
||||
*
|
||||
*/
|
||||
export const CoreFilterCmpt = {
|
||||
emits: ['nwNewEntry'],
|
||||
components: {
|
||||
CoreFetchCmpt
|
||||
CoreFetchCmpt,
|
||||
FilterConfig,
|
||||
FilterColumns,
|
||||
TableDownload
|
||||
},
|
||||
emits: [
|
||||
'nwNewEntry',
|
||||
'click:new'
|
||||
],
|
||||
props: {
|
||||
onNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props
|
||||
title: String,
|
||||
sideMenu: {
|
||||
type: Boolean,
|
||||
@@ -45,7 +55,16 @@ export const CoreFilterCmpt = {
|
||||
},
|
||||
tabulatorOptions: Object,
|
||||
tabulatorEvents: Array,
|
||||
tableOnly: Boolean
|
||||
tableOnly: Boolean,
|
||||
reload: Boolean,
|
||||
download: {
|
||||
type: [Boolean, String, Function, Array, Object],
|
||||
default: false
|
||||
},
|
||||
newBtnShow: Boolean,
|
||||
newBtnClass: [String, Array, Object],
|
||||
newBtnDisabled: Boolean,
|
||||
newBtnLabel: String
|
||||
},
|
||||
data: function() {
|
||||
return {
|
||||
@@ -60,6 +79,7 @@ export const CoreFilterCmpt = {
|
||||
filterFields: null,
|
||||
|
||||
availableFilters: null,
|
||||
selectedFilter: null,
|
||||
|
||||
// FetchCmpt binded properties
|
||||
fetchCmptRefresh: false,
|
||||
@@ -68,7 +88,9 @@ export const CoreFilterCmpt = {
|
||||
fetchCmptDataFetched: null,
|
||||
|
||||
tabulator: null,
|
||||
tableBuilt: false
|
||||
tableBuilt: false,
|
||||
tabulatorHasSelector: false,
|
||||
selectedData: []
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -115,6 +137,8 @@ export const CoreFilterCmpt = {
|
||||
{
|
||||
// If the column has to be displayed or not
|
||||
col.visible = selectedFields.indexOf(col.field) >= 0;
|
||||
if (col.formatter == 'rowSelection')
|
||||
col.visible = true;
|
||||
|
||||
if (col.hasOwnProperty('resizable'))
|
||||
col.resizable = col.visible;
|
||||
@@ -123,6 +147,14 @@ export const CoreFilterCmpt = {
|
||||
|
||||
return columns;
|
||||
},
|
||||
fieldIdsForVisibilty() {
|
||||
if (!this.tableBuilt)
|
||||
return [];
|
||||
return this.tabulator.getColumns().filter(col => {
|
||||
let def = col.getDefinition();
|
||||
return !def.frozen && def.title;
|
||||
}).map(col => col.getField());
|
||||
},
|
||||
fieldNames() {
|
||||
if (!this.tableBuilt)
|
||||
return {};
|
||||
@@ -135,21 +167,24 @@ export const CoreFilterCmpt = {
|
||||
if (!this.uuid)
|
||||
return '';
|
||||
return '-' + this.uuid;
|
||||
},
|
||||
columnsForFilter() {
|
||||
if (!this.filteredColumns || !this.datasetMetadata)
|
||||
return [];
|
||||
const filterTitles = this.filteredColumns.reduce((a,c) => {
|
||||
a[c.field] = c.title;
|
||||
return a;
|
||||
}, {});
|
||||
return this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}}));
|
||||
}
|
||||
},
|
||||
beforeCreate() {
|
||||
if (!this.tableOnly == !this.filterType)
|
||||
alert('You can not have a filter-type in table-only mode!');
|
||||
},
|
||||
created() {
|
||||
this.uuid = _uuid++;
|
||||
if (!this.tableOnly)
|
||||
this.getFilter(); // get the filter data
|
||||
},
|
||||
mounted() {
|
||||
this.initTabulator();
|
||||
},
|
||||
methods: {
|
||||
reloadTable() {
|
||||
if (this.tableOnly)
|
||||
this.tabulator.setData();
|
||||
else
|
||||
this.getFilter();
|
||||
},
|
||||
initTabulator() {
|
||||
// Define a default tabulator options in case it was not provided
|
||||
let tabulatorOptions = {...{
|
||||
@@ -164,6 +199,9 @@ export const CoreFilterCmpt = {
|
||||
tabulatorOptions.columns = this.filteredColumns;
|
||||
}
|
||||
|
||||
if (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length)
|
||||
this.tabulatorHasSelector = true;
|
||||
|
||||
// Start the tabulator with the build options
|
||||
this.tabulator = new Tabulator(
|
||||
this.$refs.table,
|
||||
@@ -177,6 +215,9 @@ export const CoreFilterCmpt = {
|
||||
this.tabulator.on(evt.event, evt.handler);
|
||||
}
|
||||
this.tabulator.on('tableBuilt', () => this.tableBuilt = true);
|
||||
this.tabulator.on("rowSelectionChanged", data => {
|
||||
this.selectedData = data;
|
||||
});
|
||||
if (this.tableOnly) {
|
||||
this.tabulator.on('tableBuilt', () => {
|
||||
const cols = this.tabulator.getColumns();
|
||||
@@ -194,15 +235,24 @@ export const CoreFilterCmpt = {
|
||||
}
|
||||
},
|
||||
_updateTabulator() {
|
||||
this.tabulator.setData(this.filteredData);
|
||||
this.tabulatorHasSelector = this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;
|
||||
this.tabulator.setColumns(this.filteredColumns);
|
||||
this.tabulator.setData(this.filteredData);
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
getFilter: function() {
|
||||
//
|
||||
this.startFetchCmpt(CoreFilterAPIs.getFilter, null, this.render);
|
||||
if (this.selectedFilter === null)
|
||||
this.startFetchCmpt(CoreFilterAPIs.getFilter, null, this.render);
|
||||
else
|
||||
this.startFetchCmpt(
|
||||
CoreFilterAPIs.getFilterById,
|
||||
{
|
||||
filterId: this.selectedFilter
|
||||
},
|
||||
this.render
|
||||
);
|
||||
},
|
||||
/**
|
||||
*
|
||||
@@ -230,7 +280,7 @@ export const CoreFilterCmpt = {
|
||||
filter.type = data.datasetMetadata[i].type;
|
||||
|
||||
this.filterFields.push(filter);
|
||||
break;
|
||||
//break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -266,6 +316,7 @@ export const CoreFilterCmpt = {
|
||||
if (link == null) link = '#';
|
||||
|
||||
filtersArray[filtersArray.length] = {
|
||||
id: filters[filtersCount].filter_id,
|
||||
link: link + filters[filtersCount].filter_id,
|
||||
description: filters[filtersCount].desc,
|
||||
sort: filtersCount,
|
||||
@@ -280,6 +331,7 @@ export const CoreFilterCmpt = {
|
||||
if (link == null) link = '#';
|
||||
|
||||
filtersArray[filtersArray.length] = {
|
||||
id: personalFilters[filtersCount].filter_id,
|
||||
link: link + personalFilters[filtersCount].filter_id,
|
||||
description: personalFilters[filtersCount].desc,
|
||||
subscriptDescription: personalFilters[filtersCount].subscriptDescription,
|
||||
@@ -318,6 +370,7 @@ export const CoreFilterCmpt = {
|
||||
if (link == null) link = '#';
|
||||
|
||||
filtersArray[filtersArray.length] = {
|
||||
id: filters[filtersCount].filter_id,
|
||||
option: filters[filtersCount].filter_id,
|
||||
description: filters[filtersCount].desc
|
||||
};
|
||||
@@ -330,6 +383,7 @@ export const CoreFilterCmpt = {
|
||||
if (link == null) link = '#';
|
||||
|
||||
filtersArray[filtersArray.length] = {
|
||||
id: personalFilters[filtersCount].filter_id,
|
||||
option: personalFilters[filtersCount].filter_id,
|
||||
description: personalFilters[filtersCount].desc
|
||||
};
|
||||
@@ -366,12 +420,13 @@ export const CoreFilterCmpt = {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
handlerSaveCustomFilter: function(event) {
|
||||
handlerSaveCustomFilter: function(customFilterName) {
|
||||
this.selectedFilter = null;
|
||||
//
|
||||
this.startFetchCmpt(
|
||||
CoreFilterAPIs.saveCustomFilter,
|
||||
{
|
||||
customFilterName: this.$refscustomFilterName.value
|
||||
customFilterName
|
||||
},
|
||||
this.getFilter
|
||||
);
|
||||
@@ -380,159 +435,22 @@ export const CoreFilterCmpt = {
|
||||
*
|
||||
*/
|
||||
handlerRemoveCustomFilter: function(event) {
|
||||
filterId = event.currentTarget.getAttribute("href").substring(1);
|
||||
if (filterId === this.selectedFilter)
|
||||
this.selectedFilter = null;
|
||||
//
|
||||
this.startFetchCmpt(
|
||||
CoreFilterAPIs.removeCustomFilter,
|
||||
{
|
||||
filterId: event.currentTarget.getAttribute("href").substring(1)
|
||||
filterId: filterId
|
||||
},
|
||||
this.getFilter
|
||||
);
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
handlerApplyFilterFields: function(event) {
|
||||
let filterFields = [];
|
||||
let filterFieldDivRows = document.getElementById('filterFields').getElementsByClassName('row');
|
||||
|
||||
for (let i = 0; i< filterFieldDivRows.length; i++)
|
||||
{
|
||||
let filterField = {};
|
||||
|
||||
for (let j = 0; j< filterFieldDivRows[i].children.length; j++)
|
||||
{
|
||||
let filterColumn = filterFieldDivRows[i].children[j];
|
||||
let filterColumnElement = filterColumn.children[0];
|
||||
|
||||
// If the first column then search for the fields dropdown
|
||||
if (j == 0) filterColumnElement = filterColumnElement.querySelector('select[name=fieldName]');
|
||||
|
||||
// If the filter name is _not_ null and it is _not_ a new filter
|
||||
if (filterColumnElement.name != null && filterColumnElement.name != FILTER_COMPONENT_NEW_FILTER)
|
||||
{
|
||||
// Condition
|
||||
if (filterColumnElement.name == 'condition' && filterColumnElement.value == "")
|
||||
{
|
||||
alert("Please fill all the filter options");
|
||||
return;
|
||||
}
|
||||
|
||||
// Name
|
||||
if (filterColumnElement.name == 'fieldName')
|
||||
{
|
||||
filterField.name = filterColumnElement.value;
|
||||
}
|
||||
// Operation
|
||||
if (filterColumnElement.name == 'operation')
|
||||
{
|
||||
filterField.operation = filterColumnElement.value;
|
||||
}
|
||||
// Condition
|
||||
if (filterColumnElement.name == 'condition')
|
||||
{
|
||||
filterField.condition = filterColumnElement.value;
|
||||
}
|
||||
// Option
|
||||
if (filterColumnElement.name == 'option')
|
||||
{
|
||||
filterField.option = filterColumnElement.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.entries(filterField).length > 0) filterFields.push(filterField);
|
||||
}
|
||||
|
||||
//
|
||||
this.startFetchCmpt(
|
||||
CoreFilterAPIs.applyFilterFields,
|
||||
{
|
||||
filterFields: filterFields
|
||||
},
|
||||
this.getFilter
|
||||
);
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
handlerChangeFilterField: function(oldValue, newValue) {
|
||||
|
||||
// If an old filter has been changed
|
||||
if (oldValue != "")
|
||||
{
|
||||
for (let i = 0; i < this.filterFields.length; i++)
|
||||
{
|
||||
if (this.filterFields[i].name == oldValue)
|
||||
{
|
||||
this.filterFields.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Then add the new filter
|
||||
for (let i = 0; i < this.datasetMetadata.length; i++)
|
||||
{
|
||||
if (this.datasetMetadata[i].name == newValue)
|
||||
{
|
||||
let filter = {
|
||||
name: this.datasetMetadata[i].name,
|
||||
type: this.datasetMetadata[i].type
|
||||
};
|
||||
|
||||
this.filterFields.push(filter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
handlerAddNewFilter: function(event) {
|
||||
// Adds a new empty filter
|
||||
this.filterFields.push({
|
||||
name: FILTER_COMPONENT_NEW_FILTER,
|
||||
type: FILTER_COMPONENT_NEW_FILTER_TYPE
|
||||
});
|
||||
},
|
||||
/*
|
||||
*
|
||||
*/
|
||||
handlerToggleSelectedField(field) {
|
||||
|
||||
// If it is a selected field
|
||||
if (this.selectedFields.indexOf(field) != -1)
|
||||
{
|
||||
// then hide it
|
||||
this.tabulator.hideColumn(field);
|
||||
// and remove it from the this.selectedFields property
|
||||
this.selectedFields.splice(this.selectedFields.indexOf(field), 1);
|
||||
}
|
||||
else // otherwise
|
||||
{
|
||||
// show it
|
||||
this.tabulator.showColumn(field);
|
||||
// and add it to the this.selectedFields property
|
||||
this.selectedFields.push(field);
|
||||
}
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
handlerRemoveFilterField: function(event) {
|
||||
//
|
||||
this.startFetchCmpt(
|
||||
CoreFilterAPIs.removeFilterField,
|
||||
{
|
||||
filterField: event.currentTarget.getAttribute('field-to-remove')
|
||||
},
|
||||
this.getFilter
|
||||
);
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
handlerGetFilterById: function(event) {
|
||||
|
||||
let filterId = null;
|
||||
@@ -550,16 +468,37 @@ export const CoreFilterCmpt = {
|
||||
filterId = attr.substring(1);
|
||||
}
|
||||
|
||||
// Ajax call
|
||||
this.switchFilter(filterId);
|
||||
},
|
||||
switchFilter(filterId) {
|
||||
this.selectedFilter = filterId;
|
||||
this.getFilter();
|
||||
},
|
||||
applyFilterConfig(filterFields) {
|
||||
this.selectedFilter = null;
|
||||
this.startFetchCmpt(
|
||||
CoreFilterAPIs.getFilterById,
|
||||
CoreFilterAPIs.applyFilterFields,
|
||||
{
|
||||
filterId: filterId
|
||||
filterFields
|
||||
},
|
||||
this.render
|
||||
this.getFilter
|
||||
);
|
||||
}
|
||||
},
|
||||
beforeCreate() {
|
||||
if (!this.tableOnly == !this.filterType)
|
||||
alert('You can not have a filter-type in table-only mode!');
|
||||
},
|
||||
created() {
|
||||
if (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function)))
|
||||
alert('"nwNewEntry" listener is mandatory when sideMenu is true');
|
||||
this.uuid = _uuid++;
|
||||
if (!this.tableOnly)
|
||||
this.getFilter(); // get the filter data
|
||||
},
|
||||
mounted() {
|
||||
this.initTabulator();
|
||||
},
|
||||
template: `
|
||||
<!-- Load filter data -->
|
||||
<core-fetch-cmpt
|
||||
@@ -580,178 +519,53 @@ export const CoreFilterCmpt = {
|
||||
|
||||
<div :id="'filterCollapsables' + idExtra">
|
||||
|
||||
<div class="filter-header-title">
|
||||
<span v-if="!tableOnly" class="filter-header-title-span-filter">[ {{ filterName }} ]</span>
|
||||
<span v-if="!tableOnly" data-bs-toggle="collapse" :data-bs-target="'#collapseFilters' + idExtra" class="filter-header-title-span-icon fa-solid fa-filter fa-xl"></span>
|
||||
<span data-bs-toggle="collapse" :data-bs-target="'#collapseColumns' + idExtra" class="filter-header-title-span-icon fa-solid fa-table-columns fa-xl"></span>
|
||||
</div>
|
||||
|
||||
<div :id="'collapseColumns' + idExtra" class="card-body collapse" :data-bs-parent="'#filterCollapsables' + idExtra">
|
||||
<div class="card">
|
||||
<!-- Filter fields options -->
|
||||
<div class="row card-body filter-options-div">
|
||||
<div class="filter-fields-area">
|
||||
<template v-for="fieldToDisplay in fields">
|
||||
<div
|
||||
class="filter-fields-field"
|
||||
v-bind:class="selectedFields.indexOf(fieldToDisplay) != -1 ? 'text-light bg-dark' : '' "
|
||||
@click="handlerToggleSelectedField(fieldToDisplay)"
|
||||
>
|
||||
{{ fieldNames[fieldToDisplay] || fieldToDisplay }}
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-row justify-content-between flex-wrap">
|
||||
<div v-if="newBtnShow || reload || $slots.actions" class="d-flex gap-2 align-items-baseline flex-wrap">
|
||||
<button v-if="newBtnShow" class="btn btn-outline-secondary" :class="newBtnClass" :title="newBtnLabel ? undefined : 'New'" :aria-label="newBtnLabel ? undefined : 'New'" @click="$emit('click:new', $event)" :disabled="newBtnDisabled">
|
||||
<span class="fa-solid fa-plus" aria-hidden="true"></span>
|
||||
{{ newBtnLabel }}
|
||||
</button>
|
||||
<button v-if="reload" class="btn btn-outline-secondary" aria-label="Reload" @click="reloadTable">
|
||||
<span class="fa-solid fa-rotate-right" aria-hidden="true"></span>
|
||||
</button>
|
||||
<span v-if="$slots.actions && tabulatorHasSelector">Mit {{selectedData.length}} ausgewählten: </span>
|
||||
<slot name="actions" v-bind="tabulatorHasSelector ? selectedData : []"></slot>
|
||||
</div>
|
||||
<div class="d-flex gap-1 align-items-baseline flex-grow-1 justify-content-end">
|
||||
<span v-if="!tableOnly">[ {{ filterName }} ]</span>
|
||||
<a v-if="!tableOnly" href="#" class="btn btn-link px-0 text-dark" data-bs-toggle="collapse" :data-bs-target="'#collapseFilters' + idExtra">
|
||||
<span class="fa-solid fa-xl fa-filter"></span>
|
||||
</a>
|
||||
<a href="#" class="btn btn-link px-0 text-dark" data-bs-toggle="collapse" :data-bs-target="'#collapseColumns' + idExtra">
|
||||
<span class="fa-solid fa-xl fa-table-columns"></span>
|
||||
</a>
|
||||
<table-download class="btn btn-link px-0 text-dark" :tabulator="tabulator" :config="download"></table-download>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="!tableOnly" :id="'collapseFilters' + idExtra" class="card-body collapse" :data-bs-parent="'#filterCollapsables' + idExtra">
|
||||
<div class="card">
|
||||
<!-- Filter options -->
|
||||
<div class="card-body" v-if="!sideMenu">
|
||||
<select
|
||||
class="form-select"
|
||||
@change="handlerGetFilterById"
|
||||
>
|
||||
<option value="">Bitte auswählen...</option>
|
||||
<template v-for="availableFilter in availableFilters">
|
||||
<option v-bind:value="availableFilter.option">{{ availableFilter.description }}</option>
|
||||
</template>
|
||||
</select>
|
||||
</div>
|
||||
<div class="card-body filter-options-div">
|
||||
<div>
|
||||
<span>
|
||||
Neuer Filter
|
||||
</span>
|
||||
<span>
|
||||
<button class="btn btn-outline-dark" type="button" @click=handlerAddNewFilter>+</button>
|
||||
</span>
|
||||
</div>
|
||||
<div :id="'filterFields' + idExtra" class="filter-filter-fields">
|
||||
<template v-for="(filterField, index) in filterFields">
|
||||
<div class="row">
|
||||
<filter-columns
|
||||
:id="'collapseColumns' + idExtra"
|
||||
class="card-body collapse"
|
||||
:data-bs-parent="'#filterCollapsables' + idExtra"
|
||||
:fields="fieldIdsForVisibilty"
|
||||
:selected="selectedFields"
|
||||
:names="fieldNames"
|
||||
@hide="tabulator.hideColumn($event)"
|
||||
@show="tabulator.showColumn($event)"
|
||||
></filter-columns>
|
||||
|
||||
<div class="col-5">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Filter {{ index + 1 }}</span>
|
||||
<select
|
||||
class="form-select"
|
||||
name="fieldName"
|
||||
v-bind:value="filterField.name"
|
||||
@change="handlerChangeFilterField(filterField.name, $event.target.value)"
|
||||
>
|
||||
<option value="">Feld zum Filter hinzufügen...</option>
|
||||
<template v-for="columnAlias in filteredColumns">
|
||||
<option v-bind:value="columnAlias.field">{{ columnAlias.title }}</option>
|
||||
</template>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Numeric -->
|
||||
<template
|
||||
v-if="filterField.type.toLowerCase().indexOf('int') >= 0">
|
||||
<div class="col-2">
|
||||
<select class="form-select" name="operation" v-model="filterField.operation">
|
||||
<option value="equal">Gleich</option>
|
||||
<option value="nequal">Nicht gleich</option>
|
||||
<option value="gt">Größer als</option>
|
||||
<option value="lt">Weniger als</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<input type="number" class="form-control" v-bind:value="filterField.condition" name="condition">
|
||||
</div>
|
||||
<div class="col">
|
||||
<button
|
||||
class="btn btn-outline-dark"
|
||||
type="button"
|
||||
v-bind:field-to-remove="filterField.name"
|
||||
@click=handlerRemoveFilterField>
|
||||
 X 
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Text -->
|
||||
<template
|
||||
v-if="filterField.type.toLowerCase().indexOf('varchar') >= 0
|
||||
|| filterField.type.toLowerCase().indexOf('text') >= 0
|
||||
|| filterField.type.toLowerCase().indexOf('bpchar') >= 0">
|
||||
<div class="col-2">
|
||||
<select class="form-select" name="operation" v-model="filterField.operation">
|
||||
<option value="equal">Gleich</option>
|
||||
<option value="nequal">Nicht gleich</option>
|
||||
<option value="contains">Enthält</option>
|
||||
<option value="ncontains">Enthält nicht</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<input type="text" class="form-control" v-bind:value="filterField.condition" name="condition">
|
||||
</div>
|
||||
<div class="col">
|
||||
<button
|
||||
class="btn btn-outline-dark"
|
||||
type="button"
|
||||
v-bind:field-to-remove="filterField.name"
|
||||
@click=handlerRemoveFilterField>
|
||||
 X 
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Timestamp and date -->
|
||||
<template
|
||||
v-if="filterField.type.toLowerCase().indexOf('timestamp') >= 0
|
||||
|| filterField.type.toLowerCase().indexOf('date') >= 0">
|
||||
<div class="col-2">
|
||||
<select class="form-select" name="operation" v-model="filterField.operation">
|
||||
<option value="gt">Größer als</option>
|
||||
<option value="lt">Weniger als</option>
|
||||
<option value="set">Eingestellt ist</option>
|
||||
<option value="nset">Eingestellt nicht ist</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-1">
|
||||
<input type="number" class="form-control" v-bind:value="filterField.condition" name="condition">
|
||||
</div>
|
||||
<div class="col-2">
|
||||
<select class="form-select" name="option" v-model="filterField.option">
|
||||
<option value="minutes">Minuten</option>
|
||||
<option value="hours">Stunden</option>
|
||||
<option value="days">Tage</option>
|
||||
<option value="months">Monate</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button
|
||||
class="btn btn-outline-dark"
|
||||
type="button"
|
||||
v-bind:field-to-remove="filterField.name"
|
||||
@click=handlerRemoveFilterField
|
||||
> - </button>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- Filter save options -->
|
||||
<div class="row">
|
||||
<div class="col-7">
|
||||
<div class="input-group">
|
||||
<input ref="customFilterName" type="text" class="form-control" placeholder="Filternamen eingeben..." :id="'customFilterName' + idExtra">
|
||||
<button type="button" class="btn btn-outline-secondary" @click=handlerSaveCustomFilter>Filter speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button type="button" class="btn btn-outline-dark" @click=handlerApplyFilterFields>Filter anwenden</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<filter-config
|
||||
v-if="!tableOnly"
|
||||
:id="'collapseFilters' + idExtra"
|
||||
class="card-body collapse"
|
||||
:data-bs-parent="'#filterCollapsables' + idExtra"
|
||||
:filters="!sideMenu ? (availableFilters || []) : []"
|
||||
:columns="columnsForFilter"
|
||||
:fields="filterFields || []"
|
||||
@switch-filter="switchFilter"
|
||||
@apply-filter-config="applyFilterConfig"
|
||||
@save-custom-filter="handlerSaveCustomFilter"
|
||||
></filter-config>
|
||||
</div>
|
||||
|
||||
<!-- Tabulator -->
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* Copyright (C) 2022 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export default {
|
||||
props: {
|
||||
fields: Array,
|
||||
selected: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
names: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
},
|
||||
emits: {
|
||||
hide: ['fieldName'],
|
||||
show: ['fieldName']
|
||||
},
|
||||
data: function() {
|
||||
return {
|
||||
selectedFields: []
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
selected(n) {
|
||||
this.selectedFields = n;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
toggle(field) {
|
||||
if (this.selectedFields.indexOf(field) != -1)
|
||||
{
|
||||
this.selectedFields.splice(this.selectedFields.indexOf(field), 1);
|
||||
this.$emit('hide', field);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.selectedFields.push(field);
|
||||
this.$emit('show', field);
|
||||
}
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="filter-columns">
|
||||
<div class="card">
|
||||
<div class="d-flex flex-wrap gap-2 p-3 justify-content-center">
|
||||
<div
|
||||
v-for="fieldToDisplay in fields"
|
||||
class="btn"
|
||||
:class="selectedFields.indexOf(fieldToDisplay) != -1 ? 'btn-dark' : 'btn-outline-dark' "
|
||||
@click="toggle(fieldToDisplay)"
|
||||
>
|
||||
{{ names[fieldToDisplay] || fieldToDisplay }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
};
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
/**
|
||||
* Copyright (C) 2022 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export default {
|
||||
props: {
|
||||
filters: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
columns: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
fields: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
},
|
||||
emits: {
|
||||
switchFilter: ['filterId'],
|
||||
applyFilterConfig: ['filterFields'],
|
||||
saveCustomFilter: ['customFilterName']
|
||||
},
|
||||
data: function() {
|
||||
return {
|
||||
currentFields: []
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
types() {
|
||||
return this.columns.reduce((a,c) => {
|
||||
let type = c.type.toLowerCase();
|
||||
if (type.indexOf('int') >= 0)
|
||||
a[c.name] = 'Numeric';
|
||||
else if (
|
||||
type.indexOf('varchar') >= 0 ||
|
||||
type.indexOf('text') >= 0 ||
|
||||
type.indexOf('bpchar') >= 0
|
||||
)
|
||||
a[c.name] = 'Text';
|
||||
else if (
|
||||
type.indexOf('timestamp') >= 0 ||
|
||||
type.indexOf('date') >= 0
|
||||
)
|
||||
a[c.name] = 'Date';
|
||||
else
|
||||
a[c.name] = '';
|
||||
return a;
|
||||
}, {});
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
fields(n) {
|
||||
this.currentFields = n;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
switchFilter(evt) {
|
||||
this.$emit('switchFilter', evt.currentTarget.value);
|
||||
},
|
||||
applyFilterConfig() {
|
||||
const filteredFields = this.currentFields.filter(el => el.name != FILTER_COMPONENT_NEW_FILTER);
|
||||
if (filteredFields.filter(el => el.condition == "").length)
|
||||
alert("Please fill all the filter options");
|
||||
else
|
||||
this.$emit('applyFilterConfig', filteredFields);
|
||||
},
|
||||
addField(evt) {
|
||||
this.currentFields.push({
|
||||
name: FILTER_COMPONENT_NEW_FILTER
|
||||
});
|
||||
},
|
||||
removeField(index) {
|
||||
this.currentFields.splice(index, 1);
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="filter-config">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div v-if="filters.length" class="mb-4">
|
||||
<select class="form-select" @change="switchFilter">
|
||||
<option value="">Bitte auswählen...</option>
|
||||
<option v-for="filter in filters" :value="filter.id">
|
||||
{{ filter.description }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<button class="btn btn-outline-dark" type="button" @click=addField>
|
||||
<span class="fa-solid fa-plus" aria-hidden="true"></span> Neuer Filter
|
||||
</button>
|
||||
</div>
|
||||
<div class="filter-config-fields my-3">
|
||||
<div v-for="(filterField, index) in currentFields" class="filter-config-field row">
|
||||
|
||||
<div class="col-5">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Filter {{ index + 1 }}</span>
|
||||
<select
|
||||
class="form-select"
|
||||
v-model="filterField.name"
|
||||
>
|
||||
<option value="">Feld zum Filter hinzufügen...</option>
|
||||
<option v-for="col in columns" :value="col.name">
|
||||
{{ col.title }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Numeric -->
|
||||
<template v-if="types[filterField.name] == 'Numeric'">
|
||||
<div class="col-2">
|
||||
<select class="form-select" v-model="filterField.operation">
|
||||
<option value="equal">Gleich</option>
|
||||
<option value="nequal">Nicht gleich</option>
|
||||
<option value="gt">Größer als</option>
|
||||
<option value="lt">Weniger als</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<input type="number" class="form-control" v-model="filterField.condition">
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Text -->
|
||||
<template v-if="types[filterField.name] == 'Text'">
|
||||
<div class="col-2">
|
||||
<select class="form-select" v-model="filterField.operation">
|
||||
<option value="equal">Gleich</option>
|
||||
<option value="nequal">Nicht gleich</option>
|
||||
<option value="contains">Enthält</option>
|
||||
<option value="ncontains">Enthält nicht</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-3">
|
||||
<input type="text" class="form-control" v-model="filterField.condition">
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Timestamp and date -->
|
||||
<template v-if="types[filterField.name] == 'Date'">
|
||||
<div class="col-2">
|
||||
<select class="form-select" v-model="filterField.operation">
|
||||
<option value="gt">Größer als</option>
|
||||
<option value="lt">Weniger als</option>
|
||||
<option value="set">Eingestellt ist</option>
|
||||
<option value="nset">Eingestellt nicht ist</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-1">
|
||||
<input type="number" class="form-control" v-model="filterField.condition">
|
||||
</div>
|
||||
<div class="col-2">
|
||||
<select class="form-select" v-model="filterField.option">
|
||||
<option value="minutes">Minuten</option>
|
||||
<option value="hours">Stunden</option>
|
||||
<option value="days">Tage</option>
|
||||
<option value="months">Monate</option>
|
||||
</select>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="col text-end">
|
||||
<button
|
||||
class="btn btn-outline-dark"
|
||||
type="button"
|
||||
@click="removeField(index)"
|
||||
title="Filter entfernen"
|
||||
aria-title="Filter entfernen"
|
||||
>
|
||||
<span class="fa-solid fa-minus" aria-hidden="true"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filter save options -->
|
||||
<div class="row">
|
||||
<div class="col-7">
|
||||
<div class="input-group">
|
||||
<input ref="filterName" type="text" class="form-control" placeholder="Filternamen eingeben...">
|
||||
<button type="button" class="btn btn-outline-secondary" @click="$emit('saveCustomFilter', $refs.filterName.value)">Filter speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button type="button" class="btn btn-outline-dark" @click="applyFilterConfig">Filter anwenden</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
};
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
/**
|
||||
* Copyright (C) 2022 fhcomplete.org
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
const DEFAULT_ICONS = {
|
||||
jsonLines: 'fa-file-lines',
|
||||
xlsx: 'fa-file-excel',
|
||||
pdf: 'fa-file-pdf',
|
||||
html: 'fa-file-code',
|
||||
json: 'fa-file',
|
||||
csv: 'fa-file-csv'
|
||||
};
|
||||
const DEFAULT_LABELS = {
|
||||
jsonLines: 'Download as JSONLINES',
|
||||
xlsx: 'Download as XLSX',
|
||||
pdf: 'Download as PDF',
|
||||
html: 'Download as HTML',
|
||||
json: 'Download as JSON',
|
||||
csv: 'Download as CSV '
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export default {
|
||||
props: {
|
||||
tabulator: Object,
|
||||
config: {
|
||||
type: [Boolean, String, Function, Array, Object],
|
||||
default: false
|
||||
},
|
||||
iconClass: [String, Array, Object]
|
||||
},
|
||||
computed: {
|
||||
currentConfig() {
|
||||
if (!this.config)
|
||||
return false;
|
||||
|
||||
let config = this.config;
|
||||
|
||||
if (config instanceof Function)
|
||||
return [config];
|
||||
|
||||
if (config === null)
|
||||
return [];
|
||||
|
||||
if (this.config === true)
|
||||
config = ['csv'];
|
||||
|
||||
if (Object.prototype.toString.call(config) === "[object String]")
|
||||
config = config.split(',');
|
||||
|
||||
if (typeof config === 'object' && !Array.isArray(config)) {
|
||||
let newConfig = [];
|
||||
for (var k in config) {
|
||||
var v = config[k], type;
|
||||
|
||||
if (!v)
|
||||
continue;
|
||||
|
||||
if (Object.prototype.toString.call(v) === "[object String]") {
|
||||
type = this.stringToFileFormatter(v);
|
||||
if (type !== null) {
|
||||
newConfig.push({
|
||||
icon: 'fa-solid ' + DEFAULT_ICONS[type],
|
||||
label: v === k ? DEFAULT_LABELS[type] : k,
|
||||
formatter: type
|
||||
});
|
||||
} else {
|
||||
type = this.stringToFileFormatter(k);
|
||||
if(type !== null) {
|
||||
newConfig.push({
|
||||
icon: 'fa-solid ' + DEFAULT_ICONS[type],
|
||||
label: v,
|
||||
formatter: type
|
||||
});
|
||||
} else {
|
||||
alert('neither ' + k + ' nor ' + v + ' are supported download file types');
|
||||
}
|
||||
}
|
||||
} else if (typeof v === 'object' && !Array.isArray(v)) {
|
||||
type = this.stringToFileFormatter(k);
|
||||
if (type !== null) {
|
||||
if (v.formatter === undefined)
|
||||
v.formatter = type;
|
||||
if (v.label === undefined)
|
||||
v.label = DEFAULT_LABELS[type];
|
||||
if (v.icon === undefined)
|
||||
v.icon = DEFAULT_ICONS[type];
|
||||
newConfig.push(v);
|
||||
} else {
|
||||
if (v.label === undefined)
|
||||
v.label = k;
|
||||
newConfig.push(v);
|
||||
}
|
||||
} else {
|
||||
type = this.stringToFileFormatter(k);
|
||||
if (type !== null) {
|
||||
newConfig.push({
|
||||
icon: 'fa-solid ' + DEFAULT_ICONS[type],
|
||||
label: DEFAULT_LABELS[type],
|
||||
formatter: type
|
||||
});
|
||||
} else {
|
||||
alert(k + ' is not a supported download file type');
|
||||
}
|
||||
}
|
||||
}
|
||||
config = newConfig;
|
||||
}
|
||||
|
||||
if (Array.isArray(config))
|
||||
{
|
||||
config = config.map(el => {
|
||||
if (Object.prototype.toString.call(el) === "[object String]") {
|
||||
let formatter = this.stringToFileFormatter(el);
|
||||
if (formatter === null)
|
||||
return null;
|
||||
return {
|
||||
icon: 'fa-solid ' + DEFAULT_ICONS[formatter],
|
||||
label: DEFAULT_LABELS[formatter],
|
||||
formatter
|
||||
};
|
||||
}
|
||||
|
||||
if (el instanceof Function)
|
||||
return {
|
||||
formatter: el
|
||||
}
|
||||
|
||||
if (typeof el === 'object' && !Array.isArray(el) && el !== null) {
|
||||
if (el.formatter instanceof Function)
|
||||
return el;
|
||||
if (this.validateFileFormatter(el.formatter))
|
||||
return el;
|
||||
}
|
||||
|
||||
return null;
|
||||
}).filter(el => el !== null);
|
||||
|
||||
if (config.length < 2)
|
||||
return config;
|
||||
|
||||
if (config.filter(el => el.label || el.icon).length == config.length)
|
||||
return config;
|
||||
|
||||
alert('Config not valid');
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
stringToFileFormatter(input) {
|
||||
let lcInput = input.toLowerCase();
|
||||
|
||||
if (lcInput == 'jsonlines')
|
||||
return 'jsonLines';
|
||||
|
||||
if (['xlsx', 'pdf', 'html', 'json', 'csv'].includes(lcInput))
|
||||
return lcInput;
|
||||
|
||||
return null;
|
||||
},
|
||||
validateFileFormatter(input) {
|
||||
let formatter = this.stringToFileFormatter(input);
|
||||
if (!formatter) {
|
||||
alert(input + ' is not a supported file formatter');
|
||||
return false;
|
||||
}
|
||||
if (formatter == 'xlsx') {
|
||||
if (!window.XLSX) {
|
||||
alert('XLSX Library not loaded');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (formatter == 'pdf') {
|
||||
if (!window.jspdf) {
|
||||
alert('jsPDF Library not loaded');
|
||||
return false;
|
||||
}
|
||||
var doc = new jspdf.jsPDF({});
|
||||
if (!doc.autoTable) {
|
||||
alert('jsPDF-AutoTable Plugin not loaded');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
download(config) {
|
||||
this.tabulator.download(config.formatter, config.file, config.options)
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<template v-if="currentConfig">
|
||||
<template v-if="currentConfig.length == 1">
|
||||
<a
|
||||
href="#"
|
||||
class="table-download"
|
||||
v-bind="$attrs"
|
||||
title="Download"
|
||||
aria-title="Download"
|
||||
@click.prevent="download(currentConfig[0])"
|
||||
>
|
||||
<span :class="iconClass || 'fa-solid fa-xl fa-download'" aria-hidden="true"></span>
|
||||
</a>
|
||||
</template>
|
||||
<div v-else class="dropdown d-inline">
|
||||
<a
|
||||
href="#"
|
||||
class="table-download"
|
||||
v-bind="$attrs"
|
||||
title="Download"
|
||||
aria-title="Download"
|
||||
role="button"
|
||||
data-bs-toggle="dropdown"
|
||||
aria-expanded="false"
|
||||
>
|
||||
<span :class="iconClass || 'fa-solid fa-xl fa-download'" aria-hidden="true"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
<li v-for="(conf, i) in currentConfig" :key="i">
|
||||
<a class="dropdown-item" href="#" @click.prevent="download(conf)">
|
||||
<span v-if="conf.icon" :class="conf.icon" aria-hidden="true"></span>
|
||||
{{conf.label}}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
`
|
||||
};
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
const categories = Vue.reactive({});
|
||||
const loadingModules = {};
|
||||
|
||||
function extractCategory(obj, category) {
|
||||
return obj.filter(e => e.category == category).reduce((res, elem) => {
|
||||
if (!res[elem.phrase])
|
||||
res[elem.phrase] = elem.text;
|
||||
return res;
|
||||
}, {});
|
||||
}
|
||||
function getValueForLoadedPhrase(category, phrase, params) {
|
||||
let result = categories[category][phrase];
|
||||
if (!result)
|
||||
return '<< PHRASE ' + phrase + '>>';
|
||||
if (params)
|
||||
result = result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
const phrasen = {
|
||||
loadCategory(category) {
|
||||
if (Array.isArray(category))
|
||||
return Promise.all(category.map(cat => this.loadCategory(cat)));
|
||||
if (!loadingModules[category])
|
||||
loadingModules[category] = axios
|
||||
.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category)
|
||||
.then(res => {
|
||||
if (res.data.retval)
|
||||
categories[category] = extractCategory(res.data.retval, category);
|
||||
else
|
||||
categories[category] = {};
|
||||
});
|
||||
return loadingModules[category];
|
||||
},
|
||||
t_ref(category, phrase, params) {
|
||||
console.warn('depricated');
|
||||
return Vue.computed(() => this.t(category, phrase, params));
|
||||
},
|
||||
t(category, phrase, params) {
|
||||
if (params === undefined && (
|
||||
(Array.isArray(category) && category.length == 2) ||
|
||||
(category.split && category.split('/').length == 2))
|
||||
) {
|
||||
params = phrase;
|
||||
[category, phrase] = category.split ? category.split('/') : category;
|
||||
}
|
||||
if (phrase === undefined) {
|
||||
console.error('invalid input', category, phrase, params);
|
||||
return '';
|
||||
}
|
||||
let val = Vue.computed(() => {
|
||||
if (!categories[category])
|
||||
return '';
|
||||
return getValueForLoadedPhrase(category, phrase, params);
|
||||
});
|
||||
if (!categories[category])
|
||||
this.loadCategory(category);
|
||||
return val.value;
|
||||
}
|
||||
};
|
||||
|
||||
export default {
|
||||
install(app, options) {
|
||||
app.config.globalProperties.$p = phrasen;
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
$id = $_GET['id'];
|
||||
|
||||
$where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . "
|
||||
AND campus.tbl_studierendenantrag.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';";
|
||||
AND a.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Genehmigt';";
|
||||
$not_found_error = 'Studierendenantrag not found'. $id;
|
||||
} elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) {
|
||||
$uid = $_GET['uid'];
|
||||
@@ -25,8 +25,8 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
$prestudent_id = explode(';', $prestudent_id);
|
||||
$prestudent_id = (array_filter($prestudent_id, 'strlen'));
|
||||
|
||||
$where = " WHERE campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND campus.tbl_studierendenantrag.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';";
|
||||
$where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND a.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Genehmigt';";
|
||||
$not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
|
||||
} else
|
||||
die('<error>wrong parameters</error>');
|
||||
@@ -36,15 +36,17 @@ else
|
||||
|
||||
|
||||
$query = "
|
||||
SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(prestudent_id, NULL) AS semester, tbl_studierendenantrag.grund
|
||||
SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund
|
||||
FROM
|
||||
campus.tbl_studierendenantrag
|
||||
campus.tbl_studierendenantrag a
|
||||
JOIN public.tbl_student USING (prestudent_id)
|
||||
JOIN public.tbl_benutzer ON tbl_student.student_uid=uid
|
||||
JOIN public.tbl_person USING (person_id)
|
||||
JOIN public.tbl_studiengang USING (studiengang_kz)
|
||||
JOIN public.tbl_studiengang stg USING (studiengang_kz)
|
||||
JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where;
|
||||
LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz))
|
||||
LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where;
|
||||
|
||||
|
||||
if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
@@ -55,7 +57,7 @@ if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
<antraege>
|
||||
<?php while($row = $db->db_fetch_object()) { ?>
|
||||
<antrag>
|
||||
<name><![CDATA[<?= trim($row->vorname . $row->nachname); ?>]]></name>
|
||||
<name><![CDATA[<?= trim($row->vorname . ' ' . $row->nachname); ?>]]></name>
|
||||
<studiengang><![CDATA[<?= $row->bezeichnung; ?>]]></studiengang>
|
||||
<organisationsform><![CDATA[<?= $row->bezeichnung_mehrsprachig; ?>]]></organisationsform>
|
||||
<personenkz><![CDATA[<?= $row->matrikelnr; ?>]]></personenkz>
|
||||
|
||||
@@ -14,7 +14,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
$id = $_GET['id'];
|
||||
|
||||
$where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . "
|
||||
AND campus.tbl_studierendenantrag.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');";
|
||||
AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');";
|
||||
$not_found_error = 'Studierendenantrag not found'. $id;
|
||||
} elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) {
|
||||
$uid = $_GET['uid'];
|
||||
@@ -25,8 +25,8 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
$prestudent_id = explode(';', $prestudent_id);
|
||||
$prestudent_id = (array_filter($prestudent_id, 'strlen'));
|
||||
|
||||
$where = " WHERE campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND campus.tbl_studierendenantrag.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');";
|
||||
$where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');";
|
||||
$not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
|
||||
} else
|
||||
die('<error>wrong parameters</error>');
|
||||
@@ -36,15 +36,17 @@ else
|
||||
|
||||
|
||||
$query = "
|
||||
SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(prestudent_id, NULL) AS semester, tbl_studierendenantrag.grund
|
||||
SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund
|
||||
FROM
|
||||
campus.tbl_studierendenantrag
|
||||
campus.tbl_studierendenantrag a
|
||||
JOIN public.tbl_student USING (prestudent_id)
|
||||
JOIN public.tbl_benutzer ON tbl_student.student_uid=uid
|
||||
JOIN public.tbl_person USING (person_id)
|
||||
JOIN public.tbl_studiengang USING (studiengang_kz)
|
||||
JOIN public.tbl_studiengang stg USING (studiengang_kz)
|
||||
JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where;
|
||||
LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz))
|
||||
LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where;
|
||||
|
||||
|
||||
if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
@@ -55,7 +57,7 @@ if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
<antraege>
|
||||
<?php while($row = $db->db_fetch_object()) { ?>
|
||||
<antrag>
|
||||
<name><![CDATA[<?= trim($row->vorname . $row->nachname); ?>]]></name>
|
||||
<name><![CDATA[<?= trim($row->vorname . ' ' . $row->nachname); ?>]]></name>
|
||||
<studiengang><![CDATA[<?= $row->bezeichnung; ?>]]></studiengang>
|
||||
<organisationsform><![CDATA[<?= $row->bezeichnung_mehrsprachig; ?>]]></organisationsform>
|
||||
<personenkz><![CDATA[<?= $row->matrikelnr; ?>]]></personenkz>
|
||||
|
||||
@@ -15,7 +15,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
$id = $_GET['id'];
|
||||
|
||||
$where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . "
|
||||
AND campus.tbl_studierendenantrag.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) IN ('Genehmigt', 'EmailVersandt');";
|
||||
AND a.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'EmailVersandt');";
|
||||
$not_found_error = 'Studierendenantrag not found'. $id;
|
||||
} elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) {
|
||||
$uid = $_GET['uid'];
|
||||
@@ -26,8 +26,8 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
$prestudent_id = explode(';', $prestudent_id);
|
||||
$prestudent_id = (array_filter($prestudent_id, 'strlen'));
|
||||
|
||||
$where = " WHERE campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND campus.tbl_studierendenantrag.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) IN ('Genehmigt', 'EmailVersandt');";
|
||||
$where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND a.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'EmailVersandt');";
|
||||
$not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
|
||||
} else
|
||||
die('<error>wrong parameters</error>');
|
||||
@@ -37,15 +37,17 @@ else
|
||||
|
||||
|
||||
$query = "
|
||||
SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(prestudent_id, NULL) AS semester, tbl_studierendenantrag.grund, datum_wiedereinstieg, datum
|
||||
SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund, datum_wiedereinstieg, a.datum
|
||||
FROM
|
||||
campus.tbl_studierendenantrag
|
||||
campus.tbl_studierendenantrag a
|
||||
JOIN public.tbl_student USING (prestudent_id)
|
||||
JOIN public.tbl_benutzer ON tbl_student.student_uid=uid
|
||||
JOIN public.tbl_person USING (person_id)
|
||||
JOIN public.tbl_studiengang USING (studiengang_kz)
|
||||
JOIN public.tbl_studiengang stg USING (studiengang_kz)
|
||||
JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where;
|
||||
LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz))
|
||||
LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where;
|
||||
|
||||
|
||||
if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
@@ -56,7 +58,7 @@ if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
<antraege>
|
||||
<?php while($row = $db->db_fetch_object()) { ?>
|
||||
<antrag>
|
||||
<name><![CDATA[<?= trim($row->vorname . $row->nachname); ?>]]></name>
|
||||
<name><![CDATA[<?= trim($row->vorname . ' ' . $row->nachname); ?>]]></name>
|
||||
<studiengang><![CDATA[<?= $row->bezeichnung; ?>]]></studiengang>
|
||||
<organisationsform><![CDATA[<?= $row->bezeichnung_mehrsprachig; ?>]]></organisationsform>
|
||||
<personenkz><![CDATA[<?= $row->matrikelnr; ?>]]></personenkz>
|
||||
|
||||
+52
-12
@@ -21491,13 +21491,13 @@ array(
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): \nNichterfüllung finanzieller Verpflichtungen trotz Mahnung (Studienbeitrag)',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): Nichterfüllung finanzieller Verpflichtungen trotz Mahnung (Studienbeitrag)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): \nFailure to meet financial obligations despite a reminder (tuition fees)',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): Failure to meet financial obligations despite a reminder (tuition fees)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -21511,13 +21511,13 @@ array(
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): \nmehrmalig unentschuldigtes Verletzen der Anwesenheitspflicht',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): mehrmalig unentschuldigtes Verletzen der Anwesenheitspflicht',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): \nmultiple unexcused breaches of attendance requirements',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): multiple unexcused breaches of attendance requirements',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -21531,13 +21531,13 @@ array(
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): \nwiederholtes Nichteinhalten von Prüfungsterminen bzw Abgabeterminen für Seminararbeiten bzw. Projektarbeiten',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): wiederholtes Nichteinhalten von Prüfungsterminen bzw Abgabeterminen für Seminararbeiten bzw. Projektarbeiten',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): \nrepeated non-compliance with examination dates or deadlines for seminar papers or project work',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): repeated non-compliance with examination dates or deadlines for seminar papers or project work',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -21551,13 +21551,13 @@ array(
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): \nPlagiieren im Rahmen wissenschaftlicher Arbeiten bzw. unerlaubte Verwendung KI generierter Hilfsmittel bzw. Quellen',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): Plagiieren im Rahmen wissenschaftlicher Arbeiten bzw. unerlaubte Verwendung KI generierter Hilfsmittel bzw. Quellen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): \nPlagiarism in the context of scientific work or unauthorized use of AI-generated tools or sources',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): Plagiarism in the context of scientific work or unauthorized use of AI-generated tools or sources',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -21571,13 +21571,13 @@ array(
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): \nnicht genügende Leistung im Sinne der Prüfungsordnung',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): nicht genügende Leistung im Sinne der Prüfungsordnung',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): \ninsufficient performance in terms of the examination regulations',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): insufficient performance in terms of the examination regulations',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -21591,13 +21591,33 @@ array(
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): \nNichtantritt des Studiums zu Beginn des Studienjahres (=Unbegründetes Nichterscheinen zur ersten Studienveranstaltung)',
|
||||
'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): Nichtantritt des Studiums zu Beginn des Studienjahres (=Unbegründetes Nichterscheinen zur ersten Studienveranstaltung)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): \nFailure to start the course at the beginning of the academic year (= unjustified non-attendance to the first course event)',
|
||||
'text' => 'Reason for exclusion according to the training contract (point 7.4): Failure to start the course at the beginning of the academic year (= unjustified non-attendance to the first course event)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'studierendenantrag',
|
||||
'phrase' => 'textLong_MissingZgv',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Zugangsvoraussetzung BA (bzw. MA) nicht erfüllt',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Entry requirements BA (resp. MA) not fulfilled)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -21723,6 +21743,26 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'studierendenantrag',
|
||||
'phrase' => 'dropdown_MissingZgv',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Zugangsvoraussetzung BA (bzw. MA) nicht erfüllt',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Entry requirements BA (resp. MA) not fulfilled',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'studierendenantrag',
|
||||
|
||||
@@ -120,15 +120,15 @@ echo '<div>Student: <b>'.$uid.'</b><br>Titel: <b>'.
|
||||
<td><input type="text" name="sprache" id="sprache" value="'.(isset($row_zd->sprache)?$db->convert_html_chars($row_zd->sprache):'').'" size="10" maxlength="8" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="30%"><b>Kontrollierte Schlagwörter:*</b></td>
|
||||
<td width="30%"><b>Kontrollierte Schlagwörter:</b></td>
|
||||
<td width="40%"><input type="text" name="kontrollschlagwoerter" id="kontrollschlagwoerter" value="'.(isset($row_zd->kontrollschlagwoerter)?$db->convert_html_chars($row_zd->kontrollschlagwoerter):'').'" size="60" maxlength="150" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Dt. Schlagwörter:</b></td>
|
||||
<td><b>Dt. Schlagwörter:*</b></td>
|
||||
<td><input type="text" name="schlagwoerter" value="'.(isset($row_zd->schlagwoerter)?$db->convert_html_chars($row_zd->schlagwoerter):'').'" size="60" maxlength="150" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Engl. Schlagwörter:</b></td>
|
||||
<td><b>Engl. Schlagwörter:*</b></td>
|
||||
<td><input type="text" name="schlagwoerter_en" value="'.(isset($row_zd->schlagwoerter_en)?$db->convert_html_chars($row_zd->schlagwoerter_en):'').'" size="60" maxlength="150" readonly="readonly"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
Reference in New Issue
Block a user