mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
Merge branch 'vv_und_studvw_2026_02_rc4_ma0080'
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
$filterCmptArray = array(
|
||||
"app" => 'core',
|
||||
'datasetName' => 'vertragsverwaltung',
|
||||
'query' => '
|
||||
SELECT
|
||||
uid,
|
||||
person_id,
|
||||
vorname,
|
||||
nachname,
|
||||
gebdatum,
|
||||
vertragsarten,
|
||||
unternehmen,
|
||||
ids,
|
||||
aktiv
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
b.uid , p.person_id,
|
||||
p.vorname, p.nachname,
|
||||
gebdatum,
|
||||
STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten,
|
||||
STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen,
|
||||
STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids,
|
||||
b.aktiv
|
||||
FROM
|
||||
hr.tbl_dienstverhaeltnis d
|
||||
JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid
|
||||
JOIN public.tbl_person p ON p.person_id = b.person_id
|
||||
JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz
|
||||
JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz
|
||||
GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv
|
||||
) as vertragsdaten
|
||||
',
|
||||
'requiredPermissions' => 'vertrag/mitarbeiter'
|
||||
);
|
||||
@@ -163,6 +163,13 @@ $config['navigation_header'] = array(
|
||||
'expand' => true,
|
||||
'sort' => 50,
|
||||
'requiredPermissions' => 'lehre/gruppenmanager:r'
|
||||
),
|
||||
'vertragsverwaltung' => array(
|
||||
'link' => site_url('vertragsverwaltung'),
|
||||
'description' => 'Vertragsverwaltung',
|
||||
'expand' => true,
|
||||
'sort' => 51,
|
||||
'requiredPermissions' => 'vertrag/mitarbeiter:r'
|
||||
)
|
||||
)
|
||||
),
|
||||
@@ -335,6 +342,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
|
||||
'target' => '_blank',
|
||||
'requiredPermissions' => array('admin:rw')
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
$config['navigation_menu']['vertragsverwaltung/*'] = array(
|
||||
'vertragsverwaltung' => array(
|
||||
'link' => site_url('vertragsverwaltung'),
|
||||
'description' => 'Vertragsverwaltung',
|
||||
'icon' => 'home',
|
||||
'sort' => 100,
|
||||
'target' => '_blank',
|
||||
'requiredPermissions' => array('vertrag/mitarbeiter:r')
|
||||
)
|
||||
);
|
||||
|
||||
$config['navigation_menu']['apps'] = [
|
||||
|
||||
@@ -130,3 +130,16 @@ $config['students_tab_order'] = [
|
||||
'combinePeople',
|
||||
'archive',
|
||||
];
|
||||
|
||||
$config['stv_prestudent_tags'] = [
|
||||
'prioone' => ['readonly' => false],
|
||||
'priotwo' => ['readonly' => true],
|
||||
'hinweis' => ['readonly' => false],
|
||||
'hinweis_assistenz' => ['readonly' => true],
|
||||
'hinweis_kf' => ['readonly' => true],
|
||||
'hinweis_lehrende' => ['readonly' => false],
|
||||
'hinweis_stg_kf' => ['readonly' => true],
|
||||
'finished_stg' => ['readonly' => true],
|
||||
'finished_kf' => ['readonly' => true],
|
||||
'inwork_kf' => ['readonly' => true],
|
||||
];
|
||||
|
||||
@@ -28,7 +28,7 @@ class Studentenverwaltung extends Auth_Controller
|
||||
'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'),
|
||||
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
|
||||
'admin' => $this->permissionlib->isBerechtigt('admin'),
|
||||
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
|
||||
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'),
|
||||
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
|
||||
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
|
||||
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
|
||||
@@ -43,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class Vertragsverwaltung extends Auth_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$permissions = [];
|
||||
$router = load_class('Router');
|
||||
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
|
||||
#$permissions[$router->method] = ['admin:rw'];
|
||||
parent::__construct($permissions);
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function _remap()
|
||||
{
|
||||
$this->load->view('Vertragsverwaltung', [
|
||||
'permissions' => [
|
||||
'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid')
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class Detailheader extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getHeader' => ['vertrag/mitarbeiter:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function getHeader($person_id)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getHeader($person_id);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getPersonAbteilung($mitarbeiter_uid)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getLeitungOrg($oekurzbz)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class Foto extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'uploadFoto' => ['admin:r', 'assistenz:r'],
|
||||
'deleteFoto' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models and Libraries
|
||||
$this->load->model('person/Person_model', 'PersonModel');
|
||||
$this->load->model("crm/Akte_model", "AkteModel");
|
||||
$this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel');
|
||||
|
||||
$this->loadPhrases([
|
||||
'ui',
|
||||
'header'
|
||||
]);
|
||||
}
|
||||
|
||||
public function uploadFoto($person_id)
|
||||
{
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
|
||||
if (!empty($data['image']))
|
||||
{
|
||||
$base64 = $data['image'];
|
||||
$resizedImage1 = $this->_resize($base64, 827, 1063);
|
||||
|
||||
if (is_null($resizedImage1))
|
||||
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil'));
|
||||
|
||||
$akteUpdateData = array(
|
||||
'dokument_kurzbz' => 'Lichtbil',
|
||||
'person_id' => $person_id,
|
||||
'inhalt' => $resizedImage1,
|
||||
'mimetype' => 'image/jpg',
|
||||
'erstelltam' => date('c'),
|
||||
'gedruckt' => false,
|
||||
'titel' => 'Lichtbild_' . $person_id . '.jpg',
|
||||
'bezeichnung' => 'Lichtbild gross',
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID(),
|
||||
);
|
||||
|
||||
if (hasData($akte)) {
|
||||
$akte_id = getData($akte)[0]->akte_id;
|
||||
|
||||
$akteUpdateData['updateamum'] = date('c');
|
||||
$akteUpdateData['updatevon'] = getAuthUID();
|
||||
$akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData);
|
||||
} else {
|
||||
$akteResult = $this->AkteModel->insert($akteUpdateData);
|
||||
}
|
||||
|
||||
if (isError($akteResult)) {
|
||||
return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$resizedImage2 = $this->_resize($base64, 101, 130);
|
||||
|
||||
if (is_null($resizedImage2))
|
||||
return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$result = $this->_updateFoto($person_id, $resizedImage2);
|
||||
|
||||
if (!isError($result)) {
|
||||
$this->FotostatusPersonModel->insert(array(
|
||||
'person_id' => $person_id,
|
||||
'fotostatus_kurzbz' => 'hochgeladen',
|
||||
'datum' => date('Y-m-d'),
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => getAuthUID(),
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUID(),
|
||||
));
|
||||
|
||||
return $this->terminateWithSuccess($base64);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteFoto($person_id)
|
||||
{
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$result = $this->_deleteFoto($person_id);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
private function _resize($imageData, $maxwidth, $maxheight, $quality = 90)
|
||||
{
|
||||
$meta = getimagesize($imageData);
|
||||
if (!$meta)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$src_width = $meta[0];
|
||||
$src_height = $meta[1];
|
||||
$mime = $meta['mime'];
|
||||
|
||||
switch ($mime) {
|
||||
case 'image/jpeg':
|
||||
case 'image/jpg':
|
||||
$imagecreated = imagecreatefromjpeg($imageData);
|
||||
break;
|
||||
case 'image/png':
|
||||
$imagecreated = imagecreatefrompng($imageData);
|
||||
break;
|
||||
case 'image/gif':
|
||||
$imagecreated = imagecreatefromgif($imageData);
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
if (!$imagecreated)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
$src_aspect_ratio = $src_width / $src_height;
|
||||
$thu_aspect_ratio = $maxwidth / $maxheight;
|
||||
|
||||
if ($src_width <= $maxwidth && $src_height <= $maxheight)
|
||||
{
|
||||
$thu_width = $src_width;
|
||||
$thu_height = $src_height;
|
||||
}
|
||||
elseif ($thu_aspect_ratio > $src_aspect_ratio)
|
||||
{
|
||||
$thu_width = (int) ($maxheight * $src_aspect_ratio);
|
||||
$thu_height = $maxheight;
|
||||
}
|
||||
else
|
||||
{
|
||||
$thu_width = $maxwidth;
|
||||
$thu_height = (int) ($maxwidth / $src_aspect_ratio);
|
||||
}
|
||||
|
||||
$imageScaled = imagecreatetruecolor($thu_width, $thu_height);
|
||||
|
||||
if ($mime === 'image/png')
|
||||
{
|
||||
$background = imagecolorallocate($imageScaled , 0, 0, 0);
|
||||
imagecolortransparent($imageScaled, $background);
|
||||
imagealphablending($imageScaled, false);
|
||||
imagesavealpha($imageScaled, true);
|
||||
}
|
||||
|
||||
imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height);
|
||||
|
||||
if ($mime === "image/gif")
|
||||
{
|
||||
$background = imagecolorallocate($imageScaled, 0, 0, 0);
|
||||
imagecolortransparent($imageScaled, $background);
|
||||
}
|
||||
|
||||
if (!empty($imageScaled))
|
||||
{
|
||||
ob_start();
|
||||
|
||||
if ($mime == 'image/png')
|
||||
imagepng($imageScaled, NULL);
|
||||
else if ($mime === 'image/gif')
|
||||
imagegif($imageScaled, NULL);
|
||||
else
|
||||
imagejpeg($imageScaled, NULL, $quality);
|
||||
|
||||
$resizedImageData = ob_get_contents();
|
||||
ob_end_clean();
|
||||
@imagedestroy($imagecreated);
|
||||
@imagedestroy($imageScaled);
|
||||
|
||||
|
||||
if (!empty($resizedImageData))
|
||||
{
|
||||
return base64_encode($resizedImageData);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private function _updateFoto($person_id, $foto)
|
||||
{
|
||||
$personJson['foto'] = $foto;
|
||||
$result = $this->PersonModel->update($person_id, $personJson);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return error($result->msg, EXIT_ERROR);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function _deleteFoto($person_id)
|
||||
{
|
||||
$personJson['foto'] = null;
|
||||
$result = $this->PersonModel->update($person_id, $personJson);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return error($result->msg, EXIT_ERROR);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizAnrechnung extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "anrechnung_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizBestellung extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "bestellung_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -17,5 +17,106 @@ class NotizLehreinheit extends Notiz_Controller
|
||||
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
//Permission checks for allowed Oes
|
||||
$allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: [];
|
||||
|
||||
if ($this->router->method == 'addNewNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$lehreinheit_id = $post_data['id'];
|
||||
|
||||
if(!$lehreinheit_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'updateNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$notiz_id = $post_data['notiz_id'];
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//get lehreinheit_id
|
||||
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$lehreinheit_id = current($data)->lehreinheit_id;
|
||||
|
||||
if(!$lehreinheit_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'deleteNotiz')
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$lehreinheit_id = $this->input->post('id');
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$lehreinheit_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
|
||||
}
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes)
|
||||
{
|
||||
//get oe from lehreinheit
|
||||
$result = $this->LehreinheitModel->getOes($lehreinheit_id);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$oes = current($data);
|
||||
|
||||
if (!in_array($oes, $allowedOes))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "lehreinheit_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizMitarbeiter extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "mitarbeiter_uid")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -20,33 +20,123 @@ class NotizPerson extends Notiz_Controller
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
'getCountNotes' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
//Permission checks for allowed Oes
|
||||
if ($this->router->method == 'addNewNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$person_id = $post_data['id'];
|
||||
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkIfBerechtigungForOneUidExists($person_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ( $this->router->method == 'updateNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$notiz_id = $post_data['notiz_id'];
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//get person_id
|
||||
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$person_id = current($data)->person_id;
|
||||
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
$this->_checkIfBerechtigungForOneUidExists($person_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'deleteNotiz' )
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$person_id = $this->input->post('id');
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$person_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
$this->_checkIfBerechtigungForOneUidExists($person_id, $allowedStgs);
|
||||
}
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "person_id")
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre', 'error_keineSchreibrechte');
|
||||
|
||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess(true);
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
|
||||
public function loadDokumente()
|
||||
//stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
|
||||
private function _checkIfBerechtigungForOneUidExists($person_id, $allowedStgs)
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
//get all studentUids of person_id
|
||||
$result = $this->BenutzerModel->loadWhere(['person_id' => $person_id]);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
// TODO(chris): make CI variant of endpoint
|
||||
$this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview');
|
||||
|
||||
return parent::loadDokumente();
|
||||
$checkarray = [];
|
||||
foreach ($data as $item)
|
||||
{
|
||||
//check if isStudent
|
||||
$result = $this->StudentModel->isStudent($item->uid);
|
||||
|
||||
$isStudent = $this->getDataOrTerminateWithError($result);
|
||||
if($isStudent)
|
||||
{
|
||||
$checkarray[] = $this->_checkAllowedStgsFromUid($item->uid, $allowedStgs);
|
||||
}
|
||||
|
||||
}
|
||||
if (!in_array(1, $checkarray))
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
private function _checkAllowedStgsFromUid($student_uid, $allowedStgs)
|
||||
{
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
$result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studiengang_kz = current($data)->studiengang_kz;
|
||||
|
||||
if (!in_array($studiengang_kz, $allowedStgs))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizPrestudent extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
|
||||
//Load Models
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
$this->load->model('crm/Student_model', 'StudentModel');
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'ui'
|
||||
]);
|
||||
|
||||
//Permission checks for Studiengangsarray
|
||||
$allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
|
||||
|
||||
if ($this->router->method == 'addNewNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$prestudent_id = $post_data['id'];
|
||||
|
||||
if(!$prestudent_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'updateNotiz')
|
||||
{
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$notiz_id = $post_data['notiz_id'];
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//get prestudent_id
|
||||
$result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$prestudent_id = current($data)->prestudent_id;
|
||||
|
||||
if(!$prestudent_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
|
||||
}
|
||||
|
||||
if ($this->router->method == 'deleteNotiz')
|
||||
{
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$prestudent_id = $this->input->post('id');
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$prestudent_id)
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
|
||||
}
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "prestudent_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
|
||||
private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs)
|
||||
{
|
||||
$student_uid = $this->StudentModel->getUID($prestudent_id);
|
||||
|
||||
$result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studiengang_kz = current($data)->studiengang_kz;
|
||||
|
||||
if (!in_array($studiengang_kz, $allowedStgs))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizProjekt extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "projekt_kurzbz")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizProjektphase extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "projektphase_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
class NotizProjekttask extends Notiz_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'isBerechtigt' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function isBerechtigt($id, $typeId)
|
||||
{
|
||||
if($typeId != "projekttask_id")
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//TODO define permission
|
||||
if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
|
||||
{
|
||||
$result = $this->p->t('lehre','error_keineSchreibrechte');
|
||||
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->terminateWithSuccess("berechtigt in überschreibender Funktion");
|
||||
}
|
||||
}
|
||||
@@ -36,15 +36,44 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
// Load models
|
||||
$this->load->model('crm/Reihungstest_model', 'ReihungstestModel');
|
||||
$this->load->model('crm/RtPerson_model', 'RtPersonModel');
|
||||
$this->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||
$this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
|
||||
$this->load->model('organisation/Studiengang_model', 'StudiengangModel');
|
||||
}
|
||||
|
||||
public function getAufnahmetermine($person_id)
|
||||
{
|
||||
$result = $this->ReihungstestModel->getReihungstestPerson($person_id);
|
||||
$arrayRt = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
foreach ($arrayRt as $item) {
|
||||
//Studienplan
|
||||
$result = $this->StudienplanModel->loadWhere([
|
||||
'studienplan_id' => $item->studienplan_id
|
||||
]);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studienordnung_id_ber = current($data)->studienordnung_id;
|
||||
|
||||
$this->terminateWithSuccess($data);
|
||||
//Studienordnung
|
||||
$result = $this->StudienordnungModel->loadWhere([
|
||||
'studienordnung_id' => $studienordnung_id_ber
|
||||
]);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$studiengang_kz_ber = current($data)->studiengang_kz;
|
||||
|
||||
//Studiengang von studiengang_kz_ber
|
||||
$result = $this->StudiengangModel->load($studiengang_kz_ber);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$studiengangkurzbzlang_ber = current($data)->kurzbzlang;
|
||||
$typ_ber = current($data)->typ;
|
||||
|
||||
//add to Array
|
||||
$item->studiengang_kz_ber = $studiengang_kz_ber;
|
||||
$item->studiengangkurzbzlang_ber = $studiengangkurzbzlang_ber;
|
||||
$item->studiengangtyp_ber = $typ_ber;
|
||||
}
|
||||
$this->terminateWithSuccess($arrayRt);
|
||||
}
|
||||
|
||||
public function insertAufnahmetermin()
|
||||
@@ -60,7 +89,6 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
|
||||
$rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null;
|
||||
$anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null;
|
||||
$teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false;
|
||||
@@ -224,7 +252,11 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
)
|
||||
);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
//check if existing placementtest
|
||||
if(!hasData($result))
|
||||
$this->terminateWithSuccess([]);
|
||||
else
|
||||
$data = getData($result);
|
||||
|
||||
$studienplan_arr = [];
|
||||
$include_ids = [];
|
||||
@@ -233,12 +265,18 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
if($item->studienplan_id != null)
|
||||
$studienplan_arr[] = $item->studienplan_id;
|
||||
}
|
||||
if(!hasData($studienplan_arr))
|
||||
$this->terminateWithSuccess([]);
|
||||
|
||||
//get Placementtests Person
|
||||
$person_id = $this->_getPersonId($prestudent_id);
|
||||
$resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id);
|
||||
|
||||
$dataRt = $this->getDataOrTerminateWithError($resultRt);
|
||||
//check if existing placementtest
|
||||
if(!hasData($result))
|
||||
$this->terminateWithSuccess([]);
|
||||
else
|
||||
$dataRt = getData($resultRt);
|
||||
|
||||
foreach ($dataRt as $item)
|
||||
{
|
||||
@@ -354,6 +392,7 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
$person_id = $this->input->get('person_id');
|
||||
$punkte = $this->input->get('punkte');
|
||||
$reihungstest_id = $this->input->get('reihungstest_id');
|
||||
$has_excluded_gebiete = $this->input->get('hasExcludedAreas');
|
||||
|
||||
if(!$reihungstest_id)
|
||||
{
|
||||
@@ -364,22 +403,27 @@ class Aufnahmetermine extends FHCAPI_Controller
|
||||
$studiengang_kz = $this->input->get('studiengang_kz');
|
||||
|
||||
$this->load->model('testtool/Ablauf_model', 'AblaufModel');
|
||||
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz);
|
||||
$result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz, 1);
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$weightedArray = [];
|
||||
$basis_gebiet_id_arr = [];
|
||||
$basis_gebiet_id_toString = '';
|
||||
foreach ($data as $abl)
|
||||
{
|
||||
$weightedArray[$abl->gebiet_id] = $abl->gewicht;
|
||||
$basis_gebiet_id_arr[]= $abl->gebiet_id;
|
||||
}
|
||||
$basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr);
|
||||
|
||||
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray);
|
||||
|
||||
/* if (isError($result))
|
||||
{
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}*/
|
||||
|
||||
$result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
|
||||
$person_id,
|
||||
$punkte,
|
||||
$reihungstest_id,
|
||||
$weightedArray,
|
||||
$has_excluded_gebiete,
|
||||
$basis_gebiet_id_toString
|
||||
);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,8 @@ class Config extends FHCAPI_Controller
|
||||
'type' => 'select',
|
||||
'values' => $buchungstyp_kurzbz_plus_all,
|
||||
'value_key' => 'buchungstyp_kurzbz',
|
||||
'label_key' => 'beschreibung'
|
||||
'label_key' => 'beschreibung',
|
||||
'default' => 'all'
|
||||
],
|
||||
'samestg' => [
|
||||
'type' => 'bool',
|
||||
@@ -226,7 +227,8 @@ class Config extends FHCAPI_Controller
|
||||
'type' => 'select',
|
||||
'values' => $buchungstyp_kurzbz_plus_all,
|
||||
'value_key' => 'buchungstyp_kurzbz',
|
||||
'label_key' => 'beschreibung'
|
||||
'label_key' => 'beschreibung',
|
||||
'default' => 'all'
|
||||
],
|
||||
'samestg' => [
|
||||
'type' => 'bool',
|
||||
|
||||
@@ -108,6 +108,10 @@ class Student extends FHCAPI_Controller
|
||||
$this->PrestudentModel->addSelect('p.matr_nr');
|
||||
$this->PrestudentModel->addSelect('p.anrede');
|
||||
$this->PrestudentModel->addSelect('p.zugangscode');
|
||||
if($this->permissionlib->isBerechtigt('student/bpk'))
|
||||
{
|
||||
$this->PrestudentModel->addSelect('p.bpk');
|
||||
}
|
||||
|
||||
if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) {
|
||||
$this->PrestudentModel->addSelect(
|
||||
|
||||
@@ -611,7 +611,7 @@ class Students extends FHCAPI_Controller
|
||||
if (!$verband && !$gruppe && $orgform_kurzbz !== null) {
|
||||
$this->PrestudentModel->db->where(
|
||||
"(
|
||||
SELECT orgform_kurzbz
|
||||
SELECT orgform_kurzbz
|
||||
FROM public.tbl_prestudentstatus
|
||||
WHERE prestudent_id=tbl_prestudent.prestudent_id
|
||||
AND studiensemester_kurzbz=" . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
|
||||
@@ -850,6 +850,41 @@ class Students extends FHCAPI_Controller
|
||||
{
|
||||
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
||||
|
||||
$this->load->config('stv');
|
||||
$tags = $this->config->item('stv_prestudent_tags');
|
||||
|
||||
$whereTags = '';
|
||||
if (is_array($tags) && !isEmptyArray($tags)) {
|
||||
$tags = array_keys($tags);
|
||||
|
||||
foreach ($tags as $key => $tag) {
|
||||
$tags[$key] = $this->db->escape($tag);
|
||||
}
|
||||
$whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
|
||||
}
|
||||
$subQueryTag = "
|
||||
(
|
||||
SELECT
|
||||
tag.prestudent_id,
|
||||
COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
|
||||
FROM (
|
||||
SELECT DISTINCT ON (n.notiz_id)
|
||||
n.notiz_id AS id,
|
||||
nt.typ_kurzbz,
|
||||
array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
|
||||
n.text AS notiz,
|
||||
nt.style,
|
||||
n.erledigt AS done,
|
||||
nz.prestudent_id
|
||||
FROM public.tbl_notizzuordnung AS nz
|
||||
JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
|
||||
JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz "
|
||||
. $whereTags .
|
||||
"
|
||||
) AS tag
|
||||
GROUP BY tag.prestudent_id
|
||||
) AS tag_data_agg
|
||||
";
|
||||
|
||||
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
|
||||
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
|
||||
@@ -872,8 +907,11 @@ class Students extends FHCAPI_Controller
|
||||
AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
|
||||
AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');
|
||||
|
||||
$this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
|
||||
|
||||
|
||||
$this->PrestudentModel->addSelect("b.uid");
|
||||
$this->PrestudentModel->addSelect('tag_data_agg.tags');
|
||||
$this->PrestudentModel->addSelect('titelpre');
|
||||
$this->PrestudentModel->addSelect('nachname');
|
||||
$this->PrestudentModel->addSelect('vorname');
|
||||
@@ -931,6 +969,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->PrestudentModel->addSelect('mentor');
|
||||
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
|
||||
$this->PrestudentModel->addSelect('unruly');
|
||||
|
||||
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class Tags extends Tag_Controller
|
||||
{
|
||||
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getTags' => self::BERECHTIGUNG_KURZBZ,
|
||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ
|
||||
]);
|
||||
|
||||
$this->config->load('stv');
|
||||
}
|
||||
|
||||
public function getTag($readonly_tags = null)
|
||||
{
|
||||
parent::getTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function getTags($tags = null)
|
||||
{
|
||||
parent::getTags($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function addTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
parent::addTag(true, $this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function updateTag($updatable_tags = null)
|
||||
{
|
||||
parent::updateTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function deleteTag($withZuordnung = true, $updatable_tags = null)
|
||||
{
|
||||
parent::deleteTag(true, $this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
public function doneTag($updatable_tags = null)
|
||||
{
|
||||
parent::doneTag($this->config->item('stv_prestudent_tags'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2024 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/>.
|
||||
*/
|
||||
|
||||
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use CI3_Events as Events;
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the back-end
|
||||
* Provides data to the ajax get calls about the VV Config
|
||||
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
|
||||
*/
|
||||
class Config extends FHCAPI_Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'printDocument' => ['vertrag/mitarbeiter:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
public function printDocument()
|
||||
{
|
||||
$params = [];
|
||||
$menu = [];
|
||||
|
||||
Events::trigger(
|
||||
'multiActionPrintHonorarvertrag',
|
||||
// passing $menu per reference
|
||||
function & () use (&$menu) {
|
||||
return $menu;
|
||||
},
|
||||
$params
|
||||
);
|
||||
|
||||
if (is_array($menu) && isset($menu[0]))
|
||||
{
|
||||
$this->terminateWithSuccess($menu[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag');
|
||||
$this->terminateWithSuccess();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,9 +26,6 @@ class Vertraege extends FHCAPI_Controller
|
||||
'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'],
|
||||
'deleteBetreuung' =>['vertrag/mitarbeiter:w'],
|
||||
'getMitarbeiter' => ['vertrag/mitarbeiter:r'],
|
||||
'getHeader' => ['vertrag/mitarbeiter:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
|
||||
]);
|
||||
|
||||
//Load Models and Libraries
|
||||
@@ -241,7 +238,7 @@ class Vertraege extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
$this->db->trans_complete();
|
||||
$this->terminateWithSuccess(true);
|
||||
$this->terminateWithSuccess($vertrag_id);
|
||||
}
|
||||
|
||||
public function updateContract()
|
||||
@@ -358,7 +355,7 @@ class Vertraege extends FHCAPI_Controller
|
||||
}
|
||||
$this->db->trans_complete();
|
||||
|
||||
$this->terminateWithSuccess(true);
|
||||
$this->terminateWithSuccess($vertrag_id);
|
||||
}
|
||||
|
||||
public function loadContract($vertrag_id)
|
||||
@@ -684,37 +681,4 @@ class Vertraege extends FHCAPI_Controller
|
||||
}
|
||||
return $this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getPersonAbteilung($mitarbeiter_uid)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getLeitungOrg($oekurzbz)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
|
||||
public function getHeader($person_id)
|
||||
{
|
||||
$this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
|
||||
|
||||
$result = $this->Mitarbeitermodel->getHeader($person_id);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
|
||||
$this->terminateWithSuccess(current($data));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ class CI3_Events
|
||||
});
|
||||
self::$eventsSorted[$event] = true;
|
||||
}
|
||||
|
||||
|
||||
foreach (self::$events[$event] as $conf) {
|
||||
$conf[1](...$args);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
{
|
||||
const DEFAULT_PERMISSION_R = 'admin:r';
|
||||
const DEFAULT_PERMISSION_RW = 'admin:rw';
|
||||
//public function __construct($zuordnung = 'person/Notizzuordnung_model')
|
||||
|
||||
public function __construct($permissions)
|
||||
{
|
||||
$default_permissions = [
|
||||
@@ -97,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result)) {
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess(getData($result) ?: []);
|
||||
$this->terminateWithSuccess(getData($result) ?: []);
|
||||
}
|
||||
|
||||
|
||||
//Override function
|
||||
protected function isBerechtigt($id, $typeId){
|
||||
return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
public function loadNotiz()
|
||||
@@ -112,7 +112,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
|
||||
//$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT');
|
||||
$this->NotizModel->addSelect('*');
|
||||
$this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum
|
||||
@@ -143,14 +142,9 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
|
||||
$uid = getAuthUID();
|
||||
|
||||
if (isset($_POST['data']))
|
||||
{
|
||||
$data = json_decode($_POST['data']);
|
||||
unset($_POST['data']);
|
||||
foreach ($data as $k => $v) {
|
||||
$_POST[$k] = $v;
|
||||
}
|
||||
}
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
$this->form_validation->set_data($post_data);
|
||||
|
||||
//Form Validation
|
||||
$this->form_validation->set_rules('titel', 'Titel', 'required', [
|
||||
@@ -166,26 +160,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$titel = $this->input->post('titel');
|
||||
$text = $this->input->post('text');
|
||||
$erledigt = $this->input->post('erledigt');
|
||||
$verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
|
||||
$bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : null;
|
||||
$type = $this->input->post('typeId');
|
||||
$start = $this->input->post('start');
|
||||
$ende = $this->input->post('ende');
|
||||
$titel = $post_data['titel'];
|
||||
$text = $post_data['text'];
|
||||
$erledigt = $post_data['erledigt'];
|
||||
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : null;
|
||||
$type = $post_data['typeId'];
|
||||
$start = isset($post_data['start']) ? $post_data['start'] : null;
|
||||
$ende = isset($post_data['ende']) ? $post_data['ende'] : null;
|
||||
|
||||
// Start DB transaction
|
||||
$this->db->trans_start();
|
||||
|
||||
//Save note
|
||||
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid,
|
||||
"insertvon" => $verfasser_uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
|
||||
$result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid,
|
||||
"insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$notiz_id = $result->retval;
|
||||
@@ -220,7 +213,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$dms_id_arr[] = $result->retval['dms_id'];
|
||||
}
|
||||
@@ -235,34 +228,28 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->db->trans_commit();
|
||||
return $this->terminateWithSuccess($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function updateNotiz()
|
||||
{
|
||||
|
||||
$this->load->library('form_validation');
|
||||
$this->load->library('DmsLib');
|
||||
|
||||
if (isset($_POST['data']))
|
||||
{
|
||||
$data = json_decode($_POST['data']);
|
||||
unset($_POST['data']);
|
||||
foreach ($data as $k => $v) {
|
||||
$_POST[$k] = $v;
|
||||
}
|
||||
}
|
||||
$json = $this->input->post('data');
|
||||
$post_data = json_decode($json, true);
|
||||
|
||||
$notiz_id = $this->input->post('notiz_id');
|
||||
$this->form_validation->set_data($post_data);
|
||||
|
||||
if(!$notiz_id)
|
||||
{
|
||||
$this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id'])
|
||||
]);
|
||||
|
||||
//Form Validation
|
||||
$this->form_validation->set_rules('titel', 'Titel', 'required', [
|
||||
@@ -280,25 +267,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
|
||||
//update Notiz
|
||||
$uid = getAuthUID();
|
||||
$titel = $this->input->post('titel');
|
||||
$text = $this->input->post('text');
|
||||
$verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
|
||||
$bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : $uid;
|
||||
$erledigt = $this->input->post('erledigt');
|
||||
$start = $this->input->post('start');
|
||||
$ende = $this->input->post('ende');
|
||||
$titel = $post_data['titel'];
|
||||
$text = $post_data['text'];
|
||||
$bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid'];
|
||||
$erledigt = $post_data['erledigt'];
|
||||
$start = $post_data['start'];
|
||||
$ende = $post_data['ende'];
|
||||
|
||||
$result = $this->NotizModel->update(
|
||||
[
|
||||
'notiz_id' => $notiz_id
|
||||
'notiz_id' => $post_data['notiz_id'],
|
||||
],
|
||||
[
|
||||
'titel' => $titel,
|
||||
'updatevon' => $uid,
|
||||
'updateamum' => date('c'),
|
||||
'text' => $text,
|
||||
'verfasser_uid' => $verfasser_uid,
|
||||
'bearbeiter_uid' => $bearbeiter_uid,
|
||||
'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid,
|
||||
'start' => $start,
|
||||
'ende' => $ende,
|
||||
'erledigt' => $erledigt
|
||||
@@ -306,7 +291,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
);
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
//update(1) loading all dms-entries with this notiz_id
|
||||
@@ -314,7 +299,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$this->load->model('person/Notizdokument_model', 'NotizdokumentModel');
|
||||
$this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id');
|
||||
|
||||
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id));
|
||||
$result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $post_data['notiz_id']));
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
foreach ($result as $doc) {
|
||||
$dms_id_arr[$doc->dms_id] = array(
|
||||
@@ -351,7 +336,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
$dms_id = $result['dms_id'];
|
||||
|
||||
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id));
|
||||
$result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id));
|
||||
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
}
|
||||
@@ -365,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
}
|
||||
|
||||
return $this->terminateWithSuccess($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function deleteNotiz()
|
||||
@@ -416,15 +401,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result))
|
||||
{
|
||||
$this->db->trans_rollback();
|
||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
if(!hasData($result))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$this->db->trans_complete();
|
||||
return $this->terminateWithSuccess(getData($result));
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function loadDokumente()
|
||||
@@ -440,14 +425,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
array('public.tbl_notiz.notiz_id' => $notiz_id)
|
||||
);
|
||||
if (isError($result)) {
|
||||
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
if(!hasData($result))
|
||||
{
|
||||
return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
$this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess(getData($result));
|
||||
$this->terminateWithSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getMitarbeiter($searchString)
|
||||
@@ -457,7 +442,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
if (isError($result)) {
|
||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
return $this->terminateWithSuccess($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
}
|
||||
|
||||
public function getCountNotes($person_id)
|
||||
@@ -476,4 +461,4 @@ abstract class Notiz_Controller extends FHCAPI_Controller
|
||||
return $this->terminateWithSuccess($anzahl->anzahl ?: 0);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -490,6 +490,175 @@ class Vertrag_model extends DB_Model
|
||||
return $bezeichnung;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all Contracts of a Person
|
||||
* @param $person_id
|
||||
* @return array of objects
|
||||
*/
|
||||
public function loadContractsOfPerson($person_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
*,
|
||||
tbl_vertrag.bezeichnung as bezeichnung,
|
||||
tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung,
|
||||
tbl_vertrag.vertragsdatum,
|
||||
(SELECT bezeichnung FROM lehre.tbl_vertragsstatus
|
||||
JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz)
|
||||
WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung,
|
||||
CASE
|
||||
WHEN EXISTS (
|
||||
SELECT 1
|
||||
FROM lehre.tbl_vertrag_vertragsstatus
|
||||
WHERE vertrag_id = tbl_vertrag.vertrag_id
|
||||
AND vertragsstatus_kurzbz = 'abgerechnet'
|
||||
) THEN true
|
||||
ELSE false
|
||||
END AS isAbgerechnet
|
||||
FROM
|
||||
lehre.tbl_vertrag
|
||||
LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz)
|
||||
WHERE person_id= ?";
|
||||
|
||||
|
||||
return $this->execQuery($query, array($person_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all Contracts of a Person that are not assigned yet
|
||||
* @param $person_id
|
||||
* @return array of objects
|
||||
*/
|
||||
public function loadContractsOfPersonNotAssigned($person_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
'Lehrauftrag' as type,
|
||||
lehreinheit_id,
|
||||
mitarbeiter_uid,
|
||||
null as pruefung_id,
|
||||
null as projektarbeit_id,
|
||||
(tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
null as betreuerart_kurzbz,
|
||||
( SELECT
|
||||
upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
|
||||
as bezeichnung
|
||||
FROM
|
||||
lehre.tbl_lehreinheitmitarbeiter
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
|
||||
AND vertrag_id IS NULL
|
||||
UNION
|
||||
SELECT
|
||||
'Betreuung' as type,
|
||||
tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
|
||||
null as mitarbeiter_uid,
|
||||
null::integer as pruefung_id,
|
||||
projektarbeit_id,
|
||||
(tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
tbl_projektbetreuer.betreuerart_kurzbz,
|
||||
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
||||
as bezeichnung
|
||||
FROM
|
||||
lehre.tbl_projektbetreuer
|
||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
tbl_projektbetreuer.person_id=?
|
||||
AND vertrag_id IS NULL
|
||||
";
|
||||
|
||||
return $this->execQuery($query, array($person_id, $person_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all Contracts of a Person that are assigned yet
|
||||
* @param $person_id, $vertrag_id
|
||||
* @return array of objects
|
||||
*/
|
||||
|
||||
public function loadContractsOfPersonAssigned($person_id, $vertrag_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
'Lehrauftrag' as type,
|
||||
lehreinheit_id,
|
||||
mitarbeiter_uid,
|
||||
null as pruefung_id,
|
||||
null as projektarbeit_id,
|
||||
(tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
null as betreuerart_kurzbz,
|
||||
( SELECT
|
||||
upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE
|
||||
lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
|
||||
as bezeichnung, vertrag_id
|
||||
FROM
|
||||
lehre.tbl_lehreinheitmitarbeiter
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
|
||||
AND vertrag_id = ?
|
||||
UNION
|
||||
SELECT
|
||||
'Betreuung' as type,
|
||||
tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
|
||||
null as mitarbeiter_uid,
|
||||
null::integer as pruefung_id,
|
||||
projektarbeit_id,
|
||||
(tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
|
||||
tbl_lehreinheit.studiensemester_kurzbz,
|
||||
tbl_projektbetreuer.betreuerart_kurzbz,
|
||||
(SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
|
||||
as bezeichnung, vertrag_id
|
||||
FROM
|
||||
lehre.tbl_projektbetreuer
|
||||
JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
|
||||
JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
|
||||
WHERE
|
||||
tbl_projektbetreuer.person_id=?
|
||||
AND vertrag_id = ?
|
||||
";
|
||||
|
||||
return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all stati of a contract
|
||||
*
|
||||
* @param $vertrag_id
|
||||
* @return array
|
||||
*/
|
||||
public function getStatiOfContract($vertrag_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
*,
|
||||
tbl_vertrag_vertragsstatus.datum,
|
||||
tbl_vertrag_vertragsstatus.insertamum,
|
||||
tbl_vertrag_vertragsstatus.updateamum
|
||||
FROM
|
||||
lehre.tbl_vertrag_vertragsstatus
|
||||
JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
|
||||
WHERE
|
||||
tbl_vertrag_vertragsstatus.vertrag_id = ?
|
||||
ORDER BY tbl_vertrag_vertragsstatus.datum DESC";
|
||||
|
||||
return $this->execQuery($query, array($vertrag_id));
|
||||
}
|
||||
|
||||
private function _updateVertragRelevant($vertrag_id)
|
||||
{
|
||||
$this->LehreinheitmitarbeiterModel->update(
|
||||
|
||||
@@ -11,4 +11,5 @@ class Vertragstyp_model extends DB_Model
|
||||
$this->dbTable = 'lehre.tbl_vertragstyp';
|
||||
$this->pk = 'vertragstyp_kurzbz';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -190,4 +190,6 @@ class Vertragvertragsstatus_model extends DB_Model
|
||||
|
||||
return $this->loadWhere($condition);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ class Reihungstest_model extends DB_Model
|
||||
parent::__construct();
|
||||
$this->dbTable = 'public.tbl_reihungstest';
|
||||
$this->pk = 'reihungstest_id';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a test from a test id only if it is available
|
||||
@@ -42,8 +42,8 @@ class Reihungstest_model extends DB_Model
|
||||
/**
|
||||
* Checks if there are active studyplans which have no public placement tests assigned yet.
|
||||
* Only check assignment to studyplans that are
|
||||
* - Bachelor,
|
||||
* - active,
|
||||
* - Bachelor,
|
||||
* - active,
|
||||
* - set as online application
|
||||
* - valid for 1st terms
|
||||
* @return array Returns object array with studyplans that have no public placement tests assigned yet.
|
||||
@@ -97,7 +97,7 @@ class Reihungstest_model extends DB_Model
|
||||
USING (reihungstest_id)
|
||||
WHERE
|
||||
datum >= now()
|
||||
AND
|
||||
AND
|
||||
oeffentlich = \'t\'
|
||||
)
|
||||
';
|
||||
@@ -105,7 +105,7 @@ class Reihungstest_model extends DB_Model
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Gets amount of free places.
|
||||
* @return array Returns object array with faculty and amount of free places
|
||||
* for each public actual placement test date.
|
||||
@@ -432,10 +432,10 @@ class Reihungstest_model extends DB_Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all applicants of a placement test
|
||||
* @param integer $reihungstest_id ID of placement test
|
||||
* @return array Returns object array with data of applicants.
|
||||
*/
|
||||
* Loads all applicants of a placement test
|
||||
* @param integer $reihungstest_id ID of placement test
|
||||
* @return array Returns object array with data of applicants.
|
||||
*/
|
||||
public function getApplicantsOfPlacementTest($reihungstest_id)
|
||||
{
|
||||
$query = '
|
||||
@@ -556,13 +556,22 @@ class Reihungstest_model extends DB_Model
|
||||
* Calculates Result of Placement Test for a given Person and given placementtest
|
||||
* and with taking account of weighting per area
|
||||
*
|
||||
* @param $person_id ID of Person
|
||||
* @param $punkte if true result is points else result is percentage of sum
|
||||
* @param $reihungstest_id ID of Placementtest
|
||||
* @param $weightedArray array of weighting per area (gewicht per gebiet_id)
|
||||
* @return float result
|
||||
* @param Number $person_id ID of Person
|
||||
* @param Boolean $punkte if true result is points else result is percentage of sum
|
||||
* @param Number $reihungstest_id ID of Placementtest
|
||||
* @param Array $weightedArray array of weighting per area (gewicht per gebiet_id)
|
||||
* @param Boolean $has_excluded_gebiete if true, areas in the configArray will be excluded
|
||||
* @param Array $basis_gebiet_id_toString areas to exclude
|
||||
* @return float result points of RT
|
||||
*/
|
||||
public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null)
|
||||
public function getReihungstestErgebnisPerson(
|
||||
$person_id,
|
||||
$punkte,
|
||||
$reihungstest_id,
|
||||
$weightedArray = null,
|
||||
$has_excluded_gebiete = false,
|
||||
$basis_gebiet_id_toString = null
|
||||
)
|
||||
{
|
||||
$parametersArray = array($reihungstest_id);
|
||||
|
||||
@@ -577,6 +586,35 @@ class Reihungstest_model extends DB_Model
|
||||
WHERE
|
||||
reihungstest_id = ? ";
|
||||
|
||||
//areas of Studiengang
|
||||
if (!empty($basis_gebiet_id_toString))
|
||||
{
|
||||
$qry .= "
|
||||
AND
|
||||
gebiet_id IN (". $basis_gebiet_id_toString. ")
|
||||
";
|
||||
}
|
||||
|
||||
//areas to exclude
|
||||
if($has_excluded_gebiete)
|
||||
{
|
||||
if (defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE))
|
||||
{
|
||||
$excluded_gebiete = unserialize(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE);
|
||||
$exclude_gebiet_id_arr = $excluded_gebiete;
|
||||
if (is_array($exclude_gebiet_id_arr) && count($exclude_gebiet_id_arr) > 0)
|
||||
{
|
||||
$exclude_gebiet_id_toString = implode(', ', $exclude_gebiet_id_arr);
|
||||
$qry .= "
|
||||
AND
|
||||
gebiet_id NOT IN (". $exclude_gebiet_id_toString. ")
|
||||
-- AND
|
||||
-- typ = 'b'
|
||||
";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//using prestudent Status to avoid to get the sum of more than 1 placement tests
|
||||
$qry .= "
|
||||
AND prestudent_id = (
|
||||
|
||||
@@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model
|
||||
{
|
||||
$qry = "
|
||||
SELECT
|
||||
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe
|
||||
titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe, personalnummer, mitarbeiter_uid
|
||||
FROM
|
||||
public.tbl_person
|
||||
JOIN public.tbl_benutzer b USING(person_id)
|
||||
@@ -363,14 +363,14 @@ class Mitarbeiter_model extends DB_Model
|
||||
$returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
|
||||
|
||||
$qry = "
|
||||
SELECT " . $returnwert . "
|
||||
FROM
|
||||
SELECT " . $returnwert . "
|
||||
FROM
|
||||
public.tbl_mitarbeiter ma
|
||||
JOIN
|
||||
JOIN
|
||||
public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
|
||||
JOIN
|
||||
JOIN
|
||||
public.tbl_person p on (p.person_id = b.person_id)
|
||||
WHERE
|
||||
WHERE
|
||||
lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%'
|
||||
OR
|
||||
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
|
||||
@@ -393,14 +393,14 @@ class Mitarbeiter_model extends DB_Model
|
||||
public function getMitarbeiterFromLV($lehrveranstaltung_id)
|
||||
{
|
||||
$qry = "SELECT DISTINCT
|
||||
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
|
||||
FROM
|
||||
lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
|
||||
FROM
|
||||
lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit
|
||||
WHERE
|
||||
WHERE
|
||||
lehrveranstaltung_id= ?
|
||||
AND
|
||||
mitarbeiter_uid=uid
|
||||
AND
|
||||
AND
|
||||
mitarbeiter_uid=uid
|
||||
AND
|
||||
tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
|
||||
|
||||
$parametersArray = array($lehrveranstaltung_id);
|
||||
|
||||
@@ -7,19 +7,21 @@
|
||||
'vue3' => true,
|
||||
'primevue3' => true,
|
||||
#'filtercomponent' => true,
|
||||
'tabulator5' => true,
|
||||
'tabulator6' => true,
|
||||
'tinymce5' => true,
|
||||
'phrases' => array(
|
||||
'global',
|
||||
'ui',
|
||||
'notiz',
|
||||
),
|
||||
'tags' => true,
|
||||
'customCSSs' => [
|
||||
#datepicker fuer component functions
|
||||
'public/css/components/vue-datepicker.css',
|
||||
'public/css/components/primevue.css',
|
||||
'public/css/Studentenverwaltung.css',
|
||||
'public/css/components/function.css'
|
||||
'public/css/components/function.css',
|
||||
'public/css/components/Detailheader.css'
|
||||
],
|
||||
'customJSs' => [
|
||||
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js',
|
||||
@@ -45,6 +47,8 @@ $configArray = [
|
||||
'showAufnahmegruppen' => !defined('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN') ? false : FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN,
|
||||
'allowUebernahmePunkte' => !defined('FAS_REIHUNGSTEST_PUNKTEUEBERNAHME') ? true : FAS_REIHUNGSTEST_PUNKTEUEBERNAHME,
|
||||
'useReihungstestPunkte' => !defined('FAS_REIHUNGSTEST_PUNKTE') ? true : FAS_REIHUNGSTEST_PUNKTE,
|
||||
'hasExcludedAreas' => defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE),
|
||||
'stvTagsEnabled' => defined('STV_TAGS_ENABLED') ? STV_TAGS_ENABLED : false,
|
||||
];
|
||||
?>
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
$includesArray = array(
|
||||
'title' => 'Vertragsverwaltung',
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'fontawesome6' => true,
|
||||
'vue3' => true,
|
||||
'primevue3' => true,
|
||||
'filtercomponent' => true,
|
||||
'navigationcomponent' => true,
|
||||
'tabulator6' => true,
|
||||
'tinymce5' => true,
|
||||
'phrases' => array(
|
||||
'global',
|
||||
'ui',
|
||||
),
|
||||
'customCSSs' => [
|
||||
'public/css/components/vue-datepicker.css',
|
||||
'public/css/components/primevue.css',
|
||||
'public/css/Vertragsverwaltung.css',
|
||||
'public/css/components/Detailheader.css'
|
||||
],
|
||||
'customJSs' => [
|
||||
#'vendor/npm-asset/primevue/tree/tree.min.js',
|
||||
#'vendor/npm-asset/primevue/toast/toast.min.js'
|
||||
],
|
||||
'customJSModules' => [
|
||||
'public/js/apps/Vertragsverwaltung.js'
|
||||
]
|
||||
);
|
||||
|
||||
$this->load->view('templates/FHC-Header', $includesArray);
|
||||
?>
|
||||
|
||||
<?php
|
||||
$configArray = [
|
||||
'domain' => !defined('DOMAIN') ? 'notDefined' : DOMAIN,
|
||||
];
|
||||
?>
|
||||
|
||||
<div id="main">
|
||||
<router-view
|
||||
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
|
||||
:config="<?= htmlspecialchars(json_encode($configArray)); ?>"
|
||||
>
|
||||
</router-view>
|
||||
</div>
|
||||
|
||||
<?php $this->load->view('templates/FHC-Footer', $includesArray); ?>
|
||||
|
||||
@@ -371,4 +371,6 @@ define('STATUS_VORRUECKEN_ANZEIGEN', true);
|
||||
//externe Ueberwachung im Testtool erlauben
|
||||
define('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED', false);
|
||||
|
||||
//enable tags in StudVW
|
||||
define('STV_TAGS_ENABLED', false);
|
||||
?>
|
||||
|
||||
@@ -12,22 +12,22 @@ html {
|
||||
font-size: .875em;
|
||||
}
|
||||
html.fs_xx-small {
|
||||
font-size: .5em;
|
||||
font-size: .625em;
|
||||
}
|
||||
html.fs_x-small {
|
||||
font-size: .625em;
|
||||
font-size: .6875em;
|
||||
}
|
||||
html.fs_small {
|
||||
font-size: .75em;
|
||||
}
|
||||
html.fs_normal {
|
||||
font-size: .875em;
|
||||
font-size: .8125em;
|
||||
}
|
||||
html.fs_big {
|
||||
font-size: 1em;
|
||||
font-size: .875em;
|
||||
}
|
||||
html.fs_huge {
|
||||
font-size: 1.125em;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
#appMenu {
|
||||
@@ -74,6 +74,12 @@ html.fs_huge {
|
||||
color: var(--gray-500);
|
||||
}
|
||||
|
||||
/* Aufnahme Termine: background color green*/
|
||||
.stv-details-admission-table .row-green{
|
||||
background-color: lightgreen !important;
|
||||
//color: var(--green-200);
|
||||
}
|
||||
|
||||
/* Dropdown Toolbar Interessent, submenu */
|
||||
.dropend .dropdown-toggle.d-flex::after {
|
||||
height: 0;
|
||||
@@ -116,6 +122,15 @@ html.fs_huge {
|
||||
position: inherit;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.sidebar-collapsed #sidebarMenu {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.sidebar-collapsed .container-fluid > .row > main {
|
||||
flex: 0 0 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -168,7 +183,7 @@ html.fs_huge {
|
||||
}
|
||||
|
||||
.has-filter .fa-filter {
|
||||
color: var(--bs-success);
|
||||
color: var(--bs-danger);
|
||||
}
|
||||
.override_filtercmpt_actions_style div.d-flex.align-items-baseline {
|
||||
align-items: end !important;
|
||||
@@ -185,3 +200,84 @@ html.fs_huge {
|
||||
.tiny-90 div.tox.tox-tinymce {
|
||||
height: 90% !important;
|
||||
}
|
||||
|
||||
/* slim begin */
|
||||
.stv .form-label {
|
||||
margin-bottom: .15rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.stv .form-control,
|
||||
.stv .form-select,
|
||||
.stv .input-group-text {
|
||||
padding-top: .15rem;
|
||||
padding-bottom: .15rem;
|
||||
}
|
||||
|
||||
:root {
|
||||
--bs-body-line-height: 1.2;
|
||||
}
|
||||
|
||||
.stv .tabulator-row .tabulator-cell,
|
||||
.stv .tabulator-header-filter input {
|
||||
padding-top: 1px !important;
|
||||
padding-bottom: 1px !important;
|
||||
}
|
||||
|
||||
.stv .tabulator-row {
|
||||
min-height: 18px;
|
||||
}
|
||||
|
||||
.stv .btn {
|
||||
--bs-btn-padding-y: 0.25rem;
|
||||
--bs-btn-line-height: 1.2;
|
||||
}
|
||||
|
||||
.stv .p-button.p-button-icon-only {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.stv .p-tabview .p-tabview-nav li .p-tabview-nav-link {
|
||||
padding: 0.25rem .5rem;
|
||||
}
|
||||
/*
|
||||
.stv .p-tabview .p-tabview-panels {
|
||||
background-color: #e5eff5;
|
||||
}
|
||||
|
||||
.stv .p-tabview .p-tabview-nav li.p-highlight .p-tabview-nav-link {
|
||||
background: #e5eff5;
|
||||
border-color: #dee2e6 #dee2e6 #e5eff5 #dee2e6;
|
||||
}
|
||||
*/
|
||||
.stv-details-details-foto img {
|
||||
max-height: 120px;
|
||||
}
|
||||
|
||||
.stv .tabulator-row .tabulator-frozen,
|
||||
.stv .tabulator-row .tabulator-cell {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/*
|
||||
.stv .p-treetable .p-treetable-thead > tr > th,
|
||||
.stv .p-treetable .p-treetable-tbody > tr {
|
||||
background-color: #e5eff5;
|
||||
}
|
||||
|
||||
.stv .p-treetable .p-treetable-tbody > tr.p-highlight {
|
||||
background: #007bff;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.stv .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody > tr:not(.p-highlight):hover {
|
||||
background: #fff;
|
||||
color: #212529;
|
||||
}
|
||||
|
||||
.tabulator-row.tabulator-row-even .tabulator-cell {
|
||||
background-color: #e5eff5;
|
||||
}
|
||||
*/
|
||||
/* slim ende */
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
@import './components/verticalsplit.css';
|
||||
|
||||
html {
|
||||
font-size: .875em;
|
||||
}
|
||||
.vv{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
}
|
||||
.vv> header {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.vv> div {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
.vv {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
.foto-container:hover .fotoedit {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
.bg-unruly {
|
||||
background-color: #ad1010 !important;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/*.fotosperre {
|
||||
z-index: 1;
|
||||
font-size: 1rem;
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}*/
|
||||
|
||||
.foto-container .fotoedit {
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
backdrop-filter: blur(2px);
|
||||
}
|
||||
|
||||
.fotoedit {
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
color: white;
|
||||
border: none;
|
||||
z-index: 4;
|
||||
font-size: 1rem;
|
||||
width: 1.8rem;
|
||||
height: 1.8rem;
|
||||
opacity:0;
|
||||
transition: opacity 0.2s;
|
||||
top:20%;
|
||||
}
|
||||
|
||||
/* fotoeditMa {
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
color: white;
|
||||
border: none;
|
||||
z-index: 4;
|
||||
font-size: 1rem;
|
||||
opacity:0;
|
||||
transition: opacity 0.2s;
|
||||
top:20%;
|
||||
}*/
|
||||
|
||||
.buttonleft {
|
||||
margin-left: .25rem;
|
||||
}
|
||||
|
||||
.buttonright {
|
||||
margin-right: .25rem;
|
||||
}
|
||||
|
||||
/*.fotoEditMa {
|
||||
z-index: 104;
|
||||
font-size: 1rem;
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
opacity:0;
|
||||
transition: opacity 0.2s;
|
||||
top:13%;"
|
||||
z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
|
||||
}*/
|
||||
@@ -3578,6 +3578,12 @@
|
||||
transition: box-shadow 0.15s;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler > svg,
|
||||
.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler > svg * {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.p-treetable .p-treetable-tbody > tr > td .p-treetable-toggler:enabled:hover {
|
||||
color: #495057;
|
||||
border-color: transparent;
|
||||
|
||||
@@ -19,19 +19,19 @@ export default {
|
||||
getHeader(person_id){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/getHeader/' + person_id,
|
||||
url: 'api/frontend/v1/detailheader/detailheader/getHeader/' + person_id,
|
||||
};
|
||||
},
|
||||
getPersonAbteilung(mitarbeiter_uid){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/getPersonAbteilung/' + mitarbeiter_uid,
|
||||
url: 'api/frontend/v1/detailheader/detailheader/getPersonAbteilung/' + mitarbeiter_uid,
|
||||
};
|
||||
},
|
||||
getLeitungOrg(oekurzbz){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/getLeitungOrg/' + oekurzbz,
|
||||
url: 'api/frontend/v1/detailheader/detailheader/getLeitungOrg/' + oekurzbz,
|
||||
};
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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 {
|
||||
uploadFoto(person_id, params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/fotoHandling/Foto/uploadFoto/' + person_id,
|
||||
params
|
||||
};
|
||||
},
|
||||
deleteFoto(person_id){
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/fotoHandling/Foto/deleteFoto/' + person_id
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizAnrechnung/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizBestellung/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -26,4 +26,29 @@ export default {
|
||||
url: 'api/frontend/v1/notiz/notizLehreinheit/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
addNewNotiz(lehreinheit_id, params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/notiz/notizLehreinheit/addNewNotiz/' + lehreinheit_id,
|
||||
params
|
||||
};
|
||||
},
|
||||
updateNotiz(notiz_id, params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/notiz/notizLehreinheit/updateNotiz/' + notiz_id,
|
||||
params
|
||||
};
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/notiz/notizLehreinheit/deleteNotiz/',
|
||||
params: {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizMitarbeiter/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizPrestudent/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizProjekt/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizProjektphase/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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/>.
|
||||
*/
|
||||
|
||||
import Person from './person.js';
|
||||
|
||||
export default {
|
||||
|
||||
...Person,
|
||||
getNotizen(id, type) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/notiz/notizProjekttask/getNotizen/' + encodeURIComponent(id) + '/' + encodeURIComponent(type)
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,54 @@
|
||||
export default {
|
||||
|
||||
getTag(data)
|
||||
{
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/stv/Tags/getTag',
|
||||
params: data
|
||||
};
|
||||
},
|
||||
|
||||
getTags(data)
|
||||
{
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/stv/Tags/getTags'
|
||||
};
|
||||
},
|
||||
|
||||
addTag(data)
|
||||
{
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/Tags/addTag',
|
||||
params: data
|
||||
};
|
||||
},
|
||||
|
||||
updateTag(data)
|
||||
{
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/Tags/updateTag',
|
||||
params: data
|
||||
};
|
||||
},
|
||||
doneTag(data)
|
||||
{
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/Tags/doneTag',
|
||||
params: data
|
||||
};
|
||||
},
|
||||
|
||||
deleteTag(data)
|
||||
{
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/Tags/deleteTag',
|
||||
params: data
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,136 @@
|
||||
/**
|
||||
* Copyright (C) 2025 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 {
|
||||
getAllVertraege(person_id) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/Vertraege/getAllVertraege/' + person_id
|
||||
};
|
||||
},
|
||||
getAllContractsNotAssigned(person_id) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/Vertraege/getAllContractsNotAssigned/' + person_id
|
||||
};
|
||||
},
|
||||
getAllContractsAssigned(person_id, vertrag_id) {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/Vertraege/getAllContractsAssigned/' + person_id + '/' + vertrag_id + ''
|
||||
};
|
||||
},
|
||||
getAllContractTypes() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/Vertraege/getAllContractTypes/'
|
||||
};
|
||||
},
|
||||
getStatiOfContract(person_id, vertrag_id){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/Vertraege/getStatiOfContract/' + person_id + '/' + vertrag_id
|
||||
};
|
||||
},
|
||||
configPrintDocument() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/Config/printDocument/'
|
||||
};
|
||||
},
|
||||
getAllContractStati() {
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/getAllContractStati/'
|
||||
};
|
||||
},
|
||||
deleteContract(vertrag_id) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/deleteContract/' + vertrag_id
|
||||
};
|
||||
},
|
||||
addNewContract(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/addNewContract/',
|
||||
params
|
||||
};
|
||||
},
|
||||
loadContract(vertrag_id){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/loadContract/' + vertrag_id
|
||||
};
|
||||
},
|
||||
updateContract(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/updateContract/',
|
||||
params
|
||||
};
|
||||
},
|
||||
loadContractStatus(params){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/loadContractStatus/',
|
||||
params
|
||||
};
|
||||
},
|
||||
insertContractStatus(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/insertContractStatus/',
|
||||
params
|
||||
};
|
||||
},
|
||||
updateContractStatus(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/updateContractStatus/',
|
||||
params
|
||||
};
|
||||
},
|
||||
deleteContractStatus(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/deleteContractStatus/',
|
||||
params
|
||||
};
|
||||
},
|
||||
deleteLehrauftrag(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/deleteLehrauftrag/',
|
||||
params
|
||||
};
|
||||
},
|
||||
deleteBetreuung(params) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/deleteBetreuung/',
|
||||
params
|
||||
};
|
||||
},
|
||||
//loaded by mitarbeiter_header_js
|
||||
getMitarbeiter(){
|
||||
return {
|
||||
method: 'get',
|
||||
url: 'api/frontend/v1/vertraege/vertraege/getMitarbeiter/',
|
||||
};
|
||||
},
|
||||
};
|
||||
@@ -39,6 +39,7 @@ import studiengang from "./studiengang.js";
|
||||
import menu from "./menu.js";
|
||||
import dashboard from "./dashboard.js";
|
||||
import authinfo from "./authinfo.js";
|
||||
import vertraege from "./vertraege.js";
|
||||
import studium from "./studium.js";
|
||||
import language from "./language.js";
|
||||
|
||||
@@ -68,6 +69,7 @@ export default {
|
||||
studiengang,
|
||||
menu,
|
||||
authinfo,
|
||||
vertraege,
|
||||
studium,
|
||||
language
|
||||
language
|
||||
};
|
||||
|
||||
+19
-2
@@ -1,5 +1,22 @@
|
||||
import person from "./notiz/person.js";
|
||||
import prestudent from "./notiz/prestudent.js";
|
||||
import mitarbeiter from "./notiz/mitarbeiter.js";
|
||||
import projekt from "./notiz/projekt.js";
|
||||
import anrechnung from "./notiz/anrechnung.js";
|
||||
import bestellung from "./notiz/bestellung.js";
|
||||
import lehreinheit from "./notiz/lehreinheit.js";
|
||||
import projektphase from "./notiz/projektphase.js";
|
||||
import projekttask from "./notiz/projekttask.js";
|
||||
|
||||
|
||||
export default {
|
||||
person
|
||||
}
|
||||
person,
|
||||
prestudent,
|
||||
mitarbeiter,
|
||||
anrechnung,
|
||||
bestellung,
|
||||
lehreinheit,
|
||||
projekt,
|
||||
projektphase,
|
||||
projekttask,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizAnrechnung/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizAnrechnung/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizAnrechnung/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizAnrechnung/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizAnrechnung/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizAnrechnung/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizAnrechnung/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizAnrechnung/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizBestellung/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizBestellung/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizBestellung/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizBestellung/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizBestellung/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizBestellung/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizBestellung/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizBestellung/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizLehreinheit/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizLehreinheit/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizLehreinheit/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizLehreinheit/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizLehreinheit/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizLehreinheit/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizLehreinheit/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizLehreinheit/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizMitarbeiter/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizMitarbeiter/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizMitarbeiter/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizMitarbeiter/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizMitarbeiter/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizMitarbeiter/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizMitarbeiter/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizMitarbeiter/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -38,4 +38,4 @@ export default {
|
||||
isBerechtigt(id, type_id){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizPerson/isBerechtigt/');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizPrestudent/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizPrestudent/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizPrestudent/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizPrestudent/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizPrestudent/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizPrestudent/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizPrestudent/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizPrestudent/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/NotizProjekt/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/NotizProjekt/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/NotizProjekt/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/NotizProjekt/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/NotizProjekt/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/NotizProjekt/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/NotizProjekt/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/NotizProjekt/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizProjektphase/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizProjektphase/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjektphase/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjektphase/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjektphase/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjektphase/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjektphase/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizProjektphase/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
export default {
|
||||
getNotizen(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizProjekttask/getNotizen/' + params.id + '/' + params.type);
|
||||
},
|
||||
getUid(){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizProjekttask/getUid/');
|
||||
},
|
||||
addNewNotiz(id, formData) {
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjekttask/addNewNotiz/' + id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
loadNotiz(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjekttask/loadNotiz/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
loadDokumente(notiz_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjekttask/loadDokumente/', {
|
||||
notiz_id
|
||||
});
|
||||
},
|
||||
deleteNotiz(notiz_id, type_id, id){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjekttask/deleteNotiz/', {
|
||||
notiz_id,
|
||||
type_id,
|
||||
id
|
||||
});
|
||||
},
|
||||
updateNotiz(notiz_id, formData){
|
||||
return this.$fhcApi.post('api/frontend/v1/notiz/notizProjekttask/updateNotiz/' + notiz_id,
|
||||
formData
|
||||
);
|
||||
},
|
||||
getMitarbeiter(event){
|
||||
return this.$fhcApi.get('api/frontend/v1/notiz/notizProjekttask/getMitarbeiter/' + event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import person from "./vertraege/person.js";
|
||||
|
||||
export default {
|
||||
person,
|
||||
configPrintDocument() {
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/config/printDocument');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
export default {
|
||||
getAllVertraege(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllVertraege/' + params.person_id);
|
||||
},
|
||||
getAllContractsNotAssigned(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractsNotAssigned/' + params.person_id);
|
||||
},
|
||||
getAllContractsAssigned(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractsAssigned/' + params.person_id + '/' + params.vertrag_id);
|
||||
},
|
||||
getAllContractsNotAssigned2(person_id){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractsNotAssigned/' + person_id);
|
||||
},
|
||||
getStatiOfContract(url, config, params){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getStatiOfContract/' + params.vertrag_id);
|
||||
},
|
||||
getAllContractTypes(){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractTypes/');
|
||||
},
|
||||
getAllContractStati(){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractStati/');
|
||||
},
|
||||
addNewContract(form, data) {
|
||||
return this.$fhcApi.post(form,'api/frontend/v1/vertraege/vertraege/addNewContract/', data);
|
||||
},
|
||||
loadContract(vertrag_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/loadContract/' + vertrag_id);
|
||||
},
|
||||
updateContract(form, data) {
|
||||
return this.$fhcApi.post(form,'api/frontend/v1/vertraege/vertraege/updateContract/', data);
|
||||
},
|
||||
deleteContract(vertrag_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteContract/' + vertrag_id);
|
||||
},
|
||||
loadContractStatus(params){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/loadContractStatus/' + params.vertrag_id, params);
|
||||
},
|
||||
insertContractStatus(form, params) {
|
||||
return this.$fhcApi.post(form,'api/frontend/v1/vertraege/vertraege/insertContractStatus/' + params.vertrag_id, params);
|
||||
},
|
||||
updateContractStatus(form, params) {
|
||||
return this.$fhcApi.post(form,'api/frontend/v1/vertraege/vertraege/updateContractStatus/' + params.vertrag_id, params);
|
||||
},
|
||||
deleteContractStatus(params) {
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteContractStatus/' + params.vertrag_id, params);
|
||||
},
|
||||
deleteLehrauftrag(params) {
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteLehrauftrag/' + params.vertrag_id, params);
|
||||
},
|
||||
deleteBetreuung(params) {
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteBetreuung/' + params.vertrag_id, params);
|
||||
},
|
||||
getMitarbeiter(params){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getMitarbeiter/');
|
||||
},
|
||||
getHeader(person_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getHeader/' + person_id);
|
||||
},
|
||||
getPersonAbteilung(person_id){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getPersonAbteilung/' + person_id);
|
||||
},
|
||||
getLeitungOrg(oekurzbz){
|
||||
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getLeitungOrg/' + oekurzbz);
|
||||
},
|
||||
getMitarbeiterUid(person_id){
|
||||
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getMitarbeiterUid/' + person_id);
|
||||
},
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import Vertragsverwaltung from "../components/Vertraege/Vertragsverwaltung.js";
|
||||
import Phrasen from "../plugins/Phrasen.js";
|
||||
|
||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||
|
||||
const router = VueRouter.createRouter({
|
||||
history: VueRouter.createWebHistory(),
|
||||
routes: [
|
||||
{ path: `/${ciPath}/vertragsverwaltung`, component: Vertragsverwaltung },
|
||||
]
|
||||
});
|
||||
|
||||
const app = Vue.createApp({
|
||||
name: 'VertragsverwaltungApp'
|
||||
});
|
||||
|
||||
app
|
||||
.use(router)
|
||||
.use(primevue.config.default, {
|
||||
zIndex: {
|
||||
overlay: 1100
|
||||
}
|
||||
})
|
||||
.use(Phrasen)
|
||||
.mount('#main');
|
||||
@@ -43,12 +43,28 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
listBetriebsmitteltyp: [],
|
||||
formData: {
|
||||
ausgegebenam : new Date(),
|
||||
betriebsmitteltyp: 'Zutrittskarte'
|
||||
},
|
||||
statusNew: true,
|
||||
filteredInventar: [],
|
||||
layout: 'fitColumns',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: '550',
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
this.endpoint.getAllBetriebsmittel(this.typeId, this.id, (this.filterByProvidedTypes ? this.betriebsmittelTypes : null))
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
persistenceID: 'core-betriebsmittel-20260217',
|
||||
selectableRows: true,
|
||||
columns: [
|
||||
{title: "Nummer", field: "nummer", width: 150},
|
||||
{title: "PersonId", field: "person_id", visible: false},
|
||||
@@ -115,7 +131,7 @@ export default {
|
||||
'/content/pdfExport.php?xml=betriebsmittelperson.rdf.php&xsl=Uebernahme&id=' + cellData.betriebsmittelperson_id + '&output=pdf';
|
||||
|
||||
window.open(linkToPdf, '_blank');
|
||||
});
|
||||
});
|
||||
container.append(button);
|
||||
|
||||
button = document.createElement('button');
|
||||
@@ -143,64 +159,47 @@ export default {
|
||||
return container;
|
||||
},
|
||||
frozen: true
|
||||
}],
|
||||
layout: 'fitColumns',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: '550',
|
||||
persistenceID: 'core-betriebsmittel'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
}
|
||||
],
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
|
||||
await this.$p.loadCategory(['wawi', 'global', 'infocenter', 'betriebsmittel', 'person']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('nummer').component.updateDefinition({
|
||||
title: this.$p.t('wawi', 'nummer')
|
||||
});
|
||||
cm.getColumnByField('betriebsmitteltyp').component.updateDefinition({
|
||||
title: this.$p.t('global', 'typ')
|
||||
});
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('retouram').component.updateDefinition({
|
||||
title: this.$p.t('wawi', 'retourdatum')
|
||||
});
|
||||
cm.getColumnByField('beschreibung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'beschreibung')
|
||||
});
|
||||
cm.getColumnByField('kaution').component.updateDefinition({
|
||||
title: this.$p.t('infocenter', 'kaution')
|
||||
});
|
||||
cm.getColumnByField('ausgegebenam').component.updateDefinition({
|
||||
title: this.$p.t('wawi', 'ausgabedatum')
|
||||
});
|
||||
cm.getColumnByField('betriebsmittel_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'betriebsmittel_id')
|
||||
});
|
||||
cm.getColumnByField('betriebsmittelperson_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'betriebsmittelperson_id')
|
||||
});
|
||||
cm.getColumnByField('person_id').component.updateDefinition({
|
||||
title: this.$p.t('person', 'person_id')
|
||||
});
|
||||
cm.getColumnByField('uid').component.updateDefinition({
|
||||
title: this.$p.t('person', 'uid')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('nummer', this.$p.t('wawi', 'nummer'));
|
||||
setHeader('betriebsmitteltyp', this.$p.t('global', 'typ'));
|
||||
setHeader('anmerkung', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('retouram', this.$p.t('wawi', 'retourdatum'));
|
||||
setHeader('beschreibung', this.$p.t('global', 'beschreibung'));
|
||||
setHeader('kaution', this.$p.t('infocenter', 'kaution'));
|
||||
setHeader('ausgegebenam', this.$p.t('wawi', 'ausgabedatum'));
|
||||
setHeader('betriebsmittel_id', this.$p.t('ui', 'betriebsmittel_id'));
|
||||
setHeader('betriebsmittelperson_id', this.$p.t('ui', 'betriebsmittelperson_id'));
|
||||
setHeader('person_id', this.$p.t('person', 'person_id'));
|
||||
setHeader('uid', this.$p.t('person', 'uid'));
|
||||
}
|
||||
}
|
||||
],
|
||||
listBetriebsmitteltyp: [],
|
||||
formData: {
|
||||
ausgegebenam : new Date(),
|
||||
betriebsmitteltyp: 'Zutrittskarte'
|
||||
},
|
||||
statusNew: true,
|
||||
filteredInventar: []
|
||||
];
|
||||
return events;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@@ -466,5 +465,4 @@ export default {
|
||||
</template>
|
||||
</bs-modal>
|
||||
</div>`
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,12 +1,11 @@
|
||||
import ApiDetailHeader from "../../api/factory/detailHeader.js";
|
||||
import ApiHandleFoto from "../../api/factory/fotoHandling.js";
|
||||
import ModalUploadFoto from "./Modal/UploadFoto.js";
|
||||
|
||||
export default {
|
||||
name: 'DetailHeader',
|
||||
inject: {
|
||||
domain: {
|
||||
from: 'configDomain',
|
||||
default: 'technikum-wien.at'
|
||||
},
|
||||
components: {
|
||||
ModalUploadFoto
|
||||
},
|
||||
props: {
|
||||
headerData: {
|
||||
@@ -17,6 +16,19 @@ export default {
|
||||
type: Number,
|
||||
required: false
|
||||
},
|
||||
mitarbeiter_uid: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
fotoEditable: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
domain: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
typeHeader: {
|
||||
type: String,
|
||||
default: 'student',
|
||||
@@ -36,31 +48,40 @@ export default {
|
||||
if (this.typeHeader === 'student') return this.headerData;
|
||||
if (this.typeHeader === 'mitarbeiter') return this.person_id;
|
||||
return null;
|
||||
}
|
||||
},
|
||||
hasTileAlphaSlot() {
|
||||
return !!this.$slots.titleAlphaTile
|
||||
},
|
||||
hasTileBetaSlot() {
|
||||
return !!this.$slots.titleBetaTile
|
||||
},
|
||||
hasTileGammaSlot() {
|
||||
return !!this.$slots.titleGammaTile
|
||||
},
|
||||
hasTileUIDSlot() {
|
||||
return !!this.$slots.uid
|
||||
},
|
||||
|
||||
},
|
||||
created(){
|
||||
if(this.person_id) {
|
||||
this.getHeader(this.person_id);
|
||||
|
||||
this.loadDepartmentData(this.mitarbeiter_uid)
|
||||
.then(() => {
|
||||
// Call getLeitungOrg only after departmentData is loaded
|
||||
this.getLeitungOrg(this.departmentData.oe_kurzbz);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error loading department data:", error);
|
||||
});
|
||||
if (this.typeHeader === 'student') {
|
||||
if (!this.headerData) {
|
||||
throw new Error('[DetailHeader] "headerData" is required.')
|
||||
}
|
||||
} else if (this.typeHeader === 'mitarbeiter') {
|
||||
if (!this.person_id || !this.mitarbeiter_uid || !this.domain) {
|
||||
throw new Error(
|
||||
'[DetailHeader] "person_id", "mitarbeiter_uid", and "domain" are requried.'
|
||||
)
|
||||
}
|
||||
this.loadHeaderData(this.person_id, this.mitarbeiter_uid);
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
person_id: {
|
||||
handler(newVal) {
|
||||
if (newVal) {
|
||||
this.getHeader(this.person_id);
|
||||
this.loadDepartmentData(this.person_id).
|
||||
then(() => {
|
||||
this.getLeitungOrg(this.departmentData.oe_kurzbz);
|
||||
});
|
||||
this.loadHeaderData(newVal, this.mitarbeiter_uid);
|
||||
}
|
||||
},
|
||||
deep: true,
|
||||
@@ -71,9 +92,21 @@ export default {
|
||||
headerDataMa: {},
|
||||
departmentData: {},
|
||||
leitungData: {},
|
||||
isFetchingIssues: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
loadHeaderData(person_id, mitarbeiter_uid){
|
||||
this.getHeader(person_id);
|
||||
this.loadDepartmentData(mitarbeiter_uid)
|
||||
.then(() => {
|
||||
// Call getLeitungOrg only after departmentData is loaded
|
||||
this.getLeitungOrg(this.departmentData.oe_kurzbz);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error loading header data: ", error);
|
||||
});
|
||||
},
|
||||
getHeader(person_id) {
|
||||
return this.$api
|
||||
.call(ApiDetailHeader.getHeader(person_id))
|
||||
@@ -99,9 +132,46 @@ export default {
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
redirectToLeitung(){
|
||||
async goToLeitung() {
|
||||
this.loadHeaderData(this.leitungData.person_id, this.leitungData.uid);
|
||||
this.redirectToLeitung();
|
||||
},
|
||||
redirectToLeitung() {
|
||||
this.$emit('redirectToLeitung', {
|
||||
person_id: this.leitungData.person_id});
|
||||
person_id: this.leitungData.person_id,
|
||||
uid: this.leitungData.uid
|
||||
});
|
||||
},
|
||||
showModal(person_id){
|
||||
this.$refs.modalFoto.open(person_id);
|
||||
},
|
||||
showDeleteModal(person_id){
|
||||
this.$fhcAlert
|
||||
.confirmDelete()
|
||||
.then(result => result
|
||||
? person_id
|
||||
: Promise.reject({handled: true}))
|
||||
.then(this.deleteFoto)
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
deleteFoto(person_id){
|
||||
return this.$api
|
||||
.call(ApiHandleFoto.deleteFoto(person_id))
|
||||
.then(result => {
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete'));
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError)
|
||||
.finally(()=> {
|
||||
this.reload();
|
||||
});
|
||||
},
|
||||
reload() {
|
||||
if(this.person_id) {
|
||||
this.loadHeaderData(this.person_id, this.mitarbeiter_uid);
|
||||
}
|
||||
else {
|
||||
this.$emit('reload');
|
||||
}
|
||||
},
|
||||
getFotoSrc(foto) {
|
||||
if(foto === null) {
|
||||
@@ -112,74 +182,127 @@ export default {
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="core-header d-flex justify-content-start align-items-center w-100 overflow-auto pb-3 gap-3" style="max-height:9rem; min-width: 37.5rem;">
|
||||
<div class="core-header d-flex justify-content-start align-items-center w-100 overflow-auto pb-2 gap-3" style="max-height:9rem; min-width: 37.5rem;">
|
||||
|
||||
<modal-upload-foto
|
||||
v-if="person_id"
|
||||
ref="modalFoto"
|
||||
:person_id="person_id"
|
||||
@reload="reload"
|
||||
>
|
||||
</modal-upload-foto>
|
||||
<modal-upload-foto
|
||||
v-else
|
||||
ref="modalFoto"
|
||||
:person_id="headerData[0].person_id"
|
||||
@reload="reload"
|
||||
>
|
||||
</modal-upload-foto>
|
||||
|
||||
<template v-if="typeHeader==='student'">
|
||||
<div
|
||||
v-for="person in headerData"
|
||||
:key="person.person_id"
|
||||
class="d-flex flex-column align-items-center h-100 position-relative d-inline-block"
|
||||
>
|
||||
<img
|
||||
class="d-block rounded"
|
||||
style="height: 84px;"
|
||||
alt="Profilbild"
|
||||
:src="getFotoSrc(person.foto)"
|
||||
/>
|
||||
|
||||
<template v-if="person.foto_sperre">
|
||||
<i
|
||||
class=" fa fa-lock text-secondary bg-light rounded d-flex justify-content-center align-items-center position-absolute top-0 end-0"
|
||||
style="z-index: 1; font-size: 1rem; width: 1.25rem; height: 1.25rem;"
|
||||
></i>
|
||||
</template>
|
||||
<div
|
||||
v-for="person in headerData"
|
||||
:key="person.person_id"
|
||||
class="foto-container d-flex flex-column align-items-center h-100 position-relative d-inline-block"
|
||||
>
|
||||
<img
|
||||
class="d-block rounded"
|
||||
style="height: 75px;"
|
||||
alt="Profilbild"
|
||||
:src="getFotoSrc(person.foto)"
|
||||
/>
|
||||
|
||||
<template v-if="person.foto_sperre">
|
||||
<i class="fa fa-lock text-secondary bg-light rounded d-flex justify-content-center align-items-center position-absolute top-0 end-0"
|
||||
style="z-index: 1; font-size: 1rem; width: 1.25rem; height: 1.25rem;"
|
||||
>
|
||||
</i>
|
||||
</template>
|
||||
<template v-if="fotoEditable">
|
||||
<button
|
||||
type="button"
|
||||
class="fotoedit buttonleft btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute start-0"
|
||||
@click="showDeleteModal(headerData[0].person_id)">
|
||||
<i class="fa fa-xmark"></i>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="fotoedit buttonright btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute end-0"
|
||||
@click="showModal(headerData[0].person_id)">
|
||||
<i class="fa fa-pen"></i>
|
||||
</button>
|
||||
</template>
|
||||
<small class="text-muted">{{person.uid}}</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="headerData.length == 1">
|
||||
<h2 class="h4">
|
||||
{{headerData[0].titelpre}}
|
||||
{{headerData[0].vorname}}
|
||||
{{headerData[0].nachname}}<span v-if="headerData[0].titelpost">, </span>
|
||||
{{headerData[0].titelpost}}
|
||||
</h2>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<h2 class="h4">
|
||||
{{headerData[0].titelpre}}
|
||||
{{headerData[0].vorname}}
|
||||
{{headerData[0].nachname}}
|
||||
<span v-if="headerData[0].titelpost">, </span>
|
||||
{{headerData[0].titelpost}}
|
||||
</h2>
|
||||
<h6 v-if="headerData[0].unruly" class="badge" :class="'bg-unruly rounded-0'"><strong>unruly</strong></h6>
|
||||
</div>
|
||||
|
||||
<h5 class="h6">
|
||||
<strong class="text-muted">Person ID </strong>
|
||||
{{headerData[0].person_id}}
|
||||
<strong class="text-muted">| {{$p.t('lehre', 'studiengang')}} </strong>
|
||||
{{headerData[0].stg_bezeichnung}} ({{headerData[0].studiengang}})
|
||||
<strong v-if="headerData[0].semester" class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
|
||||
{{headerData[0].semester}}
|
||||
<strong v-if="headerData[0].verband" class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
|
||||
{{headerData[0].verband}}
|
||||
<strong v-if="headerData[0].gruppe" class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
|
||||
{{headerData[0].gruppe}}
|
||||
</h5>
|
||||
<h5 class="h6">
|
||||
<strong class="text-muted">{{$p.t('lehre', 'studiengang')}} </strong>
|
||||
{{headerData[0].stg_bezeichnung}} ({{headerData[0].studiengang}})
|
||||
<strong v-if="headerData[0].semester" class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
|
||||
{{headerData[0].semester}}
|
||||
<strong v-if="headerData[0].verband" class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
|
||||
{{headerData[0].verband}}
|
||||
<strong v-if="headerData[0].gruppe" class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
|
||||
{{headerData[0].gruppe}}
|
||||
</h5>
|
||||
|
||||
<h5 class="h6">
|
||||
<h5 class="h6">
|
||||
<strong class="text-muted">Email </strong>
|
||||
<span>
|
||||
<a :href="'mailto:'+headerData[0]?.mail_intern">{{headerData[0].mail_intern}}</a>
|
||||
</span>
|
||||
<strong v-if="headerData[0].statusofsemester" class="text-muted"> | Status </strong>
|
||||
{{headerData[0].statusofsemester}}
|
||||
<strong class="text-muted"> | {{$p.t('person', 'matrikelnummer')}} </strong>
|
||||
{{headerData[0].matr_nr}}
|
||||
</h5>
|
||||
|
||||
</div>
|
||||
<div v-if="headerData.length == 1" class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
|
||||
<div class="d-flex py-1">
|
||||
<div class="px-2" style="min-width: 100px;">
|
||||
<slot name="issues"></slot>
|
||||
</div>
|
||||
<div v-if="hasTileGammaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center"><slot name="titleGammaTile"></slot></h4>
|
||||
<h6 class="text-muted text-center"><slot name="valueGammaTile"></slot></h6>
|
||||
</div>
|
||||
<div v-if="hasTileBetaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center"><slot name="titleBetaTile"></slot></h4>
|
||||
<h6 class="text-muted text-center"><slot name="valueBetaTile"></slot></h6>
|
||||
</div>
|
||||
<div v-if="hasTileAlphaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center"><slot name="titleAlphaTile"></slot></h4>
|
||||
<h6 class="text-muted text-center"><slot name="valueAlphaTile"></slot></h6>
|
||||
</div>
|
||||
<div v-if="hasTileUIDSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center">UID</h4>
|
||||
<h6 class="text-muted text-center"><slot name="uid"></slot></h6>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<template v-if="typeHeader==='mitarbeiter'">
|
||||
<div class="row">
|
||||
<div class="col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3 position-relative"
|
||||
style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
|
||||
|
||||
<div class="foto-container col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3 mt-3 position-relative" style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
|
||||
<img
|
||||
class="d-block rounded"
|
||||
style="height: 84px;"
|
||||
class="d-block w-100 h-100 rounded"
|
||||
style="height: 84px; object-fit: contain;"
|
||||
alt="Profilbild"
|
||||
:src="'data:image/jpeg;base64,' + headerDataMa.foto"
|
||||
:src="getFotoSrc(headerDataMa.foto)"
|
||||
/>
|
||||
<template v-if="headerDataMa.foto_sperre">
|
||||
<i
|
||||
@@ -187,31 +310,73 @@ export default {
|
||||
style="z-index: 1; font-size: 1rem; width: 1.25rem; height: 1.25rem;"
|
||||
></i>
|
||||
</template>
|
||||
<template v-if="fotoEditable">
|
||||
<button
|
||||
type="button"
|
||||
class="fotoedit btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute start-0"
|
||||
style="z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
|
||||
@click="showDeleteModal(person_id)">
|
||||
<i class="fa fa-xmark"></i>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="fotoedit btn btn-outline-dark btn-sm d-flex justify-content-center align-items-center position-absolute end-0"
|
||||
style="z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
|
||||
@click="showModal(person_id)">
|
||||
<i class="fa fa-pen"></i>
|
||||
</button>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!--show Ma-Details-->
|
||||
<div class="col-md-10">
|
||||
<h5>{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}
|
||||
</h5>
|
||||
<div class="col-md-9 text-nowrap mt-2">
|
||||
<h4>{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}</h4>
|
||||
<strong class="text-muted">{{departmentData.organisationseinheittyp_kurzbz}}</strong>
|
||||
{{departmentData.bezeichnung}}
|
||||
<span v-if="leitungData.uid"> | </span>
|
||||
<strong v-if="leitungData.uid" class="text-muted">Vorgesetzte*r </strong>
|
||||
<a href="#" @click.prevent="redirectToLeitung">
|
||||
<a href="#" @click.prevent="goToLeitung">
|
||||
{{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}}
|
||||
</a>
|
||||
<p>
|
||||
<strong class="text-muted">Email </strong>
|
||||
<span v-if="!headerDataMa?.alias">
|
||||
<a :href="'mailto:'+headerDataMa?.uid+'@'+domain">{{headerDataMa.uid}}@{{domain}}</a>
|
||||
<span v-if="headerDataMa && (headerDataMa.alias === undefined || headerDataMa.alias === null || headerDataMa.alias === '')">
|
||||
<a :href="'mailto:' + mitarbeiter_uid + '@' + domain">
|
||||
{{ mitarbeiter_uid }}@{{ domain }}
|
||||
</a>
|
||||
</span>
|
||||
<span v-if="headerDataMa?.alias">
|
||||
<span v-else>
|
||||
<a :href="'mailto:'+headerDataMa?.alias+'@'+domain">{{headerDataMa.alias}}@{{domain}}</a>
|
||||
</span>
|
||||
<span v-if="headerDataMa?.telefonklappe" class="mb-2"> | <strong class="text-muted">DW </strong>{{headerDataMa?.telefonklappe}}</span>
|
||||
</p>
|
||||
<slot name="tag"></slot>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
|
||||
<div class="d-flex py-1">
|
||||
<div class="px-2" style="min-width: 100px;">
|
||||
<slot name="issues"></slot>
|
||||
</div>
|
||||
<div v-if="hasTileGammaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center"><slot name="titleGammaTile"></slot></h4>
|
||||
<h6 class="text-muted text-center"><slot name="valueGammaTile"></slot></h6>
|
||||
</div>
|
||||
<div v-if="hasTileBetaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center"><slot name="titleBetaTile"></slot></h4>
|
||||
<h6 class="text-muted text-center"><slot name="valueBetaTile" :valueBetaTile="valueBetaTile"></slot></h6>
|
||||
</div>
|
||||
<div v-if="hasTileAlphaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center"><slot name="titleAlphaTile"></slot></h4>
|
||||
<h6 class="text-muted text-center"><slot name="valueAlphaTile"></slot></h6>
|
||||
</div>
|
||||
<div v-if="hasTileUIDSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||
<h4 class="mb-1 text-center">UID</h4>
|
||||
<h6 class="text-muted text-center"><slot name="uid"></slot></h6>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
</div>
|
||||
`
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
import BsModal from "../../Bootstrap/Modal.js";
|
||||
import FormForm from "../../Form/Form.js";
|
||||
import FormInput from "../../Form/Input.js";
|
||||
|
||||
import ApiHandleFoto from "../../../../js/api/factory/fotoHandling.js";
|
||||
|
||||
export default {
|
||||
name: "modalUploadFoto",
|
||||
components: {
|
||||
BsModal,
|
||||
FormForm,
|
||||
FormInput,
|
||||
},
|
||||
props: {
|
||||
person_id: {
|
||||
type: Number,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data(){
|
||||
return{
|
||||
base64Image: null,
|
||||
file: null,
|
||||
preview: null,
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
open(person_id){
|
||||
this.$refs.modalUploadFoto.show(person_id);
|
||||
},
|
||||
onFileChange(e) {
|
||||
this.file = e.target.files[0];
|
||||
if (!this.file) return;
|
||||
|
||||
// convert File in base64
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = (event) => {
|
||||
this.base64Image = event.target.result;
|
||||
this.preview = this.base64Image;
|
||||
};
|
||||
reader.readAsDataURL(this.file);
|
||||
},
|
||||
|
||||
async uploadImage(person_id) {
|
||||
if (!this.base64Image) {
|
||||
this.$fhcAlert.alertInfo(this.$p.t('header', 'alert_chooseFoto'));
|
||||
return;
|
||||
}
|
||||
|
||||
return this.$api
|
||||
.call(ApiHandleFoto.uploadFoto(person_id, {
|
||||
image: this.base64Image,
|
||||
filename: this.file.name
|
||||
}))
|
||||
.then(result => {
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successFotoUpload'));
|
||||
this.closeModal();
|
||||
this.$emit('reload');
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
resetModal(){
|
||||
this.base64Image = [];
|
||||
this.file = null;
|
||||
},
|
||||
closeModal(){
|
||||
this.resetModal();
|
||||
this.$refs.modalUploadFoto.hide();
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<bs-modal
|
||||
ref="modalUploadFoto"
|
||||
dialog-class="modal-dialog-scrollable"
|
||||
>
|
||||
<template #title>
|
||||
Upload Foto
|
||||
</template>
|
||||
|
||||
<form-form
|
||||
ref="formUploadFoto"
|
||||
>
|
||||
<div>
|
||||
<input class="form-control" type="file" @change="onFileChange" accept="image/*" />
|
||||
<div class="mt-3">
|
||||
<div>
|
||||
<img :src="base64Image" style="width:100px"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
|
||||
<button class="btn btn-secondary" @click="closeModal()">{{$p.t('ui', 'cancel')}}</button>
|
||||
<button type="button" class="btn btn-primary" @click="uploadImage(person_id)">{{$p.t('ui', 'hochladen')}}</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</bs-modal>
|
||||
`,
|
||||
}
|
||||
@@ -33,26 +33,71 @@ export default {
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
isFilterSet: true,
|
||||
listOrgHeads: [],
|
||||
listOrgUnits: [], //Old
|
||||
listAllOrgUnits: [],
|
||||
listOrgUnits_GST: [],
|
||||
listOrgUnits_GMBH: [],
|
||||
formData: {
|
||||
head: 'gst',
|
||||
oe_kurzbz: '',
|
||||
funktion_kurzbz: null,
|
||||
label:'',
|
||||
//funktion_label: '',
|
||||
funktion: null,
|
||||
},
|
||||
statusNew: true,
|
||||
listAllFunctions: [],
|
||||
abortController: {
|
||||
oes: null,
|
||||
functions: null
|
||||
},
|
||||
filteredOes: [],
|
||||
filteredFunctions: [],
|
||||
newBtnStyle: '',
|
||||
selectedFunction: null,
|
||||
selectedOe: null,
|
||||
layout: 'fitDataFill',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: '300'
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiCoreFunktion.getAllUserFunctions(this.personUID)
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
persistenceID: 'core-functions-20260217',
|
||||
columns: [
|
||||
{
|
||||
title: "dienstverhaeltnis_unternehmen",
|
||||
field: "dienstverhaeltnis_unternehmen",
|
||||
headerFilter: "list",
|
||||
headerFilterParams: {valuesLookup: true, autocomplete: true, sort: "asc"},
|
||||
headerFilterParams: {
|
||||
valuesLookup: true, autocomplete: true, sort: "asc"
|
||||
},
|
||||
width: 140,
|
||||
//Field Company: if visible show link to dv
|
||||
visible: this.showDvCompany,
|
||||
formatter: this.companyLinkFormatter
|
||||
},
|
||||
{
|
||||
title: "funktion_beschreibung", field: "funktion_beschreibung", headerFilter: "list",
|
||||
headerFilterParams: {valuesLookup: true, autocomplete: true, sort: "asc"},
|
||||
headerFilterParams: {
|
||||
valuesLookup: true, autocomplete: true, sort: "asc"
|
||||
},
|
||||
width: 140
|
||||
},
|
||||
{
|
||||
title: "funktion_oebezeichnung", field: "funktion_oebezeichnung", headerFilter: "list",
|
||||
headerFilterParams: {valuesLookup: true, autocomplete: true, sort: "asc"}
|
||||
headerFilterParams: {
|
||||
valuesLookup: true, autocomplete: true, sort: "asc"
|
||||
},
|
||||
width: 140
|
||||
},
|
||||
{title: "wochenstunden", field: "wochenstunden", headerFilter: true},
|
||||
{
|
||||
@@ -87,7 +132,7 @@ export default {
|
||||
});
|
||||
},
|
||||
},
|
||||
{title: "bezeichnung", field: "bezeichnung", headerFilter: true},
|
||||
{title: "bezeichnung", field: "bezeichnung", headerFilter: true, width: 140},
|
||||
{title: "aktiv", field: "aktiv", visible: false},
|
||||
{title: "benutzerfunktion_id", field: "benutzerfunktion_id", visible: false},
|
||||
{title: "uid", field: "uid", visible: false},
|
||||
@@ -142,87 +187,41 @@ export default {
|
||||
frozen: true
|
||||
}
|
||||
],
|
||||
layout: 'fitDataFill',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: '300',
|
||||
persistenceID: 'core-functions',
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['global', 'lehre', 'person', 'ui']);
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
|
||||
//Field Company: if visible show link to dv
|
||||
const column = cm.getColumnByField('dienstverhaeltnis_unternehmen');
|
||||
const companyDv = {
|
||||
title: this.$p.t('person', 'dv_unternehmen'),
|
||||
width: 140,
|
||||
visible: this.showDvCompany,
|
||||
formatter: this.companyLinkFormatter
|
||||
};
|
||||
column.component.updateDefinition(companyDv);
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('funktion_beschreibung').component.updateDefinition({
|
||||
title: this.$p.t('person', 'zuordnung_taetigkeit'),
|
||||
width: 140
|
||||
});
|
||||
cm.getColumnByField('funktion_oebezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'organisationseinheit'),
|
||||
width: 140
|
||||
});
|
||||
cm.getColumnByField('wochenstunden').component.updateDefinition({
|
||||
title: this.$p.t('person', 'wochenstunden')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const columnDatumVon = cm.getColumnByField('datum_von');
|
||||
const fieldVonDatum = {
|
||||
title: this.$p.t('ui', 'from')
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
columnDatumVon.component.updateDefinition(fieldVonDatum);
|
||||
|
||||
const columnDatumBis = cm.getColumnByField('datum_bis');
|
||||
const fieldBisDatum = {
|
||||
title: this.$p.t('global', 'bis'),
|
||||
};
|
||||
columnDatumBis.component.updateDefinition(fieldBisDatum);
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'bezeichnung'),
|
||||
width: 140
|
||||
});
|
||||
|
||||
setHeader('dienstverhaeltnis_unternehmen', this.$p.t('person', 'dv_unternehmen'));
|
||||
setHeader('funktion_beschreibung', this.$p.t('person', 'zuordnung_taetigkeit'));
|
||||
setHeader('funktion_oebezeichnung', this.$p.t('lehre', 'organisationseinheit'));
|
||||
setHeader('wochenstunden', this.$p.t('person', 'wochenstunden'));
|
||||
setHeader('datum_von', this.$p.t('ui', 'from'));
|
||||
setHeader('datum_bis', this.$p.t('global', 'bis'));
|
||||
setHeader('bezeichnung', this.$p.t('ui', 'bezeichnung'));
|
||||
}
|
||||
}
|
||||
],
|
||||
isFilterSet: true,
|
||||
listOrgHeads: [],
|
||||
listOrgUnits: [], //Old
|
||||
listAllOrgUnits: [],
|
||||
listOrgUnits_GST: [],
|
||||
listOrgUnits_GMBH: [],
|
||||
formData: {
|
||||
head: 'gst',
|
||||
oe_kurzbz: '',
|
||||
funktion_kurzbz: null,
|
||||
label:'',
|
||||
//funktion_label: '',
|
||||
funktion: null,
|
||||
},
|
||||
statusNew: true,
|
||||
listAllFunctions: [],
|
||||
abortController: {
|
||||
oes: null,
|
||||
functions: null
|
||||
},
|
||||
filteredOes: [],
|
||||
filteredFunctions: [],
|
||||
newBtnStyle: '',
|
||||
selectedFunction: null,
|
||||
selectedOe: null
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
selectedFunction(newVal) {
|
||||
@@ -340,6 +339,8 @@ export default {
|
||||
this.formData.head = 'gst';
|
||||
this.formData.oe_kurzbz = '';
|
||||
this.formData.funktion_kurzbz = '';
|
||||
this.selectedFunction = null;
|
||||
this.selectedOe= null;
|
||||
},
|
||||
filterFunctions(event) {
|
||||
const query = event.query.toLowerCase();
|
||||
@@ -460,14 +461,12 @@ export default {
|
||||
</template>
|
||||
|
||||
<form-form class="row pt-3" ref="functionData">
|
||||
|
||||
<form-input
|
||||
container-class="mb-3 col-8"
|
||||
type="select"
|
||||
name="companies"
|
||||
:label="$p.t('core/unternehmen')"
|
||||
v-model="formData.head"
|
||||
@change="getOrgetsForCompanyOld"
|
||||
>
|
||||
<option
|
||||
v-for="org in listOrgHeads"
|
||||
|
||||
@@ -4,6 +4,8 @@ import DetailsForm from "../Details/Form.js";
|
||||
import CoreTag from '../../Tag/Tag.js';
|
||||
import { tagHeaderFilter } from '../../../../js/tabulator/filters/extendedHeaderFilter.js';
|
||||
import { extendedHeaderFilter } from "../../../../js/tabulator/filters/extendedHeaderFilter.js";
|
||||
import { tagFormatter } from "../../../../js/tabulator/formatter/tags.js";
|
||||
import { addTagInTable, deleteTagInTable, updateTagInTable } from "../../../../js/helpers/TagHelper.js";
|
||||
|
||||
import ApiLv from "../../../api/lehrveranstaltung.js";
|
||||
import ApiTag from "../../../api/lehrveranstaltung/tag.js";
|
||||
@@ -223,72 +225,7 @@ export default {
|
||||
headerFilter: "input",
|
||||
headerFilterFunc: tagHeaderFilter,
|
||||
headerFilterFuncParams: {field: 'tags'},
|
||||
formatter: (cell) => {
|
||||
let tags = cell.getValue();
|
||||
if (!tags) return;
|
||||
|
||||
let container = document.createElement('div');
|
||||
container.className = "d-flex gap-1";
|
||||
|
||||
let parsedTags = JSON.parse(tags);
|
||||
let maxVisibleTags = 2;
|
||||
|
||||
const rowData = cell.getRow().getData();
|
||||
if (rowData._tagExpanded === undefined) {
|
||||
rowData._tagExpanded = false;
|
||||
}
|
||||
|
||||
const renderTags = () => {
|
||||
container.innerHTML = '';
|
||||
parsedTags = parsedTags.filter(item => item !== null);
|
||||
|
||||
parsedTags.sort((a, b) => {
|
||||
let adone = a.done ? 1 : 0;
|
||||
let bbone = b.done ? 1 : 0;
|
||||
|
||||
if (adone !== bbone)
|
||||
{
|
||||
return adone - bbone;
|
||||
}
|
||||
return b.id - a.id;
|
||||
});
|
||||
const tagsToShow = rowData._tagExpanded ? parsedTags : parsedTags.slice(0, maxVisibleTags);
|
||||
|
||||
tagsToShow.forEach(tag => {
|
||||
if (!tag) return;
|
||||
let tagElement = document.createElement('span');
|
||||
tagElement.innerText = tag.beschreibung;
|
||||
tagElement.title = tag.notiz;
|
||||
tagElement.className = "tag " + tag.style;
|
||||
if (tag.done) tagElement.className += " tag_done";
|
||||
|
||||
tagElement.addEventListener('click', (event) => {
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
this.$refs.tagComponent.editTag(tag.id);
|
||||
});
|
||||
|
||||
container.appendChild(tagElement);
|
||||
});
|
||||
|
||||
if (parsedTags.length > maxVisibleTags) {
|
||||
let toggle = document.createElement('button');
|
||||
toggle.innerText = (rowData._tagExpanded ? '- ' : '+ ') + (parsedTags.length - maxVisibleTags);
|
||||
toggle.className = "display_all";
|
||||
toggle.title = rowData._tagExpanded ? "Tags ausblenden" : "Tags einblenden";
|
||||
|
||||
toggle.addEventListener('click', () => {
|
||||
rowData._tagExpanded = !rowData._tagExpanded;
|
||||
renderTags();
|
||||
});
|
||||
|
||||
container.appendChild(toggle);
|
||||
}
|
||||
};
|
||||
|
||||
renderTags();
|
||||
return container;
|
||||
},
|
||||
formatter: (cell) => tagFormatter(cell, this.$refs.tagComponent),
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
@@ -444,104 +381,16 @@ export default {
|
||||
},
|
||||
addedTag(addedTag)
|
||||
{
|
||||
const table = this.$refs.table.tabulator;
|
||||
|
||||
this.selectedRows.forEach(row =>
|
||||
{
|
||||
if (Array.isArray(addedTag.response))
|
||||
{
|
||||
addedTag.response.forEach(tag => {
|
||||
const targetRow = this.allRows.find(row => row.getData().lehreinheit_id === tag.lehreinheit_id);
|
||||
if (targetRow)
|
||||
{
|
||||
const rowData = targetRow.getData();
|
||||
let tags = [];
|
||||
try {
|
||||
tags = JSON.parse(rowData.tags || '[]');
|
||||
} catch (e) {}
|
||||
|
||||
const tagExists = tags.some((t) => t.id === tag.id);
|
||||
if (!tagExists)
|
||||
{
|
||||
addedTag.id = tag.id;
|
||||
tags.unshift({ ...addedTag });
|
||||
targetRow.update({ tags: JSON.stringify(tags) });
|
||||
targetRow.reformat();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
addTagInTable(addedTag, this.allRows, 'lehreinheit_id')
|
||||
},
|
||||
deletedTag(deletedTag) {
|
||||
const targetRow = this.allRows.find(row => {
|
||||
const rowData = row.getData();
|
||||
|
||||
let tags = [];
|
||||
try {
|
||||
tags = JSON.parse(rowData.tags || '[]');
|
||||
} catch (e) {}
|
||||
|
||||
return tags.some(tag => tag.id === deletedTag);
|
||||
});
|
||||
|
||||
if (targetRow) {
|
||||
const rowData = targetRow.getData();
|
||||
let tags = [];
|
||||
|
||||
try {
|
||||
tags = JSON.parse(rowData.tags || '[]');
|
||||
} catch (e) {}
|
||||
|
||||
const filteredTags = tags.filter(t => t.id !== deletedTag);
|
||||
const updatedTags = JSON.stringify(filteredTags);
|
||||
|
||||
if (updatedTags !== rowData.tags) {
|
||||
targetRow.update({
|
||||
tags: updatedTags
|
||||
});
|
||||
|
||||
targetRow.reformat();
|
||||
}
|
||||
}
|
||||
deletedTag(deletedTag)
|
||||
{
|
||||
deleteTagInTable(deletedTag, this.allRows);
|
||||
},
|
||||
|
||||
updatedTag(updatedTag) {
|
||||
const targetRow = this.allRows.find(row => {
|
||||
const rowData = row.getData();
|
||||
let tags = [];
|
||||
|
||||
try {
|
||||
tags = JSON.parse(rowData.tags || '[]');
|
||||
} catch (e) {}
|
||||
|
||||
return tags.some(t => t?.id === updatedTag.id);
|
||||
});
|
||||
|
||||
if (targetRow)
|
||||
{
|
||||
const rowData = targetRow.getData();
|
||||
let tags = [];
|
||||
try {
|
||||
tags = JSON.parse(rowData.tags || '[]');
|
||||
} catch (e) {}
|
||||
|
||||
let changed = false;
|
||||
|
||||
const tagIndex = tags.findIndex(tag => tag?.id === updatedTag.id);
|
||||
if (tagIndex !== -1) {
|
||||
tags[tagIndex] = { ...updatedTag };
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (changed)
|
||||
{
|
||||
targetRow.update({
|
||||
tags: JSON.stringify(tags),
|
||||
});
|
||||
targetRow.reformat();
|
||||
}
|
||||
}
|
||||
updatedTag(updatedTag)
|
||||
{
|
||||
updateTagInTable(updatedTag, this.allRows);
|
||||
},
|
||||
async copyLehreinheit(row, art)
|
||||
{
|
||||
|
||||
@@ -47,6 +47,7 @@ export default {
|
||||
<fhc-tabs
|
||||
v-if="lv.length === 1"
|
||||
ref="tabs"
|
||||
:useprimevue="true"
|
||||
:modelValue="lv[0]"
|
||||
:config="configLVTabs"
|
||||
:default="$route.params.tab"
|
||||
|
||||
@@ -25,247 +25,11 @@ export default {
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: this.loadAjaxCall,
|
||||
ajaxParams: () => {
|
||||
return {
|
||||
id: this.id,
|
||||
type: this.typeId
|
||||
};
|
||||
},
|
||||
ajaxResponse: (url, params, response) => this.buildTreemap(response),
|
||||
columns: [
|
||||
{title: "subject", field: "subject", headerFilter: true},
|
||||
{title: "body", field: "body", formatter: "html", visible: false, headerFilter: true},
|
||||
{title: "message_id", field: "message_id", visible: false, headerFilter: true},
|
||||
{
|
||||
title: "Datum",
|
||||
field: "insertamum",
|
||||
headerFilter: true,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
const date = new Date(dateStr); // Convert to Date object
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
},
|
||||
headerFilterFunc(headerValue, rowValue) {
|
||||
const matches = headerValue.match(/^(([0-9]{2})\.)?([0-9]{2})\.([0-9]{4})?$/);
|
||||
let comparestr = headerValue;
|
||||
if(matches !== null) {
|
||||
const year = (matches[4] !== undefined) ? matches[4] : '';
|
||||
const month = matches[3];
|
||||
const day = (matches[2] !== undefined) ? matches[2] : '';
|
||||
comparestr = year + '-' + month + '-' + day;
|
||||
}
|
||||
return rowValue.match(comparestr);
|
||||
}
|
||||
},
|
||||
{title: "sender", field: "sender", headerFilter: true},
|
||||
{title: "recipient", field: "recipient", headerFilter: true},
|
||||
{title: "senderId", field: "sender_id", headerFilter: true},
|
||||
{title: "recipientId", field: "recipient_id", headerFilter: true},
|
||||
{title: "Relationmessage ID", field: "relationmessage_id", headerFilter: true},
|
||||
{
|
||||
title: "Status",
|
||||
field: "status",
|
||||
headerFilter: true,
|
||||
formatterParams: [
|
||||
"unread",
|
||||
"read",
|
||||
"archived",
|
||||
"deleted"
|
||||
],
|
||||
formatter: (cell, formatterParams) => {
|
||||
return formatterParams[cell.getValue()];
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "letzte Änderung",
|
||||
field: "statusdatum",
|
||||
headerFilter: true,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
const date = new Date(dateStr); // Convert to Date object
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
},
|
||||
headerFilterFunc(headerValue, rowValue) {
|
||||
const matches = headerValue.match(/^(([0-9]{2})\.)?([0-9]{2})\.([0-9]{4})?$/);
|
||||
let comparestr = headerValue;
|
||||
if(matches !== null) {
|
||||
const year = (matches[4] !== undefined) ? matches[4] : '';
|
||||
const month = matches[3];
|
||||
const day = (matches[2] !== undefined) ? matches[2] : '';
|
||||
comparestr = year + '-' + month + '-' + day;
|
||||
}
|
||||
return rowValue.match(comparestr);
|
||||
}
|
||||
},
|
||||
{
|
||||
title: 'Aktionen', field: 'actions',
|
||||
width: 100,
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let container = document.createElement('div');
|
||||
container.className = "d-flex gap-2";
|
||||
|
||||
let button = document.createElement('button');
|
||||
if (this.personId != cell.getData().sender_id) {
|
||||
button.disabled = true;
|
||||
button.style = "visibility: hidden";
|
||||
button.ariaHidden = true;
|
||||
}
|
||||
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.title = this.$p.t('global', 'reply');
|
||||
button.innerHTML = '<i class="fa fa-reply"></i>';
|
||||
button.addEventListener(
|
||||
'click',
|
||||
(event) =>
|
||||
this.actionReplyToMessage(cell.getData().message_id)
|
||||
);
|
||||
|
||||
container.append(button);
|
||||
|
||||
button = document.createElement('button');
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.title = this.$p.t('ui', 'loeschen');
|
||||
button.innerHTML = '<i class="fa fa-xmark"></i>';
|
||||
button.addEventListener(
|
||||
'click',
|
||||
() =>
|
||||
this.actionDeleteMessage(cell.getData().message_id)
|
||||
);
|
||||
container.append(button);
|
||||
|
||||
return container;
|
||||
},
|
||||
frozen: true
|
||||
}
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: '400',
|
||||
selectable: 1,
|
||||
selectableRangeMode: 'click',
|
||||
index: 'message_id',
|
||||
pagination: true,
|
||||
paginationMode: "remote",
|
||||
paginationSize: 15,
|
||||
paginationInitialPage: 1,
|
||||
dataTree: true,
|
||||
headerSort: true,
|
||||
dataTreeChildField: "children",
|
||||
dataTreeCollapseElement:"<i class='fas fa-minus-square'></i>",
|
||||
dataTreeChildIndent: 15,
|
||||
dataTreeStartExpanded: false,
|
||||
persistenceID: 'core-message-2025112401',
|
||||
locale: 'de',
|
||||
"langs": {
|
||||
"de":{ //German language definition
|
||||
"data":{
|
||||
"loading":"Lädt", //data loader text
|
||||
"error":"Fehler", //data error text
|
||||
},
|
||||
"pagination":{
|
||||
"first":"Erste",
|
||||
"first_title":"Erste Seite",
|
||||
"last":"Letzte",
|
||||
"last_title":"Letzte Seite",
|
||||
"prev":"Vorige",
|
||||
"prev_title":"Vorige Seite",
|
||||
"next":"Nächste",
|
||||
"next_title":"Nächste Seite",
|
||||
"all":"Alle"
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
tabulatorEvents: [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['global', 'person', 'stv', 'messages', 'ui', 'notiz']);
|
||||
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
|
||||
cm.getColumnByField('subject').component.updateDefinition({
|
||||
title: this.$p.t('global', 'betreff')
|
||||
});
|
||||
cm.getColumnByField('body').component.updateDefinition({
|
||||
title: this.$p.t('messages', 'body')
|
||||
});
|
||||
cm.getColumnByField('message_id').component.updateDefinition({
|
||||
title: this.$p.t('messages', 'message_id')
|
||||
});
|
||||
cm.getColumnByField('insertamum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'datum')
|
||||
});
|
||||
cm.getColumnByField('sender').component.updateDefinition({
|
||||
title: this.$p.t('messages', 'sender')
|
||||
});
|
||||
cm.getColumnByField('recipient').component.updateDefinition({
|
||||
title: this.$p.t('messages', 'recipient')
|
||||
});
|
||||
cm.getColumnByField('sender_id').component.updateDefinition({
|
||||
title: this.$p.t('messages', 'senderId')
|
||||
});
|
||||
cm.getColumnByField('recipient_id').component.updateDefinition({
|
||||
title: this.$p.t('messages', 'recipientId')
|
||||
});
|
||||
cm.getColumnByField('statusdatum').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'letzte_aenderung')
|
||||
});
|
||||
cm.getColumnByField('status').component.updateDefinition({
|
||||
formatterParams: [
|
||||
this.$p.t('messages/unread'),
|
||||
this.$p.t('messages/read'),
|
||||
this.$p.t('messages/archived'),
|
||||
this.$p.t('messages/deleted')
|
||||
]
|
||||
});
|
||||
this.$refs.table.tabulator.rowManager.getDisplayRows();
|
||||
/*
|
||||
cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});
|
||||
*/
|
||||
this.$emit('tabulator_tablebuilt');
|
||||
}
|
||||
},
|
||||
{
|
||||
event: 'rowClick',
|
||||
handler: (e, row) => {
|
||||
const selectedMessage = row.getData().message_id;
|
||||
const body = row.getData().body;
|
||||
this.previewBody = body;
|
||||
}
|
||||
},
|
||||
/*
|
||||
{
|
||||
event: 'pageLoaded',
|
||||
handler: (pageno) => {
|
||||
this.pageNo = pageno+1;
|
||||
}
|
||||
}
|
||||
*/
|
||||
],
|
||||
previewBody: "",
|
||||
open: false,
|
||||
personId: null,
|
||||
layoutColumnsOnNewData: false,
|
||||
height: '400',
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -339,10 +103,10 @@ export default {
|
||||
}
|
||||
});
|
||||
|
||||
// to avoid endless loop
|
||||
if (iteration > messages.length) break;
|
||||
// to avoid endless loop
|
||||
if (iteration > messages.length) break;
|
||||
}
|
||||
return {data: messageNested, last_page: last_page};
|
||||
return {data: messageNested, last_page: last_page};
|
||||
},
|
||||
loadAjaxCall(url, config, params){
|
||||
return this.$api.call(
|
||||
@@ -351,24 +115,231 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
statusText(){
|
||||
return {
|
||||
0: this.$p.t('messsages', 'unread'),
|
||||
1: this.$p.t('messsages', 'read'),
|
||||
2: this.$p.t('messsages', 'archived'),
|
||||
3: this.$p.t('messsages', 'deleted')
|
||||
}
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: this.loadAjaxCall,
|
||||
ajaxParams: () => {
|
||||
return {
|
||||
id: this.id,
|
||||
type: this.typeId
|
||||
};
|
||||
},
|
||||
ajaxResponse: (url, params, response) => this.buildTreemap(response),
|
||||
layout: 'fitDataStretchFrozen',
|
||||
index: 'message_id',
|
||||
persistenceID: 'core-message-20260217',
|
||||
selectableRows: 1,
|
||||
selectableRowsRangeMode: 'click',
|
||||
columns: [
|
||||
{title: "subject", field: "subject", headerFilter: true},
|
||||
{title: "body", field: "body", formatter: "html", visible: false, headerFilter: true},
|
||||
{title: "message_id", field: "message_id", visible: false, headerFilter: true},
|
||||
{
|
||||
title: "Datum",
|
||||
field: "insertamum",
|
||||
headerFilter: true,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
const date = new Date(dateStr); // Convert to Date object
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
},
|
||||
headerFilterFunc(headerValue, rowValue) {
|
||||
const matches = headerValue.match(/^(([0-9]{2})\.)?([0-9]{2})\.([0-9]{4})?$/);
|
||||
let comparestr = headerValue;
|
||||
if(matches !== null) {
|
||||
const year = (matches[4] !== undefined) ? matches[4] : '';
|
||||
const month = matches[3];
|
||||
const day = (matches[2] !== undefined) ? matches[2] : '';
|
||||
comparestr = year + '-' + month + '-' + day;
|
||||
}
|
||||
return rowValue.match(comparestr);
|
||||
}
|
||||
},
|
||||
{title: "sender", field: "sender", headerFilter: true},
|
||||
{title: "recipient", field: "recipient", headerFilter: true},
|
||||
{title: "senderId", field: "sender_id", headerFilter: true},
|
||||
{title: "recipientId", field: "recipient_id", headerFilter: true},
|
||||
{title: "Relationmessage ID", field: "relationmessage_id", headerFilter: true},
|
||||
{
|
||||
title: "Status",
|
||||
field: "status",
|
||||
headerFilter: true,
|
||||
formatterParams: [
|
||||
"unread",
|
||||
"read",
|
||||
"archived",
|
||||
"deleted"
|
||||
],
|
||||
formatter: (cell, formatterParams) => {
|
||||
const key = formatterParams[cell.getValue()];
|
||||
return this.$p.t('messages', key);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "letzte Änderung",
|
||||
field: "statusdatum",
|
||||
headerFilter: true,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
const date = new Date(dateStr); // Convert to Date object
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
},
|
||||
headerFilterFunc(headerValue, rowValue) {
|
||||
const matches = headerValue.match(/^(([0-9]{2})\.)?([0-9]{2})\.([0-9]{4})?$/);
|
||||
let comparestr = headerValue;
|
||||
if(matches !== null) {
|
||||
const year = (matches[4] !== undefined) ? matches[4] : '';
|
||||
const month = matches[3];
|
||||
const day = (matches[2] !== undefined) ? matches[2] : '';
|
||||
comparestr = year + '-' + month + '-' + day;
|
||||
}
|
||||
return rowValue.match(comparestr);
|
||||
}
|
||||
},
|
||||
{
|
||||
title: 'Aktionen', field: 'actions',
|
||||
width: 100,
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let container = document.createElement('div');
|
||||
container.className = "d-flex gap-2";
|
||||
|
||||
let button = document.createElement('button');
|
||||
if (this.personId != cell.getData().sender_id) {
|
||||
button.disabled = true;
|
||||
button.style = "visibility: hidden";
|
||||
button.ariaHidden = true;
|
||||
}
|
||||
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.title = this.$p.t('global', 'reply');
|
||||
button.innerHTML = '<i class="fa fa-reply"></i>';
|
||||
button.addEventListener(
|
||||
'click',
|
||||
(event) =>
|
||||
this.actionReplyToMessage(cell.getData().message_id)
|
||||
);
|
||||
|
||||
container.append(button);
|
||||
|
||||
button = document.createElement('button');
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.title = this.$p.t('ui', 'loeschen');
|
||||
button.innerHTML = '<i class="fa fa-xmark"></i>';
|
||||
button.addEventListener(
|
||||
'click',
|
||||
() =>
|
||||
this.actionDeleteMessage(cell.getData().message_id)
|
||||
);
|
||||
container.append(button);
|
||||
|
||||
return container;
|
||||
},
|
||||
frozen: true
|
||||
}
|
||||
],
|
||||
pagination: true,
|
||||
paginationMode: "remote",
|
||||
paginationSize: 15,
|
||||
paginationInitialPage: 1,
|
||||
dataTree: true,
|
||||
headerSort: true,
|
||||
dataTreeChildField: "children",
|
||||
dataTreeCollapseElement:"<i class='fas fa-minus-square'></i>",
|
||||
dataTreeChildIndent: 15,
|
||||
dataTreeStartExpanded: false,
|
||||
locale: 'de',
|
||||
"langs": {
|
||||
"de":{ //German language definition
|
||||
"data":{
|
||||
"loading":"Lädt", //data loader text
|
||||
"error":"Fehler", //data error text
|
||||
},
|
||||
"pagination":{
|
||||
"first":"Erste",
|
||||
"first_title":"Erste Seite",
|
||||
"last":"Letzte",
|
||||
"last_title":"Letzte Seite",
|
||||
"prev":"Vorige",
|
||||
"prev_title":"Vorige Seite",
|
||||
"next":"Nächste",
|
||||
"next_title":"Nächste Seite",
|
||||
"all":"Alle"
|
||||
},
|
||||
},
|
||||
}
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['global', 'person', 'stv', 'messages', 'ui', 'notiz']);
|
||||
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('subject', this.$p.t('global', 'betreff'));
|
||||
setHeader('body', this.$p.t('messages', 'body'));
|
||||
setHeader('message_id', this.$p.t('messages', 'message_id'));
|
||||
setHeader('insertamum', this.$p.t('global', 'datum'));
|
||||
setHeader('sender', this.$p.t('messages', 'sender'));
|
||||
setHeader('recipient', this.$p.t('messages', 'recipient'));
|
||||
setHeader('sender_id', this.$p.t('messages', 'senderId'));
|
||||
setHeader('recipient_id', this.$p.t('messages', 'recipientId'));
|
||||
setHeader('statusdatum', this.$p.t('notiz', 'letzte_aenderung'));
|
||||
|
||||
this.$refs.table.tabulator.rowManager.getDisplayRows();
|
||||
this.$emit('tabulator_tablebuilt');
|
||||
}
|
||||
},
|
||||
{
|
||||
event: 'rowClick',
|
||||
handler: (e, row) => {
|
||||
const selectedMessage = row.getData().message_id;
|
||||
const body = row.getData().body;
|
||||
this.previewBody = body;
|
||||
}
|
||||
},
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
// change to target="_blank"
|
||||
/* this.$nextTick(() => {
|
||||
const links = document.querySelectorAll('.preview a');
|
||||
links.forEach(link => {
|
||||
link.setAttribute('target', '_blank');
|
||||
link.setAttribute('rel', 'noopener noreferrer'); // Sicherheitsmaßnahme
|
||||
});
|
||||
});*/
|
||||
/* this.$nextTick(() => {
|
||||
const links = document.querySelectorAll('.preview a');
|
||||
links.forEach(link => {
|
||||
link.setAttribute('target', '_blank');
|
||||
link.setAttribute('rel', 'noopener noreferrer'); // Sicherheitsmaßnahme
|
||||
});
|
||||
});*/
|
||||
},
|
||||
created(){
|
||||
if(this.typeId != 'person_id' && Array.isArray(this.id) && this.id.length === 1) {
|
||||
@@ -383,6 +354,7 @@ export default {
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
}
|
||||
|
||||
},
|
||||
template: `
|
||||
<div class="messages-detail-table">
|
||||
@@ -392,7 +364,7 @@ export default {
|
||||
|
||||
<div class="row">
|
||||
<!--table-->
|
||||
<div class="col-sm-6 pt-6">
|
||||
<div class="col-sm-6 pt-1">
|
||||
<core-filter-cmpt
|
||||
ref="table"
|
||||
:tabulator-options="tabulatorOptions"
|
||||
@@ -408,9 +380,9 @@ export default {
|
||||
</div>
|
||||
|
||||
<!--preview wysiwyg-window-->
|
||||
<div class="col-sm-6 pt-6">
|
||||
<br><br><br><br>
|
||||
<div ref="preview">
|
||||
<div class="col-sm-6 pt-5">
|
||||
<div class="msg-preview-spacer pt-2" aria-hidden="true"></div>
|
||||
<div ref="preview" class="bg-white">
|
||||
<div v-html="previewBody" class="p-3 border rounded overflow-scroll twoColumns"></div>
|
||||
</div>
|
||||
|
||||
@@ -452,4 +424,4 @@ export default {
|
||||
</div>
|
||||
`
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+138
-200
@@ -1,5 +1,4 @@
|
||||
import VueDatePicker from '../vueDatepicker.js.php';
|
||||
import PvAutoComplete from "../../../../index.ci.php/public/js/components/primevue/autocomplete/autocomplete.esm.min.js";
|
||||
import FormUploadDms from '../Form/Upload/Dms.js';
|
||||
import {CoreFilterCmpt} from "../filter/Filter.js";
|
||||
import BsModal from "../Bootstrap/Modal.js";
|
||||
@@ -11,7 +10,6 @@ export default {
|
||||
components: {
|
||||
CoreFilterCmpt,
|
||||
VueDatePicker,
|
||||
PvAutoComplete,
|
||||
FormUploadDms,
|
||||
FormForm,
|
||||
FormInput,
|
||||
@@ -50,7 +48,49 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
notizen: [],
|
||||
multiupload: true,
|
||||
mitarbeiter: [],
|
||||
filteredMitarbeiter: [],
|
||||
zwischenvar: '',
|
||||
editorInitialized: false,
|
||||
editor: null,
|
||||
notizData: {
|
||||
typeId: this.typeId,
|
||||
id: this.id,
|
||||
titel: null,
|
||||
statusNew: true,
|
||||
text: '',
|
||||
lastUpdate: null,
|
||||
von: null,
|
||||
bis: null,
|
||||
document: null,
|
||||
erledigt: false,
|
||||
verfasser: null,
|
||||
bearbeiter: null,
|
||||
anhang: []
|
||||
},
|
||||
showVariables: {
|
||||
showTitel: false,
|
||||
showText: false,
|
||||
showVerfasser: false,
|
||||
showBearbeiter: false,
|
||||
showVon: false,
|
||||
showBis: false,
|
||||
showDokumente: false,
|
||||
showErledigt: false,
|
||||
showNotiz_id: false,
|
||||
showNotizzuordnung_id: false,
|
||||
showType_id: false,
|
||||
showId: false,
|
||||
showLastupdate: false
|
||||
},
|
||||
currentVerfasserUid: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions: function() {
|
||||
return {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(this.endpoint.getNotizen(this.id, this.typeId)),
|
||||
ajaxParams: () => {
|
||||
@@ -65,6 +105,7 @@ export default {
|
||||
title: "Titel",
|
||||
field: "titel",
|
||||
width: 100,
|
||||
visible: this.showVariables.showTitel,
|
||||
tooltip:function(e, cell, onRendered){
|
||||
var el = document.createElement("div");
|
||||
el.style.backgroundColor = "white";
|
||||
@@ -87,6 +128,7 @@ export default {
|
||||
width: 250,
|
||||
formatter: "html",
|
||||
//clipContents: true,
|
||||
visible: this.showVariables.showText,
|
||||
tooltip:function(e, cell, onRendered){
|
||||
var el = document.createElement("div");
|
||||
el.style.backgroundColor = "white";
|
||||
@@ -101,18 +143,18 @@ export default {
|
||||
return el;
|
||||
},
|
||||
},
|
||||
{title: "VerfasserIn", field: "verfasser", width: 124},
|
||||
{title: "BearbeiterIn", field: "bearbeiter", width: 126},
|
||||
{title: "VerfasserIn", field: "verfasser", width: 124, visible: this.showVariables.showVerfasser},
|
||||
{title: "BearbeiterIn", field: "bearbeiter", width: 126, visible: this.showVariables.showBearbeiter},
|
||||
{title: "Verfasser UID", field: "verfasser_uid", width: 124, visible: false},
|
||||
{title: "Bearbeiter UID", field: "bearbeiter_uid", width: 126, visible: false},
|
||||
{title: "Start", field: "start_format", width: 86, visible: false},
|
||||
{title: "Ende", field: "ende_format", width: 86, visible: false},
|
||||
{title: "Dokumente", field: "countdoc", width: 100, visible: false},
|
||||
{title: "Start", field: "start_format", width: 86, visible: this.showVariables.showVon},
|
||||
{title: "Ende", field: "ende_format", width: 86, visible: this.showVariables.showBis},
|
||||
{title: "Dokumente", field: "countdoc", width: 100, visible: this.showVariables.showDokumente},
|
||||
{
|
||||
title: "Erledigt",
|
||||
field: "erledigt",
|
||||
width: 97,
|
||||
visible: false,
|
||||
visible: this.showVariables.showErledigt,
|
||||
formatter:"tickCross",
|
||||
hozAlign:"center",
|
||||
formatterParams: {
|
||||
@@ -120,15 +162,15 @@ export default {
|
||||
crossElement: '<i class="fa fa-xmark text-danger"></i>'
|
||||
}
|
||||
},
|
||||
{title: "Notiz_id", field: "notiz_id", width: 92, visible: false},
|
||||
{title: "Notizzuordnung_id", field: "notizzuordnung_id", width: 164, visible: false},
|
||||
{title: "type_id", field: "type_id", width: 164, visible: false},
|
||||
{title: "extension_id", field: "id", width: 135, visible: false},
|
||||
{title: "Notiz_id", field: "notiz_id", width: 92, visible: this.showVariables.showNotiz_id},
|
||||
{title: "Notizzuordnung_id", field: "notizzuordnung_id", width: 164, visible: this.showVariables.showNotizzuordnung_id},
|
||||
{title: "type_id", field: "type_id", width: 164, visible: this.showVariables.showType_id},
|
||||
{title: "extension_id", field: "id", width: 135, visible: this.showVariables.showId},
|
||||
{
|
||||
title: "letzte Änderung",
|
||||
title: "letzte Änderung",
|
||||
field: "lastupdate",
|
||||
width: 146,
|
||||
visible: false,
|
||||
visible: this.showVariables.showLastupdate,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
@@ -185,129 +227,60 @@ export default {
|
||||
index: 'notiz_id',
|
||||
persistenceID: this.tabulatorPersistenceId,
|
||||
persistence: {
|
||||
sort: false,
|
||||
sort: true,
|
||||
columns: ["width", "visible", "frozen"],
|
||||
filter: false,
|
||||
headerFilter: false,
|
||||
group: false,
|
||||
page: false,
|
||||
}
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
},
|
||||
tabulatorEvents: function () {
|
||||
return [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
|
||||
//to avoid js error
|
||||
if (!this.$refs.table) return;
|
||||
|
||||
await this.$p.loadCategory(['notiz', 'global', 'ui']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('verfasser').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'verfasser'),
|
||||
visible: this.showVariables.showVerfasser
|
||||
});
|
||||
cm.getColumnByField('verfasser_uid').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'verfasser_uid'),
|
||||
});
|
||||
cm.getColumnByField('titel').component.updateDefinition({
|
||||
title: this.$p.t('global', 'titel'),
|
||||
//visible: this.showVariables.showTitel
|
||||
});
|
||||
cm.getColumnByField('bearbeiter').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'bearbeiter'),
|
||||
visible: this.showVariables.showBearbeiter
|
||||
});
|
||||
cm.getColumnByField('bearbeiter_uid').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'bearbeiter_uid'),
|
||||
});
|
||||
cm.getColumnByField('start_format').component.updateDefinition({
|
||||
title: this.$p.t('global', 'gueltigVon'),
|
||||
visible: this.showVariables.showVon
|
||||
});
|
||||
cm.getColumnByField('ende_format').component.updateDefinition({
|
||||
title: this.$p.t('global', 'gueltigBis'),
|
||||
visible: this.showVariables.showBis
|
||||
});
|
||||
cm.getColumnByField('countdoc').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'document'),
|
||||
visible: this.showVariables.showDokumente
|
||||
});
|
||||
cm.getColumnByField('erledigt').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'erledigt'),
|
||||
visible: this.showVariables.showErledigt
|
||||
});
|
||||
cm.getColumnByField('lastupdate').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'letzte_aenderung'),
|
||||
visible: this.showVariables.showLastupdate
|
||||
});
|
||||
cm.getColumnByField('notiz_id').component.updateDefinition({
|
||||
visible: this.showVariables.showNotiz_id,
|
||||
title: this.$p.t('ui', 'notiz_id')
|
||||
});
|
||||
cm.getColumnByField('notizzuordnung_id').component.updateDefinition({
|
||||
visible: this.showVariables.showNotizzuordnung_id,
|
||||
title: this.$p.t('ui', 'notizzuordnung_id')
|
||||
});
|
||||
cm.getColumnByField('type_id').component.updateDefinition({
|
||||
visible: this.showVariables.showType_id,
|
||||
title: this.$p.t('ui', 'type_id')
|
||||
});
|
||||
cm.getColumnByField('id').component.updateDefinition({
|
||||
visible: this.showVariables.showId,
|
||||
title: this.$p.t('ui', 'extension_id')
|
||||
});
|
||||
cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('text_stripped').component.updateDefinition({
|
||||
title: this.$p.t('global', 'text'),
|
||||
width: 250,
|
||||
tooltip: true,
|
||||
//clipContents: true,
|
||||
});
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('verfasser', this.$p.t('notiz', 'verfasser'));
|
||||
setHeader('verfasser_uid', this.$p.t('ui', 'verfasser_uid'));
|
||||
setHeader('titel', this.$p.t('global', 'titel'));
|
||||
setHeader('bearbeiter', this.$p.t('notiz', 'bearbeiter'));
|
||||
setHeader('bearbeiter_uid', this.$p.t('ui', 'bearbeiter_uid'));
|
||||
setHeader('start_format', this.$p.t('global', 'gueltigVon'));
|
||||
setHeader('ende_format', this.$p.t('global', 'gueltigBis'));
|
||||
setHeader('countdoc', this.$p.t('notiz', 'document'));
|
||||
setHeader('erledigt', this.$p.t('notiz', 'erledigt'));
|
||||
setHeader('lastupdate', this.$p.t('notiz', 'letzte_aenderung'));
|
||||
setHeader('notiz_id', this.$p.t('ui', 'notiz_id'));
|
||||
setHeader('notizzuordnung_id', this.$p.t('ui', 'notizzuordnung_id'));
|
||||
setHeader('type_id', this.$p.t('ui', 'type_id'));
|
||||
setHeader('id', this.$p.t('ui', 'extension_id'));
|
||||
setHeader('text_stripped', this.$p.t('global', 'text'));
|
||||
|
||||
// Force layout recalculation for handling overflow text
|
||||
this.$refs.table.tabulator.redraw(true);
|
||||
}
|
||||
}
|
||||
],
|
||||
notizen: [],
|
||||
multiupload: true,
|
||||
mitarbeiter: [],
|
||||
filteredMitarbeiter: [],
|
||||
zwischenvar: '',
|
||||
editorInitialized: false,
|
||||
editor: null,
|
||||
notizData: {
|
||||
typeId: this.typeId,
|
||||
titel: null,
|
||||
statusNew: true,
|
||||
text: '',
|
||||
lastUpdate: null,
|
||||
von: null,
|
||||
bis: null,
|
||||
document: null,
|
||||
erledigt: false,
|
||||
verfasser: null,
|
||||
bearbeiter: null,
|
||||
anhang: []
|
||||
},
|
||||
showVariables: {
|
||||
showTitel: false,
|
||||
showText: false,
|
||||
showVerfasser: false,
|
||||
showBearbeiter: false,
|
||||
showVon: false,
|
||||
showBis: false,
|
||||
showDokumente: false,
|
||||
showErledigt: false,
|
||||
showNotiz_id: false,
|
||||
showNotizzuordnung_id: false,
|
||||
showType_id: false,
|
||||
showId: false,
|
||||
showLastupdate: false
|
||||
}
|
||||
];
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -335,8 +308,6 @@ export default {
|
||||
this.notizData.bis = this.notizen.ende;
|
||||
this.notizData.document = this.notizen.dms_id;
|
||||
this.notizData.erledigt = this.notizen.erledigt;
|
||||
this.notizData.verfasser = this.notizen.verfasser_uid;
|
||||
this.notizData.intVerfasser = this.notizen.verfasser_uid;
|
||||
this.notizData.intBearbeiter = this.notizen.bearbeiter_uid;
|
||||
this.notizData.bearbeiter = this.notizen.bearbeiter_uid;
|
||||
}
|
||||
@@ -359,6 +330,7 @@ export default {
|
||||
},
|
||||
addNewNotiz() {
|
||||
const formData = new FormData();
|
||||
this.notizData.id = this.id;
|
||||
|
||||
formData.append('data', JSON.stringify(this.notizData));
|
||||
Object.entries(this.notizData.anhang).forEach(([k, v]) => formData.append(k, v));
|
||||
@@ -402,6 +374,7 @@ export default {
|
||||
this.notizData = result.data;
|
||||
this.notizData.typeId = this.typeId;
|
||||
this.notizData.anhang = [];
|
||||
this.currentVerfasserUid = result.data.verfasser_uid;
|
||||
return result;
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
@@ -455,16 +428,17 @@ export default {
|
||||
bis: null,
|
||||
document: null,
|
||||
erledigt: false,
|
||||
verfasser: this.uid,
|
||||
bearbeiter: null,
|
||||
anhang: []
|
||||
anhang: [],
|
||||
};
|
||||
this.currentVerfasserUid = this.uid
|
||||
},
|
||||
getUid() {
|
||||
return this.$api
|
||||
.call(this.endpoint.getUid())
|
||||
.then(result => {
|
||||
this.notizData.intVerfasser = result.data;
|
||||
this.currentVerfasserUid = result.data;
|
||||
this.uid = result.data;
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
@@ -547,14 +521,7 @@ export default {
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
'notizData.intVerfasser': {
|
||||
handler(newVal) {
|
||||
if (typeof newVal === 'object') {
|
||||
this.notizData.verfasser = newVal.mitarbeiter_uid;
|
||||
}
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
|
||||
id() {
|
||||
this.reload();
|
||||
}
|
||||
@@ -654,24 +621,23 @@ export default {
|
||||
<div class="row mb-3">
|
||||
<label for="bis" class="form-label col-sm-2">{{$p.t('notiz','verfasser')}}</label>
|
||||
|
||||
<div v-if="notizData.verfasser_uid" class="col-sm-3">
|
||||
<input type="text" :readonly="readonly" class="form-control" id="name" v-model="notizData.verfasser_uid">
|
||||
</div>
|
||||
<div v-else class="col-sm-3">
|
||||
<PvAutoComplete v-model="notizData.intVerfasser" optionLabel="mitarbeiter" :suggestions="filteredMitarbeiter" @complete="search" minLength="3"/>
|
||||
<div class="col-sm-3">
|
||||
<input type="text" readonly="readonly" class="form-control" id="name" v-model="currentVerfasserUid">
|
||||
</div>
|
||||
|
||||
<label for="von" class="form-label col-sm-1">{{$p.t('global','gueltigVon')}}</label>
|
||||
<div class="col-sm-3">
|
||||
<vue-date-picker
|
||||
id="von"
|
||||
v-model="notizData.start"
|
||||
clearable="false"
|
||||
<form-input
|
||||
type="DatePicker"
|
||||
v-model="notizData['start']"
|
||||
name="von"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
format="dd.MM.yyyy"
|
||||
preview-format="dd.MM.yyyy"
|
||||
:teleport="true"
|
||||
preview-format="dd.MM.yyyy"></vue-date-picker>
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -679,26 +645,35 @@ export default {
|
||||
<label for="bis" class="form-label col-sm-2">{{$p.t('notiz','bearbeiter')}}</label>
|
||||
|
||||
<div v-if="notizData.bearbeiter_uid" class="col-sm-3">
|
||||
<input type="text" :readonly="readonly" class="form-control" id="name" v-model="notizData.bearbeiter_uid">
|
||||
<input type="text" class="form-control" id="name" v-model="notizData.bearbeiter_uid">
|
||||
</div>
|
||||
|
||||
<div v-else class="col-sm-3">
|
||||
<PvAutoComplete v-model="notizData.intBearbeiter" optionLabel="mitarbeiter" :suggestions="filteredMitarbeiter" @complete="search" minlength="3"/>
|
||||
<form-input
|
||||
type="autocomplete"
|
||||
v-model="notizData.intBearbeiter"
|
||||
:suggestions="filteredMitarbeiter"
|
||||
@complete="search"
|
||||
optionLabel="mitarbeiter"
|
||||
minlength="3"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
|
||||
|
||||
<label for="bis" class="form-label col-sm-1">{{$p.t('global','gueltigBis')}}</label>
|
||||
<div class="col-sm-3">
|
||||
<vue-date-picker
|
||||
id="bis"
|
||||
<form-input
|
||||
type="DatePicker"
|
||||
v-model="notizData.ende"
|
||||
clearable="false"
|
||||
name="bis"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
format="dd.MM.yyyy"
|
||||
preview-format="dd.MM.yyyy"
|
||||
:teleport="true"
|
||||
preview-format="dd.MM.yyyy">
|
||||
</vue-date-picker>
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -842,28 +817,15 @@ export default {
|
||||
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="notizData.verfasser_uid"
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'verfasser')"
|
||||
type="text"
|
||||
v-model="notizData.verfasser_uid"
|
||||
name="titel"
|
||||
readonly="readonly"
|
||||
v-model="currentVerfasserUid"
|
||||
name="verfasser"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
<form-input
|
||||
v-else
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'verfasser')"
|
||||
type="autocomplete"
|
||||
v-model="notizData.intVerfasser"
|
||||
:suggestions="filteredMitarbeiter"
|
||||
@complete="search"
|
||||
optionLabel="mitarbeiter"
|
||||
minLength="3"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
|
||||
<form-input
|
||||
v-if="notizData.bearbeiter_uid"
|
||||
container-class="col-6"
|
||||
@@ -1008,25 +970,12 @@ export default {
|
||||
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="notizData.verfasser_uid"
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'verfasser')"
|
||||
type="text"
|
||||
v-model="notizData.verfasser_uid"
|
||||
name="titel"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
<form-input
|
||||
v-else
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'verfasser')"
|
||||
type="autocomplete"
|
||||
v-model="notizData.intVerfasser"
|
||||
:suggestions="filteredMitarbeiter"
|
||||
@complete="search"
|
||||
optionLabel="mitarbeiter"
|
||||
minLength="3"
|
||||
readonly="readonly"
|
||||
v-model="currentVerfasserUid"
|
||||
name="verfasser"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
@@ -1195,33 +1144,21 @@ export default {
|
||||
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="notizData.verfasser_uid"
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'verfasser')"
|
||||
type="text"
|
||||
v-model="notizData.verfasser_uid"
|
||||
name="titel"
|
||||
readonly="readonly"
|
||||
v-model="currentVerfasserUid"
|
||||
name="verfasser"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
<form-input
|
||||
v-else
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'verfasser')"
|
||||
type="autocomplete"
|
||||
v-model="notizData.intVerfasser"
|
||||
:suggestions="filteredMitarbeiter"
|
||||
@complete="search"
|
||||
optionLabel="mitarbeiter"
|
||||
minLength="3"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
|
||||
<form-input
|
||||
v-if="notizData.bearbeiter_uid"
|
||||
container-class="col-6"
|
||||
:label="$p.t('notiz', 'bearbeiter')"
|
||||
v-model="notizData.bearbeiter_uid"
|
||||
name="bearbeiter"
|
||||
minlength="3"
|
||||
>
|
||||
</form-input>
|
||||
@@ -1235,6 +1172,7 @@ export default {
|
||||
:suggestions="filteredMitarbeiter"
|
||||
@complete="search"
|
||||
optionLabel="mitarbeiter"
|
||||
name="bearbeiter"
|
||||
minlength="3"
|
||||
>
|
||||
</form-input>
|
||||
@@ -1292,4 +1230,4 @@ export default {
|
||||
<p v-else>Kein Layout übergeben</p>
|
||||
</div>
|
||||
</div>`,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,6 +84,8 @@ export default {
|
||||
configShowAufnahmegruppen: this.config.showAufnahmegruppen,
|
||||
configAllowUebernahmePunkte: this.config.allowUebernahmePunkte,
|
||||
configUseReihungstestPunkte: this.config.useReihungstestPunkte,
|
||||
configHasExcludedAreas: this.config.hasExcludedAreas,
|
||||
configStvTagsEnabled: this.config.stvTagsEnabled,
|
||||
appConfig: Vue.computed(() => this.appconfig),
|
||||
hasZGVBakkPermission: this.permissions['student/editBakkZgv'],
|
||||
hasZGVMasterPermission: this.permissions['student/editMakkZgv'],
|
||||
@@ -94,6 +96,7 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
sidebarCollapsed: false,
|
||||
appconfig: {},
|
||||
configEndpoints: ApiStvConfig,
|
||||
selected: [],
|
||||
@@ -146,7 +149,8 @@ export default {
|
||||
sprachen: [],
|
||||
geschlechter: []
|
||||
},
|
||||
verbandEndpoint: ApiStvVerband
|
||||
verbandEndpoint: ApiStvVerband,
|
||||
filter: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -392,6 +396,7 @@ export default {
|
||||
}
|
||||
},
|
||||
onSearch(e) {
|
||||
this.deleteCustomFilter();
|
||||
const searchsettings = { ...this.$refs.searchbar.searchsettings };
|
||||
if (searchsettings.searchstr.length >= 2) {
|
||||
this.blurSearchbar();
|
||||
@@ -420,6 +425,12 @@ export default {
|
||||
this.$refs.searchbar.$refs.input.blur();
|
||||
this.$refs.searchbar.abort();
|
||||
this.$refs.searchbar.hideresult();
|
||||
},
|
||||
handleCustomFilter(filter){
|
||||
this.filter = filter;
|
||||
},
|
||||
deleteCustomFilter(){
|
||||
this.$refs.stvList.resetFilter();
|
||||
}
|
||||
},
|
||||
created() {
|
||||
@@ -494,12 +505,10 @@ export default {
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
mounted() {
|
||||
//Test manu Systemerror
|
||||
//FHC_JS_DATA_STORAGE_OBJECT.systemerror_mailto = 'ma0068@technikum-wien.at';this.$fhcAlert.handleSystemError(1);
|
||||
this.handlePersonUrl();
|
||||
},
|
||||
template: /* html */`
|
||||
<div class="stv">
|
||||
<div class="stv" :class="{ 'sidebar-collapsed': sidebarCollapsed }">
|
||||
<header class="navbar navbar-expand-lg navbar-dark bg-dark flex-md-nowrap p-0 shadow">
|
||||
<div class="col-md-4 col-lg-3 col-xl-2 d-flex align-items-center">
|
||||
<button
|
||||
@@ -514,6 +523,14 @@ export default {
|
||||
<span class="svg-icon svg-icon-apps"></span>
|
||||
</button>
|
||||
<a class="navbar-brand me-0" :href="stvRoot">StudVw: {{studiensemesterKurzbz}} {{studiengangKuerzel}}</a>
|
||||
<button
|
||||
class="btn btn-outline-light border-0 d-none d-md-inline-flex m-1 ms-auto"
|
||||
type="button"
|
||||
@click="sidebarCollapsed = !sidebarCollapsed"
|
||||
:aria-label="$p.t('ui/toggle_nav')"
|
||||
>
|
||||
<span class="fa-solid fa-list"></span>
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-outline-light border-0 d-md-none m-1 collapsed"
|
||||
@@ -625,10 +642,10 @@ export default {
|
||||
<main class="col-md-8 ms-sm-auto col-lg-9 col-xl-10">
|
||||
<vertical-split>
|
||||
<template #top>
|
||||
<stv-list ref="stvList" v-model:selected="selected" :studiengang-kz="studiengangKz" :studiensemester-kurzbz="studiensemesterKurzbz"></stv-list>
|
||||
<stv-list ref="stvList" v-model:selected="selected" :studiengang-kz="studiengangKz" :studiensemester-kurzbz="studiensemesterKurzbz" @filterActive="handleCustomFilter"></stv-list>
|
||||
</template>
|
||||
<template #bottom>
|
||||
<stv-details ref="details" :students="selected"></stv-details>
|
||||
<stv-details ref="details" :students="selected" @reload="reloadList"></stv-details>
|
||||
</template>
|
||||
</vertical-split>
|
||||
</main>
|
||||
|
||||
@@ -39,7 +39,19 @@ export default {
|
||||
return Object.fromEntries(Object.entries(this.configStudents).filter(([ , value ]) => !value.showOnlyWithUid));
|
||||
}
|
||||
return Object.fromEntries(Object.entries(this.configStudents).filter(([ , value ]) => !value.showOnlyWithUid && !value.showOnlyWithUid));
|
||||
}
|
||||
},
|
||||
tile_PersId(){
|
||||
let tile = this.students[0].person_id != null ? this.students[0].person_id : '-';
|
||||
return tile;
|
||||
},
|
||||
tile_MatrNr(){
|
||||
let tile = this.students[0].matr_nr != null ? this.students[0].matr_nr : '-';
|
||||
return tile;
|
||||
},
|
||||
tile_PersKz(){
|
||||
let tile = this.students[0].matrikelnr != null ? this.students[0].matrikelnr : '-';
|
||||
return tile;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
'$p.user_language.value'(n, o) {
|
||||
@@ -65,7 +77,10 @@ export default {
|
||||
reload() {
|
||||
if (this.$refs.tabs?.$refs?.current?.reload)
|
||||
this.$refs.tabs.$refs.current.reload();
|
||||
}
|
||||
},
|
||||
reloadList() {
|
||||
this.$emit('reload');
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.loadConfig();
|
||||
@@ -79,7 +94,16 @@ export default {
|
||||
<fhc-header
|
||||
:headerData="students"
|
||||
typeHeader="student"
|
||||
@reload="reloadList"
|
||||
fotoEditable
|
||||
>
|
||||
<template #uid>{{students[0].uid}}</template>
|
||||
<template #titleAlphaTile>PersID</template>
|
||||
<template #valueAlphaTile>{{tile_PersId}}</template>
|
||||
<template #titleBetaTile>MatrNr</template>
|
||||
<template #valueBetaTile>{{tile_MatrNr}}</template>
|
||||
<template #titleGammaTile>PersKz</template>
|
||||
<template #valueGammaTile>{{tile_PersKz}}</template>
|
||||
</fhc-header>
|
||||
<fhc-tabs
|
||||
v-if="students.length == 1"
|
||||
|
||||
+107
-121
@@ -34,43 +34,61 @@ export default {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
studentUids() {
|
||||
if (this.student.uid)
|
||||
{
|
||||
return [this.student.uid];
|
||||
}
|
||||
return this.student.map(e => e.uid);
|
||||
},
|
||||
studentKzs(){
|
||||
if (this.student.uid)
|
||||
{
|
||||
return [this.student.studiengang_kz];
|
||||
}
|
||||
return this.student.map(e => e.studiengang_kz);
|
||||
},
|
||||
stg_kz(){
|
||||
return this.studentKzs[0];
|
||||
},
|
||||
showAllFormats() {
|
||||
if( this.isBerechtigtDocAndOdt === false
|
||||
|| !Array.isArray(this.isBerechtigtDocAndOdt) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
let retval = this.isBerechtigtDocAndOdt.includes(this.stgInfo.oe_kurzbz);
|
||||
return retval;
|
||||
}
|
||||
},
|
||||
props: {
|
||||
student: Object
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
tabulatorData: [],
|
||||
lastSelected: null,
|
||||
formData: {
|
||||
typStg: null,
|
||||
pruefungstyp_kurzbz: null,
|
||||
akadgrad_id: null,
|
||||
vorsitz: null,
|
||||
pruefungsantritt_kurzbz: null,
|
||||
abschlussbeurteilung_kurzbz: null,
|
||||
datum: null,
|
||||
sponsion: null,
|
||||
pruefer1: null,
|
||||
pruefer2: null,
|
||||
pruefer3: null,
|
||||
anmerkung: null,
|
||||
protokoll: null,
|
||||
note: null,
|
||||
link: null
|
||||
},
|
||||
statusNew: true,
|
||||
arrTypen: [],
|
||||
arrAntritte: [],
|
||||
arrBeurteilungen: [],
|
||||
arrAkadGrad: [],
|
||||
arrNoten: [],
|
||||
selectedVorsitz: null,
|
||||
filteredMitarbeiter: [],
|
||||
filteredPersons: [],
|
||||
selectedPruefer1: null,
|
||||
selectedPruefer2: null,
|
||||
selectedPruefer3: null,
|
||||
stgInfo: { typ: '', oe_kurzbz: '' },
|
||||
abortController: {
|
||||
mitarbeiter: null,
|
||||
persons: null
|
||||
},
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
minHeight: '200',
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(ApiStvAbschlusspruefung.getAbschlusspruefung(this.student.uid)),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
index: 'abschlusspruefung_id',
|
||||
persistenceID: 'stv-details-finalexam-20260217',
|
||||
columns: [
|
||||
{title: "vorsitz", field: "vorsitz_nachname"},
|
||||
{title: "abschlussbeurteilung", field: "beurteilung_bezeichnung"},
|
||||
@@ -163,14 +181,11 @@ export default {
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
minHeight: '200',
|
||||
index: 'abschlusspruefung_id',
|
||||
persistenceID: 'stv-details-finalexam-2025112401'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'dataLoaded',
|
||||
handler: data => this.tabulatorData = data.map(item => {
|
||||
@@ -181,94 +196,66 @@ export default {
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
if (!this.$refs.table) return;
|
||||
|
||||
await this.$p.loadCategory(['global', 'person', 'stv', 'abschlusspruefung', 'ui']);
|
||||
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('vorsitz_nachname').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'vorsitz_header')
|
||||
});
|
||||
cm.getColumnByField('beurteilung_bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'abschlussbeurteilung')
|
||||
});
|
||||
cm.getColumnByField('p1_nachname').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'pruefer1')
|
||||
});
|
||||
cm.getColumnByField('p2_nachname').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'pruefer2')
|
||||
});
|
||||
cm.getColumnByField('p3_nachname').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'pruefer3')
|
||||
});
|
||||
cm.getColumnByField('datum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'datum')
|
||||
});
|
||||
cm.getColumnByField('uhrzeit').component.updateDefinition({
|
||||
title: this.$p.t('global', 'uhrzeit')
|
||||
});
|
||||
cm.getColumnByField('freigabedatum').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'freigabe')
|
||||
});
|
||||
cm.getColumnByField('antritt_bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'pruefungsantritt')
|
||||
});
|
||||
cm.getColumnByField('sponsion').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'sponsion')
|
||||
});
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('pruefungstyp_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('global', 'typ')
|
||||
});
|
||||
cm.getColumnByField('abschlusspruefung_id').component.updateDefinition({
|
||||
title: this.$p.t('abschlusspruefung', 'abschlusspruefung_id')
|
||||
});
|
||||
/*
|
||||
cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});
|
||||
*/
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('vorsitz_nachname', this.$p.t('abschlusspruefung', 'vorsitz_header'));
|
||||
setHeader('beurteilung_bezeichnung', this.$p.t('abschlusspruefung', 'abschlussbeurteilung'));
|
||||
setHeader('p1_nachname', this.$p.t('abschlusspruefung', 'pruefer1'));
|
||||
setHeader('p2_nachname', this.$p.t('abschlusspruefung', 'pruefer2'));
|
||||
setHeader('p3_nachname', this.$p.t('abschlusspruefung', 'pruefer3'));
|
||||
setHeader('datum', this.$p.t('global', 'datum'));
|
||||
setHeader('uhrzeit', this.$p.t('global', 'uhrzeit'));
|
||||
setHeader('freigabedatum', this.$p.t('abschlusspruefung', 'freigabe'));
|
||||
setHeader('antritt_bezeichnung', this.$p.t('abschlusspruefung', 'pruefungsantritt'));
|
||||
setHeader('sponsion', this.$p.t('abschlusspruefung', 'sponsion'));
|
||||
setHeader('anmerkung', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('pruefungstyp_kurzbz', this.$p.t('global', 'typ'));
|
||||
setHeader('abschlusspruefung_id', this.$p.t('abschlusspruefung', 'abschlusspruefung_id'));
|
||||
}
|
||||
}
|
||||
],
|
||||
tabulatorData: [],
|
||||
lastSelected: null,
|
||||
formData: {
|
||||
typStg: null,
|
||||
pruefungstyp_kurzbz: null,
|
||||
akadgrad_id: null,
|
||||
vorsitz: null,
|
||||
pruefungsantritt_kurzbz: null,
|
||||
abschlussbeurteilung_kurzbz: null,
|
||||
datum: null,
|
||||
sponsion: null,
|
||||
pruefer1: null,
|
||||
pruefer2: null,
|
||||
pruefer3: null,
|
||||
anmerkung: null,
|
||||
protokoll: null,
|
||||
note: null,
|
||||
link: null
|
||||
},
|
||||
statusNew: true,
|
||||
arrTypen: [],
|
||||
arrAntritte: [],
|
||||
arrBeurteilungen: [],
|
||||
arrAkadGrad: [],
|
||||
arrNoten: [],
|
||||
selectedVorsitz: null,
|
||||
filteredMitarbeiter: [],
|
||||
filteredPersons: [],
|
||||
selectedPruefer1: null,
|
||||
selectedPruefer2: null,
|
||||
selectedPruefer3: null,
|
||||
stgInfo: { typ: '', oe_kurzbz: '' },
|
||||
abortController: {
|
||||
mitarbeiter: null,
|
||||
persons: null
|
||||
},
|
||||
];
|
||||
return events;
|
||||
},
|
||||
studentUids() {
|
||||
if (this.student.uid)
|
||||
{
|
||||
return [this.student.uid];
|
||||
}
|
||||
return this.student.map(e => e.uid);
|
||||
},
|
||||
studentKzs(){
|
||||
if (this.student.uid)
|
||||
{
|
||||
return [this.student.studiengang_kz];
|
||||
}
|
||||
return this.student.map(e => e.studiengang_kz);
|
||||
},
|
||||
stg_kz(){
|
||||
return this.studentKzs[0];
|
||||
},
|
||||
showAllFormats() {
|
||||
if( this.isBerechtigtDocAndOdt === false
|
||||
|| !Array.isArray(this.isBerechtigtDocAndOdt) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
let retval = this.isBerechtigtDocAndOdt.includes(this.stgInfo.oe_kurzbz);
|
||||
return retval;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@@ -339,7 +326,7 @@ export default {
|
||||
},
|
||||
getPersonLabel(titelpre, nachname, vorname, titelpost, uid) {
|
||||
return nachname + ' ' + vorname + (titelpre ? ' ' + titelpre : '') + (titelpost ? ' ' + titelpost : '') + (uid ? ' (' + uid + ')' : '');
|
||||
|
||||
|
||||
},
|
||||
actionDeleteAbschlusspruefung(abschlusspruefung_id) {
|
||||
this.$fhcAlert
|
||||
@@ -841,4 +828,3 @@ export default {
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
|
||||
@@ -31,12 +31,30 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
formData: {},
|
||||
listBegruendungen: [],
|
||||
listNewLehrveranstaltungen: [],
|
||||
listLektoren: [],
|
||||
listKompatibleLehrveranstaltungen: [],
|
||||
statusNew: true,
|
||||
showNotizen: false,
|
||||
currentAnrechnung_id: null,
|
||||
endpoint: ApiNotizPerson,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvExemptions.getAnrechnungen(this.student.prestudent_id)
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
layout: 'fitDataStretchFrozen',
|
||||
height: '500',
|
||||
index: 'anrechnung_id',
|
||||
persistenceID: 'stv-details-anrechnungen-20260217',
|
||||
selectableRows: true,
|
||||
columns: [
|
||||
{title: "anrechnung_id", field: "anrechnung_id", visible: false},
|
||||
{title: "lehrveranstaltung_id", field: "lehrveranstaltung_id", visible: false},
|
||||
@@ -107,63 +125,43 @@ export default {
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
height: '500',
|
||||
index: 'anrechnung_id',
|
||||
persistenceID: 'stv-details-anrechnungen-2025112401'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
|
||||
await this.$p.loadCategory(['anrechnungen', 'global', 'ui', 'lehre']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('anrechnung_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'anrechnung_id'),
|
||||
});
|
||||
cm.getColumnByField('lehrveranstaltung_id').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'lehrveranstaltung_id'),
|
||||
});
|
||||
cm.getColumnByField('bez_lehrveranstaltung').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'lehrveranstaltung'),
|
||||
});
|
||||
cm.getColumnByField('begruendung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'begruendung'),
|
||||
});
|
||||
cm.getColumnByField('lehrveranstaltung_id_kompatibel').component.updateDefinition({
|
||||
title: this.$p.t('anrechnung', 'lehrveranstaltung_id_kompatibel'),
|
||||
});
|
||||
cm.getColumnByField('lehrveranstaltung_bez_kompatibel').component.updateDefinition({
|
||||
title: this.$p.t('anrechnung', 'lehrveranstaltung_bez_kompatibel'),
|
||||
});
|
||||
cm.getColumnByField('status').component.updateDefinition({
|
||||
title: this.$p.t('global', 'status'),
|
||||
});
|
||||
cm.getColumnByField('genehmigt_von').component.updateDefinition({
|
||||
title: this.$p.t('anrechnung', 'genehmigtVon'),
|
||||
});
|
||||
cm.getColumnByField('notizen_anzahl').component.updateDefinition({
|
||||
title: this.$p.t('anrechnung', 'existingNotes'),
|
||||
});
|
||||
cm.getColumnByField('insertamum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'datum'),
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
setHeader( 'anrechnung_id', this.$p.t('ui', 'anrechnung_id'));
|
||||
setHeader( 'lehrveranstaltung_id', this.$p.t('lehre', 'lehrveranstaltung_id'));
|
||||
setHeader( 'bez_lehrveranstaltung', this.$p.t('lehre', 'lehrveranstaltung'));
|
||||
setHeader( 'begruendung', this.$p.t('global', 'begruendung'));
|
||||
setHeader( 'lehrveranstaltung_id_kompatibel', this.$p.t('anrechnung', 'lehrveranstaltung_id_kompatibel'));
|
||||
setHeader( 'lehrveranstaltung_bez_kompatibel', this.$p.t('anrechnung', 'lehrveranstaltung_bez_kompatibel'));
|
||||
setHeader( 'status', this.$p.t('global', 'status'));
|
||||
setHeader( 'genehmigt_von', this.$p.t('anrechnung', 'genehmigtVon'));
|
||||
setHeader( 'notizen_anzahl', this.$p.t('anrechnung', 'existingNotes'));
|
||||
setHeader( 'insertamum', this.$p.t('global', 'datum'));
|
||||
}
|
||||
}
|
||||
],
|
||||
formData: {},
|
||||
listBegruendungen: [],
|
||||
listNewLehrveranstaltungen: [],
|
||||
listLektoren: [],
|
||||
listKompatibleLehrveranstaltungen: [],
|
||||
statusNew: true,
|
||||
showNotizen: false,
|
||||
currentAnrechnung_id: null,
|
||||
endpoint: ApiNotizPerson
|
||||
];
|
||||
return events;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
||||
@@ -91,12 +91,24 @@ export default {
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
layout:"fitDataTable",
|
||||
index: 'akte_id',
|
||||
persistenceID: 'stv-details-archiv',
|
||||
persistenceID: 'stv-details-archiv-20260217',
|
||||
columns: [
|
||||
{title: "Akte Id", field: "akte_id", visible: false},
|
||||
{title: this.$p.t('stv', 'archiv_title'), field: "titel"},
|
||||
{title: this.$p.t('stv', 'archiv_description'), field: "bezeichnung"},
|
||||
{title: this.$p.t('stv', 'archiv_creation_date'), field: "erstelltam"},
|
||||
{title: this.$p.t('stv', 'archiv_creation_date'), field: "erstelltam",
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{
|
||||
title: this.$p.t('stv', 'archiv_signiert'),
|
||||
field: "signiert",
|
||||
@@ -117,7 +129,22 @@ export default {
|
||||
crossElement: '<i class="fa fa-xmark text-danger"></i>'
|
||||
},
|
||||
},
|
||||
{title: this.$p.t('stv', 'archiv_accepted_on_at'), field: "akzeptiertamum"},
|
||||
{title: this.$p.t('stv', 'archiv_accepted_on_at'), field: "akzeptiertamum",
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{
|
||||
title: this.$p.t('stv', 'archiv_gedruckt'),
|
||||
field: "gedruckt",
|
||||
|
||||
+194
-152
@@ -23,6 +23,10 @@ export default {
|
||||
from: 'configUseReihungstestPunkte',
|
||||
default: true
|
||||
},
|
||||
hasExcludedAreas: {
|
||||
from: 'configHasExcludedAreas',
|
||||
default: false
|
||||
},
|
||||
$reloadList: {
|
||||
from: '$reloadList',
|
||||
required: true
|
||||
@@ -35,159 +39,20 @@ export default {
|
||||
student: Object
|
||||
},
|
||||
data() {
|
||||
let self = this;
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvAdmissionDates.getAufnahmetermine(this.student.person_id)
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
columns: [
|
||||
{title: "rt_id", field: "rt_id", visible: false},
|
||||
{title: "rt_person_id", field: "rt_person_id", visible: false},
|
||||
{title: "person_id", field: "person_id", visible: false},
|
||||
{title: "datum", field: "datum",
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
});
|
||||
}
|
||||
},
|
||||
{title: "stufe", field: "stufe"},
|
||||
{title: "studiensemester", field: "studiensemester"},
|
||||
{title: "anmerkung", field: "anmerkung", visible: false},
|
||||
{title: "anmeldedatum", field: "anmeldedatum", visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
});
|
||||
}
|
||||
},
|
||||
{title: "punkte", field: "punkte"},
|
||||
{
|
||||
title: "teilgenommen", field: "teilgenommen",
|
||||
formatter: "tickCross",
|
||||
hozAlign: "center",
|
||||
formatterParams: {
|
||||
tickElement: '<i class="fa fa-check text-success"></i>',
|
||||
crossElement: '<i class="fa fa-xmark text-danger"></i>'
|
||||
}
|
||||
},
|
||||
{title: "ort", field: "ort", visible: false},
|
||||
{title: "studienplan", field: "studienplan", visible: false},
|
||||
{title: "studienplan_id", field: "studienplan_id", visible: false},
|
||||
{title: "stg", field: "studiengangkurzbzlang"},
|
||||
{title: "Stg", field: "stg_kuerzel"},
|
||||
{
|
||||
title: 'Aktionen', field: 'actions',
|
||||
minWidth: 150, // Ensures Action-buttons will be always fully displayed
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let container = document.createElement('div');
|
||||
container.className = "d-flex gap-2";
|
||||
|
||||
let button = document.createElement('button');
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.innerHTML = '<i class="fa fa-edit"></i>';
|
||||
button.title = this.$p.t('ui', 'bearbeiten');
|
||||
button.addEventListener('click', (event) =>
|
||||
this.actionEditPlacementTest(cell.getData().rt_person_id)
|
||||
);
|
||||
container.append(button);
|
||||
|
||||
button = document.createElement('button');
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.innerHTML = '<i class="fa fa-xmark"></i>';
|
||||
button.title = this.$p.t('ui', 'loeschen');
|
||||
button.addEventListener('click', () =>
|
||||
this.actionDeletePlacementTest(cell.getData().rt_person_id)
|
||||
);
|
||||
container.append(button);
|
||||
|
||||
return container;
|
||||
},
|
||||
frozen: true
|
||||
}
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
minHeight: 200,
|
||||
index: 'aufnahmetermin_id',
|
||||
persistenceID: 'stv-details-table_admission-dates-2025112401'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['admission', 'global', 'person', 'ui', 'projektarbeitsbeurteilung']);
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
|
||||
cm.getColumnByField('rt_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'reihungstest_id')
|
||||
});
|
||||
cm.getColumnByField('rt_person_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'reihungstest_person_id')
|
||||
});
|
||||
cm.getColumnByField('person_id').component.updateDefinition({
|
||||
title: this.$p.t('person', 'person_id')
|
||||
});
|
||||
cm.getColumnByField('datum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'datum')
|
||||
});
|
||||
cm.getColumnByField('stufe').component.updateDefinition({
|
||||
title: this.$p.t('admission', 'stufe')
|
||||
});
|
||||
cm.getColumnByField('studiensemester').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'studiensemester')
|
||||
});
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('anmeldedatum').component.updateDefinition({
|
||||
title: this.$p.t('admission', 'anmeldedatum')
|
||||
});
|
||||
cm.getColumnByField('punkte').component.updateDefinition({
|
||||
title: this.$p.t('exam', 'punkte')
|
||||
});
|
||||
cm.getColumnByField('teilgenommen').component.updateDefinition({
|
||||
title: this.$p.t('admission', 'teilgenommen')
|
||||
});
|
||||
cm.getColumnByField('ort').component.updateDefinition({
|
||||
title: this.$p.t('person', 'ort')
|
||||
});
|
||||
cm.getColumnByField('studienplan').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'studienplan')
|
||||
});
|
||||
cm.getColumnByField('studienplan_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'studienplan_id')
|
||||
});
|
||||
cm.getColumnByField('studiengangkurzbzlang').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeitsbeurteilung', 'studiengang')
|
||||
});
|
||||
cm.getColumnByField('stg_kuerzel').component.updateDefinition({
|
||||
title: this.$p.t('admission', 'stg_kurz')
|
||||
});
|
||||
}
|
||||
}
|
||||
],
|
||||
formData: {},
|
||||
statusNew: true,
|
||||
listPlacementTests: [],
|
||||
listStudyPlans: [],
|
||||
filterOnlyFutureTestsSet: false,
|
||||
filteredPlacementTests: []
|
||||
filteredPlacementTests: [],
|
||||
youngestSemester: null,
|
||||
stgRtPers: null,
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
minHeight: 200
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -197,11 +62,12 @@ export default {
|
||||
this.formData.anmeldedatum = new Date();
|
||||
this.$refs.placementTestModal.show();
|
||||
},
|
||||
actionEditPlacementTest(rt_person_id) {
|
||||
actionEditPlacementTest(rt_person_id, stg_kz) {
|
||||
this.resetForm();
|
||||
this.statusNew = false;
|
||||
this.loadPlacementTest(rt_person_id);
|
||||
this.$refs.placementTestModal.show();
|
||||
this.stgRtPers = stg_kz;
|
||||
},
|
||||
actionDeletePlacementTest(rt_person_id) {
|
||||
this.$fhcAlert
|
||||
@@ -271,12 +137,13 @@ export default {
|
||||
this.reload();
|
||||
});
|
||||
},
|
||||
getResultReihungstest(reihungstest_id){
|
||||
getResultReihungstest(reihungstest_id, stg_kz){
|
||||
const paramsRt = {
|
||||
reihungstest_id: reihungstest_id,
|
||||
person_id: this.student.person_id,
|
||||
punkte: this.useReihungstestPunkte,
|
||||
studiengang_kz: this.student.studiengang_kz
|
||||
studiengang_kz: stg_kz,
|
||||
hasExcludedAreas: this.hasExcludedAreas
|
||||
};
|
||||
|
||||
return this.$api
|
||||
@@ -330,13 +197,188 @@ export default {
|
||||
},
|
||||
resetForm() {
|
||||
this.formData = {};
|
||||
this.stgRtPers = null;
|
||||
},
|
||||
parseSemester(semester) {
|
||||
const type = semester.slice(0, 2).toUpperCase(); // "WS" or "SS"
|
||||
const year = parseInt(semester.slice(2), 10);
|
||||
|
||||
// WS > SS
|
||||
return year * 10 + (type === 'SS' ? 1 : 2);
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const self = this;
|
||||
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvAdmissionDates.getAufnahmetermine(this.student.person_id)
|
||||
),
|
||||
ajaxResponse: (url, params, response) => {
|
||||
const data = response.data;
|
||||
|
||||
const filtered = data.filter(item =>
|
||||
item.studiengang_kz_ber === this.student.studiengang_kz
|
||||
);
|
||||
|
||||
if (filtered.length > 0) {
|
||||
filtered.sort((a, b) =>
|
||||
this.parseSemester(b.studiensemester) - this.parseSemester(a.studiensemester)
|
||||
);
|
||||
self.youngestSemester = filtered[0].studiensemester;
|
||||
} else {
|
||||
self.youngestSemester = null;
|
||||
}
|
||||
|
||||
return data;
|
||||
},
|
||||
rowFormatter: function(row) {
|
||||
let data = row.getData();
|
||||
if (data.studiengang_kz_ber === self.student.studiengang_kz &&
|
||||
data.studiensemester === self.youngestSemester) {
|
||||
let cells = row.getCells();
|
||||
cells.forEach((c) => {
|
||||
c.getElement().classList.add("row-green");
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
dataLoaded: function() {
|
||||
this.redraw(true);
|
||||
},
|
||||
index: 'aufnahmetermin_id',
|
||||
persistenceID: 'stv-details-table_admission-dates-20260217',
|
||||
columns: [
|
||||
{title: "rt_id", field: "rt_id", visible: false},
|
||||
{title: "rt_person_id", field: "rt_person_id", visible: false},
|
||||
{title: "person_id", field: "person_id", visible: false},
|
||||
{title: "datum", field: "datum",
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
});
|
||||
}
|
||||
},
|
||||
{title: "stufe", field: "stufe"},
|
||||
{title: "studiensemester", field: "studiensemester"},
|
||||
{title: "anmerkung", field: "anmerkung", visible: false},
|
||||
{title: "anmeldedatum", field: "anmeldedatum", visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
});
|
||||
}
|
||||
},
|
||||
{title: "punkte", field: "punkte"},
|
||||
{
|
||||
title: "teilgenommen", field: "teilgenommen",
|
||||
formatter: "tickCross",
|
||||
hozAlign: "center",
|
||||
formatterParams: {
|
||||
tickElement: '<i class="fa fa-check text-success"></i>',
|
||||
crossElement: '<i class="fa fa-xmark text-danger"></i>'
|
||||
}
|
||||
},
|
||||
{title: "ort", field: "ort", visible: false},
|
||||
{title: "studienplan", field: "studienplan", visible: false},
|
||||
{title: "studienplan_id", field: "studienplan_id", visible: false},
|
||||
//{title: "stg", field: "studiengangkurzbzlang"},
|
||||
{title: "stg_ber", field: "studiengangkurzbzlang_ber"},
|
||||
{title: "Stg_Kz", field: "studiengang_kz_ber", visible: false},
|
||||
{
|
||||
title: 'Aktionen', field: 'actions',
|
||||
minWidth: 150, // Ensures Action-buttons will be always fully displayed
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let container = document.createElement('div');
|
||||
container.className = "d-flex gap-2";
|
||||
|
||||
let button = document.createElement('button');
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.innerHTML = '<i class="fa fa-edit"></i>';
|
||||
button.title = this.$p.t('ui', 'bearbeiten');
|
||||
button.addEventListener('click', (event) =>
|
||||
this.actionEditPlacementTest(cell.getData().rt_person_id, cell.getData().studiengang_kz_ber)
|
||||
);
|
||||
container.append(button);
|
||||
|
||||
button = document.createElement('button');
|
||||
button.className = 'btn btn-outline-secondary btn-action';
|
||||
button.innerHTML = '<i class="fa fa-xmark"></i>';
|
||||
button.title = this.$p.t('ui', 'loeschen');
|
||||
button.addEventListener('click', () =>
|
||||
this.actionDeletePlacementTest(cell.getData().rt_person_id)
|
||||
);
|
||||
container.append(button);
|
||||
|
||||
return container;
|
||||
},
|
||||
frozen: true
|
||||
}
|
||||
],
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['admission', 'global', 'person', 'ui', 'projektarbeitsbeurteilung']);
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('rt_id', this.$p.t('ui', 'reihungstest_id'));
|
||||
setHeader('rt_person_id', this.$p.t('ui', 'reihungstest_person_id'));
|
||||
setHeader('person_id', this.$p.t('person', 'person_id'));
|
||||
setHeader('datum', this.$p.t('global', 'datum'));
|
||||
setHeader('stufe', this.$p.t('admission', 'stufe'));
|
||||
setHeader('studiensemester', this.$p.t('lehre', 'studiensemester'));
|
||||
setHeader('anmerkung', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('anmeldedatum', this.$p.t('admission', 'anmeldedatum'));
|
||||
setHeader('punkte', this.$p.t('exam', 'punkte'));
|
||||
setHeader('teilgenommen', this.$p.t('admission', 'teilgenommen'));
|
||||
setHeader('ort', this.$p.t('person', 'ort'));
|
||||
setHeader('studienplan', this.$p.t('lehre', 'studienplan'));
|
||||
setHeader('studienplan_id', this.$p.t('ui', 'studienplan_id'));
|
||||
setHeader('studiengangkurzbzlang_ber', this.$p.t('projektarbeitsbeurteilung', 'studiengang'));
|
||||
setHeader('studiengang_kz_ber', this.$p.t('admission', 'stg_kurz'));
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
return events;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.$api
|
||||
.call(ApiStvAdmissionDates.getListPlacementTests(this.student.prestudent_id))
|
||||
.then(result => {
|
||||
this.listPlacementTests = this.filteredPlacementTests = result.data;
|
||||
if(result.data)
|
||||
this.listPlacementTests = this.filteredPlacementTests = result.data;
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
|
||||
@@ -488,7 +530,7 @@ export default {
|
||||
|
||||
<div v-if="allowUebernahmePunkte" class="col-4">
|
||||
<label class="form-label" style="color:transparent;">getPunkte</label>
|
||||
<button class="btn btn-outline-secondary w-100" @click="getResultReihungstest(formData.rt_id)">{{ $p.t('admission', 'getRTErgebnis') }}</button>
|
||||
<button class="btn btn-outline-secondary w-100" @click="getResultReihungstest(formData.rt_id, stgRtPers)">{{ $p.t('admission', 'getRTErgebnis') }}</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
+18
-5
@@ -50,11 +50,24 @@ export default {
|
||||
this.listAufnahmetermine = result.data;
|
||||
|
||||
const listAufnahmetermineFiltered = this.listAufnahmetermine
|
||||
.filter(item => item.studiengangkurzbzlang == this.student.studiengang)
|
||||
.filter(item => item.studiengang_kz_ber == this.student.studiengang_kz)
|
||||
.sort((a, b) => this.parseSemester(b.studiensemester) - this.parseSemester(a.studiensemester));
|
||||
const elementSemYoungest = listAufnahmetermineFiltered[0];
|
||||
|
||||
this.formData.rt_gesamtpunkte = elementSemYoungest.punkte;
|
||||
let pointsSemStg = 0;
|
||||
|
||||
if(listAufnahmetermineFiltered.length > 0){
|
||||
|
||||
const youngestSemester = listAufnahmetermineFiltered[0].studiensemester;
|
||||
|
||||
//sum of all rt-points of studiengang of youngest sem
|
||||
pointsSemStg = listAufnahmetermineFiltered
|
||||
.filter(item => item.studiensemester === youngestSemester)
|
||||
.reduce((sum, item) => sum + (Number(item.punkte) || 0), 0);
|
||||
}
|
||||
else
|
||||
pointsSemStg = 0;
|
||||
|
||||
this.formData.rt_gesamtpunkte = pointsSemStg;
|
||||
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
@@ -91,8 +104,8 @@ export default {
|
||||
},
|
||||
template: `
|
||||
<div class="stv-details-admission-header-placement h-100 pb-3">
|
||||
<h4>{{ $p.t('lehre', 'studiengang') }}</h4>
|
||||
|
||||
<h4>{{ $p.t('lehre', 'studiengang') }}</h4> {{student.studiengang}}
|
||||
|
||||
<form-form class="mt-3" ref="formRtGesamtData" @submit.prevent>
|
||||
<div v-if="showAufnahmegruppen" class="row mb-3">
|
||||
<div class="col-1">
|
||||
|
||||
@@ -164,17 +164,17 @@ export default {
|
||||
this.updateStudent(this.modelValue);
|
||||
},
|
||||
template: `
|
||||
<core-form ref="form" class="stv-details-details" @submit.prevent="save">
|
||||
<core-form ref="form" class="stv-details-details mb-4" @submit.prevent="save">
|
||||
<div class="position-sticky top-0 z-1">
|
||||
<button type="submit" class="btn btn-primary position-absolute top-0 end-0" :disabled="!changedLength">{{$p.t('ui', 'speichern')}}</button>
|
||||
</div>
|
||||
<fieldset class="overflow-hidden">
|
||||
<fieldset class="overflow-hidden mb-2">
|
||||
<legend>Person</legend>
|
||||
<template v-if="data">
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('person_id')"
|
||||
container-class="col-4 stv-details-details-person_id"
|
||||
container-class="col stv-details-details-person_id"
|
||||
:label="$p.t('person', 'person_id')"
|
||||
type="text"
|
||||
v-model="data.person_id"
|
||||
@@ -182,7 +182,7 @@ export default {
|
||||
readonly
|
||||
>
|
||||
</form-input>
|
||||
<div v-if="showZugangscode && !config.hiddenFields.includes('zugangscode')" class="col-4 stv-details-details-zugangscode">
|
||||
<div v-if="showZugangscode && !config.hiddenFields.includes('zugangscode')" class="col stv-details-details-zugangscode">
|
||||
<label>{{$p.t('global', 'zugangscode')}}</label>
|
||||
<div class="align-self-center">
|
||||
<span class="form-text">
|
||||
@@ -192,7 +192,7 @@ export default {
|
||||
</div>
|
||||
<form-input
|
||||
v-if="showBpk && !config.hiddenFields.includes('bpk')"
|
||||
container-class="col-4 stv-details-details-bpk"
|
||||
container-class="col stv-details-details-bpk"
|
||||
:label="$p.t('person', 'bpk')"
|
||||
type="text"
|
||||
v-model="data.bpk"
|
||||
@@ -200,11 +200,21 @@ export default {
|
||||
maxlength="28"
|
||||
>
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('ersatzkennzeichen')"
|
||||
container-class="col stv-details-details-ersatzkennzeichen"
|
||||
:label="$p.t('person', 'ersatzkennzeichen')"
|
||||
type="text"
|
||||
v-model="data.ersatzkennzeichen"
|
||||
name="ersatzkennzeichen"
|
||||
maxlength="10"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('anrede')"
|
||||
container-class="col-4 stv-details-details-anrede"
|
||||
container-class="col stv-details-details-anrede"
|
||||
:label="$p.t('person', 'anrede')"
|
||||
type="text"
|
||||
v-model="data.anrede"
|
||||
@@ -214,7 +224,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('titelpre')"
|
||||
container-class="col-4 stv-details-details-titelpre"
|
||||
container-class="col stv-details-details-titelpre"
|
||||
:label="$p.t('person', 'titelpre')"
|
||||
type="text"
|
||||
v-model="data.titelpre"
|
||||
@@ -224,7 +234,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('titelpost')"
|
||||
container-class="col-4 stv-details-details-titelpost"
|
||||
container-class="col stv-details-details-titelpost"
|
||||
:label="$p.t('person', 'titelpost')"
|
||||
type="text"
|
||||
v-model="data.titelpost"
|
||||
@@ -233,10 +243,10 @@ export default {
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('nachname')"
|
||||
container-class="col-4 stv-details-details-nachname"
|
||||
container-class="col stv-details-details-nachname"
|
||||
:label="$p.t('person', 'nachname')"
|
||||
type="text"
|
||||
v-model="data.nachname"
|
||||
@@ -246,7 +256,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('vorname')"
|
||||
container-class="col-4 stv-details-details-vorname"
|
||||
container-class="col stv-details-details-vorname"
|
||||
:label="$p.t('person', 'vorname')"
|
||||
type="text"
|
||||
v-model="data.vorname"
|
||||
@@ -256,7 +266,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('vornamen')"
|
||||
container-class="col-4 stv-details-details-vornamen"
|
||||
container-class="col stv-details-details-vornamen"
|
||||
:label="$p.t('person', 'vornamen')"
|
||||
type="text"
|
||||
v-model="data.vornamen"
|
||||
@@ -264,11 +274,9 @@ export default {
|
||||
maxlength="128"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('wahlname')"
|
||||
container-class="col-4 stv-details-details-wahlname"
|
||||
container-class="col stv-details-details-wahlname"
|
||||
:label="$p.t('person', 'wahlname')"
|
||||
type="text"
|
||||
v-model="data.wahlname"
|
||||
@@ -276,11 +284,12 @@ export default {
|
||||
maxlength="128"
|
||||
>
|
||||
</form-input>
|
||||
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('gebdatum')"
|
||||
container-class="col-4 stv-details-details-gebdatum"
|
||||
container-class="col stv-details-details-gebdatum"
|
||||
:label="$p.t('person', 'geburtsdatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.gebdatum"
|
||||
@@ -297,7 +306,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('gebort')"
|
||||
container-class="col-4 stv-details-details-gebort"
|
||||
container-class="col stv-details-details-gebort"
|
||||
:label="$p.t('person', 'geburtsort')"
|
||||
type="text"
|
||||
v-model="data.gebort"
|
||||
@@ -307,7 +316,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('geburtsnation')"
|
||||
container-class="col-4 stv-details-details-geburtsnation"
|
||||
container-class="col stv-details-details-geburtsnation"
|
||||
:label="$p.t('person', 'geburtsnation')"
|
||||
type="select"
|
||||
v-model="data.geburtsnation"
|
||||
@@ -316,23 +325,9 @@ export default {
|
||||
<option value="">-- {{$p.t('fehlermonitoring', 'keineAuswahl')}} --</option>
|
||||
<option v-for="nation in lists.nations" :key="nation.nation_code" :value="nation.nation_code" :disabled="nation.sperre">{{nation.kurztext}}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('ersatzkennzeichen')"
|
||||
container-class="col-4 stv-details-details-ersatzkennzeichen"
|
||||
:label="$p.t('person', 'ersatzkennzeichen')"
|
||||
type="text"
|
||||
v-model="data.ersatzkennzeichen"
|
||||
name="ersatzkennzeichen"
|
||||
maxlength="10"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('staatsbuergerschaft')"
|
||||
container-class="col-4 stv-details-details-staatsbuergerschaft"
|
||||
container-class="col stv-details-details-staatsbuergerschaft"
|
||||
:label="$p.t('person', 'staatsbuergerschaft')"
|
||||
type="select"
|
||||
v-model="data.staatsbuergerschaft"
|
||||
@@ -341,9 +336,12 @@ export default {
|
||||
<option value="">-- {{$p.t('fehlermonitoring', 'keineAuswahl')}} --</option>
|
||||
<option v-for="nation in lists.nations" :key="nation.nation_code" :value="nation.nation_code" :disabled="nation.sperre">{{nation.kurztext}}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('matr_nr')"
|
||||
container-class="col-4 stv-details-details-matr_nr"
|
||||
container-class="col stv-details-details-matr_nr"
|
||||
:label="$p.t('person', 'matrikelnummer')"
|
||||
type="text"
|
||||
v-model="data.matr_nr"
|
||||
@@ -353,7 +351,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('sprache')"
|
||||
container-class="col-4 stv-details-details-sprache"
|
||||
container-class="col stv-details-details-sprache"
|
||||
:label="$p.t('person', 'sprache')"
|
||||
type="select"
|
||||
v-model="data.sprache"
|
||||
@@ -361,11 +359,9 @@ export default {
|
||||
>
|
||||
<option v-for="sprache in lists.sprachen" :key="sprache.sprache" :value="sprache.sprache">{{sprache.sprache}}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('geschlecht')"
|
||||
container-class="col-4 stv-details-details-geschlecht"
|
||||
container-class="col stv-details-details-geschlecht"
|
||||
:label="$p.t('person', 'geschlecht')"
|
||||
type="select"
|
||||
v-model="data.geschlecht"
|
||||
@@ -375,7 +371,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('familienstand')"
|
||||
container-class="col-4 stv-details-details-familienstand"
|
||||
container-class="col stv-details-details-familienstand"
|
||||
:label="$p.t('person', 'familienstand')"
|
||||
type="select"
|
||||
v-model="data.familienstand"
|
||||
@@ -384,10 +380,10 @@ export default {
|
||||
<option v-for="(bezeichnung, key) in familienstaende" :key="key" :value="key">{{bezeichnung}}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('foto')"
|
||||
container-class="col-4 stv-details-details-foto"
|
||||
container-class="col stv-details-details-foto"
|
||||
:label="$p.t('person', 'foto')"
|
||||
type="UploadImage"
|
||||
v-model="data.foto"
|
||||
@@ -397,7 +393,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('anmerkung')"
|
||||
container-class="col-4 stv-details-details-anmerkung"
|
||||
container-class="col stv-details-details-anmerkung"
|
||||
:label="$p.t('global', 'anmerkung')"
|
||||
type="textarea"
|
||||
v-model="data.anmerkung"
|
||||
@@ -407,7 +403,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('homepage')"
|
||||
container-class="col-4 stv-details-details-homepage"
|
||||
container-class="col stv-details-details-homepage"
|
||||
:label="$p.t('person', 'homepage')"
|
||||
type="text"
|
||||
v-model="data.homepage"
|
||||
@@ -424,19 +420,19 @@ export default {
|
||||
v-if="!config.hideUDFs"
|
||||
@load="udfsLoaded"
|
||||
v-model="data"
|
||||
class="row-cols-3 g-3 mb-3"
|
||||
class="row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1"
|
||||
ci-model="person/person"
|
||||
:pk="{person_id:modelValue.person_id}"
|
||||
>
|
||||
</core-udf>
|
||||
</fieldset>
|
||||
<fieldset v-if="data?.student_uid" class="overflow-hidden">
|
||||
<fieldset v-if="data?.student_uid" class="overflow-hidden mb-2">
|
||||
<legend>{{$p.t('person', 'studentIn')}}</legend>
|
||||
<template v-if="data">
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('student_uid')"
|
||||
container-class="col-4 stv-details-details-student_uid"
|
||||
container-class="col stv-details-details-student_uid"
|
||||
:label="$p.t('person', 'uid')"
|
||||
type="text"
|
||||
v-model="data.student_uid"
|
||||
@@ -446,7 +442,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('matrikelnr')"
|
||||
container-class="col-4 stv-details-details-matrikelnr"
|
||||
container-class="col stv-details-details-matrikelnr"
|
||||
:label="$p.t('person', 'personenkennzeichen')"
|
||||
type="text"
|
||||
v-model="data.matrikelnr"
|
||||
@@ -454,22 +450,31 @@ export default {
|
||||
readonly
|
||||
>
|
||||
</form-input>
|
||||
<div class="col-4 pt-4 d-flex align-items-center">
|
||||
<template class="col-4 pt-4 d-flex align-items-center">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('aktiv')"
|
||||
container-class="form-check stv-details-details-aktiv"
|
||||
container-class="col form-check stv-details-details-aktiv"
|
||||
:label="$p.t('person', 'aktiv')"
|
||||
type="checkbox"
|
||||
v-model="data.aktiv"
|
||||
name="aktiv"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</template>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('alias')"
|
||||
:label="$p.t('person', 'alias')"
|
||||
type="text"
|
||||
v-model="data.alias"
|
||||
name="alias"
|
||||
:disabled="aliasNotAllowed"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('semester')"
|
||||
container-class="col-4 stv-details-details-semester"
|
||||
container-class="col stv-details-details-semester"
|
||||
:label="$p.t('lehre', 'semester')"
|
||||
type="text"
|
||||
v-model="data.semester"
|
||||
@@ -479,7 +484,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('verband')"
|
||||
container-class="col-4 stv-details-details-verband"
|
||||
container-class="col stv-details-details-verband"
|
||||
:label="$p.t('lehre', 'verband')"
|
||||
type="text"
|
||||
v-model="data.verband"
|
||||
@@ -489,7 +494,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('gruppe')"
|
||||
container-class="col-4 stv-details-details-gruppe"
|
||||
container-class="col stv-details-details-gruppe"
|
||||
:label="$p.t('lehre', 'gruppe')"
|
||||
type="text"
|
||||
v-model="data.gruppe"
|
||||
@@ -498,19 +503,7 @@ export default {
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('alias')"
|
||||
container-class="col-4 stv-details-details-alias"
|
||||
:label="$p.t('person', 'alias')"
|
||||
type="text"
|
||||
v-model="data.alias"
|
||||
name="alias"
|
||||
:disabled="aliasNotAllowed"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
<div v-else>
|
||||
{{$p.t('ui', 'dropdownLoading')}}...
|
||||
</div>
|
||||
|
||||
@@ -17,7 +17,14 @@ export default {
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
listDocuments: [],
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 300,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvDocuments.getDocumentsAccepted({
|
||||
@@ -27,7 +34,13 @@ export default {
|
||||
ajaxResponse: (url, params, response) => {
|
||||
return response.data;
|
||||
},
|
||||
layout: 'fitDataStretchFrozen',
|
||||
index: 'akte_id',
|
||||
selectableRows: true,
|
||||
selectableRowsRangeMode: 'click',
|
||||
persistenceID: 'stv-details-accepted-20260217',
|
||||
columns: [
|
||||
{title: "akte_id", field: "akte_id", visible: false},
|
||||
{title: "Dokument", field: "bezeichnung"},
|
||||
{title: "Akzeptiertdatum", field: "docdatum",
|
||||
formatter: function (cell) {
|
||||
@@ -67,7 +80,6 @@ export default {
|
||||
crossElement: '<i class="fa fa-xmark text-secondary"></i>'
|
||||
}},
|
||||
{title: "Infotext", field: "infotext"},
|
||||
{title: "akte_id", field: "akte_id"},
|
||||
{title: "dms_id", field: "dms_id", visible: false},
|
||||
{title: "titel", field: "titel_intern", visible: false},
|
||||
{title: "vorhanden", field: "vorhanden",
|
||||
@@ -146,58 +158,40 @@ export default {
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 300,
|
||||
selectable: true,
|
||||
selectableRangeMode: 'click',
|
||||
persistenceID: 'core-details-documents-accepted-2025072101',
|
||||
listDocuments: [],
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['global', 'dokumente', 'ui', 'mobility', 'ampeln']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'dokument')
|
||||
});
|
||||
cm.getColumnByField('docdatum').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'datumAkzeptiert')
|
||||
});
|
||||
cm.getColumnByField('dokument_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'kurzbz')
|
||||
});
|
||||
cm.getColumnByField('insertvonma').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'akzeptiertVon')
|
||||
});
|
||||
cm.getColumnByField('hochgeladenamum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'uploaddatum')
|
||||
});
|
||||
cm.getColumnByField('nachgereicht').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'nachgereicht')
|
||||
});
|
||||
cm.getColumnByField('vorhanden').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'vorhanden')
|
||||
});
|
||||
cm.getColumnByField('dms_id').component.updateDefinition({
|
||||
title: this.$p.t('global', 'dms_id')
|
||||
});
|
||||
cm.getColumnByField('titel_intern').component.updateDefinition({
|
||||
title: this.$p.t('global', 'titel')
|
||||
});
|
||||
cm.getColumnByField('anmerkung_intern').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('akte_id').component.updateDefinition({
|
||||
title: this.$p.t('global', 'akte_id')
|
||||
});
|
||||
cm.getColumnByField('nachgereicht_am').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'nachreichungAm')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
setHeader('bezeichnung', this.$p.t('global', 'dokument'));
|
||||
setHeader('docdatum', this.$p.t('dokumente', 'datumAkzeptiert'));
|
||||
setHeader('dokument_kurzbz', this.$p.t('mobility', 'kurzbz'));
|
||||
setHeader('insertvonma', this.$p.t('dokumente', 'akzeptiertVon'));
|
||||
setHeader('hochgeladenamum', this.$p.t('global', 'uploaddatum'));
|
||||
setHeader('nachgereicht', this.$p.t('dokumente', 'nachgereicht'));
|
||||
setHeader('vorhanden', this.$p.t('dokumente', 'vorhanden'));
|
||||
setHeader('dms_id', this.$p.t('global', 'dms_id'));
|
||||
setHeader('titel_intern', this.$p.t('global', 'titel'));
|
||||
setHeader('anmerkung_intern', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('akte_id', this.$p.t('global', 'akte_id'));
|
||||
setHeader('nachgereicht_am', this.$p.t('dokumente', 'nachreichungAm'));
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -210,14 +204,15 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
actionDownloadFile(akte_id){
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router
|
||||
+ '/api/frontend/v1/stv/dokumente/download?akte_id='
|
||||
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router
|
||||
+ '/api/frontend/v1/stv/dokumente/download?akte_id='
|
||||
+ encodeURIComponent(akte_id);
|
||||
},
|
||||
actionUploadFile(dokument_kurzbz){
|
||||
@@ -314,7 +309,7 @@ export default {
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="stv-details-documents h-100 pb-3">
|
||||
<div class="stv-details-aceepted h-100 pb-3">
|
||||
<h5>{{$p.t('dokumente', 'accepted')}}</h5>
|
||||
|
||||
<modal-edit
|
||||
|
||||
@@ -17,7 +17,15 @@ export default {
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 300,
|
||||
listDocuments: [],
|
||||
prestudentDocumentData: [],
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvDocuments.getDocumentsUnaccepted({
|
||||
@@ -25,6 +33,10 @@ export default {
|
||||
studiengang_kz: this.studiengang_kz})
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
layout: 'fitDataStretchFrozen',
|
||||
persistenceID: 'stv-details-unaccepted-20260217',
|
||||
selectableRows: true,
|
||||
selectableRowsRangeMode: 'click',
|
||||
columns: [
|
||||
{title: "Dokument", field: "bezeichnung"},
|
||||
{title: "Kurzbz", field: "dokument_kurzbz", visible: false},
|
||||
@@ -42,7 +54,7 @@ export default {
|
||||
hour12: false
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
{title: "nachgereicht", field: "nachgereicht", visible: false,
|
||||
formatter:"tickCross",
|
||||
hozAlign:"center",
|
||||
@@ -76,7 +88,7 @@ export default {
|
||||
return `${tickCrossIcon} ${pill}`;
|
||||
},
|
||||
hozAlign: "center"
|
||||
},
|
||||
},
|
||||
{title: "Infotext", field: "infotext"},
|
||||
{title: "akte_id", field: "akte_id"},
|
||||
{title: "titel_intern", field: "titel_intern"},
|
||||
@@ -162,53 +174,39 @@ export default {
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 300,
|
||||
selectable: true,
|
||||
selectableRangeMode: 'click',
|
||||
persistenceID: 'core-details-documents-unaccepted',
|
||||
listDocuments: [],
|
||||
prestudentDocumentData: [],
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['global', 'dokumente', 'ui', 'mobility', 'ampeln']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'dokument')
|
||||
});
|
||||
cm.getColumnByField('dokument_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'kurzbz')
|
||||
});
|
||||
cm.getColumnByField('hochgeladenamum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'uploaddatum')
|
||||
});
|
||||
cm.getColumnByField('nachgereicht').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'nachgereicht')
|
||||
});
|
||||
cm.getColumnByField('vorhanden').component.updateDefinition({
|
||||
title: this.$p.t('dokumente', 'vorhanden')
|
||||
});
|
||||
cm.getColumnByField('titel_intern').component.updateDefinition({
|
||||
title: this.$p.t('global', 'titel')
|
||||
});
|
||||
cm.getColumnByField('anmerkung_intern').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('akte_id').component.updateDefinition({
|
||||
title: this.$p.t('global', 'akte_id')
|
||||
});
|
||||
cm.getColumnByField('pflicht').component.updateDefinition({
|
||||
title: this.$p.t('ampeln', 'mandatory')
|
||||
});
|
||||
cm.getColumnByField('nachgereicht_am').component.updateDefinition({
|
||||
title: this.$p.t('global', 'dokument')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('bezeichnung', this.$p.t('global', 'dokument'));
|
||||
setHeader('dokument_kurzbz', this.$p.t('mobility', 'kurzbz'));
|
||||
setHeader('hochgeladenamum', this.$p.t('global', 'uploaddatum'));
|
||||
setHeader('nachgereicht', this.$p.t('dokumente', 'nachgereicht'));
|
||||
setHeader('vorhanden', this.$p.t('dokumente', 'vorhanden'));
|
||||
setHeader('titel_intern', this.$p.t('global', 'titel'));
|
||||
setHeader('anmerkung_intern', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('akte_id', this.$p.t('global', 'akte_id'));
|
||||
setHeader('pflicht', this.$p.t('ampeln', 'mandatory'));
|
||||
setHeader('nachgereicht_am', this.$p.t('global', 'dokument'));
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -221,14 +219,15 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
actionDownloadFile(akte_id){
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router
|
||||
+ '/api/frontend/v1/stv/dokumente/download?akte_id='
|
||||
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router
|
||||
+ '/api/frontend/v1/stv/dokumente/download?akte_id='
|
||||
+ encodeURIComponent(akte_id);
|
||||
},
|
||||
actionUploadFile(dokument_kurzbz){
|
||||
@@ -277,9 +276,9 @@ export default {
|
||||
dokument_kurzbz: e.dokument_kurzbz
|
||||
}))
|
||||
.then(() => ({
|
||||
success: true,
|
||||
dokument_bz: e.bezeichnung
|
||||
}))
|
||||
success: true,
|
||||
dokument_bz: e.bezeichnung
|
||||
}))
|
||||
.catch(() => ({
|
||||
success: false,
|
||||
dokument_bz: e.bezeichnung
|
||||
@@ -287,23 +286,23 @@ export default {
|
||||
)
|
||||
)
|
||||
.then(results => {
|
||||
const failed = results.filter(res => !res.value.success);
|
||||
const suceeded = results.filter(res => res.value.success);
|
||||
if (failed.length > 0) {
|
||||
failed.forEach(res => {
|
||||
this.$fhcAlert.alertError(this.$p.t('dokumente', 'errorAccepted',
|
||||
{'dokument_kurzbz': res.value.dokument_bz}
|
||||
));
|
||||
});
|
||||
let countSuceeded = suceeded.length;
|
||||
if(countSuceeded > 0)
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('dokumente', 'successCountAccepted',
|
||||
{'count': countSuceeded}));
|
||||
const failed = results.filter(res => !res.value.success);
|
||||
const suceeded = results.filter(res => res.value.success);
|
||||
if (failed.length > 0) {
|
||||
failed.forEach(res => {
|
||||
this.$fhcAlert.alertError(this.$p.t('dokumente', 'errorAccepted',
|
||||
{'dokument_kurzbz': res.value.dokument_bz}
|
||||
));
|
||||
});
|
||||
let countSuceeded = suceeded.length;
|
||||
if(countSuceeded > 0)
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('dokumente', 'successCountAccepted',
|
||||
{'count': countSuceeded}));
|
||||
|
||||
} else {
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('dokumente', 'successAccepted'));
|
||||
}
|
||||
this.reloadAll();
|
||||
} else {
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('dokumente', 'successAccepted'));
|
||||
}
|
||||
this.reloadAll();
|
||||
});
|
||||
},
|
||||
deleteFile(akte_id){
|
||||
|
||||
@@ -24,6 +24,7 @@ export default {
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
|
||||
open(prestudent_id, dokument_kurzbz){
|
||||
this.formData.dokument_kurzbz = dokument_kurzbz;
|
||||
this.formData.prestudent_id = prestudent_id;
|
||||
|
||||
@@ -111,7 +111,7 @@ export default {
|
||||
],
|
||||
height: 'auto',
|
||||
index: 'group_id',
|
||||
persistenceID: 'stv-details-group-list'
|
||||
persistenceID: 'stv-details-group-list-20260217'
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
@@ -24,12 +24,30 @@ export default {
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
formData: {
|
||||
mobilitaetstyp_kurzbz: "GS",
|
||||
studiensemester_kurzbz: this.currentSemester,
|
||||
status_kurzbz: 'Student',
|
||||
mobilitaet_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
listTypenMobility: [],
|
||||
listStudiensemester: [],
|
||||
programsMobility: [],
|
||||
listStudienprogramme: [],
|
||||
listPartner: [],
|
||||
statiPrestudent: [],
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvJointstudies.getStudies(this.student.prestudent_id)
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
persistenceID: 'stv-details-jointstudies-20260217',
|
||||
columns: [
|
||||
{title: "mobilitaet_id", field: "mobilitaet_id", visible: false},
|
||||
{title: "StSem", field: "studiensemester_kurzbz"},
|
||||
@@ -120,70 +138,43 @@ export default {
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['global', 'jointstudies', 'ui', 'lehre', 'mobility']);
|
||||
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('mobilitaet_id').component.updateDefinition({
|
||||
title: this.$p.t('global', 'mobilitaet_id')
|
||||
});
|
||||
/* cm.getColumnByField('studiensemester_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'studiensemester')
|
||||
});*/
|
||||
cm.getColumnByField('gsprogrammtyp_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('global', 'typ')
|
||||
});
|
||||
/* cm.getColumnByField('ausbildungssemester').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'semester')
|
||||
});*/
|
||||
cm.getColumnByField('prestudent_id').component.updateDefinition({
|
||||
title: this.$p.t('global', 'prestudentID')
|
||||
});
|
||||
cm.getColumnByField('kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'mobilitaetsprogramm')
|
||||
});
|
||||
cm.getColumnByField('studienprogramm').component.updateDefinition({
|
||||
title: this.$p.t('jointstudies', 'studienprogramm')
|
||||
});
|
||||
cm.getColumnByField('insertamum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'insertamum')
|
||||
});
|
||||
cm.getColumnByField('insertvon').component.updateDefinition({
|
||||
title: this.$p.t('global', 'insertvon')
|
||||
});
|
||||
cm.getColumnByField('updateamum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'updateamum')
|
||||
});
|
||||
cm.getColumnByField('updatevon').component.updateDefinition({
|
||||
title: this.$p.t('global', 'updatevon')
|
||||
});
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
setHeader('mobilitaet_id', this.$p.t('global', 'mobilitaet_id'));
|
||||
setHeader('gsprogrammtyp_kurzbz', this.$p.t('global', 'typ'));
|
||||
setHeader('prestudent_id', this.$p.t('global', 'prestudentID'));
|
||||
setHeader('kurzbz', this.$p.t('mobility', 'mobilitaetsprogramm'));
|
||||
setHeader('studienprogramm', this.$p.t('jointstudies', 'studienprogramm'));
|
||||
setHeader('insertamum', this.$p.t('global', 'insertamum'));
|
||||
setHeader('insertvon', this.$p.t('global', 'insertvon'));
|
||||
setHeader('updateamum', this.$p.t('global', 'updateamum'));
|
||||
setHeader('updatevon', this.$p.t('global', 'updatevon'));
|
||||
}
|
||||
}
|
||||
],
|
||||
formData: {
|
||||
mobilitaetstyp_kurzbz: "GS",
|
||||
studiensemester_kurzbz: this.currentSemester,
|
||||
status_kurzbz: 'Student',
|
||||
mobilitaet_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
listTypenMobility: [],
|
||||
listStudiensemester: [],
|
||||
programsMobility: [],
|
||||
listStudienprogramme: [],
|
||||
listPartner: [],
|
||||
statiPrestudent: [],
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
actionDeleteJointStudy(mobilitaet_id) {
|
||||
|
||||
@@ -6,7 +6,6 @@ import FormForm from '../../../../Form/Form.js';
|
||||
import FormInput from '../../../../Form/Input.js';
|
||||
|
||||
import ApiStvAddress from '../../../../../api/factory/stv/kontakt/address.js';
|
||||
import ApiStvCompany from '../../../../../api/factory/stv/kontakt/company.js';
|
||||
|
||||
export default{
|
||||
name: 'AddressComponent',
|
||||
@@ -23,11 +22,39 @@ export default{
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
addressData: {
|
||||
zustelladresse: true,
|
||||
heimatadresse: true,
|
||||
rechnungsadresse: false,
|
||||
typ: 'h',
|
||||
nation: 'A',
|
||||
address: {plz: null},
|
||||
plz: null,
|
||||
},
|
||||
statusNew: true,
|
||||
places: [],
|
||||
suggestions: {},
|
||||
nations: [],
|
||||
adressentypen: [],
|
||||
firmen: [],
|
||||
listFirmen: [],
|
||||
filteredFirmen: [],
|
||||
selectedFirma: null,
|
||||
abortController: {
|
||||
suggestions: null,
|
||||
places: null
|
||||
},
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(ApiStvAddress.get(this.uid)),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
//autoColumns: true,
|
||||
index: 'adresse_id',
|
||||
persistenceID: 'stv-details-kontakt-address-20260217',
|
||||
columns:[
|
||||
{title:"Typ", field:"bezeichnung"},
|
||||
{title:"Strasse", field:"strasse"},
|
||||
@@ -122,99 +149,52 @@ export default{
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
height: 'auto',
|
||||
index: 'adresse_id',
|
||||
persistenceID: 'stv-details-kontakt-address'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
height: 'auto'
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['notiz', 'global', 'person', 'ui']);
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'typ')
|
||||
});
|
||||
cm.getColumnByField('strasse').component.updateDefinition({
|
||||
title: this.$p.t('person', 'strasse')
|
||||
});
|
||||
cm.getColumnByField('plz').component.updateDefinition({
|
||||
title: this.$p.t('person', 'plz')
|
||||
});
|
||||
cm.getColumnByField('ort').component.updateDefinition({
|
||||
title: this.$p.t('person', 'ort')
|
||||
});
|
||||
cm.getColumnByField('gemeinde').component.updateDefinition({
|
||||
title: this.$p.t('person', 'gemeinde')
|
||||
});
|
||||
cm.getColumnByField('nation').component.updateDefinition({
|
||||
title: this.$p.t('person', 'nation')
|
||||
});
|
||||
cm.getColumnByField('heimatadresse').component.updateDefinition({
|
||||
title: this.$p.t('person', 'heimatadresse')
|
||||
});
|
||||
cm.getColumnByField('zustelladresse').component.updateDefinition({
|
||||
title: this.$p.t('person', 'zustelladresse')
|
||||
});
|
||||
cm.getColumnByField('co_name').component.updateDefinition({
|
||||
title: this.$p.t('person', 'co_name')
|
||||
});
|
||||
cm.getColumnByField('name').component.updateDefinition({
|
||||
title: this.$p.t('person', 'firma_zusatz')
|
||||
});
|
||||
cm.getColumnByField('firmenname').component.updateDefinition({
|
||||
title: this.$p.t('person', 'firma')
|
||||
});
|
||||
cm.getColumnByField('lastupdate').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'letzte_aenderung')
|
||||
});
|
||||
cm.getColumnByField('rechnungsadresse').component.updateDefinition({
|
||||
title: this.$p.t('person', 'rechnungsadresse')
|
||||
});
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('firma_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'firma_id')
|
||||
});
|
||||
cm.getColumnByField('adresse_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'adresse_id')
|
||||
});
|
||||
cm.getColumnByField('person_id').component.updateDefinition({
|
||||
title: this.$p.t('person', 'person_id')
|
||||
});
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('bezeichnung', this.$p.t('global', 'typ'));
|
||||
setHeader('strasse', this.$p.t('person', 'strasse'));
|
||||
setHeader('plz', this.$p.t('person', 'plz'));
|
||||
setHeader('ort', this.$p.t('person', 'ort'));
|
||||
setHeader('gemeinde', this.$p.t('person', 'gemeinde'));
|
||||
setHeader('nation', this.$p.t('person', 'nation'));
|
||||
setHeader('heimatadresse', this.$p.t('person', 'heimatadresse'));
|
||||
setHeader('zustelladresse', this.$p.t('person', 'zustelladresse'));
|
||||
setHeader('co_name', this.$p.t('person', 'co_name'));
|
||||
setHeader('name', this.$p.t('person', 'firma_zusatz'));
|
||||
setHeader('firmenname', this.$p.t('person', 'firma'));
|
||||
setHeader('lastupdate', this.$p.t('notiz', 'letzte_aenderung'));
|
||||
setHeader('rechnungsadresse', this.$p.t('person', 'rechnungsadresse'));
|
||||
setHeader('anmerkung', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('firma_id', this.$p.t('ui', 'firma_id'));
|
||||
setHeader('adresse_id', this.$p.t('ui', 'adresse_id'));
|
||||
setHeader('person_id', this.$p.t('person', 'person_id'));
|
||||
}
|
||||
}
|
||||
],
|
||||
addressData: {
|
||||
zustelladresse: true,
|
||||
heimatadresse: true,
|
||||
rechnungsadresse: false,
|
||||
typ: 'h',
|
||||
nation: 'A',
|
||||
address: {plz: null},
|
||||
plz: null,
|
||||
},
|
||||
statusNew: true,
|
||||
places: [],
|
||||
suggestions: {},
|
||||
nations: [],
|
||||
adressentypen: [],
|
||||
firmen: [],
|
||||
listFirmen: [],
|
||||
filteredFirmen: [],
|
||||
selectedFirma: null,
|
||||
abortController: {
|
||||
suggestions: null,
|
||||
places: null
|
||||
},
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
];
|
||||
return events;
|
||||
},
|
||||
orte() {
|
||||
return this.places.filter(ort => ort.name == this.addressData.gemeinde);
|
||||
},
|
||||
|
||||
@@ -17,11 +17,23 @@ export default{
|
||||
uid: Number
|
||||
},
|
||||
data() {
|
||||
return{
|
||||
tabulatorOptions: {
|
||||
return {
|
||||
lastSelected: null,
|
||||
bankverbindungData: {
|
||||
verrechnung: true,
|
||||
typ: 'p'
|
||||
},
|
||||
statusNew: true,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(ApiStvBankaccount.get(this.uid)),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
index: 'bankverbindung_id',
|
||||
persistenceID: 'stv-details-kontakt-bankaccount-20260217',
|
||||
columns:[
|
||||
{title:"Name", field:"name"},
|
||||
{title:"Anschrift", field:"anschrift", visible:false},
|
||||
@@ -86,56 +98,41 @@ export default{
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
height: 'auto',
|
||||
index: 'bankverbindung_id',
|
||||
persistenceID: 'stv-details-kontakt-bankaccount'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
height: 'auto'
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['global','person']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('name').component.updateDefinition({
|
||||
title: this.$p.t('global', 'name')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('typ').component.updateDefinition({
|
||||
title: this.$p.t('global', 'typ')
|
||||
});
|
||||
cm.getColumnByField('anschrift').component.updateDefinition({
|
||||
title: this.$p.t('person', 'anschrift')
|
||||
});
|
||||
cm.getColumnByField('kontonr').component.updateDefinition({
|
||||
title: this.$p.t('person', 'kontonr')
|
||||
});
|
||||
cm.getColumnByField('blz').component.updateDefinition({
|
||||
title: this.$p.t('person', 'blz')
|
||||
});
|
||||
cm.getColumnByField('verrechnung').component.updateDefinition({
|
||||
title: this.$p.t('person', 'verrechnung')
|
||||
});
|
||||
cm.getColumnByField('person_id').component.updateDefinition({
|
||||
title: this.$p.t('person', 'person_id')
|
||||
});
|
||||
cm.getColumnByField('bankverbindung_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'bankverbindung_id')
|
||||
});
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('name', this.$p.t('global','name'));
|
||||
setHeader('typ', this.$p.t('global','typ'));
|
||||
setHeader('anschrift', this.$p.t('person','anschrift'));
|
||||
setHeader('kontonr', this.$p.t('person','kontonr'));
|
||||
setHeader('blz', this.$p.t('person','blz'));
|
||||
setHeader('verrechnung', this.$p.t('person','verrechnung'));
|
||||
}
|
||||
}
|
||||
],
|
||||
lastSelected: null,
|
||||
bankverbindungData: {
|
||||
verrechnung: true,
|
||||
typ: 'p'
|
||||
},
|
||||
statusNew: true
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
uid() {
|
||||
|
||||
@@ -7,7 +7,7 @@ import FormInput from '../../../../Form/Input.js';
|
||||
import ApiStvContact from '../../../../../api/factory/stv/kontakt/contact.js';
|
||||
import ApiStvCompany from '../../../../../api/factory/stv/kontakt/company.js';
|
||||
|
||||
export default{
|
||||
export default {
|
||||
name: 'ContactComponent',
|
||||
components: {
|
||||
CoreFilterCmpt,
|
||||
@@ -20,11 +20,46 @@ export default{
|
||||
uid: Number
|
||||
},
|
||||
data() {
|
||||
return{
|
||||
tabulatorOptions: {
|
||||
return {
|
||||
lastSelected: null,
|
||||
contactData: {
|
||||
zustellung: true,
|
||||
kontakttyp: 'email',
|
||||
firma_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
kontakttypen: [],
|
||||
firmen: [],
|
||||
filteredFirmen: [],
|
||||
filteredOrte: null,
|
||||
abortController: {
|
||||
firmen: null,
|
||||
standorte: null
|
||||
},
|
||||
lastSelected: null,
|
||||
contactData: {
|
||||
zustellung: true,
|
||||
kontakttyp: 'email',
|
||||
firma_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
kontakttypen: [],
|
||||
firmen: [],
|
||||
filteredFirmen: [],
|
||||
filteredOrte: null,
|
||||
abortController: {
|
||||
firmen: null,
|
||||
standorte: null
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions(){
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(ApiStvContact.get(this.uid)),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
persistenceID: 'stv-details-kontakt-contact-20260217',
|
||||
columns:[
|
||||
{title:"Typ", field:"kontakttypbeschreibung"},
|
||||
{title:"Kontakt", field:"kontakt"},
|
||||
@@ -94,72 +129,46 @@ export default{
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
height: 'auto',
|
||||
index: 'kontakt_id',
|
||||
persistenceID: 'stv-details-kontakt-contact'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
height: 'auto'
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['notiz','global','person']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('kontakttypbeschreibung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'typ')
|
||||
});
|
||||
cm.getColumnByField('kontakt').component.updateDefinition({
|
||||
title: this.$p.t('global', 'kontakt')
|
||||
});
|
||||
cm.getColumnByField('zustellung').component.updateDefinition({
|
||||
title: this.$p.t('person', 'zustellung')
|
||||
});
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('lastupdate').component.updateDefinition({
|
||||
title: this.$p.t('notiz', 'letzte_aenderung')
|
||||
});
|
||||
cm.getColumnByField('name').component.updateDefinition({
|
||||
title: this.$p.t('person', 'firma')
|
||||
});
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('person', 'standort')
|
||||
});
|
||||
cm.getColumnByField('firma_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'firma_id')
|
||||
});
|
||||
cm.getColumnByField('kontakt_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'kontakt_id')
|
||||
});
|
||||
cm.getColumnByField('person_id').component.updateDefinition({
|
||||
title: this.$p.t('person', 'person_id')
|
||||
});
|
||||
cm.getColumnByField('standort_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'standort_id')
|
||||
});
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
}}
|
||||
],
|
||||
lastSelected: null,
|
||||
contactData: {
|
||||
zustellung: true,
|
||||
kontakttyp: 'email',
|
||||
firma_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
kontakttypen: [],
|
||||
firmen: [],
|
||||
filteredFirmen: [],
|
||||
filteredOrte: null,
|
||||
abortController: {
|
||||
firmen: null,
|
||||
standorte: null
|
||||
},
|
||||
}
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('kontakttypbeschreibung', this.$p.t('global', 'typ'));
|
||||
setHeader('kontakt', this.$p.t('global', 'kontakt'));
|
||||
setHeader('zustellung', this.$p.t('person', 'zustellung'));
|
||||
setHeader('anmerkung', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('lastupdate', this.$p.t('notiz', 'letzte_aenderung'));
|
||||
setHeader('name', this.$p.t('person', 'firma'));
|
||||
setHeader('bezeichnung', this.$p.t('person', 'standort'));
|
||||
setHeader('firma_id', this.$p.t('ui', 'firma_id'));
|
||||
setHeader('kontakt_id', this.$p.t('ui', 'kontakt_id'));
|
||||
setHeader('person_id', this.$p.t('person', 'person_id'));
|
||||
setHeader('standort_id', this.$p.t('ui', 'standort_id'));
|
||||
}
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
uid() {
|
||||
|
||||
@@ -127,10 +127,10 @@ export default {
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
dataTree: true,
|
||||
columns: this.tabulatorColumns,
|
||||
selectable: true,
|
||||
selectableRangeMode: 'click',
|
||||
selectableRows: true,
|
||||
selectableRowsRangeMode: 'click',
|
||||
index: 'buchungsnr',
|
||||
persistenceID: 'stv-details-konto'
|
||||
persistenceID: 'stv-details-konto-20260217'
|
||||
};
|
||||
},
|
||||
},
|
||||
|
||||
+40
-46
@@ -11,22 +11,6 @@ export default {
|
||||
FormInput,
|
||||
FormForm
|
||||
},
|
||||
computed: {
|
||||
downloadLink: function(){
|
||||
if(!this.dataSem.start || !this.dataSem.ende || !this.student.uid) return;
|
||||
let start = new Date(this.dataSem.start);
|
||||
start = Math.floor(start.getTime()/1000);
|
||||
let ende = new Date(this.dataSem.ende);
|
||||
ende = Math.floor(ende.getTime() / 1000);
|
||||
|
||||
let link =
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root + "cis/private/lvplan/stpl_kalender.php?type=student&pers_uid=" + this.student.uid + "&begin=" + start + "&ende= " +ende + "&format=excel";
|
||||
return link;
|
||||
},
|
||||
dbStundenplanTable: function (){
|
||||
return this.showStundenplanDev ? 'stundenplandev' : 'stundenplan';
|
||||
}
|
||||
},
|
||||
inject: {
|
||||
currentSemester: {
|
||||
from: 'currentSemester',
|
||||
@@ -44,6 +28,22 @@ export default {
|
||||
showStundenplanDev: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
downloadLink: function(){
|
||||
if(!this.dataSem.start || !this.dataSem.ende || !this.student.uid) return;
|
||||
let start = new Date(this.dataSem.start);
|
||||
start = Math.floor(start.getTime()/1000);
|
||||
let ende = new Date(this.dataSem.ende);
|
||||
ende = Math.floor(ende.getTime() / 1000);
|
||||
|
||||
let link =
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root + "cis/private/lvplan/stpl_kalender.php?type=student&pers_uid=" + this.student.uid + "&begin=" + start + "&ende= " +ende + "&format=excel";
|
||||
return link;
|
||||
},
|
||||
dbStundenplanTable: function (){
|
||||
return this.showStundenplanDev ? 'stundenplandev' : 'stundenplan';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
initTabulatorOptions(){
|
||||
this.tabulatorOptions = {
|
||||
@@ -59,6 +59,7 @@ export default {
|
||||
ajaxResponse: (url, params, response) => {
|
||||
return response.data;
|
||||
},
|
||||
persistenceID: 'stv-details-lvtermine-20260217',
|
||||
columns: [
|
||||
{title: "lv_id", field: "lehrveranstaltung_id", visible: false},
|
||||
{title: "lehreinheit_id", field: "lehreinheit_id", visible: false},
|
||||
@@ -80,7 +81,7 @@ export default {
|
||||
{title: "farbe", field: "farbe", visible: false},
|
||||
{title: "Gruppen", field: "gruppen_kuerzel"},
|
||||
{title: "ort", field: "ort_kurzbz"},
|
||||
{title: "lektorIn", field: "lektorname"},
|
||||
{title: "lektorIn", field: "lektorname", sorter: "string"},
|
||||
{title: "Lehrfach", field: "lehrfach_bez"}
|
||||
],
|
||||
rowFormatter: function(row){
|
||||
@@ -100,42 +101,35 @@ export default {
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['global', 'ui', 'lehre']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('lehrveranstaltung_id').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'lehrveranstaltung_id')
|
||||
});
|
||||
cm.getColumnByField('lehreinheit_id').component.updateDefinition({
|
||||
title: this.$p.t('global', 'lehreinheit_id')
|
||||
});
|
||||
cm.getColumnByField('datum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'datum')
|
||||
});
|
||||
cm.getColumnByField('beginn').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'dateFrom')
|
||||
});
|
||||
cm.getColumnByField('ende').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'dateTo')
|
||||
});
|
||||
cm.getColumnByField('gruppen_kuerzel').component.updateDefinition({
|
||||
title: this.$p.t('global', 'gruppen')
|
||||
});
|
||||
cm.getColumnByField('ort_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('global', 'ortLocation')
|
||||
});
|
||||
cm.getColumnByField('lektorname').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'lektor')
|
||||
});
|
||||
cm.getColumnByField('lehrfach_bez').component.updateDefinition({
|
||||
title: this.$p.t('global', 'lehrfach')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('lehrveranstaltung_id', this.$p.t('lehre', 'lehrveranstaltung_id'));
|
||||
setHeader('lehreinheit_id', this.$p.t('global', 'lehreinheit_id'));
|
||||
setHeader('datum', this.$p.t('global', 'datum'));
|
||||
setHeader('beginn', this.$p.t('ui', 'dateFrom'));
|
||||
setHeader('ende', this.$p.t('ui', 'dateTo'));
|
||||
setHeader('gruppen_kuerzel', this.$p.t('global', 'gruppen'));
|
||||
setHeader('ort_kurzbz', this.$p.t('global', 'ortLocation'));
|
||||
setHeader('lektorname', this.$p.t('lehre', 'lektor'));
|
||||
setHeader('lehrfach_bez', this.$p.t('global', 'lehrfach'));
|
||||
}
|
||||
}
|
||||
];
|
||||
},
|
||||
getDatesOfSemester(studiensemester_kurzbz) {
|
||||
this.dataSem = this.listStudiensemester.find(item => item.studiensemester_kurzbz === studiensemester_kurzbz);
|
||||
},
|
||||
},
|
||||
exportToExcel(){
|
||||
window.open(this.downloadLink, '_blank');
|
||||
},
|
||||
|
||||
@@ -74,7 +74,7 @@ export default {
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 200,
|
||||
persistenceID: 'core-mobility-purpose-2025112401'
|
||||
persistenceID: 'core-mobility-purpose-20260217'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
{
|
||||
@@ -83,17 +83,22 @@ export default {
|
||||
|
||||
await this.$p.loadCategory(['ui', 'global', 'mobility']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'bezeichnung')
|
||||
});
|
||||
cm.getColumnByField('kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'kurzbz')
|
||||
});
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('bezeichnung', this.$p.t('ui', 'bezeichnung'));
|
||||
setHeader('kurzbz', this.$p.t('mobility', 'kurzbz'));
|
||||
//setHeader('actions', this.$p.t('global', 'aktionen'));
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@@ -72,7 +72,7 @@ export default {
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 200,
|
||||
persistenceID: 'core-mobility-support-2025112401'
|
||||
persistenceID: 'core-mobility-support-20260217'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
{
|
||||
@@ -81,14 +81,19 @@ export default {
|
||||
|
||||
await this.$p.loadCategory(['ui', 'global', 'mobility']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'bezeichnung')
|
||||
});
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
setHeader('bezeichnung', this.$p.t('ui', 'bezeichnung'));
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@@ -37,12 +37,49 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
formData: {
|
||||
von: new Date(),
|
||||
bis: new Date(),
|
||||
mobilitaetsprogramm_code: 7,
|
||||
nation_code: 'A',
|
||||
herkunftsland_code: 'A',
|
||||
bisio_id: null,
|
||||
localPurposes: [],
|
||||
localSupports: [],
|
||||
lehrveranstaltung_id: null,
|
||||
lehreinheit_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
programsMobility: [],
|
||||
listLvs: [],
|
||||
listLes: [],
|
||||
listLvsAndLes: [],
|
||||
listPurposes: [],
|
||||
listSupports: [],
|
||||
tabulatorData: [],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
minHeight: 200,
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
student(){
|
||||
if (this.$refs.table) {
|
||||
this.$refs.table.reloadTable();
|
||||
}
|
||||
},
|
||||
},
|
||||
computed:{
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(
|
||||
ApiStvMobility.getMobilitaeten(this.student.uid)
|
||||
),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
index: 'bisio_id',
|
||||
persistenceID: 'stv-details-table_mobility-20260217',
|
||||
columns: [
|
||||
{title: "Kurzbz", field: "kurzbz"},
|
||||
{title: "Nation", field: "nation_code"},
|
||||
@@ -63,8 +100,8 @@ export default {
|
||||
},
|
||||
{
|
||||
title: "Bis",
|
||||
field: "bis",
|
||||
formatter: function (cell) {
|
||||
field: "bis",
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
@@ -109,81 +146,49 @@ export default {
|
||||
frozen: true
|
||||
},
|
||||
],
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
minHeight: 200,
|
||||
index: 'bisio_id',
|
||||
persistenceID: 'stv-details-table_mobiliy-2025112401'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'dataLoaded',
|
||||
handler: data => this.tabulatorData = data.map(item => {
|
||||
// item.actionDiv = document.createElement('div');
|
||||
// item.actionDiv = document.createElement('div');
|
||||
return item;
|
||||
}),
|
||||
},
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async() => {
|
||||
|
||||
if (!this.$refs.table) return;
|
||||
|
||||
await this.$p.loadCategory(['global', 'person', 'stv', 'mobility', 'ui']);
|
||||
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'kurzbz_program')
|
||||
});
|
||||
cm.getColumnByField('nation_code').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'gastnation')
|
||||
});
|
||||
cm.getColumnByField('von').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'von')
|
||||
});
|
||||
cm.getColumnByField('bis').component.updateDefinition({
|
||||
title: this.$p.t('global', 'bis')
|
||||
});
|
||||
cm.getColumnByField('bisio_id').component.updateDefinition({
|
||||
title: this.$p.t('mobility', 'bisio_id')
|
||||
});
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
/* cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});*/
|
||||
setHeader('kurzbz', this.$p.t('mobility', 'kurzbz_program'));
|
||||
setHeader('nation_code', this.$p.t('mobility', 'gastnation'));
|
||||
setHeader('von', this.$p.t('ui', 'von'));
|
||||
setHeader('bis', this.$p.t('global', 'bis'));
|
||||
setHeader('bisio_id', this.$p.t('mobility', 'bisio_id'));
|
||||
}
|
||||
}
|
||||
],
|
||||
formData: {
|
||||
von: new Date(),
|
||||
bis: new Date(),
|
||||
mobilitaetsprogramm_code: 7,
|
||||
nation_code: 'A',
|
||||
herkunftsland_code: 'A',
|
||||
bisio_id: null,
|
||||
localPurposes: [],
|
||||
localSupports: [],
|
||||
lehrveranstaltung_id: null,
|
||||
lehreinheit_id: null
|
||||
},
|
||||
statusNew: true,
|
||||
programsMobility: [],
|
||||
listLvs: [],
|
||||
listLes: [],
|
||||
listLvsAndLes: [],
|
||||
listPurposes: [],
|
||||
listSupports: [],
|
||||
tabulatorData: []
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
student(){
|
||||
if (this.$refs.table) {
|
||||
this.$refs.table.reloadTable();
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
computed:{
|
||||
lv_teile(){
|
||||
return this.listLvsAndLes.filter(lv => lv.lehreinheit_id == this.formData.lehreinheit_id);
|
||||
},
|
||||
|
||||
@@ -39,8 +39,38 @@ export default {
|
||||
{ field: 'lv_bezeichnung', title: this.$p.t('lehre/lehrveranstaltung') },
|
||||
{ field: 'note_bezeichnung', title: this.$p.t('lehre/note') },
|
||||
{ field: 'insertvon', title: this.$p.t('profil/mitarbeiterIn'), visible: false },
|
||||
{ field: 'benotungsdatum', title: this.$p.t('stv/grades_gradingdate'), visible: false },
|
||||
{ field: 'freigabedatum', title: this.$p.t('stv/grades_approvaldate'), visible: false },
|
||||
{ field: 'benotungsdatum', title: this.$p.t('stv/grades_gradingdate'), visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{ field: 'freigabedatum', title: this.$p.t('stv/grades_approvaldate'), visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{ field: 'studiensemester_kurzbz', title: this.$p.t('lehre/studiensemester'), visible: false },
|
||||
{ field: 'stg_bezeichnung', title: this.$p.t('lehre/studiengang'), visible: false },
|
||||
{ field: 'note', title: this.$p.t('stv/grades_numericgrade'), visible: false },
|
||||
@@ -49,9 +79,9 @@ export default {
|
||||
],
|
||||
layout: 'fitDataStretch',
|
||||
height: '100%',
|
||||
selectable: true,
|
||||
selectableRangeMode: 'click',
|
||||
persistenceID: 'stv-details-noten-repeater'
|
||||
selectableRows: true,
|
||||
selectableRowsRangeMode: 'click',
|
||||
persistenceID: 'stv-details-noten-repeater-20260217'
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
@@ -39,8 +39,38 @@ export default {
|
||||
{ field: 'lehrveranstaltung_bezeichnung', title: this.$p.t('lehre/lehrveranstaltung') },
|
||||
{ field: 'note_bezeichnung', title: this.$p.t('lehre/note') },
|
||||
{ field: 'mitarbeiter_uid', title: this.$p.t('profil/mitarbeiterIn'), visible: false },
|
||||
{ field: 'benotungsdatum', title: this.$p.t('stv/grades_gradingdate'), visible: false },
|
||||
{ field: 'freigabedatum', title: this.$p.t('stv/grades_approvaldate'), visible: false },
|
||||
{ field: 'benotungsdatum', title: this.$p.t('stv/grades_gradingdate'), visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{ field: 'freigabedatum', title: this.$p.t('stv/grades_approvaldate'), visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{ field: 'studiensemester_kurzbz', title: this.$p.t('lehre/studiensemester'), visible: false },
|
||||
{ field: 'note', title: this.$p.t('stv/grades_numericgrade'), visible: false },
|
||||
{ field: 'student_uid', title: this.$p.t('profil/studentIn'), visible: false },
|
||||
@@ -49,9 +79,9 @@ export default {
|
||||
],
|
||||
layout: 'fitDataStretch',
|
||||
height: '100%',
|
||||
selectable: true,
|
||||
selectableRangeMode: 'click',
|
||||
persistenceID: 'stv-details-noten-teacher'
|
||||
selectableRows: true,
|
||||
selectableRowsRangeMode: 'click',
|
||||
persistenceID: 'stv-details-noten-teacher-20260217'
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
@@ -148,8 +148,38 @@ export default {
|
||||
{ field: 'zeugnis', title: this.$p.t('stv/grades_zeugnis'), formatter: 'tickCross' },
|
||||
{ field: 'lehrveranstaltung_bezeichnung', title: this.$p.t('lehre/lehrveranstaltung') },
|
||||
gradeField,
|
||||
{ field: 'uebernahmedatum', title: this.$p.t('stv/grades_takeoverdate'), visible: false },
|
||||
{ field: 'benotungsdatum', title: this.$p.t('stv/grades_gradingdate'), visible: false },
|
||||
{ field: 'uebernahmedatum', title: this.$p.t('stv/grades_takeoverdate'), visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{ field: 'benotungsdatum', title: this.$p.t('stv/grades_gradingdate'), visible: false,
|
||||
formatter: function (cell) {
|
||||
const dateStr = cell.getValue();
|
||||
if (!dateStr) return "";
|
||||
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: false
|
||||
});
|
||||
}},
|
||||
{ field: 'studiensemester_kurzbz', title: this.$p.t('lehre/studiensemester'), visible: false },
|
||||
{ field: 'note_number', title: this.$p.t('stv/grades_numericgrade'), visible: false, formatter: cell => cell.getData().note, tooltip: (evt, cell) => cell.getData().note },
|
||||
{ field: 'lehrveranstaltung_id', title: this.$p.t('lehre/lehrveranstaltung_id'), visible: false },
|
||||
@@ -218,9 +248,9 @@ export default {
|
||||
columns,
|
||||
height: '100%',
|
||||
layout: 'fitDataStretchFrozen',
|
||||
selectable: 1,
|
||||
selectableRangeMode: 'click',
|
||||
persistenceID: 'stv-details-noten-zeugnis-2025112401',
|
||||
selectableRows: 1,
|
||||
selectableRowsRangeMode: 'click',
|
||||
persistenceID: 'stv-details-noten-zeugnis-20260217',
|
||||
persistence:{
|
||||
columns: ["width", "visible", "frozen"]
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ export default {
|
||||
},
|
||||
template: `
|
||||
<div class="stv-details-notizen h-100 pb-3">
|
||||
|
||||
|
||||
<!-- Test Version classicFas for enter with one click vs popupModal-->
|
||||
<core-notiz
|
||||
@@ -31,7 +30,7 @@ export default {
|
||||
show-tiny-mce
|
||||
:visibleColumns="['titel','text','verfasser','bearbeiter','dokumente']"
|
||||
@reload="$emit('update:suffix')"
|
||||
tabulator-persistence-id="stv-notiz-2026011301"
|
||||
tabulator-persistence-id="stv-notiz-20260217"
|
||||
>
|
||||
</core-notiz>
|
||||
|
||||
@@ -76,7 +75,6 @@ visibleColumns: list, which fields shoult be showed as default in filter compone
|
||||
------------------------ SOME TESTDATA -----------------------------------------------------
|
||||
---------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
<core-notiz
|
||||
:endpoint="$fhcApi.factory.notiz.mitarbeiter"
|
||||
ref="formc"
|
||||
@@ -114,8 +112,9 @@ visibleColumns: list, which fields shoult be showed as default in filter compone
|
||||
:showTinyMCE="true"
|
||||
:visible-columns="['titel','text','verfasser','bearbeiter','dokumente']"
|
||||
>
|
||||
</core-notiz>-->
|
||||
</core-notiz>
|
||||
-->
|
||||
|
||||
</div>
|
||||
`
|
||||
};
|
||||
};
|
||||
|
||||
@@ -260,12 +260,12 @@ export default {
|
||||
<div class="position-sticky top-0 z-1">
|
||||
<button type="submit" class="btn btn-primary position-absolute top-0 end-0" :disabled="!deltaLength">Speichern</button>
|
||||
</div>
|
||||
<fieldset class="overflow-hidden">
|
||||
<fieldset class="overflow-hidden mb-2">
|
||||
<legend>{{$p.t('lehre', 'title_zgv')}} {{modelValue.nachname}} {{modelValue.vorname}}</legend>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('prestudent_id')"
|
||||
container-class="col-3 stv-details-prestudent-prestudent_id"
|
||||
container-class="col stv-details-prestudent-prestudent_id"
|
||||
:label="$p.t('ui', 'prestudent_id')"
|
||||
type="text"
|
||||
v-model="data.prestudent_id"
|
||||
@@ -275,7 +275,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('person_id')"
|
||||
container-class="col-3 stv-details-prestudent-person_id"
|
||||
container-class="col stv-details-prestudent-person_id"
|
||||
:label="$p.t('person', 'person_id')"
|
||||
type="text"
|
||||
v-model="data.person_id"
|
||||
@@ -284,10 +284,10 @@ export default {
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgv_code')"
|
||||
container-class="col-3 stv-details-prestudent-zgv_code"
|
||||
container-class="col stv-details-prestudent-zgv_code"
|
||||
label="ZGV"
|
||||
type="autocomplete"
|
||||
v-model="selectedZgv"
|
||||
@@ -312,7 +312,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvOrt')"
|
||||
container-class="col-3 stv-details-prestudent-zgvOrt"
|
||||
container-class="col stv-details-prestudent-zgvOrt"
|
||||
:label="$p.t('infocenter', 'zgvOrt')"
|
||||
type="text"
|
||||
v-model="data.zgvort"
|
||||
@@ -321,7 +321,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvDatum')"
|
||||
container-class="col-3 stv-details-prestudent-zgvDatum"
|
||||
container-class="col stv-details-prestudent-zgvDatum"
|
||||
:label="$p.t('infocenter', 'zgvDatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.zgvdatum"
|
||||
@@ -337,7 +337,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvNation')"
|
||||
container-class="col-3 stv-details-prestudent-zgvNation"
|
||||
container-class="col stv-details-prestudent-zgvNation"
|
||||
:label="$p.t('infocenter', 'zgvNation')"
|
||||
type="select"
|
||||
v-model="data.zgvnation"
|
||||
@@ -348,10 +348,10 @@ export default {
|
||||
<option v-for="nation in lists.nations" :key="nation.nation_code" :value="nation.nation_code" :disabled="nation.sperre">{{nation.kurztext}}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvmas_code')"
|
||||
container-class="col-3 stv-details-prestudent-zgvmas_code"
|
||||
container-class="col stv-details-prestudent-zgvmas_code"
|
||||
:label="$p.t('lehre', 'zgvMaster')"
|
||||
type="autocomplete"
|
||||
v-model="selectedMasterZgv"
|
||||
@@ -376,7 +376,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvmaort')"
|
||||
container-class="col-3 stv-details-prestudent-zgvmaort"
|
||||
container-class="col stv-details-prestudent-zgvmaort"
|
||||
:label="$p.t('lehre', 'zgvMasterOrt')"
|
||||
type="text"
|
||||
v-model="data.zgvmaort"
|
||||
@@ -385,7 +385,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvmadatum')"
|
||||
container-class="col-3 stv-details-prestudent-zgvmadatum"
|
||||
container-class="col stv-details-prestudent-zgvmadatum"
|
||||
:label="$p.t('lehre', 'zgvMasterDatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.zgvmadatum"
|
||||
@@ -401,7 +401,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvmanation')"
|
||||
container-class="col-3 stv-details-prestudent-zgvmanation"
|
||||
container-class="col stv-details-prestudent-zgvmanation"
|
||||
:label="$p.t('lehre', 'zgvMasterNation')"
|
||||
type="select"
|
||||
v-model="data.zgvmanation"
|
||||
@@ -413,10 +413,10 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
<!--ZGV Doktor-->
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvdoktor_code')"
|
||||
container-class="col-3 stv-details-prestudent-zgvdoktor_code"
|
||||
container-class="col stv-details-prestudent-zgvdoktor_code"
|
||||
:label="$p.t('lehre', 'zgvDoktor')"
|
||||
type="autocomplete"
|
||||
v-model="selectedDoktorZgv"
|
||||
@@ -441,7 +441,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvdoktorort')"
|
||||
container-class="col-3 stv-details-prestudent-zgvdoktorort"
|
||||
container-class="col stv-details-prestudent-zgvdoktorort"
|
||||
:label="$p.t('lehre', 'zgvDoktorOrt')"
|
||||
type="text"
|
||||
v-model="data.zgvdoktorort"
|
||||
@@ -450,7 +450,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvdoktordatum')"
|
||||
container-class="col-3 stv-details-prestudent-zgvdoktordatum"
|
||||
container-class="col stv-details-prestudent-zgvdoktordatum"
|
||||
:label="$p.t('lehre', 'zgvDoktorDatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.zgvdoktordatum"
|
||||
@@ -466,7 +466,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvdoktornation')"
|
||||
container-class="col-3 stv-details-prestudent-zgvdoktornation"
|
||||
container-class="col stv-details-prestudent-zgvdoktornation"
|
||||
:label="$p.t('lehre', 'zgvDoktorNation')"
|
||||
type="select"
|
||||
v-model="data.zgvdoktornation"
|
||||
@@ -477,11 +477,13 @@ export default {
|
||||
<option v-for="nation in lists.nations" :key="nation.nation_code" :value="nation.nation_code" :disabled="nation.sperre">{{nation.kurztext}}</option>
|
||||
</form-input>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="col-3 pt-4 d-flex align-items-center">
|
||||
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 gx-3 gy-1 mb-1">
|
||||
<div
|
||||
class="col pt-4 d-flex align-items-center"
|
||||
v-if="!config.hiddenFields.includes('zgv_erfuellt')"
|
||||
>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgv_erfuellt')"
|
||||
container-class="form-check stv-details-prestudent-zgv_erfuellt"
|
||||
:label="$p.t('infocenter', 'zgvErfuellt')"
|
||||
type="checkbox"
|
||||
@@ -490,9 +492,11 @@ export default {
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="col-3 pt-4 d-flex align-items-center">
|
||||
<div
|
||||
class="col pt-4 d-flex align-items-center"
|
||||
v-if="!config.hiddenFields.includes('zgvmas_erfuellt')"
|
||||
>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvmas_erfuellt')"
|
||||
container-class="form-check stv-details-prestudent-zgvmas_erfuellt"
|
||||
:label="$p.t('lehre', 'zgvMasterErfuellt')"
|
||||
type="checkbox"
|
||||
@@ -501,9 +505,11 @@ export default {
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="col-3 pt-4 d-flex align-items-center">
|
||||
<div
|
||||
class="col pt-4 d-flex align-items-center"
|
||||
v-if="!config.hiddenFields.includes('zgvdoktor_erfuellt')"
|
||||
>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('zgvdoktor_erfuellt')"
|
||||
container-class="form-check stv-details-prestudent-zgvdoktor_erfuellt"
|
||||
:label="$p.t('lehre', 'zgvDoktorErfuellt')"
|
||||
type="checkbox"
|
||||
@@ -514,12 +520,12 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset class="overflow-hidden">
|
||||
<fieldset class="overflow-hidden mb-2">
|
||||
<legend>PrestudentIn</legend>
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-3 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('aufmerksamdurch_kurzbz')"
|
||||
container-class="col-4 stv-details-prestudent-aufmerksamdurch_kurzbz"
|
||||
container-class="col stv-details-prestudent-aufmerksamdurch_kurzbz"
|
||||
:label="$p.t('person', 'aufmerksamDurch')"
|
||||
type="select"
|
||||
v-model="data.aufmerksamdurch_kurzbz"
|
||||
@@ -529,7 +535,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('berufstaetigkeit_code')"
|
||||
container-class="col-4 stv-details-prestudent-berufstaetigkeit_code"
|
||||
container-class="col stv-details-prestudent-berufstaetigkeit_code"
|
||||
:label="$p.t('person', 'berufstaetigkeit')"
|
||||
type="select"
|
||||
v-model="data.berufstaetigkeit_code"
|
||||
@@ -540,7 +546,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('ausbildungcode')"
|
||||
container-class="col-4 stv-details-prestudent-ausbildungcode"
|
||||
container-class="col stv-details-prestudent-ausbildungcode"
|
||||
:label="$p.t('person', 'ausbildung')"
|
||||
type="select"
|
||||
v-model="data.ausbildungcode"
|
||||
@@ -551,10 +557,10 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-3 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('aufnahmeschluessel')"
|
||||
container-class="col-4 stv-details-prestudent-aufnahmeschluessel"
|
||||
container-class="col stv-details-prestudent-aufnahmeschluessel"
|
||||
label="Aufnahmeschlüssel"
|
||||
type="text"
|
||||
v-model="data.aufnahmeschluessel"
|
||||
@@ -563,9 +569,11 @@ export default {
|
||||
>
|
||||
</form-input>
|
||||
|
||||
<div class="col-4 pt-4 d-flex align-items-center">
|
||||
<div
|
||||
v-if="!config.hiddenFields.includes('facheinschlaegigBerufstaetig')"
|
||||
class="col pt-4 d-flex align-items-center"
|
||||
>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('facheinschlaegigBerufstaetig')"
|
||||
container-class="form-check stv-details-prestudent-facheinschlaegigBerufstaetig"
|
||||
:label="$p.t('person', 'facheinschlaegigBerufstaetig')"
|
||||
type="checkbox"
|
||||
@@ -577,7 +585,7 @@ export default {
|
||||
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('standort_code')"
|
||||
container-class="col-4 stv-details-prestudent-standort_code"
|
||||
container-class="col stv-details-prestudent-standort_code"
|
||||
:label="$p.t('person', 'bisstandort')"
|
||||
type="select"
|
||||
v-model="data.standort_code"
|
||||
@@ -587,10 +595,10 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-3 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('studiengang_kz')"
|
||||
container-class="col-4 stv-details-prestudent-studiengang_kz"
|
||||
container-class="col stv-details-prestudent-studiengang_kz"
|
||||
:label="$p.t('lehre', 'studiengang')"
|
||||
type="select"
|
||||
v-model="data.studiengang_kz"
|
||||
@@ -601,7 +609,7 @@ export default {
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('gsstudientyp_kurzbz')"
|
||||
container-class="col-4 stv-details-prestudent-gsstudientyp_kurzbz"
|
||||
container-class="col stv-details-prestudent-gsstudientyp_kurzbz"
|
||||
:label="$p.t('lehre', 'studientyp')"
|
||||
type="select"
|
||||
v-model="data.gsstudientyp_kurzbz"
|
||||
@@ -611,66 +619,77 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-3 gx-3 gy-1 mb-1">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('anmerkung')"
|
||||
container-class="col-4 stv-details-prestudent-anmerkung"
|
||||
container-class="col stv-details-prestudent-anmerkung"
|
||||
:label="$p.t('global', 'anmerkung')"
|
||||
type="text"
|
||||
v-model="data.anmerkung"
|
||||
name="anmerkung"
|
||||
>
|
||||
</form-input>
|
||||
<div class="col-2 pt-4 d-flex align-items-center">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('bismelden')"
|
||||
container-class="form-check stv-details-prestudent-bismelden"
|
||||
:label="$p.t('person', 'bismelden')"
|
||||
type="checkbox"
|
||||
v-model="data.bismelden"
|
||||
name="bismelden"
|
||||
:disabled="!hasBismeldenPermission"
|
||||
<div class="col">
|
||||
<div class="row g-3 align-items-center mb-3">
|
||||
<div
|
||||
class="col-12 col-md-6 pt-4 d-flex align-items-center"
|
||||
v-if="!config.hiddenFields.includes('bismelden')"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div class="col-2 pt-4 d-flex align-items-center">
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('dual')"
|
||||
container-class="form-check stv-details-prestudent-dual"
|
||||
:label="$p.t('lehre', 'dual')"
|
||||
type="checkbox"
|
||||
v-model="data.dual"
|
||||
name="dual"
|
||||
<form-input
|
||||
container-class="col form-check stv-details-prestudent-bismelden"
|
||||
:label="$p.t('person', 'bismelden')"
|
||||
type="checkbox"
|
||||
v-model="data.bismelden"
|
||||
name="bismelden"
|
||||
:disabled="!hasBismeldenPermission"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
<div
|
||||
class="col-12 col-md-6 pt-4 d-flex align-items-center"
|
||||
v-if="!config.hiddenFields.includes('dual')"
|
||||
>
|
||||
</form-input>
|
||||
<form-input
|
||||
container-class="col form-check stv-details-prestudent-dual"
|
||||
:label="$p.t('lehre', 'dual')"
|
||||
type="checkbox"
|
||||
v-model="data.dual"
|
||||
name="dual"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form-input
|
||||
container-class="col-3"
|
||||
:label="$p.t('lehre', 'foerderrelevant')"
|
||||
type="select"
|
||||
v-model="data.foerderrelevant"
|
||||
name="foerderrelevant"
|
||||
>
|
||||
<option v-for="entry in listFoerderrelevant" :value="entry.value">{{entry.text}}</option>
|
||||
</form-input>
|
||||
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('priorisierung')"
|
||||
container-class="col-1"
|
||||
:label="$p.t('lehre', 'prioritaet')"
|
||||
type="text"
|
||||
v-model="data.priorisierung"
|
||||
name="priorisierung"
|
||||
:disabled="!hasPrestudentPermission"
|
||||
>
|
||||
</form-input>
|
||||
<div class="col">
|
||||
<div class="row g-3 align-items-center">
|
||||
<form-input
|
||||
container-class="col-12 col-md-6"
|
||||
:label="$p.t('lehre', 'foerderrelevant')"
|
||||
type="select"
|
||||
v-model="data.foerderrelevant"
|
||||
name="foerderrelevant"
|
||||
>
|
||||
<option v-for="entry in listFoerderrelevant" :value="entry.value">{{entry.text}}</option>
|
||||
</form-input>
|
||||
<form-input
|
||||
v-if="!config.hiddenFields.includes('priorisierung')"
|
||||
container-class="col-12 col-md-6"
|
||||
:label="$p.t('lehre', 'prioritaet')"
|
||||
type="text"
|
||||
v-model="data.priorisierung"
|
||||
name="priorisierung"
|
||||
:disabled="!hasPrestudentPermission"
|
||||
>
|
||||
</form-input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<core-udf
|
||||
v-if="!config.hideUDFs"
|
||||
@load="udfsLoaded"
|
||||
v-model="data"
|
||||
class="row-cols-3 g-3 mb-3"
|
||||
class="row-cols-3 gx-3 gy-1 mb-1"
|
||||
ci-model="crm/prestudent"
|
||||
:pk="{prestudent_id:modelValue.prestudent_id}"
|
||||
>
|
||||
|
||||
@@ -12,11 +12,20 @@ export default{
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
layout: 'fitDataFill',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
selectableRows: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(ApiStvPrestudent.getHistoryPrestudents(this.personId)),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
//autoColumns: true,
|
||||
persistenceID: 'stv-details-prestudent-history-20260217',
|
||||
columns:[
|
||||
{title:"StSem", field:"studiensemester_kurzbz"},
|
||||
{title:"Prio", field:"priorisierung"},
|
||||
@@ -37,35 +46,38 @@ export default{
|
||||
element.classList.add('fw-bold');
|
||||
}
|
||||
},
|
||||
layout: 'fitDataFill',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
selectable: false,
|
||||
persistenceID: 'stv-details-prestudent-history'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['lehre']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('orgform_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'organisationsform')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'studienplan')
|
||||
});
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('orgform_kurzbz', this.$p.t('lehre', 'organisationsform'));
|
||||
setHeader('bezeichnung', this.$p.t('lehre', 'studienplan'));
|
||||
setHeader('prestudent_id', this.$p.t('ui', 'prestudent_id'));
|
||||
|
||||
cm.getColumnByField('prestudent_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'prestudent_id')
|
||||
});
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
return events;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
personId() {
|
||||
@@ -73,7 +85,7 @@ export default{
|
||||
},
|
||||
},
|
||||
template: `
|
||||
<div class="stv-details-prestudent-history h-100 pt-3">
|
||||
<div class="stv-details-prestudent-history h-100">
|
||||
<core-filter-cmpt
|
||||
ref="table"
|
||||
:tabulator-options="tabulatorOptions"
|
||||
|
||||
@@ -26,37 +26,8 @@ export default{
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
prestudentIds() {
|
||||
if (this.modelValue.prestudent_id)
|
||||
{
|
||||
return [this.modelValue.prestudent_id];
|
||||
}
|
||||
return this.modelValue.map(e => e.prestudent_id);
|
||||
},
|
||||
showToolbarStudent() {
|
||||
if (Array.isArray(this.modelValue)) {
|
||||
if (!this.modelValue.length)
|
||||
return false;
|
||||
return this.modelValue.every(item => item.uid);
|
||||
}
|
||||
return !!this.modelValue.uid;
|
||||
},
|
||||
showToolbarInteressent() {
|
||||
if (Array.isArray(this.modelValue)) {
|
||||
if (!this.modelValue.length)
|
||||
return false;
|
||||
return !this.modelValue.some(item => item.uid);
|
||||
}
|
||||
return !this.modelValue.uid;
|
||||
}
|
||||
},
|
||||
props: {
|
||||
modelValue: Object,
|
||||
config: Object,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabulatorOptions: {
|
||||
tabulatorOptions() {
|
||||
const options = {
|
||||
ajaxURL: 'dummy',
|
||||
ajaxRequestFunc: () => this.$api.call(ApiStvPrestudent.getHistoryPrestudent(this.modelValue.prestudent_id)),
|
||||
ajaxResponse: (url, params, response) => response.data,
|
||||
@@ -164,7 +135,7 @@ export default{
|
||||
}
|
||||
},
|
||||
{title: "UpdateVon", field: "updatevon", visible: false},
|
||||
/* {title: "Aufnahmestufe", field: "aufnahmestufe", visible: false},*/
|
||||
/* {title: "Aufnahmestufe", field: "aufnahmestufe", visible: false},*/
|
||||
{
|
||||
title: 'Aktionen', field: 'actions',
|
||||
minWidth: 150, // Ensures Action-buttons will be always fully displayed
|
||||
@@ -207,8 +178,8 @@ export default{
|
||||
button.addEventListener('click', () =>
|
||||
this.actionEditStatus(data.status_kurzbz, data.studiensemester_kurzbz, data.ausbildungssemester)
|
||||
);
|
||||
/* if (this.dataMeldestichtag && this.dataMeldestichtag > data.datum && !this.hasPermissionToSkipStatusCheck)
|
||||
button.disabled = true;*/
|
||||
/* if (this.dataMeldestichtag && this.dataMeldestichtag > data.datum && !this.hasPermissionToSkipStatusCheck)
|
||||
button.disabled = true;*/
|
||||
container.append(button);
|
||||
|
||||
button = document.createElement('button');
|
||||
@@ -237,68 +208,78 @@ export default{
|
||||
layout: 'fitDataStretchFrozen',
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 'auto',
|
||||
selectable: false,
|
||||
selectableRows: false,
|
||||
index: 'statusId',
|
||||
persistenceID: 'stv-multistatus-2025112401'
|
||||
},
|
||||
tabulatorEvents: [
|
||||
persistenceID: 'stv-multistatus-20260217'
|
||||
};
|
||||
return options;
|
||||
},
|
||||
tabulatorEvents() {
|
||||
const events = [
|
||||
{
|
||||
event: 'tableBuilt',
|
||||
handler: async () => {
|
||||
await this.$p.loadCategory(['lehre','global','person','ui']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('lehrverband').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'lehrverband')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
cm.getColumnByField('bestaetigtam').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'bestaetigt_am')
|
||||
});
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
cm.getColumnByField('bewerbung_abgeschicktamum').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'bewerbung_abgeschickt_am')
|
||||
});
|
||||
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'studienplan')
|
||||
});
|
||||
|
||||
cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});
|
||||
|
||||
cm.getColumnByField('datum').component.updateDefinition({
|
||||
title: this.$p.t('global', 'datum')
|
||||
});
|
||||
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('global', 'anmerkung')
|
||||
});
|
||||
|
||||
cm.getColumnByField('bestaetigtvon').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'bestaetigt_von')
|
||||
});
|
||||
|
||||
cm.getColumnByField('insertamum').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'insert_am')
|
||||
});
|
||||
|
||||
cm.getColumnByField('insertvon').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'insert_von')
|
||||
});
|
||||
|
||||
cm.getColumnByField('prestudent_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'prestudent_id')
|
||||
});
|
||||
|
||||
cm.getColumnByField('studienplan_id').component.updateDefinition({
|
||||
title: this.$p.t('ui', 'studienplan_id')
|
||||
});
|
||||
}
|
||||
setHeader('lehrverband', this.$p.t('lehre', 'lehrverband'));
|
||||
setHeader('bestaetigtam', this.$p.t('lehre', 'bestaetigt_am'));
|
||||
setHeader('bewerbung_abgeschicktamum', this.$p.t('lehre', 'bewerbung_abgeschickt_am'));
|
||||
setHeader('bezeichnung', this.$p.t('lehre', 'studienplan'));
|
||||
setHeader('actions', this.$p.t('global', 'aktionen'));
|
||||
setHeader('datum', this.$p.t('global', 'datum'));
|
||||
setHeader('anmerkung', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('bestaetigtvon', this.$p.t('lehre', 'bestaetigt_von'));
|
||||
setHeader('insertamum', this.$p.t('lehre', 'insert_am'));
|
||||
setHeader('insertvon', this.$p.t('lehre', 'insert_von'));
|
||||
setHeader('prestudent_id', this.$p.t('ui', 'prestudent_id'));
|
||||
setHeader('studienplan_id', this.$p.t('ui', 'studienplan_id')); }
|
||||
}
|
||||
],
|
||||
];
|
||||
return events;
|
||||
},
|
||||
prestudentIds() {
|
||||
if (this.modelValue.prestudent_id)
|
||||
{
|
||||
return [this.modelValue.prestudent_id];
|
||||
}
|
||||
return this.modelValue.map(e => e.prestudent_id);
|
||||
},
|
||||
showToolbarStudent() {
|
||||
if (Array.isArray(this.modelValue)) {
|
||||
if (!this.modelValue.length)
|
||||
return false;
|
||||
return this.modelValue.every(item => item.uid);
|
||||
}
|
||||
return !!this.modelValue.uid;
|
||||
},
|
||||
showToolbarInteressent() {
|
||||
if (Array.isArray(this.modelValue)) {
|
||||
if (!this.modelValue.length)
|
||||
return false;
|
||||
return !this.modelValue.some(item => item.uid);
|
||||
}
|
||||
return !this.modelValue.uid;
|
||||
}
|
||||
},
|
||||
props: {
|
||||
modelValue: Object,
|
||||
config: Object,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
statusData: {},
|
||||
statusId: {},
|
||||
dataMeldestichtag: null,
|
||||
@@ -420,7 +401,7 @@ export default{
|
||||
@saved="reload"
|
||||
>
|
||||
</status-modal>
|
||||
|
||||
|
||||
<core-filter-cmpt
|
||||
v-if="!this.modelValue.length"
|
||||
ref="table"
|
||||
@@ -433,8 +414,7 @@ export default{
|
||||
new-btn-show
|
||||
:new-btn-label="this.$p.t('global', 'status')"
|
||||
@click:new="actionNewStatus"
|
||||
>
|
||||
|
||||
>
|
||||
<template #actions="{updateData2}">
|
||||
<!-- SingleSelectButton-->
|
||||
<status-dropdown
|
||||
|
||||
+28
-45
@@ -49,50 +49,33 @@ export default {
|
||||
handler: async() => {
|
||||
await this.$p.loadCategory(['global', 'person', 'lehre', 'stv', 'ui', 'projektarbeit']);
|
||||
|
||||
let cm = this.$refs.table.tabulator.columnManager;
|
||||
const setHeader = (field, text) => {
|
||||
const col = this.$refs.table.tabulator.getColumn(field);
|
||||
if (!col) return;
|
||||
|
||||
cm.getColumnByField('projekttyp_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'typ_kurzbz')
|
||||
});
|
||||
cm.getColumnByField('bezeichnung').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'typ')
|
||||
});
|
||||
cm.getColumnByField('studiensemester_kurzbz').component.updateDefinition({
|
||||
title: this.$p.t('lehre', 'studiensemester')
|
||||
});
|
||||
cm.getColumnByField('titel').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'titel')
|
||||
});
|
||||
cm.getColumnByField('note').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'gesamtnote')
|
||||
});
|
||||
cm.getColumnByField('beginn').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'beginn')
|
||||
});
|
||||
cm.getColumnByField('ende').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'ende')
|
||||
});
|
||||
cm.getColumnByField('freigegeben').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'freigegeben')
|
||||
});
|
||||
cm.getColumnByField('gesperrtbis').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'gesperrtBis')
|
||||
});
|
||||
cm.getColumnByField('themenbereich').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'themenbereich')
|
||||
});
|
||||
cm.getColumnByField('anmerkung').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'anmerkung')
|
||||
});
|
||||
cm.getColumnByField('firma_id').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'firmaId')
|
||||
});
|
||||
cm.getColumnByField('abgabedatum').component.updateDefinition({
|
||||
title: this.$p.t('projektarbeit', 'abgabeEndupload')
|
||||
});
|
||||
cm.getColumnByField('actions').component.updateDefinition({
|
||||
title: this.$p.t('global', 'aktionen')
|
||||
});
|
||||
const el = col.getElement();
|
||||
if (!el || !el.querySelector) return;
|
||||
|
||||
const titleEl = el.querySelector('.tabulator-col-title');
|
||||
if (titleEl) {
|
||||
titleEl.textContent = text;
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('projekttyp_kurzbz', this.$p.t('projektarbeit', 'typ_kurzbz'));
|
||||
setHeader('bezeichnung', this.$p.t('projektarbeit', 'typ'));
|
||||
setHeader('studiensemester_kurzbz', this.$p.t('lehre', 'studiensemester'));
|
||||
setHeader('titel', this.$p.t('projektarbeit', 'titel'));
|
||||
setHeader('note', this.$p.t('projektarbeit', 'gesamtnote'));
|
||||
setHeader('beginn', this.$p.t('projektarbeit', 'beginn'));
|
||||
setHeader('ende', this.$p.t('projektarbeit', 'ende'));
|
||||
setHeader('freigegeben', this.$p.t('projektarbeit', 'freigegeben'));
|
||||
setHeader('gesperrtbis', this.$p.t('projektarbeit', 'gesperrtBis'));
|
||||
setHeader('themenbereich', this.$p.t('projektarbeit', 'themenbereich'));
|
||||
setHeader('anmerkung', this.$p.t('projektarbeit', 'anmerkung'));
|
||||
setHeader('firma_id', this.$p.t('projektarbeit', 'firmaId'));
|
||||
setHeader('abgabedatum', this.$p.t('projektarbeit', 'abgabeEndupload'));
|
||||
setHeader('actions', this.$p.t('global', 'aktionen'));
|
||||
}
|
||||
},
|
||||
],
|
||||
@@ -260,12 +243,12 @@ export default {
|
||||
layout: 'fitDataStretchFrozen',
|
||||
height: 'auto',
|
||||
minHeight: '200',
|
||||
selectable: 1,
|
||||
selectableRows: 1,
|
||||
index: 'projektarbeit_id',
|
||||
persistence:{
|
||||
columns: true, //persist column layout
|
||||
},
|
||||
persistenceID: 'stv-details-projektarbeit-2025112401'
|
||||
persistenceID: 'stv-details-projektarbeit-20260217'
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user