mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
Merge master into feature-54564/FHC-4_Studierendenverwaltung_Abschlusspruefung
This commit is contained in:
@@ -5,3 +5,5 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
// CMS Content Id for CIS4 Menu Root
|
||||
$config['cis_menu_root_content_id'] = 11066;
|
||||
// send Mails for ProfilUpdate
|
||||
$config['cis_send_profil_update_mails'] = true;
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
// use vuejs dev version
|
||||
$config['use_vuejs_dev_version'] = false;
|
||||
// use bundled javascript
|
||||
$config['use_bundled_javascript'] = false;
|
||||
@@ -36,6 +36,7 @@ class ProfilUpdate extends Auth_Controller
|
||||
'getTopic' => ['basis/cis:r'],
|
||||
]);
|
||||
|
||||
$this->load->config('cis');
|
||||
|
||||
$this->load->model('person/Profil_update_model', 'ProfilUpdateModel');
|
||||
$this->load->model('person/Kontakt_model', 'KontaktModel');
|
||||
@@ -111,6 +112,10 @@ class ProfilUpdate extends Auth_Controller
|
||||
|
||||
private function sendEmail_onProfilUpdate_response($uid, $topic, $status)
|
||||
{
|
||||
if($this->config->item('cis_send_profil_update_mails') === false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->load->helper('hlp_sancho_helper');
|
||||
$email = $uid . "@" . DOMAIN;
|
||||
@@ -138,6 +143,10 @@ class ProfilUpdate extends Auth_Controller
|
||||
|
||||
private function sendEmail_onProfilUpdate_insertion($uid, $profil_update_id, $topic)
|
||||
{
|
||||
if($this->config->item('cis_send_profil_update_mails') === false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->load->helper('hlp_sancho_helper');
|
||||
$emails = [];
|
||||
|
||||
@@ -28,14 +28,12 @@ class Cis4 extends Auth_Controller
|
||||
public function index()
|
||||
{
|
||||
$this->load->model('person/Person_model','PersonModel');
|
||||
$begruesung = $this->PersonModel->getFirstName(getAuthUID());
|
||||
if(isError($begruesung))
|
||||
{
|
||||
show_error("name couldn't be loaded for username ".getAuthUID());
|
||||
}
|
||||
$begruesung = getData($begruesung);
|
||||
$personData = getData($this->PersonModel->getByUid(getAuthUID()))[0];
|
||||
|
||||
$viewData = array(
|
||||
'name' => $begruesung
|
||||
'uid' => getAuthUID(),
|
||||
'name' => $personData->vorname,
|
||||
'person_id' => $personData->person_id
|
||||
);
|
||||
|
||||
$this->load->view('CisVue/Dashboard.php',['viewData' => $viewData]);
|
||||
|
||||
@@ -125,7 +125,7 @@ class Cms extends FHCAPI_Controller
|
||||
|
||||
//get the data or terminate with error
|
||||
$news = $this->getDataOrTerminateWithError($news);
|
||||
|
||||
|
||||
// collect the content of the news
|
||||
foreach($news as $news_element){
|
||||
$this->addMeta("content_id",$news_element->content_id);
|
||||
@@ -134,12 +134,17 @@ class Cms extends FHCAPI_Controller
|
||||
$this->NewsModel->resetQuery();
|
||||
$content = $this->cmslib->getContent($news_element->content_id);
|
||||
|
||||
$content = $this->getDataOrTerminateWithError($content);
|
||||
$content = getData($content);
|
||||
|
||||
$news_element->content_obj = $content;
|
||||
}
|
||||
$withContent = function($news) {
|
||||
return $news->content_obj != null;
|
||||
};
|
||||
|
||||
$newsWithContent = array_filter($news, $withContent);
|
||||
|
||||
$this->terminateWithSuccess($news);
|
||||
$this->terminateWithSuccess($newsWithContent);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,9 @@ class Phrasen extends FHCAPI_Controller
|
||||
{
|
||||
parent::__construct([
|
||||
'loadModule' => self::PERM_ANONYMOUS,
|
||||
'setLanguage' => self::PERM_ANONYMOUS
|
||||
'setLanguage' => self::PERM_ANONYMOUS,
|
||||
'getLanguage' => self::PERM_ANONYMOUS,
|
||||
'getAllLanguages' => self::PERM_ANONYMOUS,
|
||||
]);
|
||||
|
||||
$this->load->helper('hlp_language');
|
||||
@@ -60,4 +62,23 @@ class Phrasen extends FHCAPI_Controller
|
||||
$phrases = $this->p->setPhrases($categories, $language);
|
||||
$this->terminateWithSuccess($phrases);
|
||||
}
|
||||
|
||||
// gets the langauge of the currently logged in user session and otherwhise the system language
|
||||
public function getLanguage()
|
||||
{
|
||||
$lang = getUserLanguage();
|
||||
$this->terminateWithSuccess($lang);
|
||||
}
|
||||
|
||||
// gets all languages that are set as active in the database
|
||||
public function getAllLanguages()
|
||||
{
|
||||
$langs = getDBActiveLanguages();
|
||||
$langs = $this->getDataOrTerminateWithError($langs);
|
||||
$langs = array_map(function($lang){
|
||||
return $lang->sprache;
|
||||
}, $langs);
|
||||
$this->terminateWithSuccess($langs);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -88,7 +88,7 @@ class Profil extends FHCAPI_Controller
|
||||
$res->data = $this->studentProfil();
|
||||
$res->data->pid = $this->pid;
|
||||
}
|
||||
|
||||
// editing your own profil - true
|
||||
$editAllowed = true;
|
||||
}
|
||||
// UID is availabe when accessing Profil/View/:uid
|
||||
@@ -495,12 +495,11 @@ class Profil extends FHCAPI_Controller
|
||||
*/
|
||||
private function getPersonInfo($uid, $geburtsInfo = null)
|
||||
{
|
||||
$selectClause = ["foto", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"];
|
||||
$selectClause = ["foto", "foto_sperre", "anrede", "titelpost as postnomen", "titelpre as titel", "vorname", "nachname"];
|
||||
/** @param integer $geburtsInfo */
|
||||
if ($geburtsInfo) {
|
||||
array_push($selectClause, "gebort");
|
||||
array_push($selectClause, "gebdatum");
|
||||
array_push($selectClause, "foto_sperre");
|
||||
}
|
||||
$this->BenutzerModel->addSelect($selectClause);
|
||||
$this->BenutzerModel->addJoin("tbl_person", "person_id");
|
||||
@@ -512,6 +511,12 @@ class Profil extends FHCAPI_Controller
|
||||
$person_res = hasData($person_res) ? getData($person_res)[0] : null;
|
||||
}
|
||||
|
||||
if( ($person_res->foto === null) || (($this->uid !== $uid) && ($person_res->foto_sperre !== false)) )
|
||||
{
|
||||
$dummy_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg'));
|
||||
$person_res->foto = $dummy_foto;
|
||||
}
|
||||
|
||||
return $person_res;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,8 @@ class ProfilUpdate extends FHCAPI_Controller
|
||||
'show' => self::PERM_LOGGED,
|
||||
]);
|
||||
|
||||
$this->load->config('cis');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases(
|
||||
array(
|
||||
@@ -504,6 +506,10 @@ class ProfilUpdate extends FHCAPI_Controller
|
||||
|
||||
private function sendEmail_onProfilUpdate_insertion($uid, $profil_update_id, $topic)
|
||||
{
|
||||
if($this->config->item('cis_send_profil_update_mails') === false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->load->helper('hlp_sancho_helper');
|
||||
$emails = [];
|
||||
@@ -573,6 +579,11 @@ class ProfilUpdate extends FHCAPI_Controller
|
||||
|
||||
private function sendEmail_onProfilUpdate_response($uid, $topic, $status)
|
||||
{
|
||||
if($this->config->item('cis_send_profil_update_mails') === false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->load->helper('hlp_sancho_helper');
|
||||
$email = $uid . "@" . DOMAIN;
|
||||
|
||||
|
||||
@@ -151,7 +151,12 @@ class Stundenplan extends FHCAPI_Controller
|
||||
// getting the student_lehrverbaende of the student in the different studiensemester
|
||||
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range);
|
||||
|
||||
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband));
|
||||
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband);
|
||||
if(!$stundenplan_query)
|
||||
{
|
||||
$this->terminateWithSuccess([]);
|
||||
}
|
||||
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query);
|
||||
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
|
||||
|
||||
$this->expand_object_information($stundenplan_data);
|
||||
|
||||
@@ -29,6 +29,7 @@ class Gruppenmanagement extends Auth_Controller
|
||||
$this->load->model('person/benutzer_model', 'BenutzerModel');
|
||||
$this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
|
||||
$this->load->model('person/benutzergruppe_model', 'BenutzergruppeModel');
|
||||
$this->load->model('person/gruppe_manager_model', 'GruppemanagerModel');
|
||||
$this->load->model('system/Log_model', 'LogModel');
|
||||
|
||||
$this->load->library('WidgetLib');
|
||||
@@ -117,6 +118,27 @@ class Gruppenmanagement extends Auth_Controller
|
||||
$result = error('Uid missing');
|
||||
else
|
||||
{
|
||||
$this->GruppemanagerModel->addSelect('1');
|
||||
$isManagerRes = $this->GruppemanagerModel->loadWhere(
|
||||
array(
|
||||
'uid' => $this->_uid,
|
||||
'gruppe_kurzbz' => $gruppe_kurzbz
|
||||
)
|
||||
);
|
||||
|
||||
if (isError($isManagerRes))
|
||||
{
|
||||
$this->outputJsonError(getError($isManagerRes));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!hasData($isManagerRes))
|
||||
{
|
||||
$this->outputJsonError($this->p->t('gruppenmanagement', 'nichtZumEditierenDerGruppeBerechtigt'));
|
||||
return;
|
||||
}
|
||||
|
||||
$this->BenutzergruppeModel->addSelect('1');
|
||||
$benutzerExistsRes = $this->BenutzergruppeModel->loadWhere(
|
||||
array(
|
||||
'uid' => $uid,
|
||||
@@ -170,6 +192,26 @@ class Gruppenmanagement extends Auth_Controller
|
||||
$result = error('Uid missing');
|
||||
else
|
||||
{
|
||||
$this->GruppemanagerModel->addSelect('1');
|
||||
$isManagerRes = $this->GruppemanagerModel->loadWhere(
|
||||
array(
|
||||
'uid' => $this->_uid,
|
||||
'gruppe_kurzbz' => $gruppe_kurzbz
|
||||
)
|
||||
);
|
||||
|
||||
if (isError($isManagerRes))
|
||||
{
|
||||
$this->outputJsonError(getError($isManagerRes));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!hasData($isManagerRes))
|
||||
{
|
||||
$this->outputJsonError($this->p->t('gruppenmanagement', 'nichtZumEditierenDerGruppeBerechtigt'));
|
||||
return;
|
||||
}
|
||||
|
||||
$result = $this->BenutzergruppeModel->delete(
|
||||
array(
|
||||
'uid' => $uid,
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
<?php
|
||||
|
||||
if (!defined('BASEPATH'))
|
||||
exit('No direct script access allowed');
|
||||
|
||||
class Tag_Controller extends FHCAPI_Controller
|
||||
{
|
||||
private $_uid;
|
||||
|
||||
const BERECHTIGUNG_KURZBZ = 'admin:rw';
|
||||
|
||||
public function __construct($permissions)
|
||||
{
|
||||
$default_permissions = [
|
||||
'getTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'getTags' => self::BERECHTIGUNG_KURZBZ,
|
||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
|
||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
|
||||
];
|
||||
|
||||
$merged_permissions = array_merge($default_permissions, $permissions);
|
||||
|
||||
parent::__construct($merged_permissions);
|
||||
|
||||
$this->_setAuthUID();
|
||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||
}
|
||||
|
||||
public function getTag()
|
||||
{
|
||||
$id = $this->input->get('id');
|
||||
|
||||
$this->NotizModel->addSelect(
|
||||
'tbl_notiz.titel,
|
||||
tbl_notiz.text,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||
tbl_notiz.notiz_id,
|
||||
tbl_notiz_typ.style,
|
||||
tbl_notiz.erledigt as done,
|
||||
tbl_notiz.insertamum,
|
||||
tbl_notiz.updateamum,
|
||||
tbl_notiz.insertvon,
|
||||
tbl_notiz.updatevon
|
||||
'
|
||||
);
|
||||
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
||||
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
|
||||
|
||||
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
|
||||
}
|
||||
|
||||
public function getTags()
|
||||
{
|
||||
$this->NotiztypModel->addSelect(
|
||||
'typ_kurzbz as tag_typ_kurzbz,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||
style,
|
||||
beschreibung,
|
||||
tag
|
||||
'
|
||||
);
|
||||
$this->NotiztypModel->addOrder('prioritaet');
|
||||
$notiztypen = $this->NotiztypModel->loadWhere(array('aktiv' => true));
|
||||
$this->terminateWithSuccess(hasData($notiztypen) ? getData($notiztypen) : array());
|
||||
}
|
||||
|
||||
public function addTag($withZuordnung = true)
|
||||
{
|
||||
$postData = $this->getPostJson();
|
||||
|
||||
$checkTyp = $this->NotiztypModel->loadWhere(array('typ_kurzbz' => $postData->tag_typ_kurzbz));
|
||||
|
||||
if (!hasData($checkTyp))
|
||||
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
|
||||
if ($withZuordnung)
|
||||
{
|
||||
$return = array();
|
||||
$checkZuordnungType = $this->NotizzuordnungModel->isValidType($postData->zuordnung_typ);
|
||||
if (!isSuccess($checkZuordnungType))
|
||||
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$values = array_unique($postData->values);
|
||||
|
||||
foreach ($values as $value)
|
||||
{
|
||||
$insertResult = $this->addNotiz($postData);
|
||||
|
||||
if (isError($insertResult))
|
||||
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$insertZuordnung = $this->NotizzuordnungModel->insert(array(
|
||||
'notiz_id' => $insertResult->retval,
|
||||
$postData->zuordnung_typ => $value
|
||||
));
|
||||
|
||||
if (isError($insertZuordnung))
|
||||
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
$return[] = [$postData->zuordnung_typ => $value, 'id' => $insertResult->retval];
|
||||
}
|
||||
$this->terminateWithSuccess($return);
|
||||
}
|
||||
else
|
||||
{
|
||||
$insertResult = $this->addNotiz($postData);
|
||||
if (isError($insertResult))
|
||||
$this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
|
||||
|
||||
return $insertResult->retval;
|
||||
}
|
||||
}
|
||||
|
||||
private function addNotiz($postData)
|
||||
{
|
||||
return $this->NotizModel->insert(array(
|
||||
'titel' => 'TAG', //TODO klären
|
||||
'text' => $postData->notiz,
|
||||
'verfasser_uid' => $this->_uid,
|
||||
'erledigt' => false,
|
||||
'insertamum' => date('Y-m-d H:i:s'),
|
||||
'insertvon' => $this->_uid,
|
||||
'typ' => $postData->tag_typ_kurzbz
|
||||
));
|
||||
|
||||
}
|
||||
public function updateTag()
|
||||
{
|
||||
$postData = $this->getPostJson();
|
||||
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
|
||||
array('text' => $postData->notiz)
|
||||
);
|
||||
$this->terminateWithSuccess($updateData);
|
||||
}
|
||||
public function doneTag()
|
||||
{
|
||||
$postData = $this->getPostJson();
|
||||
$updateData = $this->NotizModel->update(array('notiz_id' => $postData->id),
|
||||
array('erledigt' => !$postData->done)
|
||||
);
|
||||
|
||||
$this->terminateWithSuccess($updateData);
|
||||
}
|
||||
|
||||
public function deleteTag($withZuordnung = true)
|
||||
{
|
||||
$postData = $this->getPostJson();
|
||||
|
||||
$deleteNotiz = "";
|
||||
if ($withZuordnung)
|
||||
{
|
||||
$deleteZuordnung = $this->NotizzuordnungModel->delete(array(
|
||||
'notiz_id' => $postData->id
|
||||
));
|
||||
|
||||
if (isSuccess($deleteZuordnung))
|
||||
{
|
||||
$deleteNotiz = $this->NotizModel->delete(array(
|
||||
'notiz_id' => $postData->id
|
||||
));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$deleteNotiz = $this->NotizModel->delete(array(
|
||||
'notiz_id' => $postData->id
|
||||
));
|
||||
}
|
||||
$this->terminateWithSuccess($deleteNotiz);
|
||||
}
|
||||
|
||||
private function _setAuthUID()
|
||||
{
|
||||
$this->_uid = getAuthUID();
|
||||
|
||||
if (!$this->_uid)
|
||||
show_error('User authentification failed');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -33,7 +33,7 @@ class SearchBarLib
|
||||
const ERROR_NOT_AUTH = 'ERR005';
|
||||
|
||||
// List of allowed types of search
|
||||
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student', 'prestudent', 'document', 'cms'];
|
||||
const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student','studentStv', 'prestudent', 'document', 'cms'];
|
||||
|
||||
const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id=';
|
||||
|
||||
@@ -362,17 +362,26 @@ EOSC;
|
||||
private function _student($searchstr, $type)
|
||||
{
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$gesperrtes_foto = base64_encode(file_get_contents(DOC_ROOT.'skin/images/profilbild_dummy.jpg'));
|
||||
$students = $dbModel->execReadOnlyQuery('
|
||||
SELECT
|
||||
\''.$type.'\' AS type,
|
||||
s.student_uid AS uid,
|
||||
CONCAT(s.student_uid,\'@'.DOMAIN.'\') AS email,
|
||||
s.matrikelnr,
|
||||
CONCAT(UPPER(stg.typ),UPPER(stg.kurzbz),\'-\',s.semester,s.verband) as verband,
|
||||
stg.bezeichnung AS studiengang,
|
||||
p.person_id AS person_id,
|
||||
p.vorname || \' \' || p.nachname AS name,
|
||||
k.kontakt as email ,
|
||||
p.foto
|
||||
CASE
|
||||
when s.student_uid = \''.getAuthUID().'\' then p.foto
|
||||
when p.foto IS NULL then \''.$gesperrtes_foto.'\'
|
||||
when p.foto_sperre = false then p.foto
|
||||
else \''.$gesperrtes_foto.'\'
|
||||
end as foto,
|
||||
b.aktiv
|
||||
FROM public.tbl_student s
|
||||
JOIN public.tbl_studiengang stg USING(studiengang_kz)
|
||||
JOIN public.tbl_benutzer b ON(b.uid = s.student_uid)
|
||||
JOIN public.tbl_person p USING(person_id)
|
||||
LEFT JOIN (
|
||||
@@ -380,10 +389,57 @@ EOSC;
|
||||
FROM public.tbl_kontakt
|
||||
WHERE kontakttyp = \'email\'
|
||||
) as k USING(person_id)
|
||||
WHERE b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
|
||||
WHERE
|
||||
b.aktiv = TRUE
|
||||
AND (b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
|
||||
OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
|
||||
OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\')
|
||||
GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name,
|
||||
email, p.foto, s.verband, s.semester, stg.bezeichnung,
|
||||
stg.typ, stg.kurzbz, b.aktiv
|
||||
ORDER BY b.aktiv DESC, p.nachname ASC, p.vorname ASC
|
||||
');
|
||||
|
||||
// If something has been found then return it
|
||||
if (hasData($students)) return getData($students);
|
||||
|
||||
// Otherwise return an empty array
|
||||
return array();
|
||||
}
|
||||
|
||||
private function _studentStv($searchstr, $type)
|
||||
{
|
||||
$dbModel = new DB_Model();
|
||||
|
||||
$students = $dbModel->execReadOnlyQuery('
|
||||
SELECT
|
||||
\''.$type.'\' AS type,
|
||||
s.student_uid AS uid,
|
||||
s.matrikelnr,
|
||||
CONCAT(UPPER(stg.typ),UPPER(stg.kurzbz),\'-\',s.semester,s.verband) as verband,
|
||||
stg.bezeichnung AS studiengang,
|
||||
p.person_id AS person_id,
|
||||
p.vorname || \' \' || p.nachname AS name,
|
||||
k.kontakt AS email,
|
||||
p.foto,
|
||||
b.aktiv
|
||||
FROM public.tbl_student s
|
||||
JOIN public.tbl_studiengang stg USING(studiengang_kz)
|
||||
JOIN public.tbl_benutzer b ON(b.uid = s.student_uid)
|
||||
JOIN public.tbl_person p USING(person_id)
|
||||
LEFT JOIN (
|
||||
SELECT kontakt, person_id
|
||||
FROM public.tbl_kontakt
|
||||
WHERE kontakttyp = \'email\'
|
||||
) as k USING(person_id)
|
||||
WHERE
|
||||
b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
|
||||
OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
|
||||
OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\'
|
||||
GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name, email, p.foto
|
||||
GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name,
|
||||
k.kontakt, p.foto, s.verband, s.semester, stg.bezeichnung,
|
||||
stg.typ, stg.kurzbz, b.aktiv
|
||||
ORDER BY b.aktiv DESC, p.nachname ASC, p.vorname ASC
|
||||
');
|
||||
|
||||
// If something has been found then return it
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
class LehrveranstaltungFaktor_model extends DB_Model
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'lehre.tbl_lehrveranstaltung_faktor';
|
||||
$this->pk = 'lehrveranstaltung_faktor_id';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
class Gruppe_manager_model extends DB_Model
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'public.tbl_gruppe_manager';
|
||||
$this->pk = 'gruppe_manager_id';
|
||||
}
|
||||
}
|
||||
@@ -142,7 +142,7 @@ class Notiz_model extends DB_Model
|
||||
$this->addSelect('public.tbl_notiz.*');
|
||||
$this->addJoin('public.tbl_notizzuordnung', 'notiz_id');
|
||||
|
||||
return $this->loadWhere(array('person_id' => $person_id));
|
||||
return $this->loadWhere(array('person_id' => $person_id, 'tbl_notiz.typ' => NULL));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
class Projects_Employees_model extends DB_Model
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'sync.tbl_projects_employees';
|
||||
$this->pk = 'projects_employees_id';
|
||||
}
|
||||
|
||||
public function deleteByProjectTaskId($ids)
|
||||
{
|
||||
$qry = "DELETE FROM " . $this->dbTable . "
|
||||
WHERE project_task_id IN ?";
|
||||
|
||||
return $this->execQuery($qry, array($ids));
|
||||
}
|
||||
}
|
||||
@@ -135,7 +135,7 @@ class Stundenplan_model extends DB_Model
|
||||
|
||||
|
||||
/**
|
||||
* function that takes a query that fetches lehre.vw_stundenplan rows and groups them so that they can be displayed in a calendar
|
||||
* groups rows of a subquery that fetches data from the lehre.vw_stundenplan table
|
||||
* @param string $stundenplanViewQuery the subquery used to group the result
|
||||
*
|
||||
* @return stdClass
|
||||
@@ -190,7 +190,7 @@ class Stundenplan_model extends DB_Model
|
||||
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
||||
* @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_stundenplan table
|
||||
*
|
||||
* @return string
|
||||
* @return mixed
|
||||
*/
|
||||
public function getStundenplanQuery($start_date, $end_date,$semester,$gruppen,$studentlehrverbaende){
|
||||
|
||||
@@ -206,7 +206,13 @@ class Stundenplan_model extends DB_Model
|
||||
}
|
||||
return $result;
|
||||
};
|
||||
|
||||
|
||||
// if both the gruppen and the studentlehrverbaende are empty we early return
|
||||
if($emptyCheck($gruppen) && $emptyCheck($studentlehrverbaende))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$query =
|
||||
"select sp.*
|
||||
from lehre.vw_stundenplan sp
|
||||
@@ -233,15 +239,15 @@ class Stundenplan_model extends DB_Model
|
||||
// converts the array of gruppen strings into a sql IN (_,_,_) chain
|
||||
$query .="(sp.gruppe_kurzbz IN (" .implode(',',$gruppen[$sem_date]).") AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende)." )";
|
||||
|
||||
// adds the OR sql chain only if the $studentlehrverbaende array is not empty
|
||||
// DOES not include the sql OR if the $studentlehrverbaende are empty and it is the last gruppen element in the iteration
|
||||
if(key($semester) != $sem || !$emptyCheck($studentlehrverbaende))
|
||||
{
|
||||
$query .="OR";
|
||||
}
|
||||
|
||||
$query .="OR";
|
||||
}
|
||||
}
|
||||
|
||||
// if there are no studentlehrverbaende and the gruppen are not empty, we can remove the last OR added after the groups
|
||||
if($emptyCheck($studentlehrverbaende) && !$emptyCheck($gruppen))
|
||||
{
|
||||
$query = substr($query, 0, -2);
|
||||
}
|
||||
|
||||
foreach($semester as $sem=>$semester_date_range)
|
||||
{
|
||||
@@ -253,20 +259,24 @@ class Stundenplan_model extends DB_Model
|
||||
}
|
||||
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
|
||||
{
|
||||
// adds the OR sql chain only if its not the first element in the first semester of the $studentlehrverbaende array
|
||||
if($sem != array_keys($semester)[0] || $key != array_keys($semester)[0])
|
||||
{
|
||||
$query .="OR";
|
||||
}
|
||||
$query .= "((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
||||
// Eintraege fuer den ganzen Verband
|
||||
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
||||
// Eintraege fuer das ganze Semester
|
||||
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).") AND gruppe_kurzbz is null)";
|
||||
|
||||
$query .="OR";
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if the studentlehrverbaende is not empty we can remove the last OR that was added to the query
|
||||
if(!$emptyCheck($studentlehrverbaende))
|
||||
{
|
||||
$query = substr($query, 0, -2);
|
||||
}
|
||||
|
||||
// closes the AND sql chain only if it was opened previously
|
||||
if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende))
|
||||
{
|
||||
|
||||
@@ -13,5 +13,33 @@ class Stundensatz_model extends DB_Model
|
||||
$this->pk = 'stundensatz_id';
|
||||
$this->hasSequence = true;
|
||||
}
|
||||
|
||||
|
||||
public function getStundensatzByDatum($uid, $beginn, $ende = null, $typ = null)
|
||||
{
|
||||
$qry = "SELECT
|
||||
*
|
||||
FROM
|
||||
hr.tbl_stundensatz
|
||||
WHERE
|
||||
uid = ?
|
||||
AND (gueltig_bis >= ? OR gueltig_bis is null)";
|
||||
|
||||
$params = array($uid, $beginn);
|
||||
|
||||
if (!is_null($ende))
|
||||
{
|
||||
$qry .= " AND (gueltig_von <= ?)";
|
||||
$params[] = $ende;
|
||||
}
|
||||
|
||||
if (!is_null($typ))
|
||||
{
|
||||
$qry .= " AND stundensatztyp = ?";
|
||||
$params[] = $typ;
|
||||
}
|
||||
|
||||
$qry .= " ORDER BY gueltig_bis DESC NULLS FIRST, gueltig_von DESC NULLS LAST LIMIT 1;";
|
||||
|
||||
return $this->execQuery($qry, $params);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
class Notiztyp_model extends DB_Model
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'public.tbl_notiz_typ';
|
||||
$this->pk = 'typ_kurzbz';
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
$STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\'';
|
||||
$TAETIGKEIT_KURZBZ = '\'bewerbung\', \'kommunikation\'';
|
||||
$LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Interessent rejected\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\'';
|
||||
$LOGDATA_DELETED_BY_USER = '\'% deleted by user\'';
|
||||
$POSTPONE_STATUS_PARKED = '\'parked\'';
|
||||
$STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\'';
|
||||
$ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz');
|
||||
@@ -283,6 +284,7 @@
|
||||
FROM system.tbl_log l
|
||||
WHERE l.taetigkeit_kurzbz IN ('.$TAETIGKEIT_KURZBZ.')
|
||||
AND l.logdata->>\'name\' NOT IN ('.$LOGDATA_NAME.')
|
||||
AND l.logdata->>\'message\' NOT LIKE ('.$LOGDATA_DELETED_BY_USER.')
|
||||
AND l.person_id = p.person_id
|
||||
ORDER BY l.log_id DESC
|
||||
LIMIT 1
|
||||
|
||||
@@ -45,3 +45,4 @@
|
||||
$tablewidget = isset($tablewidget) ? $tablewidget : false;
|
||||
$udfs = isset($udfs) ? $udfs : false;
|
||||
$widgets = isset($widgets) ? $widgets : false;
|
||||
$tags = isset($tags) ? $tags : false;
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
$calledPath = $this->router->directory.$this->router->class;
|
||||
$calledMethod = $this->router->method;
|
||||
|
||||
$this->load->config('javascript');
|
||||
$use_vuejs_dev_version = $this->config->item('use_vuejs_dev_version');
|
||||
|
||||
// By default set the parameters to null
|
||||
$customJSs = isset($customJSs) ? $customJSs : null;
|
||||
$customJSModules = isset($customJSModules) ? $customJSModules : null;
|
||||
@@ -110,7 +113,14 @@
|
||||
// Vue 3 JS
|
||||
if ($vue3 === true)
|
||||
{
|
||||
generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js');
|
||||
if($use_vuejs_dev_version && $use_vuejs_dev_version === true)
|
||||
{
|
||||
generateJSsInclude('vendor/vuejs/vuejs3_dev/vue.global.js');
|
||||
}
|
||||
else
|
||||
{
|
||||
generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js');
|
||||
}
|
||||
generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js');
|
||||
}
|
||||
|
||||
|
||||
@@ -119,6 +119,9 @@
|
||||
// CIS
|
||||
if ($cis === true) generateCSSsInclude(defined('CIS4') ? 'public/css/cis4.css' : 'public/css/cis_bs5.css');
|
||||
|
||||
//Tags
|
||||
if ($tags === true) generateCSSsInclude('public/css/tags.css');
|
||||
|
||||
// Eventually required CSS
|
||||
generateCSSsInclude($customCSSs); // Eventually required CSS
|
||||
?>
|
||||
|
||||
@@ -98,6 +98,7 @@ if(!$result_ort)
|
||||
die("ort not found!");
|
||||
$num_rows_ort=$db->db_num_rows($result_ort);
|
||||
|
||||
|
||||
/*$sql_query="SELECT student_uid FROM public.tbl_student ORDER BY student_uid";
|
||||
$result_lektor=$db->db_query($sql_query);
|
||||
if(!$result_lektor)
|
||||
@@ -531,7 +532,6 @@ if(!defined('CIS_LVPLAN_ZUSATZMENUE_ANZEIGEN') || CIS_LVPLAN_ZUSATZMENUE_ANZEIGE
|
||||
echo '
|
||||
<td class="menubox">
|
||||
<p><a href="raumsuche.php">'.$p->t('lvplan/raumsuche').'</a></p>
|
||||
<p><a class="Item" href="mailto:'.MAIL_LVPLAN.'">'.$p->t('lvplan/fehlerUndFeedback').'</a></p>
|
||||
<p><a href="../../../cms/content.php?content_id='.$p->t('dms_link/lvPlanFAQ').'" class="hilfe" target="_blank">'.$p->t('global/hilfe').'</a></p>
|
||||
</td>';
|
||||
}
|
||||
|
||||
@@ -37,8 +37,8 @@ require_once('../../../include/datum.class.php');
|
||||
require_once('../../../include/phrasen.class.php');
|
||||
require_once('../../../include/mitarbeiter.class.php');
|
||||
|
||||
$sprache = getSprache();
|
||||
$p = new phrasen($sprache);
|
||||
$sprache = getSprache();
|
||||
$p = new phrasen($sprache);
|
||||
|
||||
if (!$db = new basis_db())
|
||||
die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung'));
|
||||
@@ -46,7 +46,7 @@ if (!$db = new basis_db())
|
||||
// Variablen uebernehmen
|
||||
if (isset($_GET['type']))
|
||||
$type=$_GET['type'];
|
||||
else
|
||||
else
|
||||
$type='';
|
||||
|
||||
if (isset($_GET['datum']))
|
||||
@@ -61,7 +61,7 @@ if (isset($_GET['stg_kz']))
|
||||
$stg_kz=$_GET['stg_kz'];
|
||||
if (isset($_GET['sem']))
|
||||
$sem=$_GET['sem'];
|
||||
|
||||
|
||||
if($sem!='' && !is_numeric($sem))
|
||||
die($p->t('lvplan/semesterIstUngueltig'));
|
||||
|
||||
@@ -70,7 +70,7 @@ if($stunde!='' && !is_numeric($stunde))
|
||||
|
||||
if (isset($_GET['ver']))
|
||||
$ver=$_GET['ver'];
|
||||
|
||||
|
||||
if (isset($_GET['grp']))
|
||||
$grp=$_GET['grp'];
|
||||
if (isset($_GET['gruppe_kurzbz']))
|
||||
@@ -83,32 +83,32 @@ if(!$datum_obj->checkDatum($datum))
|
||||
$stsem = getStudiensemesterFromDatum($datum);
|
||||
//Stundenplan
|
||||
$sql_query="
|
||||
SELECT
|
||||
campus.vw_stundenplan.*, lehrfach.bezeichnung, vw_mitarbeiter.titelpre,
|
||||
SELECT
|
||||
campus.vw_stundenplan.*, lehrfach.bezeichnung, vw_mitarbeiter.titelpre,
|
||||
vw_mitarbeiter.titelpost, vw_mitarbeiter.nachname, vw_mitarbeiter.vorname,
|
||||
(SELECT
|
||||
count(*)
|
||||
FROM
|
||||
public.tbl_studentlehrverband
|
||||
WHERE
|
||||
studiengang_kz=vw_stundenplan.studiengang_kz
|
||||
(SELECT
|
||||
count(*)
|
||||
FROM
|
||||
public.tbl_studentlehrverband
|
||||
WHERE
|
||||
studiengang_kz=vw_stundenplan.studiengang_kz
|
||||
AND semester=vw_stundenplan.semester
|
||||
AND (verband=vw_stundenplan.verband OR vw_stundenplan.verband is null OR trim(vw_stundenplan.verband)='')
|
||||
AND (gruppe=vw_stundenplan.gruppe OR vw_stundenplan.gruppe is null OR trim(vw_stundenplan.gruppe)='')
|
||||
AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_lvb,
|
||||
(SELECT
|
||||
count(*)
|
||||
FROM
|
||||
public.tbl_benutzergruppe
|
||||
WHERE
|
||||
gruppe_kurzbz=vw_stundenplan.gruppe_kurzbz
|
||||
AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_lvb,
|
||||
(SELECT
|
||||
count(*)
|
||||
FROM
|
||||
public.tbl_benutzergruppe
|
||||
WHERE
|
||||
gruppe_kurzbz=vw_stundenplan.gruppe_kurzbz
|
||||
AND studiensemester_kurzbz=".$db->db_add_param($stsem).") as anzahl_grp
|
||||
FROM
|
||||
campus.vw_stundenplan
|
||||
FROM
|
||||
campus.vw_stundenplan
|
||||
JOIN lehre.tbl_lehrveranstaltung as lehrfach ON (vw_stundenplan.lehrfach_id=lehrfach.lehrveranstaltung_id)
|
||||
JOIN campus.vw_mitarbeiter USING (uid)
|
||||
WHERE
|
||||
datum=".$db->db_add_param($datum)."
|
||||
WHERE
|
||||
datum=".$db->db_add_param($datum)."
|
||||
AND stunde=".$db->db_add_param($stunde);
|
||||
|
||||
if ($type=='lektor')
|
||||
@@ -121,7 +121,7 @@ else
|
||||
{
|
||||
if($stg_kz=='' || $sem=='')
|
||||
die('Fehlerhafte Parameteruebergabe');
|
||||
|
||||
|
||||
if($type=="verband" && $stg_kz!='' && $sem!='')
|
||||
{
|
||||
// Studiengangsansicht
|
||||
@@ -133,7 +133,7 @@ else
|
||||
else
|
||||
{
|
||||
// Pers. Ansicht
|
||||
$sql_query.=" AND EXISTS (SELECT 1 FROM campus.vw_student_lehrveranstaltung
|
||||
$sql_query.=" AND EXISTS (SELECT 1 FROM campus.vw_student_lehrveranstaltung
|
||||
WHERE lehreinheit_id=vw_stundenplan.lehreinheit_id AND uid=".$db->db_add_param($pers_uid).")";
|
||||
}
|
||||
// Manfred weiss nicht mehr warum, aber wir aktivieren 23-09-2009
|
||||
@@ -154,16 +154,16 @@ $num_rows_stpl = $db->db_num_rows($erg_stpl);
|
||||
|
||||
//Reservierungen
|
||||
$sql_query="
|
||||
SELECT
|
||||
vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost,
|
||||
vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon,
|
||||
reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon
|
||||
FROM
|
||||
SELECT
|
||||
vw_reservierung.*, vw_mitarbeiter.titelpre, vw_mitarbeiter.titelpost,
|
||||
vw_mitarbeiter.vorname, vw_mitarbeiter.nachname, reserviert_von.titelpre AS titelpre_reserviertvon, reserviert_von.titelpost AS titelpost_reserviertvon,
|
||||
reserviert_von.vorname AS vorname_reserviertvon, reserviert_von.nachname AS nachname_reserviertvon
|
||||
FROM
|
||||
campus.vw_reservierung
|
||||
JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid
|
||||
LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid
|
||||
WHERE
|
||||
datum=".$db->db_add_param($datum)."
|
||||
WHERE
|
||||
datum=".$db->db_add_param($datum)."
|
||||
AND stunde=".$db->db_add_param($stunde);
|
||||
|
||||
if (isset($ort_kurzbz) && $type=='ort')
|
||||
@@ -172,7 +172,7 @@ if ($type=='lektor')
|
||||
$sql_query.=" AND vw_reservierung.uid=".$db->db_add_param($pers_uid);
|
||||
if ($type=='verband' || $type=='student')
|
||||
{
|
||||
$sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)."
|
||||
$sql_query.=" AND studiengang_kz=".$db->db_add_param($stg_kz)."
|
||||
AND (semester=".$db->db_add_param($sem)." OR semester=0 OR semester IS NULL)";
|
||||
}
|
||||
$sql_query.=' ORDER BY titel LIMIT 100';
|
||||
@@ -258,12 +258,12 @@ if ($num_rows_stpl>0)
|
||||
echo (!is_null($semester) && !empty($semester)?'</A>':'');
|
||||
echo '
|
||||
</td>
|
||||
|
||||
|
||||
<td><A class="Item" title="'.$anzahl_grp.' Studierende" href="mailto:'.mb_strtolower($gruppe_kurzbz).'@'.DOMAIN.'">
|
||||
'.$db->convert_html_chars($gruppe_kurzbz).'</A></td>
|
||||
<td>'.$db->convert_html_chars($titel).'</td>
|
||||
|
||||
</tr>';
|
||||
|
||||
</tr>';
|
||||
}
|
||||
echo '</table><BR>';
|
||||
}
|
||||
@@ -294,7 +294,7 @@ if ($num_rows_repl>0)
|
||||
$pers_nachname_reserviertvon=$row->nachname_reserviertvon;
|
||||
|
||||
$ort->load($ortkurzbz);
|
||||
|
||||
|
||||
echo '<tr class="liste'.($i%2).'">';
|
||||
echo '<td>'.$db->convert_html_chars($titel).'</td>';
|
||||
echo '<td>'.(!empty($ortkurzbz)?($ort->content_id!=''?'<a href="../../../cms/content.php?content_id='.$ort->content_id.'" target="_self" onClick="window.resizeTo(1200,880)">'.$db->convert_html_chars($ortkurzbz).'</a>':$db->convert_html_chars($ortkurzbz)):$db->convert_html_chars($ortkurzbz)).'</td>';
|
||||
@@ -304,6 +304,6 @@ if ($num_rows_repl>0)
|
||||
}
|
||||
echo '</table><br>';
|
||||
}
|
||||
echo '<P>'.$p->t('lvplan/fehlerUndFeedback').' <A class="Item" href="mailto:'.MAIL_LVPLAN.'">'.$p->t('lvplan/lvKoordinationsstelle').'</A>.</P>
|
||||
echo '<P>'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'</P>
|
||||
</body></html>';
|
||||
?>
|
||||
|
||||
@@ -341,7 +341,7 @@ elseif($format=='excel')
|
||||
// Print in HTML-File
|
||||
else
|
||||
{
|
||||
echo '<P class="dont-print">'.$p->t('lvplan/fehlerUndFeedback').' <A class="Item" href="mailto:'.MAIL_LVPLAN.'">'.$p->t('lvplan/lvKoordinationsstelle').'</A></P>';
|
||||
echo '<br><P class="dont-print">'.$p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)).'</P>';
|
||||
echo '</body></html>';
|
||||
}
|
||||
|
||||
|
||||
@@ -524,6 +524,6 @@ if (isset($reservdelcount))
|
||||
echo "Es wurde".($reservdelcount!=1?'n':'')." $reservdelcount Stunde".($reservdelcount!=1?'n':'')." gelöscht!<BR>";
|
||||
?>
|
||||
|
||||
<P><br><?php echo $p->t('lvplan/fehlerUndFeedback');?> <A class="Item" href="mailto:<?php echo MAIL_LVPLAN?>"><?php echo $p->t('lvplan/lvKoordinationsstelle');?></A>.</P>
|
||||
<P><br><?php echo $p->t('lvplan/FragenZuLvPlan', array(MAIL_LVPLAN)); ?>.</P>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
@@ -326,6 +326,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "package",
|
||||
"package": {
|
||||
"name": "vuejs/vuejs3_dev",
|
||||
"version": "3.3.8",
|
||||
"dist": {
|
||||
"url": "https://unpkg.com/vue@3.3.8/dist/vue.global.js",
|
||||
"type": "file"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "package",
|
||||
"package": {
|
||||
@@ -439,6 +450,7 @@
|
||||
},
|
||||
|
||||
"require-dev": {
|
||||
"vuejs/vuejs3_dev": "3.3.8",
|
||||
"squizlabs/php_codesniffer": "3.6.*",
|
||||
"phpmd/phpmd": "2.*",
|
||||
"phpmetrics/phpmetrics": "2.*",
|
||||
|
||||
Generated
+10
-1
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "eedcd2abe226d372ff8d735498eb3b0a",
|
||||
"content-hash": "01ea35652d88680f8262c5365828eb46",
|
||||
"packages": [
|
||||
{
|
||||
"name": "afarkas/html5shiv",
|
||||
@@ -4680,6 +4680,15 @@
|
||||
},
|
||||
"time": "2019-06-13T22:48:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "vuejs/vuejs3_dev",
|
||||
"version": "3.3.8",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://unpkg.com/vue@3.3.8/dist/vue.global.js"
|
||||
},
|
||||
"type": "library"
|
||||
},
|
||||
{
|
||||
"name": "webmozart/assert",
|
||||
"version": "1.9.1",
|
||||
|
||||
@@ -208,6 +208,7 @@ else
|
||||
<menupopup id="student-filter-menu-popup" >
|
||||
<menuitem id="student-toolbar-filter-dokumente" label="fehlende Dokumente" oncommand="InteressentDokumenteFilter()" disabled="false" tooltiptext="Liste aller Studenten mit Fehlenden Dokumenten"/>
|
||||
<menuitem id="student-toolbar-filter-offenebuchungen" label="offene Buchungen" oncommand="StudentKontoFilterStudenten('konto')" disabled="false" tooltiptext="Liste aller Studenten mit offenen Buchungen"/>
|
||||
<menuitem id="student-toolbar-filter-ueberfaelligebuchungen" label="überfällige Buchungen" oncommand="StudentKontoFilterStudenten('ueberfaelligebuchungen')" disabled="false" tooltiptext="Liste aller Studenten mit überfälligen Buchungen"/>
|
||||
<menuitem id="student-toolbar-filter-studiengebuehr" label="nicht gebuchte Studiengebuehr" oncommand="StudentKontoFilterStudenten('studiengebuehr')" disabled="false" tooltiptext="Liste aller Studenten die noch nicht mit der Studiengebühr belastet wurden" />
|
||||
<menuitem id="student-toolbar-filter-erhoehte-studiengebuehr" label="erhöhten Studienbeitrag" oncommand="StudentKontoFilterStudenten('StudiengebuehrErhoeht')" disabled="false" tooltiptext="Liste aller Studenten denen der erhöhte Studienbeitrag eingebucht wurde" />
|
||||
<menuitem id="student-toolbar-filter-zgvohnedatum" label="ZGV eingetragen ohne Datum" oncommand="StudentKontoFilterStudenten('zgvohnedatum')" disabled="false" tooltiptext="Liste aller Studenten die ZGV eingetragen haben bei denen aber kein ZGV Datum gesetzt ist" />
|
||||
|
||||
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . '/basis_db.class.php');
|
||||
require_once(dirname(__FILE__) . '/functions.inc.php');
|
||||
|
||||
class lehrveranstaltung_faktor extends basis_db
|
||||
{
|
||||
public $lehrveranstaltung_faktor_id; // serial
|
||||
public $lehrveranstaltung_id; // integer
|
||||
public $faktor; // numeric
|
||||
public $studiensemester_kurzbz_von; // varchar(16)
|
||||
public $studiensemester_kurzbz_bis; // varchar(16)
|
||||
public $insertamum; // timestamp
|
||||
public $insertvon; // varchar(32)
|
||||
public $updateamum; // timestamp
|
||||
public $updatevon; // varchar(32)
|
||||
public $lv_faktoren = array(); // lehrveranstaltung Objekt
|
||||
|
||||
|
||||
/**
|
||||
* Konstruktor
|
||||
* @param $lehrveranstaltung_faktor_id
|
||||
*/
|
||||
public function __construct($lehrveranstaltung_faktor_id = null)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
if (!is_null($lehrveranstaltung_faktor_id))
|
||||
$this->load($lehrveranstaltung_faktor_id);
|
||||
}
|
||||
|
||||
|
||||
public function load($lehrveranstaltung_faktor_id)
|
||||
{
|
||||
if (!is_numeric($lehrveranstaltung_faktor_id))
|
||||
{
|
||||
$this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein';
|
||||
return false;
|
||||
}
|
||||
|
||||
$qry = "SELECT * FROM lehre.tbl_lehrveranstaltung_faktor
|
||||
WHERE lehrveranstaltung_faktor_id=".$this->db_add_param($lehrveranstaltung_faktor_id, FHC_INTEGER);
|
||||
|
||||
if (!$this->db_query($qry)) {
|
||||
$this->errormsg = 'Datensatz konnte nicht geladen werden';
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($row = $this->db_fetch_object())
|
||||
{
|
||||
$this->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id;
|
||||
$this->lehrveranstaltung_id = $row->lehrveranstaltung_id;
|
||||
$this->faktor = $row->faktor;
|
||||
$this->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von;
|
||||
$this->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function loadByLV($lv_id, $von = null, $bis = null, $id = null)
|
||||
{
|
||||
|
||||
if (!is_numeric($lv_id))
|
||||
{
|
||||
$this->errormsg = 'Lehrveranstaltung_faktor_id muss eine gueltige Zahl sein';
|
||||
return false;
|
||||
}
|
||||
$qry = "SELECT *
|
||||
FROM lehre.tbl_lehrveranstaltung_faktor
|
||||
LEFT JOIN public.tbl_studiensemester vonstsem
|
||||
ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz
|
||||
LEFT JOIN public.tbl_studiensemester bisstem
|
||||
ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz
|
||||
WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER);
|
||||
|
||||
if(!empty($von))
|
||||
{
|
||||
$qry .= "
|
||||
AND (bisstem.ende >= (
|
||||
SELECT start
|
||||
FROM public.tbl_studiensemester
|
||||
WHERE studiensemester_kurzbz = " . $this->db_add_param($von, FHC_STRING) . "
|
||||
)
|
||||
OR bisstem.ende IS NULL
|
||||
)";
|
||||
}
|
||||
|
||||
if(!empty($bis) && $bis !== "")
|
||||
{
|
||||
$qry .= "
|
||||
AND
|
||||
(vonstsem.start <= (
|
||||
SELECT ende
|
||||
FROM public.tbl_studiensemester
|
||||
WHERE studiensemester_kurzbz = " . $this->db_add_param($bis, FHC_STRING) . "
|
||||
))
|
||||
";
|
||||
}
|
||||
|
||||
if (!empty($id) && $id !== "")
|
||||
{
|
||||
$qry .= "
|
||||
AND
|
||||
lehrveranstaltung_faktor_id != ". $this->db_add_param($id, FHC_INTEGER);
|
||||
}
|
||||
|
||||
if (!$result = $this->db_query($qry)) {
|
||||
$this->errormsg = 'Datensatz konnte nicht geladen werden';
|
||||
return false;
|
||||
}
|
||||
|
||||
while ($row = $this->db_fetch_object($result))
|
||||
{
|
||||
$lv_faktor_objekt = new lehrveranstaltung_faktor();
|
||||
|
||||
$lv_faktor_objekt->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id;
|
||||
$lv_faktor_objekt->lehrveranstaltung_id = $row->lehrveranstaltung_id;
|
||||
$lv_faktor_objekt->faktor = $row->faktor;
|
||||
$lv_faktor_objekt->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von;
|
||||
$lv_faktor_objekt->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis;
|
||||
|
||||
$this->lv_faktoren[] = $lv_faktor_objekt;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function addFaktor($lv_id, $faktor, $von, $bis = NULL)
|
||||
{
|
||||
$qry = 'INSERT INTO lehre.tbl_lehrveranstaltung_faktor (lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, studiensemester_kurzbz_bis)
|
||||
VALUES ('. $this->db_add_param($lv_id, FHC_INTEGER) . ', '.
|
||||
$this->db_add_param($faktor, FHC_INTEGER) . ', '.
|
||||
$this->db_add_param($von, FHC_STRING) . ', '.
|
||||
$this->db_add_param($bis, FHC_STRING) . ');';
|
||||
|
||||
if ($this->db_query($qry))
|
||||
{
|
||||
$qry_id = "SELECT currval('lehre.lehrveranstaltung_faktor_id_seq') as id;";
|
||||
if($this->db_query($qry_id))
|
||||
{
|
||||
if($row = $this->db_fetch_object())
|
||||
{
|
||||
$this->db_query('COMMIT');
|
||||
return [
|
||||
'id' => $row->id,
|
||||
'lv_id' => $lv_id,
|
||||
'faktor' => $faktor,
|
||||
'von' => $von,
|
||||
'bis' => $bis
|
||||
];
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->db_query('ROLLBACK');
|
||||
return [
|
||||
'status' => 'error',
|
||||
'message' => 'Fehler beim Einfügen in die Datenbank:'
|
||||
];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->db_query('ROLLBACK');
|
||||
return [
|
||||
'status' => 'error',
|
||||
'message' => 'Fehler beim Einfügen in die Datenbank:'
|
||||
];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return [
|
||||
'status' => 'error',
|
||||
'message' => 'Fehler beim Einfügen in die Datenbank:'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function updateFaktor($id, $faktor, $von, $bis)
|
||||
{
|
||||
$qry = "UPDATE lehre.tbl_lehrveranstaltung_faktor
|
||||
SET faktor = ". $this->db_add_param($faktor) ." ,
|
||||
studiensemester_kurzbz_von = ". $this->db_add_param($von) .",
|
||||
studiensemester_kurzbz_bis = ". $this->db_add_param($bis) ."
|
||||
WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER);
|
||||
|
||||
if ($this->db_query($qry))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [
|
||||
'status' => 'error',
|
||||
'message' => 'Fehler beim Einfügen in die Datenbank:'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function getAkt($lv_id)
|
||||
{
|
||||
if (!is_numeric($lv_id))
|
||||
{
|
||||
$this->errormsg = 'Lehrveranstaltung_id muss eine gueltige Zahl sein';
|
||||
return false;
|
||||
}
|
||||
|
||||
$qry = "SELECT *
|
||||
FROM lehre.tbl_lehrveranstaltung_faktor
|
||||
LEFT JOIN public.tbl_studiensemester vonstsem
|
||||
ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_von = vonstsem.studiensemester_kurzbz
|
||||
LEFT JOIN public.tbl_studiensemester bisstem
|
||||
ON tbl_lehrveranstaltung_faktor.studiensemester_kurzbz_bis = bisstem.studiensemester_kurzbz
|
||||
WHERE lehrveranstaltung_id = ".$this->db_add_param($lv_id, FHC_INTEGER) . "
|
||||
AND (vonstsem.start <= now() OR vonstsem.start IS NULL)
|
||||
AND (bisstem.ende >= now() OR bisstem.ende IS NULL)
|
||||
ORDER BY vonstsem.start DESC LIMIT 1
|
||||
";
|
||||
|
||||
|
||||
if (!$this->db_query($qry)) {
|
||||
$this->errormsg = 'Datensatz konnte nicht geladen werden';
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($row = $this->db_fetch_object())
|
||||
{
|
||||
$this->lehrveranstaltung_faktor_id = $row->lehrveranstaltung_faktor_id;
|
||||
$this->lehrveranstaltung_id = $row->lehrveranstaltung_id;
|
||||
$this->faktor = $row->faktor;
|
||||
$this->studiensemester_kurzbz_von = $row->studiensemester_kurzbz_von;
|
||||
$this->studiensemester_kurzbz_bis = $row->studiensemester_kurzbz_bis;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public function deleteFaktor($id)
|
||||
{
|
||||
$qry = "DELETE FROM lehre.tbl_lehrveranstaltung_faktor
|
||||
WHERE lehrveranstaltung_faktor_id = ". $this->db_add_param($id, FHC_INTEGER);
|
||||
|
||||
if ($this->db_query($qry))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [
|
||||
'status' => 'error',
|
||||
'message' => 'Fehler beim Löschen aus der Datenbank:'
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -325,7 +325,7 @@ class notiz extends basis_db
|
||||
FROM
|
||||
public.tbl_notiz
|
||||
LEFT JOIN public.tbl_notizzuordnung USING(notiz_id)
|
||||
WHERE 1=1";
|
||||
WHERE 1=1 AND tbl_notiz.typ IS NULL ";
|
||||
|
||||
if(!is_null($erledigt))
|
||||
{
|
||||
@@ -523,7 +523,7 @@ class notiz extends basis_db
|
||||
FROM
|
||||
public.tbl_notiz
|
||||
LEFT JOIN public.tbl_notizzuordnung USING(notiz_id)
|
||||
WHERE 1=1";
|
||||
WHERE 1=1 AND tbl_notiz.typ IS NULL ";
|
||||
|
||||
if(!is_null($erledigt))
|
||||
{
|
||||
|
||||
@@ -101,4 +101,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='Es haben sich folgende Aenderungen
|
||||
$this->phrasen['lvplan/reserviertInDev']='reserviert<br>für<br>lehre';
|
||||
$this->phrasen['lvplan/raumNichtReservierbar']='Die Möglichkeit der Reservierung ist für diesen Raum deaktiviert.';
|
||||
$this->phrasen['lvplan/reserviertVon']='Reserviert von';
|
||||
?>
|
||||
$this->phrasen['lvplan/FragenZuLvPlan']='Für Fragen zu Ihrem LV-Plan wenden Sie sich bitte an Ihre <a class="Item" href="mailto:%s">LV-Koordinationsstelle</a>';
|
||||
?>
|
||||
|
||||
@@ -100,4 +100,5 @@ $this->phrasen['lvplan/folgendeAenderungen']='There have been the following chan
|
||||
$this->phrasen['lvplan/reserviertInDev']='not<br>available';
|
||||
$this->phrasen['lvplan/raumNichtReservierbar']='Reservation is disabled for this room.';
|
||||
$this->phrasen['lvplan/reserviertVon']='Reserved by';
|
||||
$this->phrasen['lvplan/FragenZuLvPlan']='For questions about your personal schedule, please contact the <a class="Item" href="mailto:%s">Course-Coordination Office</a>';
|
||||
?>
|
||||
|
||||
+39
-1
@@ -182,6 +182,10 @@ html {
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
#nav-sprachen{
|
||||
transition: none;
|
||||
}
|
||||
|
||||
/* searchbar */
|
||||
#nav-search {
|
||||
z-index: 1;
|
||||
@@ -478,15 +482,28 @@ html {
|
||||
}
|
||||
|
||||
.fhc-entry:hover{
|
||||
background-color:#0088d6 !important;
|
||||
background-color:#005585 !important;
|
||||
color:white !important;
|
||||
}
|
||||
|
||||
.fhc-entry.btn:focus {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.fhc-entry.btn {
|
||||
border-radius: 0 !important;
|
||||
}
|
||||
|
||||
.fhc-entry {
|
||||
transition-property: background,color;
|
||||
transition-duration: 0.3s,0.2s;
|
||||
transition-timing-function: ease-out,ease-out;
|
||||
}
|
||||
|
||||
[selected].fhc-entry {
|
||||
background-color: #00649C !important;
|
||||
}
|
||||
|
||||
@media screen and ( max-width: 767px ) {
|
||||
#nav-search {
|
||||
position: static;
|
||||
@@ -527,4 +544,25 @@ html {
|
||||
padding-left: 2.5rem;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
}
|
||||
|
||||
/* classes used for the Vue <Transition> component*/
|
||||
.v-enter-active,
|
||||
.v-leave-active {
|
||||
transition: opacity 0.2s ease-out;
|
||||
}
|
||||
|
||||
.v-enter-from,
|
||||
.v-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.height-enter-active,
|
||||
.height-leave-active {
|
||||
transition: height 0.3s ease-out;
|
||||
}
|
||||
|
||||
.height-enter-from,
|
||||
.height-leave-to {
|
||||
height: 0px;
|
||||
}
|
||||
@@ -1,27 +1,72 @@
|
||||
.widgets-news .card-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start !important;
|
||||
|
||||
}
|
||||
|
||||
:root{
|
||||
--news-widget-height: 1;
|
||||
}
|
||||
|
||||
.widgets-news .news-content > div,
|
||||
.widgets-news .news-content .row:nth-child(1),
|
||||
.widgets-news .news-content .news-list,
|
||||
.widgets-news .news-content .news-list-item,
|
||||
.widgets-news .news-content .card-body
|
||||
{
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.widgets-news img
|
||||
{
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.widgets-news .card-body{
|
||||
overflow: hidden;
|
||||
}
|
||||
.fhc-news-menu-item {
|
||||
padding: 0.375rem;
|
||||
color: var(--fhc-cis-menu-lvl-1-color);
|
||||
min-height: 5%;
|
||||
max-height: 30%;
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background-color: #00649c;
|
||||
border: 1px solid #f1f1f1;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s ease, border-color 0.2s ease; /* Smooth transition */
|
||||
}
|
||||
|
||||
.fhc-news-menu-item:hover {
|
||||
background-color: var(--fhc-cis-menu-lvl-1-bg-hover);
|
||||
border-color: #f1f1f1;
|
||||
}
|
||||
|
||||
.fhc-news-menu-item:active {
|
||||
background-color: var(--fhc-cis-menu-lvl-1-color-hover);
|
||||
border-color: #f1f1f1;
|
||||
}
|
||||
|
||||
.fhc-news-menu-item.selected {
|
||||
background-color: var(--fhc-cis-menu-lvl-1-bg-hover);
|
||||
border-right: 2px solid #fff;
|
||||
|
||||
}
|
||||
|
||||
.fhc-news-menu-item:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.fhc-news-menu-item-betreff
|
||||
{
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
max-height: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.fhc-news-menu-item-date {
|
||||
text-align: end;
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.fhc-carousel .carousel-item {
|
||||
transition: transform 0.375s ease-in-out, opacity 0.75s ease-in-out;
|
||||
}
|
||||
|
||||
.fhc-carousel .carousel-item-next,
|
||||
.fhc-carousel .carousel-item-prev {
|
||||
transition: transform 0.44s ease-in-out, opacity 0.8s ease-in-out;
|
||||
}
|
||||
|
||||
.fhc-carousel .carousel-item-start,
|
||||
.fhc-carousel .carousel-item-end {
|
||||
transition: transform 0.44s ease-in-out, opacity 0.8s ease-in-out;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
width: 100%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
box-shadow: 2px 2px 4px rgba(0, 0, 0, .4);
|
||||
}
|
||||
|
||||
.searchbar_results_scroller {
|
||||
@@ -109,3 +110,7 @@
|
||||
-moz-user-select: none; /* Firefox */
|
||||
-ms-user-select: none; /* IE/Edge */
|
||||
}
|
||||
|
||||
.searchbar_inaktiv {
|
||||
opacity: .6;
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
.tag {
|
||||
display: inline-block;
|
||||
padding: 5px 10px;
|
||||
margin-right: 5px;
|
||||
border-radius: 3px;
|
||||
color: white;
|
||||
font-size: .75em;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
.tag:hover
|
||||
{
|
||||
transform: scale(1.15);
|
||||
}
|
||||
|
||||
.tag_rot {
|
||||
background-color: #ff0000ff;
|
||||
}
|
||||
|
||||
.tag_gelb {
|
||||
background-color: #ffff00ff;
|
||||
color: black;
|
||||
}
|
||||
.tag_gruen {
|
||||
background-color: #008000ff;
|
||||
}
|
||||
|
||||
.tag_rosa {
|
||||
background-color: #FFC1C1;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.tag_aprikose {
|
||||
background-color: #4f7596;
|
||||
}
|
||||
|
||||
.tag_pfirsich {
|
||||
background-color: #a15f95;
|
||||
}
|
||||
|
||||
.tag_orange {
|
||||
background-color: #ffA500ff;
|
||||
}
|
||||
|
||||
|
||||
.tag_braun {
|
||||
background-color: #6d4c41;
|
||||
}
|
||||
|
||||
.tag_blau {
|
||||
background-color: #508498;
|
||||
}
|
||||
|
||||
.tag_lavendel {
|
||||
background-color: #C7A3FF;
|
||||
}
|
||||
|
||||
.tag_limette {
|
||||
background-color: #D3FFCE;
|
||||
}
|
||||
|
||||
.tag_done {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.display_all {
|
||||
background-color: darkgrey !important;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.dropdown_list {
|
||||
list-style: none;
|
||||
background-color: white;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||
z-index: 1000;
|
||||
position: absolute;
|
||||
padding: 10px 10px 10px;
|
||||
max-width: 200px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.plus_button_container.disabled {
|
||||
pointer-events: none;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.modificationdate {
|
||||
font-style: italic;
|
||||
font-size: 0.7em;
|
||||
text-align: left;
|
||||
}
|
||||
@@ -22,5 +22,11 @@ export default {
|
||||
setLanguage(categories,language) {
|
||||
const payload = {categories, language}
|
||||
return this.$fhcApi.post('/api/frontend/v1/phrasen/setLanguage', payload);
|
||||
},
|
||||
getLanguage() {
|
||||
return this.$fhcApi.get('/api/frontend/v1/phrasen/getLanguage', {});
|
||||
},
|
||||
getActiveDbLanguages() {
|
||||
return this.$fhcApi.get('/api/frontend/v1/phrasen/getAllLanguages', {});
|
||||
}
|
||||
};
|
||||
@@ -18,6 +18,7 @@ const app = Vue.createApp({
|
||||
calcheightonly: true,
|
||||
types: [
|
||||
"mitarbeiter",
|
||||
"student",
|
||||
"raum",
|
||||
"organisationunit"
|
||||
],
|
||||
@@ -33,6 +34,17 @@ const app = Vue.createApp({
|
||||
},
|
||||
childactions: []
|
||||
},
|
||||
student: {
|
||||
defaultaction: {
|
||||
type: "link",
|
||||
action: function (data) {
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
"/Cis/Profil/View/" + data.uid;
|
||||
|
||||
}
|
||||
},
|
||||
childactions: []
|
||||
},
|
||||
raum: {
|
||||
defaultaction: {
|
||||
type: "link",
|
||||
|
||||
@@ -2,6 +2,8 @@ import FhcCalendar from "../../components/Calendar/Calendar.js";
|
||||
import Phrasen from "../../plugin/Phrasen.js";
|
||||
import CalendarDate from "../../composables/CalendarDate.js";
|
||||
import LvModal from "../../components/Cis/Mylv/LvModal.js";
|
||||
import LvInfo from "../../components/Cis/Mylv/LvInfo.js"
|
||||
import LvMenu from "../../components/Cis/Mylv/LvMenu.js"
|
||||
|
||||
|
||||
const app = Vue.createApp({
|
||||
@@ -17,7 +19,7 @@ const app = Vue.createApp({
|
||||
}
|
||||
},
|
||||
components: {
|
||||
FhcCalendar, LvModal
|
||||
FhcCalendar, LvModal, LvMenu, LvInfo
|
||||
},
|
||||
computed:{
|
||||
weekFirstDay: function () {
|
||||
@@ -35,6 +37,9 @@ const app = Vue.createApp({
|
||||
|
||||
},
|
||||
methods:{
|
||||
setSelectedEvent: function (event) {
|
||||
this.currentlySelectedEvent = event;
|
||||
},
|
||||
getLvID: function () {
|
||||
this.lv_id = window.location.pathname
|
||||
},
|
||||
@@ -111,7 +116,7 @@ const app = Vue.createApp({
|
||||
<h2>{{$p.t('lehre/stundenplan')}}</h2>
|
||||
<hr>
|
||||
<lv-modal v-if="currentlySelectedEvent" :event="currentlySelectedEvent" ref="lvmodal" />
|
||||
<fhc-calendar :initial-date="currentDay" @change:range="updateRange" :events="events" initial-mode="week" show-weeks @select:day="selectDay" v-model:minimized="minimized">
|
||||
<fhc-calendar @selectedEvent="setSelectedEvent" :initial-date="currentDay" @change:range="updateRange" :events="events" initial-mode="week" show-weeks @select:day="selectDay" v-model:minimized="minimized">
|
||||
<template #monthPage="{event,day,isSelected}">
|
||||
<span class="fhc-entry" :class="{'selectedEvent':isSelected}" style="color:white" :style="{'background-color': event.color}">
|
||||
{{event.topic}}
|
||||
@@ -124,8 +129,8 @@ const app = Vue.createApp({
|
||||
<span>{{event?.orig.ort_kurzbz}}</span>
|
||||
</div>
|
||||
</template>
|
||||
<template #dayPage="{event,day}">
|
||||
<div type="button" class="fhc-entry border border-secondary border row h-100 justify-content-center align-items-center text-center">
|
||||
<template #dayPage="{event,day,mobile}">
|
||||
<div @click="mobile? showModal(event?.orig):null" type="button" class="fhc-entry border border-secondary border row m-0 h-100 justify-content-center align-items-center text-center">
|
||||
<div class="col ">
|
||||
<p>Lehrveranstaltung:</p>
|
||||
<p class="m-0">{{event?.orig.topic}}</p>
|
||||
@@ -140,6 +145,17 @@ const app = Vue.createApp({
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #pageMobilContent="{lvMenu}">
|
||||
<h3 >{{$p.t('lvinfo','lehrveranstaltungsinformationen')}}</h3>
|
||||
<div class="w-100">
|
||||
<lv-info :event="currentlySelectedEvent" />
|
||||
</div>
|
||||
<h3 >Lehrveranstaltungs Menu</h3>
|
||||
<lv-menu :containerStyles="['p-0']" :rowStyles="['m-0']" v-show="lvMenu" :menu="lvMenu" />
|
||||
</template>
|
||||
<template #pageMobilContentEmpty >
|
||||
<h3>Keine Lehrveranstaltungen</h3>
|
||||
</template>
|
||||
</fhc-calendar>
|
||||
`
|
||||
});
|
||||
|
||||
@@ -66,6 +66,12 @@ export default {
|
||||
}
|
||||
},
|
||||
watch:{
|
||||
selectedEvent:{
|
||||
handler(newSelectedEvent) {
|
||||
this.$emit('selectedEvent', newSelectedEvent);
|
||||
},
|
||||
immediate: true,
|
||||
},
|
||||
// scroll to the first event if the html element was found
|
||||
scrollTime({focusDate,scrollTime}){
|
||||
// return early if the scrollTime is not set
|
||||
@@ -89,7 +95,8 @@ export default {
|
||||
'select:day',
|
||||
'select:event',
|
||||
'change:range',
|
||||
'update:minimized'
|
||||
'update:minimized',
|
||||
'selectedEvent'
|
||||
],
|
||||
data() {
|
||||
return {
|
||||
@@ -223,8 +230,14 @@ export default {
|
||||
<template #weekPage="{event,day,isSelected}">
|
||||
<slot name="weekPage" :event="event" :day="day" :isSelected="isSelected"></slot>
|
||||
</template>
|
||||
<template #dayPage="{event,day}">
|
||||
<slot name="dayPage" :event="event" :day="day"></slot>
|
||||
<template #dayPage="{event,day,mobile}">
|
||||
<slot name="dayPage" :event="event" :day="day" :mobile="mobile"></slot>
|
||||
</template>
|
||||
<template #pageMobilContent="{lvMenu}">
|
||||
<slot name="pageMobilContent" :lvMenu="lvMenu"></slot>
|
||||
</template>
|
||||
<template #pageMobilContentEmpty>
|
||||
<slot name="pageMobilContentEmpty" ></slot>
|
||||
</template>
|
||||
<template #minimizedPage="{event,day}">
|
||||
<slot name="minimizedPage" :event="event" :day="day"></slot>
|
||||
|
||||
@@ -43,8 +43,14 @@ export default {
|
||||
<calendar-header :title="title" @prev="prev" @next="next" @updateMode="$emit('updateMode', $event)" @click="$emit('updateMode', 'week')"/>
|
||||
<calendar-pane ref="pane" v-slot="slot" @slid="paneChanged">
|
||||
<calendar-day-page :active="slot.active" :year="focusDate.y" :week="focusDate.w+slot.offset" @updateMode="$emit('updateMode', $event)" @page:back="prev" @page:forward="next" @input="selectEvent" >
|
||||
<template #dayPage="{event,day}">
|
||||
<slot name="dayPage" :event="event" :day="day" ></slot>
|
||||
<template #dayPage="{event,day,mobile}">
|
||||
<slot name="dayPage" :event="event" :day="day" :mobile="mobile" ></slot>
|
||||
</template>
|
||||
<template #pageMobilContent="{lvMenu}">
|
||||
<slot name="pageMobilContent" :lvMenu="lvMenu" ></slot>
|
||||
</template>
|
||||
<template #pageMobilContentEmpty>
|
||||
<slot name="pageMobilContentEmpty" ></slot>
|
||||
</template>
|
||||
</calendar-day-page>
|
||||
</calendar-pane>
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import CalendarDate from '../../../composables/CalendarDate.js';
|
||||
import LvMenu from "../../../components/Cis/Mylv/LvMenu.js"
|
||||
import LvInfo from "../../../components/Cis/Mylv/LvInfo.js"
|
||||
import LvModal from "../../../components/Cis/Mylv/LvModal.js";
|
||||
|
||||
function ggt(m, n) { return n == 0 ? m : ggt(n, m % n); }
|
||||
@@ -8,8 +6,6 @@ function kgv(m, n) { return (m * n) / ggt(m, n); }
|
||||
|
||||
export default {
|
||||
components:{
|
||||
LvMenu,
|
||||
LvInfo,
|
||||
LvModal,
|
||||
},
|
||||
data() {
|
||||
@@ -79,9 +75,26 @@ export default {
|
||||
this.fetchLvMenu(event);
|
||||
},
|
||||
immediate:true,
|
||||
},
|
||||
isSliding:{
|
||||
handler(value){
|
||||
if(value)
|
||||
{
|
||||
this.setSelectedEvent(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
pageHeaderStyle(){
|
||||
return {
|
||||
'z-index': 4,
|
||||
'grid-template-columns': 'repeat(' + this.day.length + ', 1fr)',
|
||||
'grid-template-rows': 1,
|
||||
position: 'sticky',
|
||||
top: 0,
|
||||
}
|
||||
},
|
||||
dayGridStyle(){
|
||||
return {
|
||||
'grid-template-columns': '1 1fr',
|
||||
@@ -191,12 +204,16 @@ export default {
|
||||
'z-index': 0,
|
||||
}
|
||||
},
|
||||
showModal: function (evt) {
|
||||
let event = evt.orig;
|
||||
this.setSelectedEvent(event);
|
||||
Vue.nextTick(() => {
|
||||
this.$refs.lvmodal.show();
|
||||
});
|
||||
eventGridStyle(day, event) {
|
||||
return {
|
||||
'z-index': 1,
|
||||
'grid-column-start': 1 + (event.lane - 1) * day.lanes / event.maxLane,
|
||||
'grid-column-end': 1 + event.lane * day.lanes / event.maxLane,
|
||||
'grid-row-start': this.dateToMinutesOfDay(event.start),
|
||||
'grid-row-end': this.dateToMinutesOfDay(event.end),
|
||||
'background-color': event.orig.color,
|
||||
'--test': this.dateToMinutesOfDay(event.end),
|
||||
}
|
||||
},
|
||||
eventClick(evt) {
|
||||
let event = evt.orig;
|
||||
@@ -258,36 +275,26 @@ export default {
|
||||
dateToMinutesOfDay(day) {
|
||||
return Math.floor(((day.getHours() - 7) * 60 + day.getMinutes()) / this.smallestTimeFrame) + 1;
|
||||
},
|
||||
eventGridStyle(day,event){
|
||||
return {
|
||||
'z-index': 1,
|
||||
'grid-column-start': 1 + (event.lane - 1) * day.lanes / event.maxLane,
|
||||
'grid-column-end': 1 + event.lane * day.lanes / event.maxLane,
|
||||
'grid-row-start': this.dateToMinutesOfDay(event.start),
|
||||
'grid-row-end': this.dateToMinutesOfDay(event.end),
|
||||
'background-color': event.orig.color,
|
||||
'--test': this.dateToMinutesOfDay(event.end),
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
template: /*html*/`
|
||||
<div class="fhc-calendar-day-page ">
|
||||
<!-- lvModal for mobile view -->
|
||||
<lv-modal v-if="selectedEvent" :event="selectedEvent" ref="lvmodal" />
|
||||
<div class="row m-0">
|
||||
<div class="col-12 col-xl-6 p-0">
|
||||
<div class="d-flex flex-column">
|
||||
<div class="fhc-calendar-week-page-header d-grid border-2 border-bottom text-center" :style="{'z-index':4,'grid-template-columns': 'repeat(' + day.length + ', 1fr)', 'grid-template-rows':1}" style="position:sticky; top:0; " >
|
||||
<div class="fhc-calendar-week-page-header d-grid border-2 border-bottom text-center" :style="pageHeaderStyle" >
|
||||
<div type="button" class="flex-grow-1" :title="day.toLocaleString(undefined, {dateStyle:'short'})" @click.prevent="changeToMonth(day)">
|
||||
<div class="fw-bold">{{day.toLocaleString(undefined, {weekday: size < 2 ? 'narrow' : (size < 3 ? 'short' : 'long')})}}</div>
|
||||
<a href="#" class="small text-secondary text-decoration-none" >{{day.toLocaleString(undefined, [{day:'numeric',month:'numeric'},{day:'numeric',month:'numeric'},{day:'numeric',month:'numeric'},{dateStyle:'short'}][this.size])}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div ref="eventcontainer" class="position-relative flex-grow-1" @mousemove="calcHourPosition" @mouseleave="" >
|
||||
<div ref="eventcontainer" class="position-relative flex-grow-1" @mousemove="calcHourPosition" @mouseleave="hourPosition = null" >
|
||||
<div :id="hourGridIdentifier(hour)" v-for="hour in hours" :key="hour" class="position-absolute box-shadow-border-top" :style="hourGridStyle(hour)"></div>
|
||||
<div v-if="hourPosition" class="position-absolute border-top small" :style="indicatorStyle">
|
||||
<span class="border border-top-0 px-2 bg-white">{{hourPositionTime}}</span>
|
||||
</div>
|
||||
<Transition>
|
||||
<div v-if="hourPosition" class="position-absolute border-top small" :style="indicatorStyle">
|
||||
<span class="border border-top-0 px-2 bg-white">{{hourPositionTime}}</span>
|
||||
</div>
|
||||
</Transition>
|
||||
<div>
|
||||
<h1 v-if="noEventsCondition" class="m-0 text-secondary" ref="noEventsText" :style="noLvStyle">Keine Lehrveranstaltungen</h1>
|
||||
<div :class="{'fhc-calendar-no-events-overlay':noEventsCondition, 'events':true}">
|
||||
@@ -297,16 +304,16 @@ export default {
|
||||
</div>
|
||||
<div v-for="day in eventsPerDayAndHour" :key="day" class=" day border-start" :style="dayGridStyle">
|
||||
<div v-for="event in day.events" :key="event" :style="eventGridStyle(day,event)" :class="{'selectedEvent':event.orig == selectedEvent}" class="mx-2 small rounded overflow-hidden " >
|
||||
<!-- desktop version opens the lvMenu next to the calendar -->
|
||||
<!-- desktop version of the page template, parent receives slotProp mobile = false -->
|
||||
<div class="d-none d-xl-block h-100 " @click.prevent="eventClick(event)">
|
||||
<slot name="dayPage" :event="event" :day="day">
|
||||
<p>this is a placeholder which means that no template was passed to the Calendar Page slot</p>
|
||||
<slot name="dayPage" :event="event" :day="day" :mobile="false">
|
||||
<p>this is a slot placeholder</p>
|
||||
</slot>
|
||||
</div>
|
||||
<!-- mobile version opens the lvModal in a modal -->
|
||||
<div class="d-block d-xl-none h-100" @click.prevent="showModal(event)">
|
||||
<slot name="dayPage" :event="event" :day="day">
|
||||
<p>this is a placeholder which means that no template was passed to the Calendar Page slot</p>
|
||||
<!-- mobile version of the page template, parent receives slotProp mobile = true -->
|
||||
<div class="d-block d-xl-none h-100" @click.prevent="eventClick(event)">
|
||||
<slot name="dayPage" :event="event" :day="day" :mobile="true">
|
||||
<p>this is a slot placeholder</p>
|
||||
</slot>
|
||||
</div>
|
||||
|
||||
@@ -318,18 +325,17 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-none d-xl-block col-xl-6 p-0">
|
||||
<div class="p-5 sticky-top d-flex justify-content-center align-items-center flex-column">
|
||||
<div style="z-index:0" class="p-5 sticky-top d-flex justify-content-center align-items-center flex-column">
|
||||
<div style="max-height: calc(var(--fhc-calendar-pane-height) - 100px); overflow-y:auto;" class="w-100">
|
||||
<template v-if="selectedEvent && lvMenu">
|
||||
<h3 >{{$p.t('lvinfo','lehrveranstaltungsinformationen')}}</h3>
|
||||
<div class="w-100">
|
||||
<lv-info :event="selectedEvent" />
|
||||
</div>
|
||||
<h3 >Lehrveranstaltungs Menu</h3>
|
||||
<lv-menu :containerStyles="['p-0']" :rowStyles="['m-0']" v-show="lvMenu" :menu="lvMenu" />
|
||||
<slot name="pageMobilContent" :lvMenu="lvMenu" >
|
||||
<p>this is a slot placeholder</p>
|
||||
</slot>
|
||||
</template>
|
||||
<template v-else-if="noEventsCondition">
|
||||
<h3>Keine Lehrveranstaltungen</h3>
|
||||
<slot name="pageMobilContentEmpty" >
|
||||
<h3>This is an slot placeholder</h3>
|
||||
</slot>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="p-4 d-flex w-100 justify-content-center align-items-center">
|
||||
|
||||
@@ -31,6 +31,27 @@ export default {
|
||||
'input',
|
||||
],
|
||||
computed: {
|
||||
pageHeaderStyle(){
|
||||
return {
|
||||
'z-index': 4,
|
||||
'grid-template-columns': 'repeat(' + this.days.length + ', 1fr)',
|
||||
'grid-template-rows': 1,
|
||||
position: 'sticky',
|
||||
top: 0,
|
||||
}
|
||||
},
|
||||
indicatorStyle() {
|
||||
return {
|
||||
'pointer-events': 'none',
|
||||
'padding-left': '3.5rem',
|
||||
'margin-top': '-1px',
|
||||
'z-index': 2,
|
||||
'border-color': '#00649C!important',
|
||||
top: this.hourPosition + 'px',
|
||||
left: 0,
|
||||
right: 0,
|
||||
}
|
||||
},
|
||||
hours(){
|
||||
// returns an array with elements starting at 7 and ending at 24
|
||||
return [...Array(24).keys()].filter(hour => hour >= 7 && hour <= 24);
|
||||
@@ -88,6 +109,36 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
hourGridIdentifier(hour) {
|
||||
// this is the id attribute that is responsible to scroll the calender to the first event
|
||||
return 'scroll' + hour + this.focusDate.d + this.week;
|
||||
},
|
||||
hourGridStyle(hour) {
|
||||
return {
|
||||
'pointer-events': 'none',
|
||||
top: this.getAbsolutePositionForHour(hour),
|
||||
left: 0,
|
||||
right: 0,
|
||||
'z-index': 0,
|
||||
}
|
||||
},
|
||||
dayGridStyle(day) {
|
||||
return {
|
||||
'grid-template-columns': 'repeat(' + day.lanes + ', 1fr)',
|
||||
'grid-template-rows': 'repeat(' + (this.hours.length * 60 / this.smallestTimeFrame) + ', 1fr)',
|
||||
}
|
||||
},
|
||||
eventGridStyle(day, event) {
|
||||
return {
|
||||
'z-index': 1,
|
||||
'grid-column-start': 1 + (event.lane - 1) * day.lanes / event.maxLane,
|
||||
'grid-column-end': 1 + event.lane * day.lanes / event.maxLane,
|
||||
'grid-row-start': this.dateToMinutesOfDay(event.start),
|
||||
'grid-row-end': this.dateToMinutesOfDay(event.end),
|
||||
'background-color': event.orig.color,
|
||||
'--test': this.dateToMinutesOfDay(event.end),
|
||||
}
|
||||
},
|
||||
calcHourPosition(event) {
|
||||
let height = this.$refs.eventcontainer.getBoundingClientRect().height;
|
||||
let top = this.$refs.eventcontainer.getBoundingClientRect().top;
|
||||
@@ -155,23 +206,25 @@ export default {
|
||||
<div class="fhc-calendar-week-page">
|
||||
|
||||
<div class="d-flex flex-column">
|
||||
<div class="fhc-calendar-week-page-header d-grid border-2 border-bottom text-center" :style="{'z-index':4,'grid-template-columns': 'repeat(' + days.length + ', 1fr)', 'grid-template-rows':1}" style="position:sticky; top:0; " >
|
||||
<div class="fhc-calendar-week-page-header d-grid border-2 border-bottom text-center" :style="pageHeaderStyle" >
|
||||
<div type="button" v-for="day in days" :key="day" class="flex-grow-1" :title="day.toLocaleString(undefined, {dateStyle:'short'})" @click.prevent="changeToMonth(day)">
|
||||
<div class="fw-bold">{{day.toLocaleString(undefined, {weekday: size < 2 ? 'narrow' : (size < 3 ? 'short' : 'long')})}}</div>
|
||||
<a href="#" class="small text-secondary text-decoration-none" >{{day.toLocaleString(undefined, [{day:'numeric',month:'numeric'},{day:'numeric',month:'numeric'},{day:'numeric',month:'numeric'},{dateStyle:'short'}][this.size])}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div ref="eventcontainer" class="position-relative flex-grow-1" @mousemove="calcHourPosition" @mouseleave="" >
|
||||
<div :id="'scroll'+hour+focusDate.d+week" v-for="hour in hours" :key="hour" class="position-absolute box-shadow-border-top" style="pointer-events: none;" :style="{top:getAbsolutePositionForHour(hour),left:0,right:0,'z-index':0}"></div>
|
||||
<div v-if="hourPosition" class="position-absolute border-top small" style="pointer-events: none; padding-left:3.5rem; margin-top:-1px;z-index:2;border-color:#00649C !important" :style="{top:hourPosition+'px',left:0,right:0}">
|
||||
<span class="border border-top-0 px-2 bg-white">{{hourPositionTime}}</span>
|
||||
</div>
|
||||
<div ref="eventcontainer" class="position-relative flex-grow-1" @mousemove="calcHourPosition" @mouseleave="hourPosition = null" >
|
||||
<div :id="hourGridIdentifier(hour)" v-for="hour in hours" :key="hour" class="position-absolute box-shadow-border-top" :style="hourGridStyle(hour)"></div>
|
||||
<Transition>
|
||||
<div v-if="hourPosition" class="position-absolute border-top small" :style="indicatorStyle">
|
||||
<span class="border border-top-0 px-2 bg-white">{{hourPositionTime}}</span>
|
||||
</div>
|
||||
</Transition>
|
||||
<div class="events">
|
||||
<div class="hours">
|
||||
<div v-for="hour in hours" style="min-height:100px" :key="hour" class="text-muted text-end small" :ref="'hour' + hour">{{hour}}:00</div>
|
||||
</div>
|
||||
<div v-for="day in eventsPerDayAndHour" :key="day" class=" day border-start" :style="{'grid-template-columns': 'repeat(' + day.lanes + ', 1fr)', 'grid-template-rows': 'repeat(' + (hours.length * 60 / smallestTimeFrame) + ', 1fr)'}">
|
||||
<div :style="{'background-color':event.orig.color}" class="mx-2 small rounded overflow-hidden " @click.prevent="weekPageClick(event.orig, day)" :style="{'z-index':1,'grid-column-start': 1+(event.lane-1)*day.lanes/event.maxLane, 'grid-column-end': 1+event.lane*day.lanes/event.maxLane, 'grid-row-start': dateToMinutesOfDay(event.start), 'grid-row-end': dateToMinutesOfDay(event.end) ,'--test': dateToMinutesOfDay(event.end)}" v-for="event in day.events" :key="event">
|
||||
<div v-for="day in eventsPerDayAndHour" :key="day" class=" day border-start" :style="dayGridStyle(day)">
|
||||
<div v-for="event in day.events" :key="event" @click.prevent="weekPageClick(event.orig, day)" :style="eventGridStyle(day,event)" class="mx-2 small rounded overflow-hidden " >
|
||||
<slot name="weekPage" :event="event" :day="day" :isSelected="event.orig == selectedEvent" >
|
||||
<p>this is a placeholder which means that no template was passed to the Calendar Page slot</p>
|
||||
</slot>
|
||||
|
||||
@@ -53,7 +53,7 @@ export default {
|
||||
},
|
||||
template: /*html*/ `
|
||||
<!-- div that contains the content -->
|
||||
<component :is="computeContentType" v-if="content" :content="content" />
|
||||
<component :is="computeContentType" v-if="content" :content="content" :content_id="content_id" />
|
||||
<p v-else>No content is available to display</p>
|
||||
`,
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@ export default {
|
||||
RaumContent,
|
||||
},
|
||||
props:{
|
||||
contentID:{
|
||||
content_id:{
|
||||
type: Number
|
||||
},
|
||||
ort_kurzbz:{
|
||||
@@ -34,8 +34,8 @@ export default {
|
||||
// this method is always called when the modal is shown
|
||||
modalShown: function(){
|
||||
|
||||
if(this.contentID){
|
||||
this.$fhcApi.factory.cms.content(this.contentID).then(res =>{
|
||||
if(this.content_id){
|
||||
this.$fhcApi.factory.cms.content(this.content_id).then(res =>{
|
||||
this.content = res.data.content;
|
||||
this.type = res.data.type;
|
||||
|
||||
@@ -55,7 +55,7 @@ export default {
|
||||
<span v-else>Raum Informationen</span>
|
||||
</template>
|
||||
<template #default>
|
||||
<RaumContent v-if="content" :content="content"></RaumContent>
|
||||
<RaumContent v-if="content" :content="content" :content_id="content_id"></RaumContent>
|
||||
<div v-else>Der Content für diesen Raum konnte nicht geladen werden</div>
|
||||
</template>
|
||||
<template #footer>
|
||||
|
||||
@@ -5,6 +5,9 @@ export default {
|
||||
type:String,
|
||||
required:true,
|
||||
},
|
||||
content_id:{
|
||||
type:Number,
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
// replaces the tablesorter with the tabulator
|
||||
@@ -21,6 +24,34 @@ export default {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// tries to wrap the Raum titel with a link tag that redirects to the Reservierungen of that Raum
|
||||
let title = document.getElementsByTagName("h1");
|
||||
title = title.length ? title[0] : null;
|
||||
if (title)
|
||||
{
|
||||
let room_name = title.innerText;
|
||||
let room_name_reg_exp = new RegExp("\\w*\\s([a-zA-Z][0-9\\.]+)$");
|
||||
let room_name_reg_exp_result = room_name.match(room_name_reg_exp);
|
||||
if(room_name_reg_exp_result)
|
||||
{
|
||||
room_name = room_name_reg_exp_result[0];
|
||||
room_name = room_name.replace(" ","_");
|
||||
let link_element = document.createElement("a");
|
||||
link_element.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/CisVue/Cms/getRoomInformation/" + room_name;
|
||||
link_element.appendChild(title.cloneNode(true));
|
||||
title.replaceWith(link_element);
|
||||
}
|
||||
else
|
||||
{
|
||||
console.error(`the regular expression did not match the room name: ${room_name}`);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
console.error(`was not able to get the title of the raum_contentmittitel by searching for the first h1 element`);
|
||||
}
|
||||
},
|
||||
template: /*html*/ `
|
||||
<!-- div that contains the content -->
|
||||
|
||||
@@ -37,7 +37,8 @@ export default {
|
||||
template: /*html*/ `
|
||||
<h2 >News</h2>
|
||||
<hr/>
|
||||
<pagination :page_size="page_size" @page="loadNewPageContent" :maxPageCount="maxPageCount">
|
||||
<pagination :page_size="page_size" @page="loadNewPageContent" :maxPageCount="maxPageCount">
|
||||
</pagination>
|
||||
<div v-html="content"></div>
|
||||
</pagination>`,
|
||||
`,
|
||||
};
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import CisMenuEntry from "./Menu/Entry.js";
|
||||
import FhcSearchbar from "../searchbar/searchbar.js";
|
||||
import CisSprachen from "./Sprachen.js"
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CisMenuEntry,
|
||||
FhcSearchbar
|
||||
FhcSearchbar,
|
||||
CisSprachen,
|
||||
},
|
||||
props: {
|
||||
menu: Array,
|
||||
@@ -49,34 +51,18 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getLanguageButtonClass(lang) {
|
||||
let classString = 'btn btn-level-2 rounded-0'
|
||||
const langCookie = (function(lang) {
|
||||
const cookieString = document.cookie;
|
||||
const cookies = cookieString.split('; ');
|
||||
|
||||
for (let cookie of cookies) {
|
||||
const [key, value] = cookie.split('=');
|
||||
if (key === lang) {
|
||||
return decodeURIComponent(value);
|
||||
}
|
||||
}
|
||||
|
||||
return null; // Return null if the cookie is not found
|
||||
})('sprache');
|
||||
if(langCookie === lang) classString += ' fhc-active';
|
||||
return classString
|
||||
},
|
||||
toggleCollapsibles(target){
|
||||
switch(target){
|
||||
case 'settings':
|
||||
this.navUserDropdown?.hide();
|
||||
break;
|
||||
case 'navUserDropdown':
|
||||
this.$refs.searchbar?.settingsDropdown?.hide();
|
||||
break;
|
||||
checkSettingsVisibility: function (event) {
|
||||
// hides the settings collapsible if the user clicks somewhere else
|
||||
if (!this.$refs.navUserDropdown.contains(event.target)) {
|
||||
this.navUserDropdown.hide();
|
||||
}
|
||||
},
|
||||
handleShowNavUser(){
|
||||
document.addEventListener("click", this.checkSettingsVisibility);
|
||||
},
|
||||
handleHideNavUser(){
|
||||
document.removeEventListener("click", this.checkSettingsVisibility);
|
||||
},
|
||||
makeParentContentActive(content_id, collection=this.entries, parent=null){
|
||||
for(let entry of collection){
|
||||
if(entry.content_id == content_id){
|
||||
@@ -93,20 +79,6 @@ export default {
|
||||
setActiveEntry(content_id){
|
||||
this.activeEntry = content_id;
|
||||
},
|
||||
handleChangeLanguage(lang) {
|
||||
this.$p.setLanguage(lang, this.$fhcApi)
|
||||
const gerButton = this.$refs.ger
|
||||
const engButton = this.$refs.eng
|
||||
|
||||
if(lang === 'German') {
|
||||
gerButton.classList.add('fhc-active')
|
||||
engButton.classList.remove('fhc-active')
|
||||
} else if(lang === 'English') {
|
||||
engButton.classList.add('fhc-active')
|
||||
gerButton.classList.remove('fhc-active')
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
this.entries = this.menu;
|
||||
@@ -116,14 +88,10 @@ export default {
|
||||
});
|
||||
},
|
||||
template: /*html*/`
|
||||
<!--<p>CISVUE HEADER</p>
|
||||
<p>highest count : {{highestMatchingUrlCount}}</p>
|
||||
<p>active entry content_id : {{activeEntry}}</p>
|
||||
-->
|
||||
<button id="nav-main-btn" class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#nav-main" aria-controls="nav-main" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<button id="nav-main-btn" class="navbar-toggler rounded-0" type="button" data-bs-toggle="offcanvas" data-bs-target="#nav-main" aria-controls="nav-main" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<fhc-searchbar @showSettings="toggleCollapsibles" ref="searchbar" id="nav-search" class="fhc-searchbar w-100" :searchoptions="searchbaroptions" :searchfunction="searchfunction"></fhc-searchbar>
|
||||
<fhc-searchbar ref="searchbar" id="nav-search" class="fhc-searchbar w-100" :searchoptions="searchbaroptions" :searchfunction="searchfunction"></fhc-searchbar>
|
||||
<a id="nav-logo" class="d-none d-lg-block" :href="rootUrl">
|
||||
<img :src="logoUrl" alt="Logo">
|
||||
</a>
|
||||
@@ -131,27 +99,28 @@ export default {
|
||||
<button id="nav-user-btn" class="btn btn-link rounded-0" type="button" data-bs-toggle="collapse" data-bs-target="#nav-user-menu" aria-expanded="false" aria-controls="nav-user-menu">
|
||||
<img :src="avatarUrl" class="avatar rounded-circle"/>
|
||||
</button>
|
||||
<ul ref="navUserDropdown" @[\`show.bs.collapse\`]="toggleCollapsibles('navUserDropdown')" id="nav-user-menu" class="top-100 end-0 collapse list-unstyled" aria-labelledby="nav-user-btn">
|
||||
<ul ref="navUserDropdown"
|
||||
@[\`shown.bs.collapse\`]="handleShowNavUser"
|
||||
@[\`hide.bs.collapse\`]="handleHideNavUser"
|
||||
id="nav-user-menu" class="top-100 end-0 collapse list-unstyled" aria-labelledby="nav-user-btn">
|
||||
<li class="btn-level-2"><a class="btn btn-level-2 rounded-0 d-block" :href="site_url + '/Cis/Profil'" id="menu-profil">Profil</a></li>
|
||||
<li class="fhc-languages btn-level-2" style="text-align: center;">
|
||||
<div class="btn-group">
|
||||
<a :class="getLanguageButtonClass('German')" ref="ger" href="#" @click="handleChangeLanguage('German')">Deutsch</a>
|
||||
<a :class="getLanguageButtonClass('English')" ref="eng" href="#" @click="handleChangeLanguage('English')">English</a>
|
||||
</div>
|
||||
<li class="btn-level-2">
|
||||
<cis-sprachen></cis-sprachen>
|
||||
</li>
|
||||
<li class="btn-level-2"><hr class="dropdown-divider p-0 "></li>
|
||||
<li class="btn-level-2"><hr class="dropdown-divider m-0 "></li>
|
||||
<li><a class="btn btn-level-2 rounded-0 d-block" :href="logoutUrl">Logout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<nav id="nav-main" class="offcanvas offcanvas-start bg-dark" tabindex="-1" aria-labelledby="nav-main-btn" data-bs-backdrop="false">
|
||||
<div id="nav-main-sticky">
|
||||
<div id="nav-main-toggle" class="position-static d-none d-lg-block bg-dark">
|
||||
<button type="button" class="btn bg-dark text-light rounded-0 p-1 d-flex align-items-center" data-bs-toggle="collapse" data-bs-target="#nav-main-menu" aria-expanded="true" aria-controls="nav-main-menu">
|
||||
<button type="button" class="btn bg-dark text-light rounded-0 p-1 d-flex align-items-center" data-bs-toggle="collapse" data-bs-target=".nav-menu-collapse" aria-expanded="true" aria-controls="nav-sprachen nav-main-menu">
|
||||
<i class="fa fa-arrow-circle-left"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="offcanvas-body p-0">
|
||||
<div id="nav-main-menu" class="collapse collapse-horizontal show">
|
||||
|
||||
<div id="nav-main-menu" class="nav-menu-collapse collapse collapse-horizontal show">
|
||||
<div>
|
||||
<cis-menu-entry :highestMatchingUrlCount="highestMatchingUrlCount" :activeContent="activeEntry" v-for="entry in entries" :key="entry.content_id" :entry="entry" />
|
||||
</div>
|
||||
|
||||
@@ -196,11 +196,6 @@ export default {
|
||||
this.checkActiveUrl(new URL(window.location.href));
|
||||
},
|
||||
template: /*html*/`
|
||||
<!-- DEBUGGIING PRINTS
|
||||
<p>entry content_id: {{JSON.stringify(entry.content_id,null,2)}}</p>
|
||||
<p>entry menu: {{JSON.stringify(entry.menu_open,null,2)}}</p>
|
||||
<p>highest count : {{urlCount}}</p>
|
||||
-->
|
||||
<div v-if="entry.template_kurzbz == 'include'">
|
||||
INCLUDE
|
||||
</div>
|
||||
|
||||
@@ -11,6 +11,15 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
lektorenLinks: function(){
|
||||
if (!this.event || !Array.isArray(this.event.lektor) || !this.event.lektor.length) return "a";
|
||||
|
||||
let lektorenLinks ={};
|
||||
this.event.lektor.forEach((lektor)=>{
|
||||
lektorenLinks[lektor.kurzbz] = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/Cis/Profil/View/${lektor.mitarbeiter_uid}`;
|
||||
})
|
||||
return lektorenLinks;
|
||||
},
|
||||
start_time: function () {
|
||||
if (!this.event.start) return 'N/A';
|
||||
if (!this.event.start instanceof Date) {
|
||||
@@ -67,7 +76,12 @@ export default {
|
||||
$p.t('lehre','lektor')+':'
|
||||
:''
|
||||
}}</th>
|
||||
<td>{{event.lektor.map(lektor=>lektor.kurzbz).join("/")}}</td>
|
||||
<td>
|
||||
<div v-for="lektor in event.lektor" class="d-block">
|
||||
<a v-if="lektorenLinks[lektor.kurzbz]" :href="lektorenLinks[lektor.kurzbz]"><i class="fa fa-arrow-up-right-from-square me-1" style="color:#00649C"></i></a>
|
||||
{{lektor.kurzbz}}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{
|
||||
|
||||
@@ -14,6 +14,16 @@ export default {
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
c4_disabled: function (menuItem) {
|
||||
if (!this.c4_link(menuItem) && !menuItem.c4_moodle_links?.length) {
|
||||
return true;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
c4_target: function (menuItem) {
|
||||
if (menuItem.c4_moodle_links?.length > 0) return null;
|
||||
return menuItem.c4_target ?? null;
|
||||
},
|
||||
selectMenu: function (menuItem, index = null) {
|
||||
|
||||
// early return if link is #
|
||||
@@ -37,7 +47,7 @@ export default {
|
||||
if (!menuItem) return null;
|
||||
if (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length)
|
||||
{
|
||||
return '#';
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -50,9 +60,9 @@ export default {
|
||||
<div v-else>
|
||||
<div class="container" :class="containerStyles">
|
||||
<div class="row g-2 justify-content-center" :class="rowStyles">
|
||||
<div style="min-height:150px; min-width:150px;" class="col-12 col-lg-6 col-xl-4" v-for="(menuItem, index) in menu" :key="index">
|
||||
<a :id="menuItem.name" :class="{'dropdown-toggle':menuItem.c4_moodle_links?.length }" :target="menuItem.c4_target ?? null" role="button" :href="c4_link(menuItem)"
|
||||
:disabled="!c4_link(menuItem)?true:null"
|
||||
<div style="min-height:150px; min-width:150px;" class="col-12 col-lg-6 col-xl-4" v-for="(menuItem, index) in menu" :key="index">
|
||||
<a :id="menuItem.name" :class="{'dropdown-toggle':menuItem.c4_moodle_links?.length }" role="button" :href="c4_link(menuItem)"
|
||||
:disabled="c4_disabled(menuItem)" :data-bs-toggle="menuItem.c4_moodle_links?.length?'dropdown':null"
|
||||
class="fhc-entry p-2 w-100 text-wrap border border-1 rounded-3 d-flex flex-column align-items-center justify-content-center text-center text-decoration-none link-dark h-100">
|
||||
<img :src="menuItem.c4_icon" :alt="menuItem.name" />
|
||||
<p @click="selectMenu(menuItem)" class="w-100 mt-2">{{menuItem.name}}</p>
|
||||
|
||||
@@ -17,6 +17,10 @@ export default {
|
||||
type:String,
|
||||
default:"title"
|
||||
},
|
||||
showMenu:{
|
||||
type:Boolean,
|
||||
default:true,
|
||||
},
|
||||
/*
|
||||
* NOTE(chris):
|
||||
* Hack to expose in "emits" declared events to $props which we use
|
||||
@@ -39,6 +43,9 @@ export default {
|
||||
methods:{
|
||||
onModalShow: function()
|
||||
{
|
||||
// do not load the menu if the menu is not getting rendered
|
||||
if(!this.showMenu) return;
|
||||
|
||||
if (this.event.type == 'lehreinheit') {
|
||||
this.$fhcApi.factory.stundenplan.getLehreinheitStudiensemester(this.event.lehreinheit_id[0]).then(
|
||||
res=>res.data
|
||||
@@ -69,8 +76,10 @@ export default {
|
||||
<template v-slot:default>
|
||||
<h3 >{{$p.t('lvinfo','lehrveranstaltungsinformationen')}}</h3>
|
||||
<lv-info :event="event"></lv-info>
|
||||
<h3 >Lehrveranstaltungs Menu</h3>
|
||||
<lv-menu :menu="menu"></lv-menu>
|
||||
<template v-if="showMenu">
|
||||
<h3 >Lehrveranstaltungs Menu</h3>
|
||||
<lv-menu :menu="menu"></lv-menu>
|
||||
</template>
|
||||
</template>
|
||||
<!-- optional footer -->
|
||||
<template v-slot:footer >
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import FhcCalendar from "../../Calendar/Calendar.js";
|
||||
import CalendarDate from "../../../composables/CalendarDate.js";
|
||||
|
||||
import LvModal from "../../../components/Cis/Mylv/LvModal.js";
|
||||
import LvInfo from "../../../components/Cis/Mylv/LvInfo.js"
|
||||
|
||||
export default{
|
||||
props:{
|
||||
@@ -10,7 +11,9 @@ export default{
|
||||
}
|
||||
},
|
||||
components: {
|
||||
FhcCalendar
|
||||
FhcCalendar,
|
||||
LvModal,
|
||||
LvInfo,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -40,6 +43,9 @@ export default{
|
||||
},
|
||||
},
|
||||
methods:{
|
||||
setSelectedEvent: function(event){
|
||||
this.currentlySelectedEvent = event;
|
||||
},
|
||||
getLvID: function () {
|
||||
this.lv_id = window.location.pathname
|
||||
},
|
||||
@@ -51,6 +57,7 @@ export default{
|
||||
Vue.nextTick(() => {
|
||||
this.$refs.lvmodal.show();
|
||||
});
|
||||
|
||||
},
|
||||
updateRange: function ({ start, end }) {
|
||||
|
||||
@@ -112,7 +119,8 @@ export default{
|
||||
this.loadEvents();
|
||||
},
|
||||
template: /*html*/`
|
||||
<fhc-calendar :initial-date="currentDay" @change:range="updateRange" :events="events" initial-mode="week" show-weeks @select:day="selectDay" v-model:minimized="minimized">
|
||||
<lv-modal v-if="currentlySelectedEvent" :showMenu="false" :event="currentlySelectedEvent" ref="lvmodal" />
|
||||
<fhc-calendar @selectedEvent="setSelectedEvent" :initial-date="currentDay" @change:range="updateRange" :events="events" initial-mode="week" show-weeks @select:day="selectDay" v-model:minimized="minimized">
|
||||
<template #monthPage="{event,day,isSelected}">
|
||||
<span class="fhc-entry" :class="{'selectedEvent':isSelected}" style="color:white" :style="{'background-color': event.color}">
|
||||
{{event.topic}}
|
||||
@@ -125,8 +133,8 @@ export default{
|
||||
<span>{{event?.orig.ort_kurzbz}}</span>
|
||||
</div>
|
||||
</template>
|
||||
<template #dayPage="{event,day}">
|
||||
<div type="button" class="fhc-entry border border-secondary border row h-100 justify-content-center align-items-center text-center">
|
||||
<template #dayPage="{event,day,mobile}">
|
||||
<div @click="mobile? showModal(event?.orig):null" type="button" class="fhc-entry border border-secondary border row h-100 justify-content-center align-items-center text-center">
|
||||
<div class="col ">
|
||||
<p>Lehrveranstaltung:</p>
|
||||
<p class="m-0">{{event?.orig.topic}}</p>
|
||||
@@ -141,6 +149,15 @@ export default{
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #pageMobilContent>
|
||||
<h3 >{{$p.t('lvinfo','lehrveranstaltungsinformationen')}}</h3>
|
||||
<div class="w-100">
|
||||
<lv-info :event="currentlySelectedEvent" />
|
||||
</div>
|
||||
</template>
|
||||
<template #pageMobilContentEmpty >
|
||||
<h3>Keine Raum Reservierung</h3>
|
||||
</template>
|
||||
</fhc-calendar>
|
||||
`,
|
||||
};
|
||||
@@ -19,8 +19,16 @@ export default {
|
||||
info: null,
|
||||
}),
|
||||
computed: {
|
||||
lektorNames() {
|
||||
return this.info.lektoren.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());
|
||||
lektorNamesLinks(){
|
||||
let lektorenLinks = {};
|
||||
this.info.lektoren.forEach(e => {
|
||||
let name = ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim();
|
||||
lektorenLinks[name] = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/Cis/Profil/View/${e.uid}`;
|
||||
});
|
||||
return lektorenLinks;
|
||||
},
|
||||
lektorNames(){
|
||||
return this.info.lektoren.map((e)=>((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());
|
||||
},
|
||||
lvLeitung() {
|
||||
return this.info.lvLeitung && this.info.lvLeitung.length ? this.info.lvLeitung.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim()) : null;
|
||||
@@ -69,16 +77,11 @@ export default {
|
||||
this.info = infos[this.lehrveranstaltung_id];
|
||||
} else {
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Info/' + this.studien_semester + '/' + this.lehrveranstaltung_id).then(res => {
|
||||
|
||||
this.info = infos[this.lehrveranstaltung_id] = res.data.retval || [];
|
||||
}).catch(() => this.info = {});
|
||||
}
|
||||
},
|
||||
template: /*html*/`
|
||||
|
||||
<!-- debugging print
|
||||
<p>{{JSON.stringify(info,null,2)}}</p>
|
||||
-->
|
||||
<h1>{{$p.t('lvinfo/lehrveranstaltungsinformationen')}}</h1>
|
||||
<hr>
|
||||
<div v-if="!info" class="text-center">
|
||||
@@ -110,8 +113,8 @@ export default {
|
||||
<th>{{$p.t('lehre/lehrbeauftragter')}}</th>
|
||||
<td>
|
||||
<ul v-if="lektorNames.length" class="list-unstyled mb-0">
|
||||
<li v-for="name in lektorNames" :key="name">
|
||||
<!-- TODO(chris): link? -->
|
||||
<li v-for="name in new Set(lektorNames)" :key="name">
|
||||
<a :href="lektorNamesLinks[name]?lektorNamesLinks[name]:null"><i class="fa fa-arrow-up-right-from-square me-1" style="color:#00649C"></i></a>
|
||||
{{name}}
|
||||
</li>
|
||||
</ul>
|
||||
@@ -125,7 +128,7 @@ export default {
|
||||
<td>
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li v-for="name in lvLeitung" :key="name">
|
||||
<!-- TODO(chris): link? -->
|
||||
<a :href="lektorNamesLinks[name]?lektorNamesLinks[name]:null"><i class="fa fa-arrow-up-right-from-square me-1" style="color:#00649C"></i></a>
|
||||
{{name}}
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
export default {
|
||||
data(){
|
||||
return {
|
||||
allActiveLanguages: null,
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
changeLanguage: function(lang){
|
||||
if(this.allActiveLanguages.some(l => l === lang))
|
||||
{
|
||||
this.$p.setLanguage(lang, this.$fhcApi);
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted(){
|
||||
this.$fhcApi.factory.phrasen.getActiveDbLanguages()
|
||||
.then(res => res.data)
|
||||
.then(
|
||||
(langs) => {
|
||||
this.allActiveLanguages = langs;
|
||||
}
|
||||
);
|
||||
},
|
||||
template:/*html*/`
|
||||
<div class="container">
|
||||
<div class="row justify-content-center align-items-center flex-nowrap overflow-hidden">
|
||||
<button v-for="lang in allActiveLanguages" @click.prevent="changeLanguage(lang)" class="col text-white fhc-entry btn text-center w-100" :selected="$p.user_language.value==lang?'':null">{{lang}}</button>
|
||||
</div>
|
||||
</div>
|
||||
`,
|
||||
};
|
||||
@@ -22,6 +22,7 @@ export default {
|
||||
provide() {
|
||||
return {
|
||||
editMode: Vue.computed(()=>this.editMode),
|
||||
viewData: Vue.computed(()=>Vue.reactive(this.viewData)),
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import BsModal from "../Bootstrap/Modal.js";
|
||||
import CachedWidgetLoader from "../../composables/Dashboard/CachedWidgetLoader.js";
|
||||
import HeightTransition from "../Tranistion/HeightTransition.js";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal,
|
||||
HeightTransition
|
||||
},
|
||||
data: () => ({
|
||||
component: "",
|
||||
@@ -118,7 +120,9 @@ export default {
|
||||
</div>
|
||||
<div v-else-if="!hidden || editMode" class="dashboard-item card overflow-hidden h-100" :class="arguments && arguments.className ? arguments.className : ''">
|
||||
<div v-if="widget" class="card-header d-flex ps-0 pe-2">
|
||||
<span v-if="editMode" drag-action="move" class="col-auto mx-2 px-2 cursor-move"><i class="fa-solid fa-grip-vertical"></i></span>
|
||||
<Transition>
|
||||
<span v-if="editMode" drag-action="move" class="col-auto mx-2 px-2 cursor-move"><i class="fa-solid fa-grip-vertical"></i></span>
|
||||
</Transition>
|
||||
<span class="col mx-2 px-2">{{ widget.setup.name }}</span>
|
||||
<a v-if="widget.setup.cis4link" :href="getWidgetC4Link(widget)" class="ms-auto mb-2">
|
||||
<i class="fa fa-arrow-up-right-from-square me-1"></i>
|
||||
@@ -127,9 +131,11 @@ export default {
|
||||
<a v-if="custom && editMode" class="col-auto px-1" href="#" @click.prevent="$emit('remove')">
|
||||
<i class="fa-solid fa-trash"></i>
|
||||
</a>
|
||||
<div v-else-if="editMode" class="col-auto px-1 form-switch">
|
||||
<input class="form-check-input ms-0" type="checkbox" role="switch" id="flexSwitchCheckChecked" :checked="!hidden" @input="$emit('remove', hidden)">
|
||||
</div>
|
||||
<Transition>
|
||||
<div v-if="!custom && editMode" class="col-auto px-1 form-switch">
|
||||
<input class="form-check-input ms-0" type="checkbox" role="switch" id="flexSwitchCheckChecked" :checked="!hidden" @input="$emit('remove', hidden)">
|
||||
</div>
|
||||
</Transition>
|
||||
</div>
|
||||
<div v-if="ready" class="card-body overflow-hidden" style="padding: 0px;">
|
||||
<component :is="component" v-model:shared-data="sharedData" :config="arguments" :width="width" :height="height" @setConfig="setConfig" @change="changeConfigManually"></component>
|
||||
@@ -148,8 +154,10 @@ export default {
|
||||
<button type="button" class="btn btn-primary" @click="changeConfig">Save changes</button>
|
||||
</template>
|
||||
</bs-modal>
|
||||
<div v-if="editMode && isResizeable" class="card-footer d-flex justify-content-end p-0">
|
||||
<span drag-action="resize" class="col-auto px-1 cursor-nw-resize"><i class="fa-solid fa-up-right-and-down-left-from-center mirror-x"></i></span>
|
||||
</div>
|
||||
<height-transition>
|
||||
<div v-if="editMode && isResizeable" class="card-footer d-flex justify-content-end p-0">
|
||||
<span drag-action="resize" class="col-auto px-1 cursor-nw-resize"><i class="fa-solid fa-up-right-and-down-left-from-center mirror-x"></i></span>
|
||||
</div>
|
||||
</height-transition>
|
||||
</div>`,
|
||||
};
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
import AbstractWidget from './Abstract';
|
||||
import BsModal from '../Bootstrap/Modal';
|
||||
|
||||
const MAX_LOADED_NEWS = 10;
|
||||
const MAX_LOADED_NEWS = 30;
|
||||
|
||||
export default {
|
||||
name: "WidgetsNews",
|
||||
components: {BsModal},
|
||||
components: {
|
||||
BsModal
|
||||
},
|
||||
data: () => ({
|
||||
allNewsList: [],
|
||||
singleNews: {},
|
||||
selected: null
|
||||
}),
|
||||
mixins: [AbstractWidget],
|
||||
computed: {
|
||||
@@ -17,10 +20,12 @@ export default {
|
||||
},
|
||||
newsList() {
|
||||
//Return news amount depending on widget width and size
|
||||
let quantity = this.width;
|
||||
// let quantity = this.width;
|
||||
let quantity = MAX_LOADED_NEWS;
|
||||
|
||||
|
||||
if (this.width === 1) {
|
||||
quantity = this.height === 1 ? 4 : 10;
|
||||
quantity = this.height === 1 ? 4 : MAX_LOADED_NEWS;
|
||||
}
|
||||
|
||||
return this.allNewsList.slice(0, quantity);
|
||||
@@ -31,12 +36,18 @@ export default {
|
||||
"skin/images/fh_technikum_wien_illustration_klein.png"
|
||||
);
|
||||
},
|
||||
activeNews() {
|
||||
return this.allNewsList.find(news => news.minimized === false) ?? this.allNewsList[0] ?? null
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.$fhcApi.factory.cms
|
||||
.news(MAX_LOADED_NEWS)
|
||||
.then((res) => {
|
||||
this.allNewsList = res.data;
|
||||
this.allNewsList = Array.from(Object.values(res.data));
|
||||
|
||||
this.selected = this.allNewsList.length ? this.allNewsList[0] : null
|
||||
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("ERROR: ", err.response.data);
|
||||
@@ -45,6 +56,63 @@ export default {
|
||||
this.$emit("setConfig", false);
|
||||
},
|
||||
methods: {
|
||||
setNext(){
|
||||
const thisIndex = this.allNewsList.findIndex(n=>n.news_id == this.selected.news_id)
|
||||
const nextIndex = thisIndex == (this.allNewsList.length - 1) ? 0 : thisIndex + 1
|
||||
this.setSelected(this.allNewsList[nextIndex])
|
||||
},
|
||||
setPrev() {
|
||||
const thisIndex = this.allNewsList.findIndex(n=>n.news_id == this.selected.news_id)
|
||||
const prevIndex = thisIndex ? thisIndex - 1 : this.allNewsList.length - 1
|
||||
this.setSelected(this.allNewsList[prevIndex], 'prev')
|
||||
},
|
||||
getMenuItemClass(news) {
|
||||
let classString = ''
|
||||
if(this.selected && this.selected.news_id === news.news_id) {
|
||||
classString += 'selected'
|
||||
}
|
||||
return classString
|
||||
},
|
||||
getDynClassCarouselItem(news, index) {
|
||||
// sets classes prev/active/next for bootstrap carousel
|
||||
let classString = ''
|
||||
|
||||
// return active class to news === selected OR very first news
|
||||
if((this.selected.news_id === news.news_id) || (this.selected === null && index === 0)) {
|
||||
classString = 'active';
|
||||
} else { // set prev/next class for news
|
||||
const selectedIndex = this.newsList.indexOf(this.selected)
|
||||
const ownIndex = this.newsList.indexOf(news)
|
||||
const isPrev = (ownIndex + 1) === selectedIndex || (ownIndex === this.newsList.length - 1 && selectedIndex === 0)
|
||||
if(isPrev) {
|
||||
classString += ' carousel-item-prev'
|
||||
}
|
||||
const isNext = (ownIndex - 1) === selectedIndex || (ownIndex === 0 && selectedIndex === this.newsList.length - 1)
|
||||
if(isNext) {
|
||||
classString += ' carousel-item-next'
|
||||
}
|
||||
}
|
||||
|
||||
return classString;
|
||||
},
|
||||
setSelected(news, direction = "next") {
|
||||
if (this.selected && news && this.selected === news) return
|
||||
|
||||
const oldCard = document.getElementById('card-'+this.selected.news_id)
|
||||
|
||||
// TODO: to show animation of non neighbour item through menu reapply css classes
|
||||
if(direction === 'next') {
|
||||
// set nextCard .carousel-item-next.carousel-item-start
|
||||
oldCard.classList.add('carousel-item-start')
|
||||
|
||||
} else {
|
||||
// set prevCard .carousel-item-prev.carousel-item-end
|
||||
oldCard.classList.add('carousel-item-end')
|
||||
}
|
||||
|
||||
this.selected = news
|
||||
|
||||
},
|
||||
contentURI: function (content_id) {
|
||||
return (
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
@@ -67,23 +135,53 @@ export default {
|
||||
},
|
||||
template: /*html*/ `
|
||||
<div class="widgets-news h-100" :style="getNewsWidgetStyle">
|
||||
<div class="d-flex flex-column h-100 ">
|
||||
<div class="d-flex flex-column h-100">
|
||||
|
||||
<div class="h-100" style="overflow-y: auto" v-if="width == 1">
|
||||
<div v-for="(news, index) in newsList" :key="news.id" class="mt-2">
|
||||
<div v-for="(news, index) in newsList" :key="news.news_id" class="mt-2">
|
||||
<div v-if="index > 0 " class="fhc-seperator"></div>
|
||||
<a :href="contentURI(news.content_id)" >{{ news.content_obj.betreff?news.content_obj.betreff:getDate(news.insertamum) }}</a><br>
|
||||
<span class="small text-muted">{{ formatDateTime(news.insertamum) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="width > 1 && height === 1" class="h-100" :class="'row row-cols-' + width">
|
||||
<div class="h-100" v-for="news in newsList" :key="news.id">
|
||||
<div class="news-content h-100" :style="'--news-widget-height: '+height" ref="htmlContent" v-html="news.content_obj.content"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="h-100" :class="'row row-cols-' + width + ' gx-2'">
|
||||
<div class="h-100" v-for="news in newsList" :key="news.id">
|
||||
<div class="news-content h-100" :style="'--news-widget-height: '+height" ref="htmlContent" v-html="news.content_obj.content"></div>
|
||||
</div>
|
||||
<a :href="contentURI(news.content_id)" >{{ news.content_obj.betreff?news.content_obj.betreff:getDate(news.insertamum) }}</a><br>
|
||||
<span class="small text-muted">{{ formatDateTime(news.insertamum) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="row h-100">
|
||||
<!-- TODO: mobile responsiveness of this part-->
|
||||
<div :class="'col-'+(width == 2? 6 : 4) + ' h-100 g-0'" style="overflow: auto;">
|
||||
<template v-for="news in newsList" :key="'menu-'+news.news_id">
|
||||
|
||||
<div class="row fhc-news-menu-item" @click="setSelected(news)" :class="getMenuItemClass(news)" style="margin-right: 0px; margin-left: 0px;">
|
||||
<div class="col-8 fhc-news-menu-item-betreff" style="overflow-y: hidden;"><p>{{news.content_obj.betreff ?? ''}}</p></div>
|
||||
<span class="fhc-news-menu-item-date fw-bold"
|
||||
>{{ news.datum ?? ''}}</span>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
</div>
|
||||
<div :class="'col-'+(width == 2? 6 : 8) + ' h-100'" style="padding-left: 0px; padding-right: 0px;" ref="htmlContent">
|
||||
<div class="container h-100" style="padding: 0px;" ref="carocontainer">
|
||||
|
||||
<div id="carouselExample" style="height: 100%;" class="carousel slide fhc-carousel" data-bs-ride="carousel"
|
||||
data-bs-interval="false"
|
||||
ref="carocontrols">
|
||||
<div class="carousel-indicators">
|
||||
<button v-for="(news, index) in newsList" :id="'indicator-'+news_news_id" type="button" data-bs-target="#carouselExample" data-bs-slide-to="index"></button>
|
||||
</div>
|
||||
|
||||
<div class="carousel-inner" style="height: 100%; max-width: 100%;">
|
||||
<div v-for="(news, index) in newsList" class="carousel-item" :class="getDynClassCarouselItem(news, index)" style="overflow-y: auto; height: 100%;" :id="'card-'+news.news_id" v-html="news.content_obj.content">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- TODO: prev/next button styling && placement-->
|
||||
<button @click="setPrev" style="z-index: 9999; color: black; opacity: 1;" data-bs-target="#carouselExample" class="carousel-control-prev" type="button">
|
||||
<i class="fa fa-chevron-left"></i>
|
||||
</button>
|
||||
<button @click="setNext" style="z-index: 9999; color: black; opacity: 1;" data-bs-target="#carouselExample" class="carousel-control-next" type="button">
|
||||
<i class="fa fa-chevron-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`,
|
||||
|
||||
@@ -188,8 +188,13 @@ export default {
|
||||
template: /*html*/`
|
||||
<div class="dashboard-widget-stundenplan d-flex flex-column h-100">
|
||||
<lv-modal v-if="selectedEvent" ref="lvmodal" :event="selectedEvent" />
|
||||
<content-modal :contentID="roomInfoContentID" dialogClass="modal-lg" ref="contentModal"/>
|
||||
<content-modal :content_id="roomInfoContentID" dialogClass="modal-lg" ref="contentModal"/>
|
||||
<fhc-calendar @change:range="updateRange" :initial-date="currentDay" class="border-0" class-header="p-0" @select:day="selectDay" :widget="true" v-model:minimized="minimized" :events="events" no-week-view :show-weeks="false" >
|
||||
<template #monthPage="{event,day,isSelected}">
|
||||
<span class="fhc-entry" :class="{'selectedEvent':isSelected}" style="color:white" :style="{'background-color': event.color}">
|
||||
{{event.topic}}
|
||||
</span>
|
||||
</template>
|
||||
<template #minimizedPage >
|
||||
<div class="flex-grow-1" style="overflow-y: auto; overflow-x: hidden">
|
||||
<div v-if="events === null" class="d-flex h-100 justify-content-center align-items-center">
|
||||
|
||||
@@ -356,29 +356,31 @@ export default {
|
||||
@drop="dragEnd"
|
||||
@mousemove="updateCursor"
|
||||
@mouseleave="mouseLeave">
|
||||
<grid-item
|
||||
v-for="item in (mode == 0 && active? placedItems_withPlaceholders : placedItems)"
|
||||
:key="item.id"
|
||||
:item="item"
|
||||
@start-move="startMove"
|
||||
@start-resize="startResize"
|
||||
@end-drag="dragCancel"
|
||||
@drop-drag="dragEnd"
|
||||
class="position-absolute"
|
||||
:active="active"
|
||||
:style="{
|
||||
top: 'calc(' + item.y + ' * var(--fhc-dg-row-height))',
|
||||
left: 'calc(' + item.x + ' * var(--fhc-dg-col-width))',
|
||||
width: 'calc(' + item.w + ' * var(--fhc-dg-col-width))',
|
||||
height: 'calc(' + item.h + ' * var(--fhc-dg-row-height))',
|
||||
paddingTop: 'var(--fhc-dg-item-padding-top)',
|
||||
paddingLeft: 'var(--fhc-dg-item-padding-horizontal)',
|
||||
paddingRight: 'var(--fhc-dg-item-padding-horizontal)'
|
||||
}">
|
||||
<template v-slot="item">
|
||||
<slot v-bind="item.data" v-bind="item" :x="item.x" :y="item.y" ></slot>
|
||||
</template>
|
||||
</grid-item>
|
||||
<TransitionGroup tag="div">
|
||||
<grid-item
|
||||
v-for="item in (mode == 0 && active? placedItems_withPlaceholders : placedItems)"
|
||||
:key="item.id"
|
||||
:item="item"
|
||||
@start-move="startMove"
|
||||
@start-resize="startResize"
|
||||
@end-drag="dragCancel"
|
||||
@drop-drag="dragEnd"
|
||||
class="position-absolute"
|
||||
:active="active"
|
||||
:style="{
|
||||
top: 'calc(' + item.y + ' * var(--fhc-dg-row-height))',
|
||||
left: 'calc(' + item.x + ' * var(--fhc-dg-col-width))',
|
||||
width: 'calc(' + item.w + ' * var(--fhc-dg-col-width))',
|
||||
height: 'calc(' + item.h + ' * var(--fhc-dg-row-height))',
|
||||
paddingTop: 'var(--fhc-dg-item-padding-top)',
|
||||
paddingLeft: 'var(--fhc-dg-item-padding-horizontal)',
|
||||
paddingRight: 'var(--fhc-dg-item-padding-horizontal)'
|
||||
}">
|
||||
<template v-slot="item">
|
||||
<slot v-bind="item.data" v-bind="item" :x="item.x" :y="item.y" ></slot>
|
||||
</template>
|
||||
</grid-item>
|
||||
</TransitionGroup>
|
||||
|
||||
</div>`
|
||||
}
|
||||
|
||||
@@ -23,11 +23,15 @@ export default {
|
||||
},
|
||||
mounted() {},
|
||||
template: /*html*/ `
|
||||
|
||||
<paginator v-model:rows="page_size" @page="(data)=>$emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" ></paginator>
|
||||
<slot>
|
||||
Placeholder
|
||||
</slot>
|
||||
|
||||
<!-- Desktop -->
|
||||
<div class="d-none d-md-block">
|
||||
<paginator v-model:rows="page_size" @page="(data)=>$emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" >
|
||||
</paginator>
|
||||
</div>
|
||||
<!-- Mobile -->
|
||||
<div class="d-block d-md-none">
|
||||
<paginator v-model:rows="page_size" @page="(data)=>$emit('page',{...data, page:data.page+1})" :rows="page_size" :totalRecords="maxPageCount" :rowsPerPageOptions="[10, 20, 30]" template="FirstPageLink PrevPageLink CurrentPageReport NextPageLink LastPageLink RowsPerPageDropdown">
|
||||
</paginator>
|
||||
</div>
|
||||
`,
|
||||
};
|
||||
|
||||
@@ -71,7 +71,7 @@ export default {
|
||||
cssclass: "position-relative",
|
||||
calcheightonly: true,
|
||||
types: [
|
||||
"student",
|
||||
"studentStv",
|
||||
"prestudent"
|
||||
],
|
||||
actions: {
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
import CoreForm from '../Form/Form.js';
|
||||
import FormInput from "../Form/Input.js";
|
||||
import BsModal from '../Bootstrap/Modal.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CoreForm,
|
||||
FormInput,
|
||||
BsModal,
|
||||
},
|
||||
emits: [
|
||||
'added',
|
||||
'updated',
|
||||
'deleted',
|
||||
],
|
||||
props: {
|
||||
endpoint: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
zuordnung_typ: String,
|
||||
savepoint: {},
|
||||
values: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
confirmLimit: {
|
||||
type: Number,
|
||||
default: 20
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showList: false,
|
||||
selectedTagId: null,
|
||||
tagData: {
|
||||
beschreibung: "",
|
||||
tag_typ_kurzbz: "",
|
||||
notiz: "",
|
||||
style: "",
|
||||
zuordnung_typ: "",
|
||||
id: "",
|
||||
insertamum: "",
|
||||
insertvon: "",
|
||||
updateamum: "",
|
||||
updatevon: "",
|
||||
response: ""
|
||||
},
|
||||
mode: "create"
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.init();
|
||||
},
|
||||
mounted() {},
|
||||
methods: {
|
||||
init() {
|
||||
if (!this.endpoint)
|
||||
return;
|
||||
this.endpoint.getTags()
|
||||
.then(response => response.data)
|
||||
.then(response => {
|
||||
this.tags = response
|
||||
})
|
||||
},
|
||||
hideList() {
|
||||
this.showList = false;
|
||||
},
|
||||
async editTag(tag_id) {
|
||||
let getData = {
|
||||
'id': tag_id
|
||||
};
|
||||
|
||||
this.endpoint.getTag(getData)
|
||||
.then(result => result.data)
|
||||
.then(result => this.openModal(result))
|
||||
},
|
||||
openModal(item = null)
|
||||
{
|
||||
this.tagData.beschreibung = item.bezeichnung;
|
||||
this.tagData.tag_typ_kurzbz = item.tag_typ_kurzbz;
|
||||
this.tagData.style = item.style;
|
||||
this.tagData.zuordnung_typ = this.zuordnung_typ;
|
||||
this.tagData.done = item.done;
|
||||
this.tagData.insertamum = item.insertamum;
|
||||
this.tagData.updateamum = item.updateamum;
|
||||
this.tagData.updatevon = item.updatevon;
|
||||
this.tagData.insertvon = item.insertvon;
|
||||
|
||||
if (item && item.notiz_id)
|
||||
{
|
||||
this.selectedTagId = item.notiz_id;
|
||||
this.tagData.notiz = item.text;
|
||||
this.mode = "edit";
|
||||
}
|
||||
else
|
||||
{
|
||||
this.selectedTagId = null;
|
||||
this.tagData.notiz = "";
|
||||
this.mode = "create";
|
||||
}
|
||||
|
||||
if (this.mode === "create" && item.tag)
|
||||
this.saveTag()
|
||||
else
|
||||
this.$refs.tagModal.show();
|
||||
},
|
||||
async saveTag()
|
||||
{
|
||||
let postData = {
|
||||
tag_typ_kurzbz: this.tagData.tag_typ_kurzbz,
|
||||
notiz: this.tagData.notiz,
|
||||
zuordnung_typ: this.tagData.zuordnung_typ,
|
||||
values: this.values
|
||||
}
|
||||
|
||||
if (this.mode === "edit")
|
||||
{
|
||||
postData.id = this.selectedTagId;
|
||||
this.tagData.id = this.selectedTagId;
|
||||
this.endpoint.updateTag(postData);
|
||||
this.$emit("updated", this.tagData);
|
||||
this.$refs.tagModal.hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.$fhcAlert && postData.values.length >= this.confirmLimit)
|
||||
{
|
||||
if (await this.$fhcAlert.confirm({message: `Der Tag wird für ${postData.values.length} Einträge gesetzt. Sind Sie sicher?`}) === false)
|
||||
return;
|
||||
}
|
||||
|
||||
this.endpoint.addTag(postData)
|
||||
.then(response => response.data)
|
||||
.then(response => {
|
||||
if (typeof response === 'number') {
|
||||
this.tagData.id = response;
|
||||
} else {
|
||||
this.tagData.response = response;
|
||||
}
|
||||
})
|
||||
.then(() => {
|
||||
this.$emit("added", this.tagData);
|
||||
})
|
||||
.then(() => {
|
||||
this.$refs.tagModal.hide();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
async doneTag()
|
||||
{
|
||||
this.tagData.id = this.selectedTagId;
|
||||
this.tagData.done = !this.tagData.done;
|
||||
|
||||
let postData = {
|
||||
id: this.selectedTagId,
|
||||
done: !this.tagData.done
|
||||
}
|
||||
this.endpoint.doneTag(postData)
|
||||
this.$emit("updated", this.tagData);
|
||||
this.$refs.tagModal.hide();
|
||||
},
|
||||
async deleteTag()
|
||||
{
|
||||
let postData = {
|
||||
id: this.selectedTagId
|
||||
}
|
||||
this.endpoint.deleteTag(postData)
|
||||
this.$emit("deleted", this.selectedTagId)
|
||||
this.$refs.tagModal.hide();
|
||||
},
|
||||
reset() {
|
||||
this.tagData = {
|
||||
beschreibung: "",
|
||||
tag_typ_kurzbz: "",
|
||||
notiz: "",
|
||||
style: "",
|
||||
zuordnung_typ: "",
|
||||
id: "",
|
||||
done: false,
|
||||
insertamum: "",
|
||||
insertvon: "",
|
||||
updateamum: "",
|
||||
updatevon: "",
|
||||
response: ""
|
||||
};
|
||||
this.selectedTagId = null;
|
||||
this.mode = "create";
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="plus_button_container" @mouseleave="hideList">
|
||||
<button @mouseover="showList = true"
|
||||
:disabled="!values || values.length === 0"
|
||||
class="btn btn-sm">
|
||||
<i class="fa-solid fa-tag fa-xl"></i>
|
||||
</button>
|
||||
<ul v-if="showList" class="dropdown_list">
|
||||
<li v-for="(item, index) in tags" :key="index" @click="openModal(item)" :title="item.bezeichnung">
|
||||
{{ item.bezeichnung }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<bs-modal
|
||||
ref="tagModal"
|
||||
class="fade text-center"
|
||||
dialog-class="modal-dialog-centered"
|
||||
@hidden-bs-modal="reset"
|
||||
>
|
||||
<template #title>
|
||||
<span :class="['tag', tagData.style]">{{ tagData.beschreibung }}</span>
|
||||
</template>
|
||||
<template #default>
|
||||
<div class="col">
|
||||
<form-input
|
||||
v-model="tagData.notiz"
|
||||
type="textarea"
|
||||
field="notiz"
|
||||
placeholder="Notiz..."
|
||||
></form-input>
|
||||
<div class="modificationdate">angelegt von {{ tagData.insertvon }} am {{ tagData.insertamum }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #footer>
|
||||
<div class="d-flex justify-content-between w-100">
|
||||
<div>
|
||||
<button
|
||||
v-if="mode === 'edit'"
|
||||
class="btn btn-success me-2"
|
||||
@click="doneTag"
|
||||
>
|
||||
{{ tagData.done ? 'Rückgängig' : 'Erledigt' }}
|
||||
</button>
|
||||
<button v-if="mode === 'edit'" class="btn btn-danger" @click="deleteTag">Löschen</button>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary" @click="saveTag">
|
||||
{{ mode === "edit" ? $p.t('ui', 'bearbeiten') : $p.t('studierendenantrag', 'btn_create') }}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
</bs-modal>`,
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
export default {
|
||||
data(){
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
onEnter(el,done){
|
||||
el.style.height = '0';
|
||||
el.style.height = el.scrollHeight + 'px';
|
||||
},
|
||||
onLeave(el,done){
|
||||
el.style.height = el.scrollHeight + 'px';
|
||||
el.style.height = '0';
|
||||
}
|
||||
},
|
||||
template:
|
||||
/*html*/`
|
||||
<Transition name="height" @enter="onEnter" @leave="onLeave">
|
||||
<slot>
|
||||
</slot>
|
||||
</Transition>
|
||||
`,
|
||||
};
|
||||
@@ -20,6 +20,7 @@ import FilterConfig from './Filter/Config.js';
|
||||
import FilterColumns from './Filter/Columns.js';
|
||||
import TableDownload from './Table/Download.js';
|
||||
import collapseAutoClose from '../../directives/collapseAutoClose.js';
|
||||
import { defaultHeaderFilter } from '../../tabulator/filters/defaultHeaderFilter.js';
|
||||
|
||||
//
|
||||
const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';
|
||||
@@ -72,7 +73,8 @@ export const CoreFilterCmpt = {
|
||||
uniqueId: String,
|
||||
// TODO soll im master kommen?
|
||||
idField: String,
|
||||
parentIdField: String
|
||||
parentIdField: String,
|
||||
countOnly: Boolean
|
||||
},
|
||||
data: function() {
|
||||
return {
|
||||
@@ -206,6 +208,7 @@ export const CoreFilterCmpt = {
|
||||
movableColumns: true,
|
||||
columnDefaults:{
|
||||
tooltip: true,
|
||||
headerFilterFunc: defaultHeaderFilter,
|
||||
},
|
||||
placeholder,
|
||||
reactiveData: true,
|
||||
@@ -275,11 +278,11 @@ export const CoreFilterCmpt = {
|
||||
const cols = this.tabulator.getColumns();
|
||||
this.fields = cols.map(col => col.getField());
|
||||
this.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
updateTabulator() {
|
||||
if (this.tabulator) {
|
||||
@@ -610,7 +613,10 @@ export const CoreFilterCmpt = {
|
||||
<button v-if="reload" class="btn btn-outline-secondary" aria-label="Reload" @click="reloadTable">
|
||||
<span class="fa-solid fa-rotate-right" aria-hidden="true"></span>
|
||||
</button>
|
||||
<span v-if="$slots.actions && tabulatorHasSelector">Mit {{selectedData.length}} ausgewählten:</span>
|
||||
<span v-if="$slots.actions && tabulatorHasSelector">
|
||||
<span v-if="countOnly">{{ selectedData.length }} ausgewählt</span>
|
||||
<span v-else> Mit {{ selectedData.length }} ausgewählten:</span>
|
||||
</span>
|
||||
<slot name="actions" v-bind="{selected: tabulatorHasSelector ? selectedData : []}"></slot>
|
||||
<slot name="search"></slot>
|
||||
</div>
|
||||
|
||||
@@ -7,12 +7,10 @@ import prestudent from "./prestudent.js";
|
||||
|
||||
export default {
|
||||
props: [ "searchoptions", "searchfunction" ],
|
||||
emits: ['showSettings'],
|
||||
data: function() {
|
||||
return {
|
||||
searchtimer: null,
|
||||
hidetimer: null,
|
||||
showsettings: false,
|
||||
searchsettings: {
|
||||
searchstr: '',
|
||||
types: [],
|
||||
@@ -54,7 +52,7 @@ export default {
|
||||
<div v-else-if="searchresult.length < 1">Es wurden keine Ergebnisse gefunden.</div>
|
||||
<template v-else="" v-for="res in searchresult">
|
||||
<person v-if="res.type === 'person'" :res="res" :actions="this.searchoptions.actions.person" @actionexecuted="this.hideresult"></person>
|
||||
<student v-else-if="res.type === 'student'" :res="res" :actions="this.searchoptions.actions.student" @actionexecuted="this.hideresult"></student>
|
||||
<student v-else-if="res.type === 'student' || res.type === 'studentStv'" :res="res" :actions="this.searchoptions.actions.student" @actionexecuted="this.hideresult"></student>
|
||||
<prestudent v-else-if="res.type === 'prestudent'" :res="res" :actions="this.searchoptions.actions.prestudent" @actionexecuted="this.hideresult"></prestudent>
|
||||
<employee v-else-if="res.type === 'mitarbeiter' || res.type === 'mitarbeiter_ohne_zuordnung'" :res="res" :actions="this.searchoptions.actions.employee" @actionexecuted="this.hideresult"></employee>
|
||||
<organisationunit v-else-if="res.type === 'organisationunit'" :res="res" :actions="this.searchoptions.actions.organisationunit" @actionexecuted="this.hideresult"></organisationunit>
|
||||
@@ -65,8 +63,10 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="searchSettings" ref="settings" @[\`show.bs.collapse\`]="$emit('showSettings','settings')"
|
||||
class="top-100 end-0 searchbar_settings text-white collapse" tabindex="-1">
|
||||
<div id="searchSettings" ref="settings"
|
||||
@[\`shown.bs.collapse\`]="handleShowSettings"
|
||||
@[\`hide.bs.collapse\`]="handleHideSettings"
|
||||
class="top-100 end-0 searchbar_settings text-white collapse" tabindex="-1">
|
||||
<div class="d-flex flex-column m-3" v-if="this.searchoptions.types.length > 0">
|
||||
<span class="fw-light mb-2">Suche filtern nach:</span>
|
||||
<template v-for="(type, index) in this.searchoptions.types" :key="type">
|
||||
@@ -87,7 +87,6 @@ export default {
|
||||
},
|
||||
beforeMount: function() {
|
||||
this.updateSearchOptions();
|
||||
|
||||
},
|
||||
mounted(){
|
||||
this.settingsDropdown = new bootstrap.Collapse(this.$refs.settings, {
|
||||
@@ -102,6 +101,21 @@ export default {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
checkSettingsVisibility: function(event) {
|
||||
// hides the settings collapsible if the user clicks somewhere else
|
||||
if (!this.$refs.settings.contains(event.target))
|
||||
{
|
||||
this.settingsDropdown.hide();
|
||||
}
|
||||
},
|
||||
handleShowSettings: function() {
|
||||
// adds the event listener checkSettingsVisibility only when the collapsible is shown
|
||||
document.addEventListener("click", this.checkSettingsVisibility);
|
||||
},
|
||||
handleHideSettings: function () {
|
||||
// removes the event listener checkSettingsVisibility when the collapsible is hidden
|
||||
document.removeEventListener("click", this.checkSettingsVisibility);
|
||||
},
|
||||
updateSearchOptions: function() {
|
||||
this.searchsettings.types = [];
|
||||
for( const idx in this.searchoptions.types ) {
|
||||
|
||||
@@ -9,14 +9,14 @@ export default {
|
||||
},
|
||||
emits: [ 'actionexecuted' ],
|
||||
template: `
|
||||
<div class="searchbar_result searchbar_student">
|
||||
<div class="searchbar_result searchbar_student" :class="(!res?.aktiv) ? 'searchbar_inaktiv' : ''">
|
||||
|
||||
<div class="searchbar_grid">
|
||||
<div class="searchbar_icon">
|
||||
<action :res="this.res" :action="this.actions.defaultaction" @actionexecuted="$emit('actionexecuted')">
|
||||
<img v-if="(typeof res.foto !== 'undefined') && (res.foto !== null)"
|
||||
:src="'data:image/jpeg;base64,' + res.foto"
|
||||
class="rounded-circle" height="100"/>
|
||||
:src="studentImage"
|
||||
class="rounded" style="max-height: 120px; max-width: 90px;" />
|
||||
<i v-else class="fas fa-user-circle fa-5x"></i>
|
||||
</action>
|
||||
</div>
|
||||
@@ -29,18 +29,25 @@ export default {
|
||||
<div class="mb-3"></div>
|
||||
|
||||
<div class="searchbar_table">
|
||||
|
||||
|
||||
<div class="searchbar_tablerow">
|
||||
<div class="searchbar_tablecell">Student_uid</div>
|
||||
<div class="searchbar_tablecell">Student UID</div>
|
||||
<div class="searchbar_tablecell">
|
||||
{{ res.uid }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="searchbar_tablerow">
|
||||
<div class="searchbar_tablecell">Person_id</div>
|
||||
<div class="searchbar_tablecell">Studiengang</div>
|
||||
<div class="searchbar_tablecell">
|
||||
{{ res.person_id }}
|
||||
{{ res.studiengang }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="searchbar_tablerow">
|
||||
<div class="searchbar_tablecell">Verband</div>
|
||||
<div class="searchbar_tablecell">
|
||||
{{ res.verband }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -75,6 +82,10 @@ export default {
|
||||
computed: {
|
||||
mailtourl: function() {
|
||||
return 'mailto:' + this.res.email;
|
||||
}
|
||||
},
|
||||
studentImage: function () {
|
||||
if (!this.res.foto) return;
|
||||
return 'data:image/jpeg;base64,'.concat(this.res.foto);
|
||||
},
|
||||
}
|
||||
};
|
||||
@@ -1,6 +1,7 @@
|
||||
import FhcApi from './FhcApi.js';
|
||||
|
||||
const categories = Vue.reactive({});
|
||||
const user_language = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language);
|
||||
const loadingModules = {};
|
||||
let reload = false;
|
||||
|
||||
@@ -30,6 +31,9 @@ const phrasen = {
|
||||
categories[row.category][row.phrase] = row.text
|
||||
})
|
||||
|
||||
// update the reactive data that holds the current active user_language
|
||||
user_language.value = language;
|
||||
|
||||
return res
|
||||
})
|
||||
},
|
||||
@@ -81,6 +85,7 @@ export default {
|
||||
t: phrasen.t,
|
||||
loadCategory: cat => phrasen.loadCategory.call(app, cat),
|
||||
setLanguage: phrasen.setLanguage,
|
||||
user_language: user_language,
|
||||
t_ref: phrasen.t_ref
|
||||
};
|
||||
app.provide('$p', app.config.globalProperties.$p);
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
function parseFilterExpression(expression){
|
||||
const includeGroups = [];
|
||||
const excludeTerms = [];
|
||||
const comparisons = [];
|
||||
|
||||
const andParts = expression.split('&&').map(part => part.trim());
|
||||
|
||||
andParts.forEach(part => {
|
||||
const orTerms = part.split('||').map(p => p.trim());
|
||||
const orRegexes = [];
|
||||
|
||||
orTerms.forEach(term => {
|
||||
|
||||
const comparisonMatch = term.match(/^(<=|>=|<|>|=|!=)\s*(\d+)$/);
|
||||
|
||||
if (comparisonMatch)
|
||||
{
|
||||
const operator = comparisonMatch[1];
|
||||
const number = parseFloat(comparisonMatch[2]);
|
||||
|
||||
comparisons.push({ operator, number });
|
||||
}
|
||||
else if (term.startsWith('!'))
|
||||
{
|
||||
const excludeTerm = term.substring(1).trim().replace(/\*/g, '.*');
|
||||
excludeTerms.push(new RegExp(excludeTerm, 'i'));
|
||||
}
|
||||
else
|
||||
{
|
||||
const includeTerm = term.replace(/\*/g, '.*');
|
||||
orRegexes.push(new RegExp(includeTerm, 'i'));
|
||||
}
|
||||
});
|
||||
|
||||
if (orRegexes.length > 0)
|
||||
{
|
||||
includeGroups.push(orRegexes);
|
||||
}
|
||||
});
|
||||
|
||||
return { includeGroups, excludeTerms, comparisons };
|
||||
}
|
||||
|
||||
export function defaultHeaderFilter(headerValue, rowValue)
|
||||
{
|
||||
const { includeGroups, excludeTerms, comparisons } = parseFilterExpression(headerValue);
|
||||
|
||||
const includes = includeGroups.every(group =>
|
||||
group.some(regex => regex.test(rowValue))
|
||||
);
|
||||
|
||||
const excludes = excludeTerms.every(regex => !regex.test(rowValue));
|
||||
|
||||
const comparisonCheck = comparisons.every(({ operator, number }) => {
|
||||
let value = rowValue;
|
||||
|
||||
if (!isNaN(number))
|
||||
{
|
||||
value = parseFloat(rowValue);
|
||||
if (isNaN(value)) return false;
|
||||
}
|
||||
|
||||
switch (operator) {
|
||||
case '<':
|
||||
return value < number;
|
||||
case '>':
|
||||
return value > number;
|
||||
case '<=':
|
||||
return value <= number;
|
||||
case '>=':
|
||||
return value >= number;
|
||||
case '=':
|
||||
return value === number;
|
||||
case '!=':
|
||||
return value !== number;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
return includes && excludes && comparisonCheck;
|
||||
}
|
||||
@@ -190,6 +190,25 @@ function checkfilter($row, $filter2, $buchungstyp = null)
|
||||
: false;
|
||||
return $filtered;
|
||||
}
|
||||
else if ($filter2 === 'ueberfaelligebuchungen')
|
||||
{
|
||||
$qry = "SELECT sum(betrag) as summe
|
||||
FROM tbl_konto
|
||||
WHERE person_id=".$db->db_add_param($row->person_id, FHC_INTEGER) ."
|
||||
AND buchungsdatum < NOW()
|
||||
"
|
||||
;
|
||||
|
||||
if($kontofilterstg=='true')
|
||||
$qry.=" AND studiengang_kz=".$db->db_add_param($row->studiengang_kz);
|
||||
if($buchungstyp != null && $buchungstyp != "alle")
|
||||
$qry.=" AND buchungstyp_kurzbz=".$db->db_add_param($buchungstyp);
|
||||
|
||||
if($db->db_query($qry))
|
||||
if($row_filter = $db->db_fetch_object())
|
||||
if($row_filter->summe=='0.00' || $row_filter->summe=='' || $row_filter->summe=='0')
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
require_once('../config/vilesci.config.inc.php');
|
||||
require_once('../include/lehrveranstaltung_faktor.class.php');
|
||||
require_once('../include/lehrveranstaltung.class.php');
|
||||
require_once('../include/benutzerberechtigung.class.php');
|
||||
require_once('../include/studiensemester.class.php');
|
||||
|
||||
$uid = get_uid();
|
||||
$rechte = new benutzerberechtigung();
|
||||
$rechte->getBerechtigungen($uid);
|
||||
|
||||
if(!$rechte->isBerechtigt('basis/person', null, 'suid'))
|
||||
{
|
||||
exit('Sie haben keine Berechtigung für die Seite');
|
||||
}
|
||||
|
||||
$method = isset($_REQUEST['method']) ? $_REQUEST['method']: '' ;
|
||||
$lv_faktor = new lehrveranstaltung_faktor();
|
||||
|
||||
switch($method)
|
||||
{
|
||||
case 'addFaktor':
|
||||
$faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ;
|
||||
if ($faktor !== '')
|
||||
{
|
||||
if (!isRightType($faktor['lv_id']))
|
||||
{
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Nur LVs und Templates möglich'
|
||||
]);
|
||||
break;
|
||||
}
|
||||
if (vonHigherThanBis($faktor['von'], $faktor['bis']))
|
||||
{
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Von nach Bis'
|
||||
]);
|
||||
break;
|
||||
}
|
||||
if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis']))
|
||||
{
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Für den Zeitraum bereits vorhanden'
|
||||
]);
|
||||
break;
|
||||
}
|
||||
|
||||
$result = $lv_faktor->addFaktor($faktor['lv_id'], $faktor['faktor'], $faktor['von'], $faktor['bis']);
|
||||
echo json_encode($result);
|
||||
}
|
||||
break;
|
||||
case 'updateFaktor':
|
||||
$faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ;
|
||||
if ($faktor !== '')
|
||||
{
|
||||
if (vonHigherThanBis($faktor['von'], $faktor['bis']))
|
||||
{
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Von nach Bis'
|
||||
]);
|
||||
break;
|
||||
}
|
||||
if (exists($faktor['lv_id'], $faktor['von'], $faktor['bis'], $faktor['id']))
|
||||
{
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Für den Zeitraum bereits vorhanden'
|
||||
]);
|
||||
break;
|
||||
}
|
||||
|
||||
$result = $lv_faktor->updateFaktor($faktor['id'], $faktor['faktor'], $faktor['von'], $faktor['bis']);
|
||||
echo json_encode($result);
|
||||
}
|
||||
break;
|
||||
case 'deleteFaktor':
|
||||
$faktor = isset($_REQUEST['faktor']) ? $_REQUEST['faktor']: '' ;
|
||||
if ($faktor !== '')
|
||||
{
|
||||
$result = $lv_faktor->deleteFaktor($faktor['id']);
|
||||
echo json_encode($result);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
function isRightType($lv_id)
|
||||
{
|
||||
$lv = new lehrveranstaltung($lv_id);
|
||||
if (in_array($lv->lehrtyp_kurzbz, array('lv', 'tpl')))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function exists($lv_id, $von, $bis, $id = null)
|
||||
{
|
||||
$lv_faktor = new lehrveranstaltung_faktor();
|
||||
$lv_faktor->loadByLV($lv_id, $von, $bis, $id);
|
||||
return !empty($lv_faktor->lv_faktoren);
|
||||
}
|
||||
|
||||
function vonHigherThanBis($von, $bis)
|
||||
{
|
||||
$vonStsem = new studiensemester($von);
|
||||
$bisStsem = new studiensemester($bis);
|
||||
|
||||
if (is_null($bis) || $bis === "")
|
||||
return false;
|
||||
if ($vonStsem->start > $bisStsem->start)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
+17
-5
@@ -27,8 +27,6 @@ require_once('dbupdate_3.4/example.php');
|
||||
require_once('dbupdate_3.4/example2.php');
|
||||
...
|
||||
*/
|
||||
require_once('dbupdate_3.4/25003_notenimport_nachpruefung.php');
|
||||
|
||||
require_once('dbupdate_3.4/dbupdate_dashboard.php');
|
||||
require_once('dbupdate_3.4/26173_index_webservicelog.php');
|
||||
require_once('dbupdate_3.4/24682_reihungstest_zugangscode_fuer_login.php');
|
||||
@@ -66,6 +64,10 @@ require_once('dbupdate_3.4/44031_stv_favorites.php');
|
||||
require_once('dbupdate_3.4/40896_kennzeichnung_unruly_person.php');
|
||||
require_once('dbupdate_3.4/39911_tabulator_in_contentmittitel.php');
|
||||
require_once('dbupdate_3.4/25999_C4_permission.php');
|
||||
require_once('dbupdate_3.4/33683_digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp.php');
|
||||
require_once('dbupdate_3.4/40717_lv_faktor.php');
|
||||
require_once('dbupdate_3.4/48526_pep_tagging.php');
|
||||
|
||||
|
||||
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
||||
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
||||
@@ -158,7 +160,7 @@ $tabellen=array(
|
||||
"campus.tbl_studierendenantrag_statustyp"=> array("studierendenantrag_statustyp_kurzbz","bezeichnung"),
|
||||
"campus.tbl_studentbeispiel" => array("student_uid","beispiel_id","vorbereitet","probleme","updateamum","updatevon","insertamum","insertvon"),
|
||||
"campus.tbl_studentuebung" => array("student_uid","mitarbeiter_uid","abgabe_id","uebung_id","note","mitarbeitspunkte","punkte","anmerkung","benotungsdatum","updateamum","updatevon","insertamum","insertvon"),
|
||||
"campus.tbl_template" => array("template_kurzbz","bezeichnung","xsd","xslt_xhtml","xslfo_pdf"),
|
||||
"campus.tbl_template" => array("template_kurzbz","bezeichnung","xsd","xslt_xhtml","xslfo_pdf","xslt_xhtml_c4"),
|
||||
"campus.tbl_uebung" => array("uebung_id","gewicht","punkte","angabedatei","freigabevon","freigabebis","abgabe","beispiele","statistik","bezeichnung","positiv","defaultbemerkung","lehreinheit_id","maxstd","maxbsp","liste_id","prozent","nummer","updateamum","updatevon","insertamum","insertvon"),
|
||||
"campus.tbl_veranstaltung" => array("veranstaltung_id","titel","beschreibung","veranstaltungskategorie_kurzbz","inhalt","start","ende","freigabevon","freigabeamum","updateamum","updatevon","insertamum","insertvon"),
|
||||
"campus.tbl_veranstaltungskategorie" => array("veranstaltungskategorie_kurzbz","bezeichnung","bild","farbe"),
|
||||
@@ -168,6 +170,11 @@ $tabellen=array(
|
||||
"campus.tbl_zeitsperretyp" => array("zeitsperretyp_kurzbz","beschreibung","farbe"),
|
||||
"campus.tbl_zeitwunsch" => array("stunde","mitarbeiter_uid","tag","gewicht","updateamum","updatevon","insertamum","insertvon", "zeitwunsch_id", "zeitwunsch_gueltigkeit_id"),
|
||||
"campus.tbl_zeitwunsch_gueltigkeit" => array("zeitwunsch_gueltigkeit_id","mitarbeiter_uid","von","bis","insertamum","insertvon", "updateamum","updatevon"),
|
||||
"dashboard.tbl_dashboard" => array("dashboard_id", "dashboard_kurzbz", "beschreibung"),
|
||||
"dashboard.tbl_dashboard_benutzer_override" => array("override_id","dashboard_id","uid","override"),
|
||||
"dashboard.tbl_dashboard_preset" => array("preset_id","dashboard_id","funktion_kurzbz","preset"),
|
||||
"dashboard.tbl_dashboard_widget" => array("dashboard_id","widget_id"),
|
||||
"dashboard.tbl_widget" => array("widget_id","widget_kurzbz","beschreibung","arguments","setup"),
|
||||
"fue.tbl_aktivitaet" => array("aktivitaet_kurzbz","beschreibung","sort"),
|
||||
"fue.tbl_aufwandstyp" => array("aufwandstyp_kurzbz","bezeichnung"),
|
||||
"fue.tbl_projekt" => array("projekt_kurzbz","nummer","titel","beschreibung","beginn","ende","oe_kurzbz","budget","farbe","aufwandstyp_kurzbz","ressource_id","anzahl_ma","aufwand_pt","projekt_id","projekttyp_kurzbz","zeitaufzeichnung"),
|
||||
@@ -256,6 +263,7 @@ $tabellen=array(
|
||||
"lehre.tbl_zeitfenster" => array("wochentag","stunde","ort_kurzbz","studiengang_kz","gewicht"),
|
||||
"lehre.tbl_zeugnis" => array("zeugnis_id","student_uid","zeugnis","erstelltam","gedruckt","titel","bezeichnung","updateamum","updatevon","insertamum","insertvon","ext_id"),
|
||||
"lehre.tbl_zeugnisnote" => array("lehrveranstaltung_id","student_uid","studiensemester_kurzbz","note","uebernahmedatum","benotungsdatum","bemerkung","updateamum","updatevon","insertamum","insertvon","ext_id","punkte"),
|
||||
"lehre.tbl_lehrveranstaltung_faktor" => array("lehrveranstaltung_faktor_id", "lehrveranstaltung_id","faktor","studiensemester_kurzbz_von","studiensemester_kurzbz_bis","insertamum","insertvon","updateamum","updatevon"),
|
||||
"public.ci_apikey" => array("apikey_id","key","level","ignore_limits","date_created"),
|
||||
"public.tbl_adresse" => array("adresse_id","person_id","name","strasse","plz","ort","gemeinde","nation","typ","heimatadresse","zustelladresse","firma_id","updateamum","updatevon","insertamum","insertvon","ext_id","rechnungsadresse","anmerkung", "co_name"),
|
||||
"public.tbl_adressentyp" => array("adressentyp_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig", "sort"),
|
||||
@@ -302,9 +310,10 @@ $tabellen=array(
|
||||
"public.tbl_msg_message" => array("message_id","person_id","subject","body","priority","relationmessage_id","oe_kurzbz","insertamum","insertvon"),
|
||||
"public.tbl_msg_recipient" => array("message_id","person_id","token","sent","sentinfo","insertamum","insertvon","oe_kurzbz"),
|
||||
"public.tbl_msg_status" => array("message_id","person_id","status","statusinfo","insertamum","insertvon","updateamum","updatevon"),
|
||||
"public.tbl_notiz" => array("notiz_id","titel","text","verfasser_uid","bearbeiter_uid","start","ende","erledigt","insertamum","insertvon","updateamum","updatevon","ext_id"),
|
||||
"public.tbl_notiz" => array("notiz_id","titel","text","verfasser_uid","bearbeiter_uid","start","ende","erledigt","insertamum","insertvon","updateamum","updatevon","ext_id", "typ"),
|
||||
"public.tbl_notizzuordnung" => array("notizzuordnung_id","notiz_id","projekt_kurzbz","projektphase_id","projekttask_id","uid","person_id","prestudent_id","bestellung_id","lehreinheit_id","ext_id","anrechnung_id"),
|
||||
"public.tbl_notiz_dokument" => array("notiz_id","dms_id"),
|
||||
"public.tbl_notiz_typ" => array("typ_kurzbz","bezeichnung_mehrsprachig", "beschreibung", "automatisiert", "aktiv", "zuordnung", "tag", "style", "vorrueckung", "prioritaet"),
|
||||
"public.tbl_ort" => array("ort_kurzbz","bezeichnung","planbezeichnung","max_person","lehre","reservieren","aktiv","lageplan","dislozierung","kosten","ausstattung","updateamum","updatevon","insertamum","insertvon","ext_id","stockwerk","standort_id","telefonklappe","content_id","m2","gebteil","oe_kurzbz","arbeitsplaetze"),
|
||||
"public.tbl_ortraumtyp" => array("ort_kurzbz","hierarchie","raumtyp_kurzbz"),
|
||||
"public.tbl_organisationseinheit" => array("oe_kurzbz", "oe_parent_kurzbz", "bezeichnung","organisationseinheittyp_kurzbz", "aktiv","mailverteiler","freigabegrenze","kurzzeichen","lehre","standort","warn_semesterstunden_frei","warn_semesterstunden_fix","standort_id"),
|
||||
@@ -323,7 +332,10 @@ $tabellen=array(
|
||||
"public.tbl_preoutgoing_status" => array("preoutgoing_status_kurzbz","bezeichnung"),
|
||||
"public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt"),
|
||||
"public.tbl_prestudentstatus" => array("prestudent_id","status_kurzbz","studiensemester_kurzbz","ausbildungssemester","datum","orgform_kurzbz","insertamum","insertvon","updateamum","updatevon","ext_id","studienplan_id","bestaetigtam","bestaetigtvon","fgm","faktiv", "anmerkung","bewerbung_abgeschicktamum","rt_stufe","statusgrund_id"),
|
||||
"public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten"),
|
||||
"public.tbl_profil_update" => array("profil_update_id","uid","topic","requested_change","updateamum","updatevon","insertamum","insertvon","status","status_timestamp","status_message","attachment_id"),
|
||||
"public.tbl_profil_update_status" => array("status_kurzbz","beschreibung","bezeichnung_mehrsprachig"),
|
||||
"public.tbl_profil_update_topic" => array("topic_kurzbz","beschreibung","bezeichnung_mehrsprachig"),
|
||||
"public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten","aktiv"),
|
||||
"public.tbl_reihungstest" => array("reihungstest_id","studiengang_kz","ort_kurzbz","anmerkung","datum","uhrzeit","updateamum","updatevon","insertamum","insertvon","ext_id","freigeschaltet","max_teilnehmer","oeffentlich","studiensemester_kurzbz","aufnahmegruppe_kurzbz","stufe","anmeldefrist","zugangs_ueberpruefung","zugangscode"),
|
||||
"public.tbl_rueckstellung" => array("rueckstellung_id","person_id","status_kurzbz","datum_bis","insertamum","insertvon"),
|
||||
"public.tbl_rueckstellung_status" => array("status_kurzbz", "bezeichnung_mehrsprachig", "sort", "aktiv"),
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||
if (!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_lehrveranstaltung_faktor LIMIT 1"))
|
||||
{
|
||||
$qry = "
|
||||
|
||||
CREATE TABLE lehre.tbl_lehrveranstaltung_faktor
|
||||
(
|
||||
lehrveranstaltung_faktor_id integer NOT NULL,
|
||||
lehrveranstaltung_id integer NOT NULL,
|
||||
faktor numeric NOT NULL,
|
||||
studiensemester_kurzbz_von varchar(16) NOT NULL,
|
||||
studiensemester_kurzbz_bis varchar(16),
|
||||
insertamum timestamp DEFAULT NOW(),
|
||||
insertvon varchar(32),
|
||||
updateamum timestamp,
|
||||
updatevon varchar(32),
|
||||
CONSTRAINT tbl_lehrveranstaltung_faktor_pk PRIMARY KEY (lehrveranstaltung_faktor_id)
|
||||
);
|
||||
|
||||
CREATE SEQUENCE lehre.lehrveranstaltung_faktor_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MAXVALUE
|
||||
NO MINVALUE
|
||||
CACHE 1;
|
||||
|
||||
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ALTER COLUMN lehrveranstaltung_faktor_id SET DEFAULT nextval('lehre.lehrveranstaltung_faktor_id_seq');
|
||||
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_lehrveranstaltung_id FOREIGN KEY (lehrveranstaltung_id) REFERENCES lehre.tbl_lehrveranstaltung (lehrveranstaltung_id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_studiensemester_von FOREIGN KEY (studiensemester_kurzbz_von) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
ALTER TABLE lehre.tbl_lehrveranstaltung_faktor ADD CONSTRAINT fk_lehrveranstaltung_faktor_studiensemester_bis FOREIGN KEY (studiensemester_kurzbz_bis) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
|
||||
|
||||
GRANT SELECT ON lehre.tbl_lehrveranstaltung_faktor TO web;
|
||||
GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_lehrveranstaltung_faktor TO vilesci;
|
||||
GRANT SELECT ON lehre.lehrveranstaltung_faktor_id_seq TO web;
|
||||
GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.lehrveranstaltung_faktor_id_seq TO vilesci;
|
||||
";
|
||||
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_lehrveranstaltung_faktor: ' . $db->db_last_error() . '</strong><br>';
|
||||
else
|
||||
echo 'Tabelle: lehre.tbl_lehrveranstaltung_faktor erstellt!';
|
||||
|
||||
//TODO ggf default wert in eine config
|
||||
$qry = "
|
||||
INSERT INTO lehre.tbl_lehrveranstaltung_faktor
|
||||
(lehrveranstaltung_id, faktor, studiensemester_kurzbz_von, insertvon)
|
||||
(
|
||||
SELECT lehrveranstaltung_id,
|
||||
2,
|
||||
(
|
||||
SELECT public.tbl_studiensemester.studiensemester_kurzbz
|
||||
FROM public.tbl_studiensemester
|
||||
ORDER BY start LIMIT 1
|
||||
),
|
||||
'checksystem'
|
||||
FROM lehre.tbl_lehrveranstaltung
|
||||
WHERE lehrtyp_kurzbz IN ('lv', 'tpl')
|
||||
);
|
||||
";
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>lehre.tbl_lehrveranstaltung_faktor: ' . $db->db_last_error() . '</strong><br>';
|
||||
else
|
||||
echo 'Tabelle: lehre.tbl_lehrveranstaltung_faktor befüllt!';
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||
|
||||
// add app pep
|
||||
if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app='pep'"))
|
||||
{
|
||||
if($db->db_num_rows($result) === 0)
|
||||
{
|
||||
$qry = "INSERT INTO system.tbl_app (app) VALUES('pep');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>System Tabelle app: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>app pep hinzugefuegt<br>';
|
||||
}
|
||||
}
|
||||
|
||||
// Creates table public.tbl_notiz_typ if it doesn't exist and grants privileges
|
||||
if (!$result = @$db->db_query('SELECT 0 FROM public.tbl_notiz_typ WHERE 0 = 1'))
|
||||
{
|
||||
//TODO zuordnung typ definieren
|
||||
$qry = 'CREATE TABLE public.tbl_notiz_typ (
|
||||
typ_kurzbz varchar(32) NOT NULL,
|
||||
bezeichnung_mehrsprachig character varying(256)[] NOT NULL,
|
||||
beschreibung text,
|
||||
automatisiert boolean NOT NULL,
|
||||
aktiv boolean NOT NULL,
|
||||
zuordnung text,
|
||||
tag boolean NOT NULL,
|
||||
style text,
|
||||
vorrueckung boolean NOT NULL,
|
||||
prioritaet smallint
|
||||
);
|
||||
|
||||
ALTER TABLE public.tbl_notiz_typ ADD CONSTRAINT pk_tbl_tbl_notiz_typ PRIMARY KEY (typ_kurzbz)';
|
||||
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>public.tbl_notiz_typ: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>public.tbl_notiz_typ table created';
|
||||
|
||||
$qry = 'GRANT SELECT ON TABLE public.tbl_notiz_typ TO web;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>public.tbl_notiz_typ: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>Granted privileges to <strong>web</strong> on public.tbl_notiz_typ';
|
||||
|
||||
$qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE public.tbl_notiz_typ TO vilesci;';
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>public.tbl_notiz_typ: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>Granted privileges to <strong>vilesci</strong> on public.tbl_notiz_typ';
|
||||
}
|
||||
|
||||
if(!@$db->db_query("SELECT typ FROM public.tbl_notiz LIMIT 1"))
|
||||
{
|
||||
$qry = 'ALTER TABLE public.tbl_notiz ADD COLUMN typ varchar(32);
|
||||
ALTER TABLE public.tbl_notiz ADD CONSTRAINT tbl_notiz_typ_fkey FOREIGN KEY (typ) REFERENCES public.tbl_notiz_typ (typ_kurzbz) ON DELETE RESTRICT ON UPDATE CASCADE;';
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong> public.tbl_notiz '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>public.tbl_notiz: Neue Spalte typ hinzugefügt';
|
||||
}
|
||||
@@ -15105,6 +15105,26 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'felderFehlen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Bitte füllen Sie alle Formularfelder aus",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Please fill in all form fields",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
@@ -37479,8 +37499,67 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
|
||||
// FHC4 Phrases Abschlusspruefung End
|
||||
// FHC4 Phrases Abschlusspruefung End
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'gruppenmanagement',
|
||||
'phrase' => 'nichtZumEditierenDerGruppeBerechtigt',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Nicht zum Editieren der Gruppe berechtigt",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "No authorization for editing the group",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'pep',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'maprojohneoe',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Mitarbeiter und Projekt sind der Organisationseinheit nicht zugeordnet.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Employee and project are not assigned to the organizational unit.',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'pep',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'infoandepl/kfl',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Info an DepL/KFL',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Info to DepL/KFL:',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ require_once('../../include/organisationsform.class.php');
|
||||
require_once('../../include/addon.class.php');
|
||||
require_once('../../include/sprache.class.php');
|
||||
require_once('../../include/lehrmodus.class.php');
|
||||
require_once('../../include/lehrveranstaltung_faktor.class.php');
|
||||
|
||||
if (!$db = new basis_db())
|
||||
die('Es konnte keine Verbindung zum Server aufgebaut werden.');
|
||||
@@ -1108,7 +1109,8 @@ if ($result_lv!=0)
|
||||
{
|
||||
echo "<th>LV-Angebot</th>
|
||||
<th>kompatible LV</th>
|
||||
<th>Aktion</th>";
|
||||
<th>Aktion</th>
|
||||
<th>Faktor</th>";
|
||||
}
|
||||
|
||||
echo "</tr></thead>";
|
||||
@@ -1326,7 +1328,20 @@ if ($result_lv!=0)
|
||||
</td>';
|
||||
|
||||
echo '<td><a href="lehrveranstaltung_kompatibel.php?lehrveranstaltung_id='.$row->lehrveranstaltung_id.'&type=edit" target="lv_detail">Kompatible LV</a></td>';
|
||||
echo '<td><a href="'.$_SERVER['PHP_SELF'].'?delete_lvid='.$row->lehrveranstaltung_id.'&stg_kz='.$stg_kz.'&semester='.$semester.'&fachbereich_kurzbz='.$oe_fachbereich.'&isaktiv='.$isaktiv.'&oe_kurzbz='.$oe_kurzbz.'&orgform='.$orgform_kurzbz.'" onclick="return conf_del()">löschen</a></td>';
|
||||
echo '<td>
|
||||
<a href="'.$_SERVER['PHP_SELF'].'?delete_lvid='.$row->lehrveranstaltung_id.'&stg_kz='.$stg_kz.'&semester='.$semester.'&fachbereich_kurzbz='.$oe_fachbereich.'&isaktiv='.$isaktiv.'&oe_kurzbz='.$oe_kurzbz.'&orgform='.$orgform_kurzbz.'" onclick="return conf_del()">löschen</a>
|
||||
';
|
||||
|
||||
if (in_array($row->lehrtyp_kurzbz, array("tpl", "lv")))
|
||||
echo '<br /><a href="lehrveranstaltung_faktor.php?lehrveranstaltung_id='.$db->convert_html_chars($row->lehrveranstaltung_id).'" target="lv_detail">Faktor</a>';
|
||||
echo '</td>';
|
||||
echo '
|
||||
<td nowrap>';
|
||||
|
||||
$lv_faktor = new lehrveranstaltung_faktor();
|
||||
$lv_faktor->getAkt($row->lehrveranstaltung_id);
|
||||
|
||||
echo $lv_faktor->faktor.'</td>';
|
||||
echo "</tr>\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
require_once('../../include/lehrmodus.class.php');
|
||||
require_once('../../include/benutzerberechtigung.class.php');
|
||||
require_once('../../include/studienplan.class.php');
|
||||
require_once('../../include/lehrveranstaltung_faktor.class.php');
|
||||
require_once('../../include/studiensemester.class.php');
|
||||
|
||||
if (!$db = new basis_db())
|
||||
die('Es konnte keine Verbindung zum Server aufgebaut werden.');
|
||||
@@ -139,6 +141,31 @@
|
||||
$reloadstr .= " window.location.href='".$_SERVER['PHP_SELF']."?stg_kz=$lv->studiengang_kz&semester=$lv->semester&neu=true';";
|
||||
}
|
||||
$reloadstr .= "</script>\n";
|
||||
|
||||
if (in_array($lv->lehrtyp_kurzbz, array('tpl', 'lv')) && $lv->new === true)
|
||||
{
|
||||
$lv_faktor = new lehrveranstaltung_faktor();
|
||||
$studiensemester = new studiensemester();
|
||||
$studiensemester_von = $studiensemester->getLastOrAktSemester();
|
||||
if ($lv->lehrtyp_kurzbz === 'lv' && $_POST['lehrveranstaltung_template_id'] !== '')
|
||||
{
|
||||
|
||||
$lv_faktor->getAkt($_POST['lehrveranstaltung_template_id']);
|
||||
//TODO Faktor in eine Config
|
||||
if (is_null($lv_faktor->faktor))
|
||||
$lv_faktor->addFaktor($lv->lehrveranstaltung_id, 2, $studiensemester_von);
|
||||
else
|
||||
$lv_faktor->addFaktor($lv->lehrveranstaltung_id, $lv_faktor->faktor, $studiensemester_von);
|
||||
}
|
||||
else
|
||||
{
|
||||
$lv_faktor->loadByLV($lv->lehrveranstaltung_id);
|
||||
if (empty($lv_faktor->lv_faktoren))
|
||||
{
|
||||
$lv_faktor->addFaktor($lv->lehrveranstaltung_id, 2, $studiensemester_von);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,309 @@
|
||||
<?php
|
||||
|
||||
require_once('../../config/vilesci.config.inc.php');
|
||||
require_once('../../include/benutzerberechtigung.class.php');
|
||||
require_once('../../include/phrasen.class.php');
|
||||
require_once('../../include/lehrveranstaltung.class.php');
|
||||
require_once('../../include/lehrveranstaltung_faktor.class.php');
|
||||
require_once('../../include/studiensemester.class.php');
|
||||
|
||||
$uid = get_uid();
|
||||
$rechte = new benutzerberechtigung();
|
||||
$rechte->getBerechtigungen($uid);
|
||||
|
||||
$sprache = getSprache();
|
||||
$p = new phrasen($sprache);
|
||||
|
||||
if(!$rechte->isBerechtigt('lehre/lehrveranstaltung', null, 'suid'))
|
||||
die('Sie haben keine Berechtigung für diese Seite');
|
||||
|
||||
echo '<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link rel="stylesheet" href="../../skin/fhcomplete.css" type="text/css">
|
||||
<link rel="stylesheet" href="../../skin/vilesci.css" type="text/css">
|
||||
<link rel="stylesheet" href="../../skin/jquery.css" type="text/css"/>
|
||||
<script type="text/javascript" src="../../vendor/jquery/jquery1/jquery-1.12.4.min.js"></script>
|
||||
<script type="text/javascript" src="../../vendor/christianbach/tablesorter/jquery.tablesorter.min.js"></script>
|
||||
<script type="text/javascript" src="../../vendor/components/jqueryui/jquery-ui.min.js"></script>
|
||||
<script type="text/javascript" src="../../include/js/jquery.ui.datepicker.translation.js"></script>
|
||||
<link rel="stylesheet" href="../../skin/tablesort.css" type="text/css"/>
|
||||
';
|
||||
?>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
|
||||
$('#faktorTable').on('click', '.edit', function() {
|
||||
var row = $(this).closest('tr');
|
||||
var id = row.data('id');
|
||||
var faktor = row.find('.faktor').text();
|
||||
var von = row.find('.von').text();
|
||||
var bis = row.find('.bis').text();
|
||||
|
||||
$('#action').val('edit');
|
||||
$('#id').val(id);
|
||||
$('#faktor').val(faktor);
|
||||
$('#von').val(von);
|
||||
$('#bis').val(bis);
|
||||
});
|
||||
|
||||
$('#faktorTable').on('click', '.delete', function() {
|
||||
var id = $(this).closest('tr').data('id');
|
||||
|
||||
var formData = {
|
||||
id: id
|
||||
}
|
||||
deleteFaktor(formData);
|
||||
});
|
||||
|
||||
$('#faktorForm').on('submit', function(event) {
|
||||
event.preventDefault();
|
||||
var action = $('#action').val();
|
||||
var id = $('#id').val();
|
||||
|
||||
var faktor = $('#faktor').val();
|
||||
var von = $('#von').val();
|
||||
var bis = $('#bis').val();
|
||||
var lv_id = $('#lv_id').val();
|
||||
|
||||
var formData = {
|
||||
faktor: faktor,
|
||||
von: von,
|
||||
bis: bis,
|
||||
lv_id: lv_id
|
||||
};
|
||||
|
||||
if(action === 'add')
|
||||
{
|
||||
addFaktor(formData);
|
||||
}
|
||||
else
|
||||
{
|
||||
formData.id = id;
|
||||
updateFaktor(formData);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function addFaktor(formData)
|
||||
{
|
||||
$.ajax({
|
||||
dataType: "json",
|
||||
type: 'POST',
|
||||
url: "../../soap/lehrveranstaltung_faktor.json.php",
|
||||
data: {
|
||||
method: 'addFaktor',
|
||||
faktor: formData
|
||||
},
|
||||
success: function(data)
|
||||
{
|
||||
if (data.status === 'error')
|
||||
return alert(data.message);
|
||||
else
|
||||
{
|
||||
addRow(data);
|
||||
handleResponse('save')
|
||||
sortTable();
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error)
|
||||
{
|
||||
alert('Fehler beim Laden der Daten');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateFaktor(formData)
|
||||
{
|
||||
$.ajax({
|
||||
dataType: "json",
|
||||
type: 'POST',
|
||||
url: "../../soap/lehrveranstaltung_faktor.json.php",
|
||||
data: {
|
||||
method: 'updateFaktor',
|
||||
faktor: formData
|
||||
},
|
||||
success: function(data)
|
||||
{
|
||||
if (data.status === 'error')
|
||||
return alert(data.message);
|
||||
else
|
||||
{
|
||||
var row = $('#faktorTable tbody tr[data-id="' + formData.id + '"]');
|
||||
row.find('.faktor').text(formData.faktor);
|
||||
row.find('.von').text(formData.von);
|
||||
row.find('.bis').text(formData.bis);
|
||||
|
||||
handleResponse('save');
|
||||
sortTable();
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error)
|
||||
{
|
||||
alert('Fehler beim Laden der Daten');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function deleteFaktor(formData)
|
||||
{
|
||||
$.ajax({
|
||||
dataType: "json",
|
||||
type: 'POST',
|
||||
url: "../../soap/lehrveranstaltung_faktor.json.php",
|
||||
data: {
|
||||
method: 'deleteFaktor',
|
||||
faktor: formData
|
||||
},
|
||||
success: function (data) {
|
||||
if (data.status === 'error')
|
||||
return alert(data.message);
|
||||
else
|
||||
{
|
||||
var row = $('#faktorTable tbody tr[data-id="' + formData.id + '"]');
|
||||
row.remove();
|
||||
$("#faktorTable").trigger("update").trigger("applyWidgets");
|
||||
handleResponse('delete');
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
alert('Fehler beim Laden der Daten');
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function addRow(faktor)
|
||||
{
|
||||
var tr = $('<tr>')
|
||||
.attr('data-id', faktor.id);
|
||||
|
||||
var editButton = $('<button>')
|
||||
.text('Bearbeiten')
|
||||
.addClass('edit')
|
||||
|
||||
var deleteButton = $('<button>')
|
||||
.text('Loeschen')
|
||||
.addClass('delete')
|
||||
|
||||
var row = tr
|
||||
.append(
|
||||
$('<td>').text(faktor.faktor).addClass('faktor'),
|
||||
$('<td>').text(faktor.von).addClass('von'),
|
||||
$('<td>').text(faktor.bis).addClass('bis'),
|
||||
$('<td>').append(editButton).addClass('edit'),
|
||||
$('<td>').append(deleteButton).addClass('delete')
|
||||
);
|
||||
|
||||
$('#faktorTable tbody').append(row);
|
||||
}
|
||||
|
||||
function handleResponse(type)
|
||||
{
|
||||
$('#faktorForm')[0].reset();
|
||||
$('#action').val('add');
|
||||
$('#id').val('');
|
||||
|
||||
let successMessage = document.getElementById('success_message_' + type);
|
||||
successMessage.style.display = 'block';
|
||||
setTimeout(() => successMessage.style.display = 'none', 1000);
|
||||
}
|
||||
|
||||
function sortTable()
|
||||
{
|
||||
if ($("#faktorTable tbody tr").length > 0)
|
||||
{
|
||||
$("#faktorTable").tablesorter({
|
||||
sortList: [[1,1], [0,0], [2,0]],
|
||||
widgets: ["zebra"]
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<?php
|
||||
|
||||
$lehrveranstaltung_id = $_GET["lehrveranstaltung_id"];
|
||||
$lv = new lehrveranstaltung();
|
||||
$lv->load($lehrveranstaltung_id);
|
||||
|
||||
$faktor = new lehrveranstaltung_faktor();
|
||||
$faktor->loadByLV($lv->lehrveranstaltung_id);
|
||||
|
||||
$studiensemester = new studiensemester();
|
||||
$studiensemester->getAll('desc');
|
||||
|
||||
|
||||
echo '
|
||||
</head>
|
||||
<body class="Background_main">
|
||||
<h2>Faktor - '. $lv->bezeichnung . ' - ' . $lv->lehrveranstaltung_id . '</h2>';
|
||||
|
||||
echo '
|
||||
<form id="faktorForm">
|
||||
<input type="hidden" id="action" value="add" />
|
||||
<input type="hidden" id="id"/>
|
||||
<input type="hidden" id="lv_id" value="'. $lv->lehrveranstaltung_id .'"/>
|
||||
<label for="faktor">Faktor</label>
|
||||
<input type="number" id="faktor" name="faktor" required />
|
||||
<label for="von">Von</label>
|
||||
<select id="von" name="von" required>
|
||||
<option value="">---keine Auswahl---</option>';
|
||||
|
||||
foreach ($studiensemester->studiensemester as $sem)
|
||||
{
|
||||
echo '<option value="'.$sem->studiensemester_kurzbz.'">'.$sem->studiensemester_kurzbz.'</option>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</select>
|
||||
<label for="bis">Bis</label>
|
||||
<select id="bis" name="bis">
|
||||
<option value="">---keine Auswahl---</option>';
|
||||
|
||||
foreach ($studiensemester->studiensemester as $sem)
|
||||
{
|
||||
echo '<option value="'.$sem->studiensemester_kurzbz.'">'.$sem->studiensemester_kurzbz.'</option>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</select>
|
||||
<button type="submit">'.$p->t('global/speichern').'</button>
|
||||
<span id="success_message_save" class="alert alert-success" style="display:none;">'. $p->t('global/erfolgreichgespeichert') . '</span>
|
||||
<span id="success_message_delete" class="alert alert-success" style="display:none;">'. $p->t('global/erfolgreichgelöscht') . '</span>
|
||||
</form>
|
||||
|
||||
<table class="tablesorter" id="faktorTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>'.$p->t('lv/faktor').'</th>
|
||||
<th>'.$p->t('global/von').'</th>
|
||||
<th>'.$p->t('global/bis').'</th>
|
||||
<th>'.$p->t('global/bearbeiten').'</th>
|
||||
<th>'.$p->t('global/loeschen').'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
';
|
||||
|
||||
if(count($faktor->lv_faktoren) > 0)
|
||||
{
|
||||
foreach($faktor->lv_faktoren as $lv_faktor)
|
||||
{
|
||||
echo "<tr data-id=". $lv_faktor->lehrveranstaltung_faktor_id .">
|
||||
<td class='faktor'>".$lv_faktor->faktor."</td>
|
||||
<td class='von'>".$lv_faktor->studiensemester_kurzbz_von."</td>
|
||||
<td class='bis'>".$lv_faktor->studiensemester_kurzbz_bis."</td>
|
||||
<td><button class='edit'>".$p->t('global/bearbeiten')."</button></td>
|
||||
<td><button class='delete'>".$p->t('global/loeschen')."</button></td>
|
||||
</tr>"
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
'</tbody>
|
||||
</table>
|
||||
';
|
||||
|
||||
?>
|
||||
|
||||
|
||||
@@ -23,12 +23,12 @@ require_once("../../config/vilesci.config.inc.php");
|
||||
require_once("../../include/functions.inc.php");
|
||||
require_once("../../include/benutzerberechtigung.class.php");
|
||||
require_once("../../include/datum.class.php");
|
||||
|
||||
require_once("../../include/studiengang.class.php");
|
||||
require_once("../../include/studiensemester.class.php");
|
||||
require_once("../../include/studienjahr.class.php");
|
||||
require_once("../../include/student.class.php");
|
||||
require_once("../../include/konto.class.php");
|
||||
require_once("../../include/bankverbindung.class.php");
|
||||
|
||||
// Get the uid of the logged user
|
||||
$user = get_uid();
|
||||
@@ -71,7 +71,7 @@ $fileTmpName = null;
|
||||
$fileMimeType = null;
|
||||
|
||||
// Constants
|
||||
$L_CSV_N_COLS = 6; // Number of columns of the CSV file
|
||||
$L_CSV_N_COLS = 10; // Number of columns of the CSV file
|
||||
$L_ERROR = "Error";
|
||||
$L_WARNING = "Warning";
|
||||
$L_INFO = "Info";
|
||||
@@ -246,15 +246,19 @@ if (!$errorOccurred && $dataPosted)
|
||||
// Checks if character encoding is UTF-8
|
||||
if (mb_detect_encoding(implode(";", $fileRow), "UTF-8", true))
|
||||
{
|
||||
$rowName = $fileRow[0];
|
||||
$rowSurname = $fileRow[1];
|
||||
$rowCode = $fileRow[2]; // uid or matrikelnr
|
||||
$rowStudiengang = $fileRow[3];
|
||||
$rowAmount = $fileRow[4];
|
||||
$rowDate = $fileRow[5];
|
||||
$rowSurname = $fileRow[0];
|
||||
$rowName = $fileRow[1];
|
||||
$rowGebdat = $fileRow[2];
|
||||
$rowCode = $fileRow[3]; // uid or matrikelnr
|
||||
$rowStudiengang = $fileRow[4];
|
||||
$rowAmount = $fileRow[5];
|
||||
$rowIBAN = $fileRow[6];
|
||||
$rowBIC = $fileRow[7];
|
||||
$rowBank = $fileRow[8];
|
||||
$rowDate = date('Y-m-d');
|
||||
|
||||
// If this row is not the header
|
||||
if (strtolower($rowName) != "nachname")
|
||||
if (strtolower($rowSurname) != "nachname")
|
||||
{
|
||||
// If $rowCode is a matrikelnr gets the uid
|
||||
if (($uid = $student->getUidFromMatrikelnummer($rowCode)) === false)
|
||||
@@ -293,6 +297,12 @@ if (!$errorOccurred && $dataPosted)
|
||||
// Inserting positive amount
|
||||
if ($konto->save(true) === true)
|
||||
{
|
||||
lAddToLogArray(
|
||||
$L_INFO,
|
||||
$lineNumber,
|
||||
"Added!!!"
|
||||
);
|
||||
/* Keine Gegenbuchung erstellen
|
||||
lDebit($konto); // Negative amount
|
||||
if ($konto->save(true) === true) // Inserting negative amount
|
||||
{
|
||||
@@ -310,6 +320,7 @@ if (!$errorOccurred && $dataPosted)
|
||||
"This file row has been discarted because an error has occurred while inserting in DB"
|
||||
);
|
||||
}
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -321,6 +332,79 @@ if (!$errorOccurred && $dataPosted)
|
||||
}
|
||||
}
|
||||
|
||||
// Bankverbindung hinterlegen
|
||||
$bank = new bankverbindung();
|
||||
$found = false;
|
||||
if($bank->load_pers($student->person_id))
|
||||
{
|
||||
foreach($bank->result as $row_bank)
|
||||
{
|
||||
if(str_replace(' ', '', $row_bank->iban) == str_replace(' ', '', $rowIBAN))
|
||||
{
|
||||
lAddToLogArray(
|
||||
$L_WARNING,
|
||||
$lineNumber,
|
||||
"Bank IBAN already found for PersonID ".$student->person_id
|
||||
);
|
||||
$found = true;
|
||||
|
||||
// Update Datum aktualisieren damit Update in Fremdsystem getriggert wird
|
||||
$row_bank->new=false;
|
||||
$row_bank->updateamum = date('Y-m-d H:i:s');
|
||||
$row_bank->updatevon = 'Leistungsimport';
|
||||
if($row_bank->save())
|
||||
{
|
||||
lAddToLogArray(
|
||||
$L_INFO,
|
||||
$lineNumber,
|
||||
"Bank Date Update for PersonID ".$student->person_id
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
lAddToLogArray(
|
||||
$L_WARNING,
|
||||
$lineNumber,
|
||||
"Bank Date Update Failed for PersonID ".$student->person_id
|
||||
);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!$found)
|
||||
{
|
||||
$bank = new bankverbindung();
|
||||
$bank->new = true;
|
||||
$bank->iban = $rowIBAN;
|
||||
$bank->person_id = $student->person_id;
|
||||
$bank->bic = $rowBIC;
|
||||
$bank->name = $rowBank;
|
||||
$bank->typ = 'p';
|
||||
$bank->verrechnung = true;
|
||||
$bank->insertamum = date('Y-m-d H:i:s');
|
||||
$bank->insertvon = 'Leistungsimport';
|
||||
$bank->updateamum = date('Y-m-d H:i:s');
|
||||
$bank->updatevon = 'Leistungsimport';
|
||||
if($bank->save())
|
||||
{
|
||||
lAddToLogArray(
|
||||
$L_INFO,
|
||||
$lineNumber,
|
||||
"Bankdaten hinzugefügt"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
lAddToLogArray(
|
||||
$L_WARNING,
|
||||
$lineNumber,
|
||||
"Failed to Add Bankdata".$bank->errormsg
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -2411,12 +2411,13 @@ else
|
||||
});
|
||||
}
|
||||
}
|
||||
function prueflingEntSperren(person_id, name, art)
|
||||
function prueflingEntSperren(element)
|
||||
{
|
||||
if (art === true)
|
||||
var text = "sperren";
|
||||
else if (art === false)
|
||||
var text = "entsperren";
|
||||
var person_id = element.getAttribute("data-person-id");
|
||||
var name = element.getAttribute("data-person-name");
|
||||
var art = element.getAttribute("data-art") === "true";
|
||||
|
||||
let text = art ? "sperren" : "entsperren";
|
||||
|
||||
if (confirm("Wollen Sie den Studenten "+ name + " wirklich " + text + "?"))
|
||||
{
|
||||
@@ -3279,10 +3280,18 @@ else
|
||||
|
||||
|
||||
echo "<td class='textcentered ".$inaktiv ."'>
|
||||
<a href='#' class='prueflingsperren_".$erg->person_id . ((isset($gesperrt_arr[$erg->person_id]) && $gesperrt_arr[$erg->person_id]->gesperrt === true) ? " hidden" : "") ."' onclick='prueflingEntSperren(" . $erg->person_id . ", \"" . $erg->vorname . " " . $erg->nachname ."\"" .", true)'>
|
||||
<a href='#' class='prueflingsperren_".$erg->person_id . ((isset($gesperrt_arr[$erg->person_id]) && $gesperrt_arr[$erg->person_id]->gesperrt === true) ? " hidden" : "") ."'
|
||||
data-person-id='".$erg->person_id."'
|
||||
data-person-name='".htmlspecialchars($erg->vorname . " " . $erg->nachname, ENT_QUOTES, 'UTF-8')."'
|
||||
data-art='true'
|
||||
onclick='prueflingEntSperren(this)'>
|
||||
<span class='glyphicon glyphicon-remove'></span>
|
||||
</a>
|
||||
<a href='#' class='prueflingentsperren_".$erg->person_id . ((isset($gesperrt_arr[$erg->person_id]) && $gesperrt_arr[$erg->person_id]->gesperrt !== true ? " hidden" : "")) . "' onclick='prueflingEntSperren(" . $erg->person_id . ", \"" . $erg->vorname . " " . $erg->nachname ."\"" .", false);'>
|
||||
<a href='#' class='prueflingentsperren_".$erg->person_id . ((isset($gesperrt_arr[$erg->person_id]) && $gesperrt_arr[$erg->person_id]->gesperrt !== true ? " hidden" : "")) . "'
|
||||
data-person-id='".$erg->person_id."'
|
||||
data-person-name='".htmlspecialchars($erg->vorname . " " . $erg->nachname, ENT_QUOTES, 'UTF-8')."'
|
||||
data-art='false'
|
||||
onclick='prueflingEntSperren(this)'>
|
||||
<span class='glyphicon glyphicon-ok'></span>
|
||||
</a>
|
||||
</td>";
|
||||
|
||||
Reference in New Issue
Block a user