mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-21 17:02:19 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e86e7f0bd8 | |||
| c36f259571 | |||
| 501bae585a | |||
| 2c72f704d0 | |||
| 194de7b4e7 | |||
| c03609142b | |||
| 5374f71732 | |||
| ccd8d5f871 | |||
| be508c99ea | |||
| 71a77fc576 | |||
| a028297da6 | |||
| ac44b36b59 |
@@ -36,7 +36,8 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getLvMenu' => self::PERM_LOGGED
|
'getLvMenu' => self::PERM_LOGGED,
|
||||||
|
'getMultipleLvMenu' => self::PERM_LOGGED
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->load->model("ressource/Mitarbeiter_model");
|
$this->load->model("ressource/Mitarbeiter_model");
|
||||||
@@ -61,24 +62,23 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* alternative function to get multiple lvMenus with a single http request
|
* alternative function to get multiple lvMenus with a single http request
|
||||||
|
* not yet working as intended as the menu_lv.inc.php scripts called by the
|
||||||
|
* lvMenuBuild event have logic coupled to require_once import which results in
|
||||||
|
* a wrong logic after the first invocation -> faulty results for lvinfo, moodle
|
||||||
|
* and several others
|
||||||
*/
|
*/
|
||||||
public function getMultipleLvMenu($lvMenuOptionList){
|
public function getMultipleLvMenu(){
|
||||||
|
$lvMenuOptionList = $this->input->post('lvMenuOptionList', true);
|
||||||
$result =[];
|
$result =[];
|
||||||
foreach($lvMenuOptionList as $lvMenuOptions){
|
foreach($lvMenuOptionList as $lvMenuOptions){
|
||||||
$lvMenu = $this->getLvMenu($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
|
$lvMenu = $this->getLvMenuInternal($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']);
|
||||||
if(isError($lvMenu)){
|
|
||||||
// TODO: some lvMenu threw an error, handle error here
|
|
||||||
}
|
|
||||||
$result[$lvMenuOptions['lvid']]=$lvMenu;
|
$result[$lvMenuOptions['lvid']]=$lvMenu;
|
||||||
}
|
}
|
||||||
$this->terminateWithSuccess($result);
|
$this->terminateWithSuccess($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private function getLvMenuInternal($lvid, $studiensemester_kurzbz) {
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function getLvMenu($lvid, $studiensemester_kurzbz)
|
|
||||||
{
|
|
||||||
|
|
||||||
// return early if parameters are missing
|
// return early if parameters are missing
|
||||||
if(!isset($lvid) || !isset($studiensemester_kurzbz))
|
if(!isset($lvid) || !isset($studiensemester_kurzbz))
|
||||||
@@ -89,14 +89,14 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
// get the user
|
// get the user
|
||||||
if (!$user=getAuthUID())
|
if (!$user=getAuthUID())
|
||||||
$this->terminateWithError($this->p->t('global', 'nichtAngemeldet'));
|
$this->terminateWithError($this->p->t('global', 'nichtAngemeldet'));
|
||||||
|
|
||||||
// check if is_lector
|
// check if is_lector
|
||||||
$is_lector = false;
|
$is_lector = false;
|
||||||
$mares = $this->Mitarbeiter_model->isMitarbeiter($user);
|
$mares = $this->Mitarbeiter_model->isMitarbeiter($user);
|
||||||
if(hasData($mares))
|
if(hasData($mares))
|
||||||
{
|
{
|
||||||
$is_lector = getData($mares);
|
$is_lector = getData($mares);
|
||||||
}
|
}
|
||||||
|
|
||||||
// definition of user_is_allowed_to_upload
|
// definition of user_is_allowed_to_upload
|
||||||
@@ -105,7 +105,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
// load lehrveranstaltung
|
// load lehrveranstaltung
|
||||||
$lvres = $this->Lehrveranstaltung_model->load($lvid);
|
$lvres = $this->Lehrveranstaltung_model->load($lvid);
|
||||||
if(!hasData($lvres))
|
if(!hasData($lvres))
|
||||||
{
|
{
|
||||||
$this->terminateWithError('LV ' . $lvid . ' not found.');
|
$this->terminateWithError('LV ' . $lvid . ' not found.');
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
$stgres = $this->Studiengang_model->load(strval($studiengang_kz));
|
$stgres = $this->Studiengang_model->load(strval($studiengang_kz));
|
||||||
if(!hasData($stgres))
|
if(!hasData($stgres))
|
||||||
{
|
{
|
||||||
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
|
$this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.');
|
||||||
}
|
}
|
||||||
$stg = (getData($stgres))[0];
|
$stg = (getData($stgres))[0];
|
||||||
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
|
$kurzbz = strtoupper($stg->typ . $stg->kurzbz);
|
||||||
@@ -139,7 +139,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
$angemeldet = false;
|
$angemeldet = false;
|
||||||
|
|
||||||
$lesres = $this->Lehreinheit_model->getLehreinheitenForStudentAndStudienSemester(
|
$lesres = $this->Lehreinheit_model->getLehreinheitenForStudentAndStudienSemester(
|
||||||
$lvid, $user, $angezeigtes_stsem
|
$lvid, $user, $angezeigtes_stsem
|
||||||
);
|
);
|
||||||
|
|
||||||
if(hasData($lesres) && count(getData($lesres)) > 0)
|
if(hasData($lesres) && count(getData($lesres)) > 0)
|
||||||
@@ -148,7 +148,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
// lehrfach
|
// lehrfach
|
||||||
$lehrfach_id='';
|
$lehrfach_id='';
|
||||||
|
|
||||||
if(defined('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN)
|
if(defined('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN)
|
||||||
{
|
{
|
||||||
// Wenn der eingeloggte User zu einer der Lehreinheiten zugeteilt ist
|
// Wenn der eingeloggte User zu einer der Lehreinheiten zugeteilt ist
|
||||||
@@ -211,8 +211,8 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
foreach($fbs as $row)
|
foreach($fbs as $row)
|
||||||
{
|
{
|
||||||
$lehrfach_oe_kurzbz_arr[] = $row->oe_kurzbz;
|
$lehrfach_oe_kurzbz_arr[] = $row->oe_kurzbz;
|
||||||
if($this->PermissionLib->isBerechtigt('lehre', null, $row->oe_kurzbz)
|
if($this->PermissionLib->isBerechtigt('lehre', null, $row->oe_kurzbz)
|
||||||
|| $this->PermissionLib->isBerechtigt('assistenz', null, $stg->oe_kurzbz))
|
|| $this->PermissionLib->isBerechtigt('assistenz', null, $stg->oe_kurzbz))
|
||||||
{
|
{
|
||||||
$user_is_allowed_to_upload=true;
|
$user_is_allowed_to_upload=true;
|
||||||
}
|
}
|
||||||
@@ -224,21 +224,21 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
$menu = array();
|
$menu = array();
|
||||||
|
|
||||||
$this->fhc_menu_lvinfo($menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr);
|
$this->fhc_menu_lvinfo($menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr);
|
||||||
|
|
||||||
$this->fhc_menu_feedback($menu, $angemeldet, $lvid);
|
$this->fhc_menu_feedback($menu, $angemeldet, $lvid);
|
||||||
|
|
||||||
$this->fhc_menu_gesamtnote($menu, $angemeldet, $lvid, $lv, $is_lector, $angezeigtes_stsem);
|
$this->fhc_menu_gesamtnote($menu, $angemeldet, $lvid, $lv, $is_lector, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_emailStudierende($menu, $user, $angemeldet, $lvid, $angezeigtes_stsem);
|
$this->fhc_menu_emailStudierende($menu, $user, $angemeldet, $lvid, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_abmeldung($menu, $user, $is_lector, $lvid, $angezeigtes_stsem);
|
$this->fhc_menu_abmeldung($menu, $user, $is_lector, $lvid, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_lehretools($menu, $lvid, $angezeigtes_stsem, $sprache);
|
$this->fhc_menu_lehretools($menu, $lvid, $angezeigtes_stsem, $sprache);
|
||||||
|
|
||||||
$this->fhc_menu_anrechnungStudent($menu, $lvid, $angezeigtes_stsem);
|
$this->fhc_menu_anrechnungStudent($menu, $lvid, $angezeigtes_stsem);
|
||||||
|
|
||||||
$this->fhc_menu_anrechnungLector($menu, $angezeigtes_stsem);
|
$this->fhc_menu_anrechnungLector($menu, $angezeigtes_stsem);
|
||||||
|
|
||||||
|
|
||||||
// Addons Menu Logic
|
// Addons Menu Logic
|
||||||
// ##########################################################################################
|
// ##########################################################################################
|
||||||
@@ -272,18 +272,18 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
'permissionLib' => &$this->PermissionLib,
|
'permissionLib' => &$this->PermissionLib,
|
||||||
'phrasesLib' => &$this->PhrasesLib
|
'phrasesLib' => &$this->PhrasesLib
|
||||||
];
|
];
|
||||||
|
|
||||||
Events::trigger('lvMenuBuild',
|
Events::trigger('lvMenuBuild',
|
||||||
// passing $menu per reference
|
// passing $menu per reference
|
||||||
function & () use (&$menu) {
|
function & () use (&$menu) {
|
||||||
return $menu;
|
return $menu;
|
||||||
},
|
},
|
||||||
$params
|
$params
|
||||||
);
|
);
|
||||||
|
|
||||||
// Menu sortieren
|
// Menu sortieren
|
||||||
// ##########################################################################################
|
// ##########################################################################################
|
||||||
|
|
||||||
foreach ($menu as $key => $row){
|
foreach ($menu as $key => $row){
|
||||||
|
|
||||||
// removes menu points that are not needed in the c4 lvUebersicht
|
// removes menu points that are not needed in the c4 lvUebersicht
|
||||||
@@ -291,7 +291,7 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
unset($menu[$key]);
|
unset($menu[$key]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fills pos array to sort the menu
|
// fills pos array to sort the menu
|
||||||
$pos[$key] = $row['position'];
|
$pos[$key] = $row['position'];
|
||||||
|
|
||||||
@@ -299,11 +299,18 @@ class LvMenu extends FHCAPI_Controller
|
|||||||
|
|
||||||
array_multisort($pos, SORT_ASC, SORT_NUMERIC, $menu);
|
array_multisort($pos, SORT_ASC, SORT_NUMERIC, $menu);
|
||||||
|
|
||||||
// HTTP response
|
|
||||||
// ##########################################################################################
|
return $menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getLvMenu($lvid, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$menu = $this->getLvMenuInternal($lvid, $studiensemester_kurzbz);
|
||||||
|
|
||||||
$this->terminateWithSuccess($menu);
|
$this->terminateWithSuccess($menu);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
|
private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){
|
||||||
|
|||||||
@@ -13,12 +13,13 @@ class Mylv extends Auth_Controller
|
|||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
|
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'Student' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
'Student' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
|
||||||
'Studiensemester' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
'Studiensemester' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
|
||||||
'Lvs' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
'Lvs' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
|
||||||
'Info' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
|
'Info' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'], // TODO(chris): permissions?
|
||||||
'Pruefungen' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions?
|
'Pruefungen' => ['student/anrechnung_beantragen:r','user:r', 'basis/cis:r'] // TODO(chris): permissions?
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,13 +45,27 @@ class Mylv extends Auth_Controller
|
|||||||
public function Studiensemester()
|
public function Studiensemester()
|
||||||
{
|
{
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
|
||||||
$result = $this->StudiensemesterModel->getWhereStudentHasLvs(getAuthUID());
|
$isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())) ?? false;
|
||||||
|
if($isMitarbeiter) {
|
||||||
|
$result = $this->StudiensemesterModel->getWhereMitarbeiterHasLvs(getAuthUID());
|
||||||
|
|
||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $this->outputJsonError(getError($result));
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
$this->outputJsonSuccess(getData($result));
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else if(getData($this->StudentModel->isStudent(getAuthUID())) ?? false) { // $isStudent
|
||||||
|
$result = $this->StudiensemesterModel->getWhereStudentHasLvs(getAuthUID());
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else {
|
||||||
|
$this->outputJsonError('neither student or mitarbeiter');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -58,13 +73,27 @@ class Mylv extends Auth_Controller
|
|||||||
public function Lvs($studiensemester_kurzbz)
|
public function Lvs($studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
||||||
|
|
||||||
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage());
|
$isMitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())) ?? false;
|
||||||
|
if($isMitarbeiter) {
|
||||||
|
$result = $this->LehrveranstaltungModel->getLvsByMitarbeiterInSemester(getAuthUID(), $studiensemester_kurzbz);
|
||||||
|
|
||||||
if (isError($result))
|
if (isError($result))
|
||||||
return $this->outputJsonError(getError($result));
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
$this->outputJsonSuccess(getData($result));
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else if(getData($this->StudentModel->isStudent(getAuthUID())) ?? false) { // $isStudent
|
||||||
|
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(getAuthUID(), $studiensemester_kurzbz, getUserLanguage());
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return $this->outputJsonError(getError($result));
|
||||||
|
|
||||||
|
$this->outputJsonSuccess(getData($result));
|
||||||
|
} else {
|
||||||
|
$this->outputJsonError('neither student or mitarbeiter');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1343,4 +1343,45 @@ class Lehrveranstaltung_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execQuery($qry, $params);
|
return $this->execQuery($qry, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// used for cis4 mylv mitarbeiter
|
||||||
|
public function getLvsByMitarbeiterInSemester($mitarbeiter_uid, $sem_kurzbz) {
|
||||||
|
$qry = "SELECT * FROM (
|
||||||
|
SELECT DISTINCT ON (lehre.tbl_lehrveranstaltung.lehrveranstaltung_id)
|
||||||
|
public.tbl_studiengang.studiengang_kz,
|
||||||
|
lehre.tbl_lehrveranstaltung.semester,
|
||||||
|
public.tbl_studiengang.bezeichnung as sg_bezeichnung,
|
||||||
|
public.tbl_studiengang.english as sg_bezeichnung_eng,
|
||||||
|
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as studiengang_kuerzel,
|
||||||
|
lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,
|
||||||
|
lehre.tbl_lehrveranstaltung.bezeichnung,
|
||||||
|
lehre.tbl_lehrveranstaltung.bezeichnung_english as bezeichnung_eng,
|
||||||
|
lehre.tbl_lehrveranstaltung.farbe,
|
||||||
|
lehre.tbl_lehrveranstaltung.lvinfo,
|
||||||
|
lehre.tbl_lehrveranstaltung.benotung,
|
||||||
|
lehre.tbl_lehrveranstaltung.orgform_kurzbz,
|
||||||
|
lehre.tbl_lehrveranstaltung.sprache,
|
||||||
|
lehre.tbl_lehrveranstaltung.ects,
|
||||||
|
lehre.tbl_lehrveranstaltung.incoming
|
||||||
|
FROM
|
||||||
|
lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung as lehrfach ON(tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id)
|
||||||
|
WHERE
|
||||||
|
tbl_lehreinheit.studiensemester_kurzbz = ?
|
||||||
|
AND mitarbeiter_uid = ?) as distincted_by_lva_id
|
||||||
|
JOIN (
|
||||||
|
SELECT lehrveranstaltung_id, TRUNC(SUM(lehre.tbl_lehreinheitmitarbeiter.semesterstunden)) as semesterstunden
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
|
||||||
|
WHERE tbl_lehreinheit.studiensemester_kurzbz = ?
|
||||||
|
AND mitarbeiter_uid = ?
|
||||||
|
GROUP BY lehrveranstaltung_id
|
||||||
|
) semesterstundenAggregatedSubquery USING(lehrveranstaltung_id)
|
||||||
|
ORDER BY studiengang_kuerzel, semester, bezeichnung";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, [$sem_kurzbz, $mitarbeiter_uid, $sem_kurzbz, $mitarbeiter_uid]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,6 +242,30 @@ class Studiensemester_model extends DB_Model
|
|||||||
return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]);
|
return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getWhereMitarbeiterHasLvs($uid) {
|
||||||
|
// first order by year with last 2 letter from right,
|
||||||
|
// then order by WS/SS inside the years
|
||||||
|
// query it asc so the ordering magic in cis4 turns it around again
|
||||||
|
$qry = "WITH unique_semesters AS (
|
||||||
|
SELECT DISTINCT ON (studiensemester_kurzbz)
|
||||||
|
studiensemester_kurzbz,
|
||||||
|
start,
|
||||||
|
ende,
|
||||||
|
bezeichnung,
|
||||||
|
studienjahr_kurzbz
|
||||||
|
FROM lehre.tbl_lehreinheit
|
||||||
|
JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id)
|
||||||
|
JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
|
||||||
|
WHERE mitarbeiter_uid = ?
|
||||||
|
)
|
||||||
|
SELECT * FROM unique_semesters
|
||||||
|
ORDER BY
|
||||||
|
RIGHT(studiensemester_kurzbz, 2) ASC,
|
||||||
|
LEFT(studiensemester_kurzbz, 2) ASC;";
|
||||||
|
|
||||||
|
return $this->execReadOnlyQuery($qry, [$uid]);
|
||||||
|
}
|
||||||
|
|
||||||
public function getAktAndFutureSemester()
|
public function getAktAndFutureSemester()
|
||||||
{
|
{
|
||||||
$query = 'SELECT studiensemester_kurzbz
|
$query = 'SELECT studiensemester_kurzbz
|
||||||
|
|||||||
@@ -6,3 +6,13 @@
|
|||||||
color: var(--fhc-myLv-disabled) !important;
|
color: var(--fhc-myLv-disabled) !important;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* adjustment to have bs5 dropdownmenus rendered properly over a tabulator table */
|
||||||
|
.mylv-semester-table .tabulator-cell {
|
||||||
|
overflow: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mylv-semester-table .tabulator-cell .action-col {
|
||||||
|
/*min-height: 2.5rem;*/
|
||||||
|
align-items: flex-start; /* so wrapped rows don't stretch vertically */
|
||||||
|
}
|
||||||
@@ -21,5 +21,20 @@ export default {
|
|||||||
method: 'get',
|
method: 'get',
|
||||||
url: `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`
|
url: `/api/frontend/v1/LvMenu/getLvMenu/${lvid}/${studiensemester_kurzbz}`
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
getMultipleLvMenu(lvas, studiensemester_kurzbz) {
|
||||||
|
// format params for backend bulk function
|
||||||
|
const lvMenuOptionList = lvas.map(lva => {
|
||||||
|
return {
|
||||||
|
lvid: lva.lehrveranstaltung_id,
|
||||||
|
studiensemester_kurzbz
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
method: 'post',
|
||||||
|
url: `/api/frontend/v1/LvMenu/getMultipleLvMenu`,
|
||||||
|
params: { lvMenuOptionList }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -5,7 +5,7 @@ import contrast from '../../directives/contrast.js';
|
|||||||
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
import {setScrollbarWidth} from "../../helpers/CssVarCalcHelpers.js";
|
||||||
import LvPlan from "../../components/Cis/LvPlan/Lehrveranstaltung.js";
|
import LvPlan from "../../components/Cis/LvPlan/Lehrveranstaltung.js";
|
||||||
import MyLvPlan from "../../components/Cis/LvPlan/Personal.js";
|
import MyLvPlan from "../../components/Cis/LvPlan/Personal.js";
|
||||||
import MylvStudent from "../../components/Cis/Mylv/Student.js";
|
import Mylv from "../../components/Cis/Mylv/MyLv.js";
|
||||||
import Profil from "../../components/Cis/Profil/Profil.js";
|
import Profil from "../../components/Cis/Profil/Profil.js";
|
||||||
import Raumsuche from "../../components/Cis/Raumsuche/Raumsuche.js";
|
import Raumsuche from "../../components/Cis/Raumsuche/Raumsuche.js";
|
||||||
import CmsNews from "../../components/Cis/Cms/News.js";
|
import CmsNews from "../../components/Cis/Cms/News.js";
|
||||||
@@ -21,6 +21,7 @@ import Studium from "../../components/Cis/Studium/Studium.js";
|
|||||||
import ApiRenderers from '../../api/factory/renderers.js';
|
import ApiRenderers from '../../api/factory/renderers.js';
|
||||||
import ApiRouteInfo from '../../api/factory/routeinfo.js';
|
import ApiRouteInfo from '../../api/factory/routeinfo.js';
|
||||||
import {capitalize} from "../../helpers/StringHelpers.js";
|
import {capitalize} from "../../helpers/StringHelpers.js";
|
||||||
|
import ApiAuthinfo from "../../api/factory/authinfo.js";
|
||||||
|
|
||||||
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
|
||||||
|
|
||||||
@@ -149,7 +150,7 @@ const router = VueRouter.createRouter({
|
|||||||
{
|
{
|
||||||
path: `/Cis/MyLv/:studiensemester?`,
|
path: `/Cis/MyLv/:studiensemester?`,
|
||||||
name: 'MyLv',
|
name: 'MyLv',
|
||||||
component: MylvStudent,
|
component: Mylv,
|
||||||
props: true,
|
props: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -231,6 +232,9 @@ const app = Vue.createApp({
|
|||||||
data: () => ({
|
data: () => ({
|
||||||
appSideMenuEntries: {},
|
appSideMenuEntries: {},
|
||||||
renderers: null,
|
renderers: null,
|
||||||
|
uid: '',
|
||||||
|
isStudent: null,
|
||||||
|
isMitarbeiter: null
|
||||||
}),
|
}),
|
||||||
components: {},
|
components: {},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -244,7 +248,10 @@ const app = Vue.createApp({
|
|||||||
return { // provide injectable & watchable language property
|
return { // provide injectable & watchable language property
|
||||||
language: Vue.computed(() => this.$p.user_language),
|
language: Vue.computed(() => this.$p.user_language),
|
||||||
renderers: Vue.computed(() => this.renderers),
|
renderers: Vue.computed(() => this.renderers),
|
||||||
isMobile: this.isMobile
|
isMobile: this.isMobile,
|
||||||
|
uid: Vue.computed(() => this.uid),
|
||||||
|
isStudent: Vue.computed(() => this.isStudent),
|
||||||
|
isMitarbeiter: Vue.computed(() => this.isMitarbeiter)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -321,6 +328,14 @@ const app = Vue.createApp({
|
|||||||
this.renderers[rendertype].calendarEvent = calendarEvent;
|
this.renderers[rendertype].calendarEvent = calendarEvent;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await this.$api
|
||||||
|
.call(ApiAuthinfo.getAuthInfo())
|
||||||
|
.then(res => {
|
||||||
|
this.uid = res.data.uid;
|
||||||
|
this.isMitarbeiter = res.data.isMitarbeiter;
|
||||||
|
this.isStudent = res.data.isStudent;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
document.addEventListener('click', this.handleClick);
|
document.addEventListener('click', this.handleClick);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'LvMenu',
|
||||||
props:{
|
props:{
|
||||||
menu:{
|
menu:{
|
||||||
type:Array,
|
type:Array,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import LvMenu from "./LvMenu.js";
|
|||||||
import ApiAddons from '../../../api/factory/addons.js';
|
import ApiAddons from '../../../api/factory/addons.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'LvUebersicht',
|
||||||
props:{
|
props:{
|
||||||
event:{
|
event:{
|
||||||
type:Object,
|
type:Object,
|
||||||
|
|||||||
@@ -1,25 +1,37 @@
|
|||||||
import MylvSemester from "./Semester.js";
|
import MylvSemesterCards from "./Semester.js";
|
||||||
import Phrasen from "../../../mixins/Phrasen.js";
|
import MylvTable from "./Table.js";
|
||||||
|
import ApiAddons from "../../../api/factory/addons.js"
|
||||||
|
|
||||||
// TODO(chris): phrase: global/studiensemester_auswaehlen
|
// TODO(chris): phrase: global/studiensemester_auswaehlen
|
||||||
// TODO(chris): phrase: next & prev +aria-label
|
// TODO(chris): phrase: next & prev +aria-label
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'MyLv',
|
||||||
components: {
|
components: {
|
||||||
MylvSemester
|
MylvSemesterCards,
|
||||||
|
MylvTable
|
||||||
},
|
},
|
||||||
mixins: [
|
|
||||||
Phrasen
|
|
||||||
],
|
|
||||||
data: () => {
|
data: () => {
|
||||||
return {
|
return {
|
||||||
firstLoad: true,
|
firstLoad: true,
|
||||||
studiensemester: null,
|
studiensemester: null,
|
||||||
lvs: {},
|
lvs: {},
|
||||||
currentSemester: null
|
currentSemester: null,
|
||||||
|
mode: localStorage.getItem('myLvaDefaultMode') ?? 'cards'
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
type: Vue.computed(() => this.type),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inject: ['isStudent', 'isMitarbeiter'],
|
||||||
computed: {
|
computed: {
|
||||||
|
type() {
|
||||||
|
if(this.isStudent) return 'student'
|
||||||
|
if(this.isMitarbeiter) return 'employee'
|
||||||
|
return null
|
||||||
|
},
|
||||||
ready() {
|
ready() {
|
||||||
return this.studiensemester !== null && (!this.firstLoad || this.current.lvs !== null);
|
return this.studiensemester !== null && (!this.firstLoad || this.current.lvs !== null);
|
||||||
},
|
},
|
||||||
@@ -34,7 +46,22 @@ export default {
|
|||||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Lvs/' + this.currentSemester).then(res => {
|
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Lvs/' + this.currentSemester).then(res => {
|
||||||
this.lvs[this.currentSemester].lvs = res.data.retval || [];
|
this.lvs[this.currentSemester].lvs = res.data.retval || [];
|
||||||
this.firstLoad = false;
|
this.firstLoad = false;
|
||||||
});
|
|
||||||
|
this.lvs[this.currentSemester].lvs.forEach(lv=>{
|
||||||
|
|
||||||
|
this.$api.call(ApiAddons.getLvMenu(lv.lehrveranstaltung_id, this.currentSemester)).then(res => {
|
||||||
|
if(res.data) {
|
||||||
|
|
||||||
|
const lvProp = this.lvs[this.currentSemester].lvs.find(lv2 => lv2.lehrveranstaltung_id == lv.lehrveranstaltung_id)
|
||||||
|
lvProp.menu = res.data
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return this.lvs[this.currentSemester];
|
return this.lvs[this.currentSemester];
|
||||||
},
|
},
|
||||||
@@ -67,6 +94,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
clickMode(evt, mode) {
|
||||||
|
localStorage.setItem('myLvaDefaultMode', mode)
|
||||||
|
this.mode = mode
|
||||||
|
},
|
||||||
prevSem() {
|
prevSem() {
|
||||||
this.$refs.studiensemester.selectedIndex--;
|
this.$refs.studiensemester.selectedIndex--;
|
||||||
this.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));
|
this.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));
|
||||||
@@ -99,7 +130,7 @@ export default {
|
|||||||
|
|
||||||
<h2>{{$p.t('lehre/myLV')}}</h2>
|
<h2>{{$p.t('lehre/myLV')}}</h2>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="mylv-student" v-if="ready">
|
<div class="mylv" v-if="ready">
|
||||||
<div v-if="currentSemester" class="row justify-content-center mb-3">
|
<div v-if="currentSemester" class="row justify-content-center mb-3">
|
||||||
<div class="col-auto d-none">
|
<div class="col-auto d-none">
|
||||||
<label class="col-form-label">{{$p.t('lehre/studiensemester')}}</label>
|
<label class="col-form-label">{{$p.t('lehre/studiensemester')}}</label>
|
||||||
@@ -117,13 +148,34 @@ export default {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class=" col-auto my-lva-modes">
|
||||||
|
<div class="d-flex gap-1 justify-content-end" role="group">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-outline-secondary"
|
||||||
|
:class="{active: mode === 'cards'}"
|
||||||
|
@click="clickMode($event, 'cards')"
|
||||||
|
>
|
||||||
|
<i class="fa fa-grip"></i>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-outline-secondary"
|
||||||
|
:class="{active: mode === 'table'}"
|
||||||
|
@click="clickMode($event, 'table')"
|
||||||
|
>
|
||||||
|
<i class="fa fa-table"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="alert alert-danger" role="alert" v-else>
|
<div class="alert alert-danger" role="alert" v-else>
|
||||||
{{$p.t('lehre/noLvFound')}}
|
{{$p.t('lehre/noLvFound')}}
|
||||||
</div>
|
</div>
|
||||||
<mylv-semester v-bind="current"/>
|
<mylv-semester-cards v-if="mode == 'cards'" v-bind="current"/>
|
||||||
|
<mylv-table v-else-if="mode == 'table'" v-bind="current"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="mylv-student text-center" v-else>
|
<div class="mylv text-center" v-else>
|
||||||
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||||
</div>`
|
</div>`
|
||||||
};
|
};
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import MylvSemesterStudiengang from "./Semester/Studiengang.js";
|
import MylvSemesterStudiengang from "./Semester/Studiengang.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Semester',
|
||||||
components: {
|
components: {
|
||||||
MylvSemesterStudiengang
|
MylvSemesterStudiengang
|
||||||
},
|
},
|
||||||
@@ -36,7 +37,8 @@ export default {
|
|||||||
return this.lvs.filter(lv => lv.studiengang_kz == studiengang.studiengang_kz && lv.semester == studiengang.semester);
|
return this.lvs.filter(lv => lv.studiengang_kz == studiengang.studiengang_kz && lv.semester == studiengang.semester);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
template: `<div class="mylv-semester" v-if="ready">
|
template: `
|
||||||
|
<div class="mylv-semester" v-if="ready">
|
||||||
<mylv-semester-studiengang v-for="studiengang in studiengaenge" :key="studiengang.studiengang_kz" v-bind="studiengang" :lvs="lvsForStudiengang(studiengang)"/>
|
<mylv-semester-studiengang v-for="studiengang in studiengaenge" :key="studiengang.studiengang_kz" v-bind="studiengang" :lvs="lvsForStudiengang(studiengang)"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="mylv-semester text-center" v-else>
|
<div class="mylv-semester text-center" v-else>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import MylvSemesterStudiengangLv from "./Studiengang/Lv.js";
|
|||||||
import Phrasen from "../../../../mixins/Phrasen.js";
|
import Phrasen from "../../../../mixins/Phrasen.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Studiengang',
|
||||||
components: {
|
components: {
|
||||||
MylvSemesterStudiengangLv
|
MylvSemesterStudiengangLv
|
||||||
},
|
},
|
||||||
@@ -31,7 +32,8 @@ export default {
|
|||||||
return lv.benotung ? lv.znote || lv.lvnote || null : null;
|
return lv.benotung ? lv.znote || lv.lvnote || null : null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
template: `<div class="card mb-3">
|
template: `
|
||||||
|
<div class="card mb-3">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h4 class="card-title mb-3">{{$p.user_language.value === 'English' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}
|
<h4 class="card-title mb-3">{{$p.user_language.value === 'English' ? sg_bezeichnung_eng : bezeichnung}} - {{kuerzel}}
|
||||||
<small>{{semester}}.{{$p.t('lehre/semester')}}</small>
|
<small>{{semester}}.{{$p.t('lehre/semester')}}</small>
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
import LvPruefungen from "./Lv/Pruefungen.js";
|
import LvPruefungen from "./Lv/Pruefungen.js";
|
||||||
import LvInfo from "./Lv/Info.js";
|
|
||||||
import Phrasen from "../../../../../mixins/Phrasen.js";
|
|
||||||
import LvUebersicht from "../../LvUebersicht.js";
|
|
||||||
|
|
||||||
import ApiLehre from '../../../../../api/factory/lehre.js';
|
import ApiLehre from '../../../../../api/factory/lehre.js';
|
||||||
import ApiAddons from '../../../../../api/factory/addons.js';
|
import ApiAddons from '../../../../../api/factory/addons.js';
|
||||||
@@ -9,15 +6,11 @@ import ApiAddons from '../../../../../api/factory/addons.js';
|
|||||||
// TODO(chris): L10n
|
// TODO(chris): L10n
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components:{
|
name: 'Lv',
|
||||||
LvUebersicht,
|
inject: ['studien_semester', 'type'],
|
||||||
},
|
|
||||||
mixins: [
|
|
||||||
Phrasen
|
|
||||||
],
|
|
||||||
inject: ['studien_semester'],
|
|
||||||
props: {
|
props: {
|
||||||
lehrveranstaltung_id: Number,
|
lehrveranstaltung_id: [Number, String],
|
||||||
|
semesterstunden: [Number, String],
|
||||||
bezeichnung: String,
|
bezeichnung: String,
|
||||||
bezeichnung_eng: String,
|
bezeichnung_eng: String,
|
||||||
module: String,
|
module: String,
|
||||||
@@ -35,13 +28,13 @@ export default {
|
|||||||
ects: String,
|
ects: String,
|
||||||
incoming: Number,
|
incoming: Number,
|
||||||
positiv: Boolean,
|
positiv: Boolean,
|
||||||
note_index: String
|
note_index: String,
|
||||||
|
menu: [Array, String]
|
||||||
},
|
},
|
||||||
data: () => {
|
data: () => {
|
||||||
return {
|
return {
|
||||||
pruefungenData: null,
|
pruefungenData: null,
|
||||||
info: null,
|
info: null,
|
||||||
menu: null,
|
|
||||||
preselectedMenuItem: null,
|
preselectedMenuItem: null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -65,12 +58,6 @@ export default {
|
|||||||
emptyMenu(){
|
emptyMenu(){
|
||||||
return !this.menu || !Array.isArray(this.menu) || Array.isArray(this.menu) && this.menu.length == 0;
|
return !this.menu || !Array.isArray(this.menu) || Array.isArray(this.menu) && this.menu.length == 0;
|
||||||
},
|
},
|
||||||
bodyStyle() {return {};
|
|
||||||
/*const bodyStyle = {};
|
|
||||||
if (this.farbe)
|
|
||||||
bodyStyle['background-color'] = '#' + this.farbe;
|
|
||||||
return bodyStyle;*/
|
|
||||||
},
|
|
||||||
grade() {
|
grade() {
|
||||||
const languageIndex = this.$p.user_language.value === 'English' ? 1 : 0
|
const languageIndex = this.$p.user_language.value === 'English' ? 1 : 0
|
||||||
if(this.benotung && this.znotebez?.length) {
|
if(this.benotung && this.znotebez?.length) {
|
||||||
@@ -84,7 +71,6 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
fetchMenu(lehrveranstaltung_id = this.lehrveranstaltung_id, studien_semester = this.studien_semester) {
|
fetchMenu(lehrveranstaltung_id = this.lehrveranstaltung_id, studien_semester = this.studien_semester) {
|
||||||
return this.$api
|
return this.$api
|
||||||
.call(ApiAddons.getLvMenu(lehrveranstaltung_id, studien_semester))
|
.call(ApiAddons.getLvMenu(lehrveranstaltung_id, studien_semester))
|
||||||
@@ -96,28 +82,18 @@ export default {
|
|||||||
this.menu = [];
|
this.menu = [];
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
c4_target(menuItem) {
|
||||||
|
if (menuItem.c4_moodle_links?.length > 0) return null;
|
||||||
|
return menuItem.c4_target ?? null;
|
||||||
|
},
|
||||||
c4_link(menuItem) {
|
c4_link(menuItem) {
|
||||||
if (!menuItem) return null;
|
if (!menuItem) return null;
|
||||||
if (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) {
|
if (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) {
|
||||||
return '#';
|
return '#';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return menuItem.c4_link ?? null;
|
return menuItem.c4_link ?? null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
openLvOption(menuItem){
|
|
||||||
if (menuItem.id == "core_menu_mailanstudierende"){
|
|
||||||
window.location.href = menuItem.c4_link;
|
|
||||||
} else if (menuItem.id == "core_menu_digitale_anwesenheitslisten") {
|
|
||||||
window.location.href = menuItem.c4_link;
|
|
||||||
} else{
|
|
||||||
this.preselectedMenuItem = menuItem;
|
|
||||||
Vue.nextTick(() => {
|
|
||||||
this.$refs.lvUebersicht.show();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
openPruefungen() {
|
openPruefungen() {
|
||||||
// early return if the pruefungenData is empty or not set
|
// early return if the pruefungenData is empty or not set
|
||||||
if (!this.LvHasPruefungenInformation) return;
|
if (!this.LvHasPruefungenInformation) return;
|
||||||
@@ -126,75 +102,65 @@ export default {
|
|||||||
pruefungenData: this.pruefungenData,
|
pruefungenData: this.pruefungenData,
|
||||||
bezeichnung: this.bezeichnung
|
bezeichnung: this.bezeichnung
|
||||||
});
|
});
|
||||||
},
|
|
||||||
openInfos() {
|
|
||||||
if (!this.info) {
|
|
||||||
this.info = true;
|
|
||||||
// TODO(chris): load all this params on ajax?
|
|
||||||
LvInfo.popup({
|
|
||||||
lehrveranstaltung_id: this.lehrveranstaltung_id,
|
|
||||||
bezeichnung: this.bezeichnung,
|
|
||||||
bezeichnung_eng: this.bezeichnung_eng,
|
|
||||||
studiengang_kuerzel: this.studiengang_kuerzel,
|
|
||||||
semester: this.semester,
|
|
||||||
studien_semester: this.studien_semester,
|
|
||||||
orgform_kurzbz: this.orgform_kurzbz,
|
|
||||||
sprache: this.sprache,
|
|
||||||
ects: this.ects,
|
|
||||||
incoming: this.incoming
|
|
||||||
}).then(() => this.info = false).catch(() => this.info = false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch:{
|
|
||||||
studien_semester(newValue){
|
|
||||||
this.fetchMenu(this.lehrveranstaltung_id, newValue);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.$api
|
if(this.type == 'student') {
|
||||||
.call(ApiLehre.getStudentPruefungen(this.lehrveranstaltung_id))
|
this.$api
|
||||||
.then(res => res.data)
|
.call(ApiLehre.getStudentPruefungen(this.lehrveranstaltung_id))
|
||||||
.then(pruefungen => {
|
.then(res => res.data)
|
||||||
this.pruefungenData = pruefungen;
|
.then(pruefungen => {
|
||||||
});
|
this.pruefungenData = pruefungen;
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
template: /*html*/`
|
||||||
this.fetchMenu(this.lehrveranstaltung_id, this.studien_semester);
|
<div class="mylv-semester-studiengang-lv card">
|
||||||
},
|
|
||||||
template: /*html*/`<div class="mylv-semester-studiengang-lv card">
|
|
||||||
<lv-uebersicht ref="lvUebersicht" :preselectedMenu="preselectedMenuItem" :event="{
|
|
||||||
lehrveranstaltung_id: lehrveranstaltung_id,
|
|
||||||
studiensemester_kurzbz:studien_semester,
|
|
||||||
lehrfach_bez:studien_semester,
|
|
||||||
stg_kurzbzlang:studien_semester,
|
|
||||||
}"/>
|
|
||||||
|
|
||||||
<div class="p-2" :class="is_organisatorische_einheit?'':'card-header'">
|
<div class="p-2" :class="is_organisatorische_einheit?'':'card-header'">
|
||||||
<!-- {{module}} if the module of the lv is important then query the module from the api endpoint for LV-->
|
<!-- {{module}} if the module of the lv is important then query the module from the api endpoint for LV-->
|
||||||
<h6 class="fw-bold" v-if="is_organisatorische_einheit" >{{ $p.t('lehre/organisationseinheit') }}:</h6>
|
<h6 class="fw-bold" v-if="is_organisatorische_einheit" >{{ $p.t('lehre/organisationseinheit') }}:</h6>
|
||||||
<h6 class="mb-0">{{$p.user_language.value === 'English' ? bezeichnung_eng : bezeichnung}}</h6>
|
<h6 class="mb-0">{{$p.user_language.value === 'English' ? bezeichnung_eng : bezeichnung}}</h6>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!emptyMenu" class="card-body " :style="bodyStyle">
|
<div v-if="!emptyMenu" class="card-body ">
|
||||||
<template v-if="menu">
|
<template v-if="menu">
|
||||||
<ul class="list-group border-top-0 border-bottom-0 rounded-0">
|
<ul class="list-group border-top-0 border-bottom-0 rounded-0">
|
||||||
<li :type="menuItem.c4_link ? 'button' : null" v-for="menuItem in menu" class="list-group-item border-0 " >
|
<li :type="menuItem.c4_link ? 'button' : null"
|
||||||
<div class="d-flex flex-row" :data-bs-toggle="menuItem.c4_moodle_links?.length ? 'dropdown' : null">
|
v-for="(menuItem, index) in menu" :key="index" class="list-group-item border-0 " >
|
||||||
|
<div class="d-flex flex-row">
|
||||||
<div class="mx-4">
|
<div class="mx-4">
|
||||||
<i :class="[menuItem.c4_icon2 ? menuItem.c4_icon2 : 'fa-solid fa-pen-to-square', !menuItem.c4_link ? 'unavailable' : null ]"></i>
|
<i :class="[menuItem.c4_icon2 ? menuItem.c4_icon2 : 'fa-solid fa-pen-to-square', !menuItem.c4_link ? 'unavailable' : null ]"></i>
|
||||||
</div>
|
</div>
|
||||||
<a
|
<a :id="menuItem.name"
|
||||||
class="fhc-body text-decoration-none text-truncate"
|
class="fhc-body text-decoration-none text-truncate"
|
||||||
:id="'moodle_links_'+lehrveranstaltung_id"
|
:class="{ 'unavailable':!menuItem.c4_link }"
|
||||||
:class="{ 'unavailable':!menuItem.c4_link, 'dropdown-toggle':menuItem.c4_moodle_links?.length }"
|
|
||||||
:target="menuItem.c4_target"
|
:target="menuItem.c4_target"
|
||||||
:href="c4_link(menuItem) ? c4_link(menuItem) : null">
|
:href="c4_link(menuItem) ? c4_link(menuItem) : null">
|
||||||
{{ menuItem.phrase ? $p.t(menuItem.phrase) : menuItem.name}}
|
{{ menuItem.phrase ? $p.t(menuItem.phrase) : menuItem.name}}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<div v-if="(menuItem.c4_moodle_links?.length || menuItem.c4_linkList?.length) && menuItem.c4_link" class="dropdown">
|
||||||
|
<button
|
||||||
|
class="btn btn-sm dropdown-toggle dropdown-toggle-split border-0"
|
||||||
|
type="button"
|
||||||
|
data-bs-toggle="dropdown"
|
||||||
|
aria-expanded="false">
|
||||||
|
<span class="visually-hidden">Toggle Dropdown</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<ul v-if="menuItem.c4_moodle_links?.length" class="dropdown-menu dropdown-menu p-0">
|
||||||
|
<li v-for="item in menuItem.c4_moodle_links" :key="item.url">
|
||||||
|
<a class="dropdown-item border-bottom" :href="item.url" target="#">{{ item.lehrform }}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul v-else class="dropdown-menu dropdown-menu p-0">
|
||||||
|
<li v-for="([text, link], i) in menuItem.c4_linkList" :key="i">
|
||||||
|
<a class="dropdown-item border-bottom" :href="link" target="#">{{ text }}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<ul v-if="menuItem.c4_moodle_links?.length" class="dropdown-menu p-0" :aria-labelledby="'moodle_links_'+lehrveranstaltung_id">
|
|
||||||
<li v-for="item in menuItem.c4_moodle_links"><a class="dropdown-item border-bottom" :href="item.url">{{item.lehrform}}</a></li>
|
</div>
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</template>
|
</template>
|
||||||
@@ -204,7 +170,7 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!emptyMenu" class="card-footer">
|
<div v-if="!emptyMenu && type == 'student'" class="card-footer">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- template for the LV if there are multiple pruefungen -->
|
<!-- template for the LV if there are multiple pruefungen -->
|
||||||
<template v-if="LvHasPruefungenInformation">
|
<template v-if="LvHasPruefungenInformation">
|
||||||
@@ -222,5 +188,12 @@ export default {
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="!emptyMenu && type == 'employee'" class="card-footer">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-auto">
|
||||||
|
<span class="ps-1">{{ $p.t('lehre/semesterstunden') }}: {{ semesterstunden }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>`
|
</div>`
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,345 @@
|
|||||||
|
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'MylvTable',
|
||||||
|
components: {
|
||||||
|
CoreFilterCmpt
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
semester: [String],
|
||||||
|
lvs: Array,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
phrasenPromise: null,
|
||||||
|
phrasenResolved: false,
|
||||||
|
tabulatorUuid: null,
|
||||||
|
tableBuiltResolve: null,
|
||||||
|
tableBuiltPromise: null,
|
||||||
|
mylvTableOptions: {
|
||||||
|
height: Vue.ref(400),
|
||||||
|
index: 'lehrveranstaltung_id',
|
||||||
|
layout: 'fitDataStretch',
|
||||||
|
placeholder: this.$p.t('global/noDataAvailable'),
|
||||||
|
columns: [
|
||||||
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('lehre/studiengang'))), field: 'sg_bezeichnung', widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('global/bezeichnung'))), field: 'bezeichnung', widthGrow: 2},
|
||||||
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('lehre/orgform'))), field: 'orgform_kurzbz', widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('lehre/kurzbz'))), field: 'studiengang_kuerzel', widthGrow: 1},
|
||||||
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('lehre/semesterstunden'))), field: 'semesterstunden',
|
||||||
|
bottomCalc: this.semesterstundenCalc, widthGrow: 1, visible: false},
|
||||||
|
{title: Vue.computed(() => this.$capitalize(this.$p.t('global/actions'))), headerSort: false,
|
||||||
|
field: 'menu', formatter: this.actionFormatter, widthGrow: 1, tooltip: this.spoofingFunc}
|
||||||
|
],
|
||||||
|
persistence: false,
|
||||||
|
persistenceID: "mylv_2026_04_17"
|
||||||
|
},
|
||||||
|
mylvTableEventHandlers: [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
ready() { return this.lvs !== null; },
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
semesterstundenCalc(values, data) {
|
||||||
|
let sum = 0
|
||||||
|
values.forEach(val => {
|
||||||
|
sum += Number(val)
|
||||||
|
})
|
||||||
|
return sum
|
||||||
|
},
|
||||||
|
spoofingFunc() {
|
||||||
|
// intentionally send empty tooltip info so tabulator tooltip doesnt get rendered but hover event propagates
|
||||||
|
// to individual button tooltips
|
||||||
|
return ''
|
||||||
|
},
|
||||||
|
c4_link(menuItem) {
|
||||||
|
if (!menuItem) return null;
|
||||||
|
if (Array.isArray(menuItem.c4_moodle_links) && menuItem.c4_moodle_links.length) {
|
||||||
|
return '#';
|
||||||
|
} else {
|
||||||
|
return menuItem.c4_link ?? null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleUuidDefined(uuid) {
|
||||||
|
this.tabulatorUuid = uuid
|
||||||
|
},
|
||||||
|
tableResolve(resolve) {
|
||||||
|
this.tableBuiltResolve = resolve
|
||||||
|
},
|
||||||
|
actionFormatter(cell) {
|
||||||
|
let container = document.createElement('div');
|
||||||
|
container.className = "d-flex gap-2";
|
||||||
|
|
||||||
|
const data = cell.getData()
|
||||||
|
if(data.menu && data.menu.length) {
|
||||||
|
|
||||||
|
container.className = "d-flex flex-wrap gap-2"
|
||||||
|
|
||||||
|
data.menu.forEach((lvLink) => {
|
||||||
|
// render dropdown if we have a link and some some linklist
|
||||||
|
const hasDropdown = (lvLink.c4_moodle_links?.length || lvLink.c4_linkList?.length) && lvLink.c4_link;
|
||||||
|
|
||||||
|
if (hasDropdown) {
|
||||||
|
// button group
|
||||||
|
const group = document.createElement('div');
|
||||||
|
group.className = 'btn-group';
|
||||||
|
|
||||||
|
// main action button
|
||||||
|
const button= this.createActionButton(lvLink)
|
||||||
|
|
||||||
|
// toggle button
|
||||||
|
const toggle = document.createElement('button');
|
||||||
|
toggle.className = 'btn btn-sm dropdown-toggle dropdown-toggle-split border-0';
|
||||||
|
toggle.type = 'button';
|
||||||
|
toggle.dataset.bsToggle = 'dropdown'; // uses absolute position which gets clipped by tabulator
|
||||||
|
toggle.ariaExpanded = 'false';
|
||||||
|
toggle.innerHTML = '<span class="visually-hidden">Toggle Dropdown</span>';
|
||||||
|
|
||||||
|
// dropdown menu
|
||||||
|
const dropMenu = document.createElement('ul');
|
||||||
|
dropMenu.className = 'dropdown-menu dropdown-menu p-0';
|
||||||
|
|
||||||
|
// moodle links have priority to be dropdown items but both can be!
|
||||||
|
const items = lvLink.c4_moodle_links?.length
|
||||||
|
? lvLink.c4_moodle_links.map(item => ({ text: item.lehrform, href: item.url }))
|
||||||
|
: lvLink.c4_linkList.map(([text, link]) => ({ text, href: link }));
|
||||||
|
|
||||||
|
|
||||||
|
items.forEach(({ text, href }) => {
|
||||||
|
const li = document.createElement('li');
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.className = 'dropdown-item border-bottom';
|
||||||
|
a.href = href;
|
||||||
|
a.target = '#';
|
||||||
|
a.textContent = text;
|
||||||
|
li.appendChild(a);
|
||||||
|
dropMenu.appendChild(li);
|
||||||
|
});
|
||||||
|
|
||||||
|
group.appendChild(button);
|
||||||
|
group.appendChild(toggle);
|
||||||
|
group.appendChild(dropMenu);
|
||||||
|
container.appendChild(group);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
container.appendChild(this.createActionButton(lvLink));
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return container;
|
||||||
|
},
|
||||||
|
createActionButton(lvLink){
|
||||||
|
const button = document.createElement('a');
|
||||||
|
button.className = 'fhc-body text-decoration-none text-truncate';
|
||||||
|
if (!lvLink.c4_link) button.classList.add('unavailable');
|
||||||
|
button.id = `${lvLink.name}_${lvLink.lehrveranstaltung_id}`;
|
||||||
|
|
||||||
|
const icon = lvLink.c4_icon2 ?? 'fa-solid fa-pen-to-square';
|
||||||
|
const label = lvLink.phrase ? this.$p.t(lvLink.phrase) : lvLink.name;
|
||||||
|
button.title = label;
|
||||||
|
button.innerHTML = `<i class="${icon}"></i><span style="margin-left:2px;">${label}</span>`;
|
||||||
|
|
||||||
|
button.addEventListener('click', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
const url = this.c4_link(lvLink);
|
||||||
|
if (url) {
|
||||||
|
const target = lvLink.c4_target || '_blank';
|
||||||
|
if (target === '_blank') {
|
||||||
|
window.open(url, '_blank', 'noopener,noreferrer');
|
||||||
|
} else {
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.warn("Link is unavailable for:", lvLink.name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return button
|
||||||
|
},
|
||||||
|
loadState() {
|
||||||
|
return JSON.parse(localStorage.getItem(this.mylvTableOptions.persistenceID) || "null");
|
||||||
|
},
|
||||||
|
saveState(table) {
|
||||||
|
// avoid storing state after first restore part happened
|
||||||
|
if(!this.stateRestored) return
|
||||||
|
const rawLayout = table.getColumnLayout();
|
||||||
|
const state = {
|
||||||
|
columns: rawLayout.map(col => ({
|
||||||
|
field: col.field,
|
||||||
|
visible: col.visible,
|
||||||
|
width: col.width,
|
||||||
|
})),
|
||||||
|
sort: table.getSorters().map(s => ({
|
||||||
|
field: s.field,
|
||||||
|
dir: s.dir,
|
||||||
|
})),
|
||||||
|
filters: table.getFilters(),
|
||||||
|
headerFilters: table.getHeaderFilters()
|
||||||
|
};
|
||||||
|
|
||||||
|
localStorage.setItem(this.mylvTableOptions.persistenceID, JSON.stringify(state));
|
||||||
|
},
|
||||||
|
handleTableBuilt() {
|
||||||
|
const table = this.$refs.mylvTable.tabulator
|
||||||
|
|
||||||
|
this.tableBuiltResolve()
|
||||||
|
|
||||||
|
table.on("columnMoved", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("columnResized", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("columnVisibilityChanged", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("filterChanged", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("headerFilterChanged", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("dataSorted", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("columnSorted", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
table.on("sortersChanged", () => {
|
||||||
|
this.saveState(table);
|
||||||
|
});
|
||||||
|
|
||||||
|
const saved = this.loadState();
|
||||||
|
|
||||||
|
table.on("renderComplete", () => {
|
||||||
|
if(!this.stateRestored) {
|
||||||
|
|
||||||
|
if (saved?.columns && !this.colLayoutRestored) {
|
||||||
|
const layout = saved.columns.map(col => ({
|
||||||
|
field: col.field,
|
||||||
|
width: col.width,
|
||||||
|
visible: col.visible,
|
||||||
|
// add more if needed, but keep it simple
|
||||||
|
}));
|
||||||
|
|
||||||
|
table.setColumnLayout(layout);
|
||||||
|
|
||||||
|
this.colLayoutRestored = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (saved?.filters && !this.filtersRestored) {
|
||||||
|
this.filtersRestored = true // instantly avoid retriggers
|
||||||
|
table.setFilter(saved.filters);
|
||||||
|
}
|
||||||
|
if (saved?.headerFilters && !this.headerFiltersRestored) {
|
||||||
|
this.headerFiltersRestored = true // instantly avoid retriggers
|
||||||
|
for (let hf of saved.headerFilters) {
|
||||||
|
table.setHeaderFilterValue(hf.field, hf.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (saved?.sort?.length && !this.sortRestored) {
|
||||||
|
this.sortRestored = true;
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
const sortList = saved.sort.map(s => {
|
||||||
|
const col = table.columnManager.findColumn(s.field);
|
||||||
|
if (!col) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { column: col, dir: s.dir };
|
||||||
|
}).filter(Boolean);
|
||||||
|
|
||||||
|
table.setSort(sortList);
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
this.stateRestored = true
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
},
|
||||||
|
async setupData() {
|
||||||
|
this.$refs.mylvTable.tabulator.setData(this.lvs);
|
||||||
|
},
|
||||||
|
async setupMounted() {
|
||||||
|
this.tableBuiltPromise = new Promise(this.tableResolve)
|
||||||
|
await this.tableBuiltPromise
|
||||||
|
|
||||||
|
this.setupData()
|
||||||
|
|
||||||
|
const tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''
|
||||||
|
const tableDataSet = document.getElementById('filterTableDataset' + tableID);
|
||||||
|
if(!tableDataSet) return
|
||||||
|
const rect = tableDataSet.getBoundingClientRect();
|
||||||
|
|
||||||
|
const h = window.visualViewport.height - rect.top - 50
|
||||||
|
if(this.$refs.mylvTable) {
|
||||||
|
this.$refs.mylvTable.$refs.table.style.setProperty('height', h+'px')
|
||||||
|
|
||||||
|
// necessary so the wrapping action row resolves to the full rowHeight required
|
||||||
|
// without the redraw here actions past the initial rowHeight would be clipped off
|
||||||
|
this.$refs.mylvTable.tabulator.redraw(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.phrasenPromise = this.$p.loadCategory(['global', 'lehre', 'lvinfo'])
|
||||||
|
this.phrasenPromise.then(()=> {this.phrasenResolved = true})
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.setupMounted()
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
lvs: {
|
||||||
|
async handler(newVal) {
|
||||||
|
await this.tableBuiltPromise;
|
||||||
|
if(!this.$refs.mylvTable?.tabulator) return
|
||||||
|
|
||||||
|
this.$refs.mylvTable.tabulator.setData(newVal);
|
||||||
|
|
||||||
|
const tableID = this.tabulatorUuid ? ('-' + this.tabulatorUuid) : ''
|
||||||
|
const tableDataSet = document.getElementById('filterTableDataset' + tableID);
|
||||||
|
if(!tableDataSet) return
|
||||||
|
const rect = tableDataSet.getBoundingClientRect();
|
||||||
|
|
||||||
|
const h = window.visualViewport.height - rect.top - 50
|
||||||
|
if(this.$refs.mylvTable) {
|
||||||
|
this.$refs.mylvTable.$refs.table.style.setProperty('height', h+'px')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
template: `
|
||||||
|
<div class="mylv-semester-table" v-if="ready">
|
||||||
|
<core-filter-cmpt
|
||||||
|
v-if="phrasenResolved"
|
||||||
|
@uuidDefined="handleUuidDefined"
|
||||||
|
:title="''"
|
||||||
|
ref="mylvTable"
|
||||||
|
:tabulator-options="mylvTableOptions"
|
||||||
|
:tabulator-events="mylvTableEventHandlers"
|
||||||
|
@tableBuilt="handleTableBuilt"
|
||||||
|
tableOnly
|
||||||
|
:sideMenu="false"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div v-if="tabulatorUuid === null" class="text-center d-flex justify-content-center align-items-center h-100" >
|
||||||
|
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
};
|
||||||
@@ -70,8 +70,8 @@ export const Raumsuche = {
|
|||||||
handler: async () => {
|
handler: async () => {
|
||||||
this.tableBuiltResolve()
|
this.tableBuiltResolve()
|
||||||
}
|
}
|
||||||
}
|
}]
|
||||||
]};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
tableResolve(resolve) {
|
tableResolve(resolve) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import LvUebersicht from "../Mylv/LvUebersicht.js";
|
|||||||
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'Studium',
|
||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
studienSemester :[],
|
studienSemester :[],
|
||||||
|
|||||||
Reference in New Issue
Block a user