mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-02 04:39:28 +00:00
MyLv
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class MyLv extends Auth_Controller
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'index' => 'student/anrechnung_beantragen:r' // TODO(chris): permissions?
|
||||
]);
|
||||
|
||||
// Loads phrases system
|
||||
$this->loadPhrases([
|
||||
'global'
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->load->view('Cis/MyLv');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,216 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
* This controller operates between (interface) the JS (GUI) and the FilterCmptLib (back-end)
|
||||
* Provides data to the ajax get calls about the filter component
|
||||
* Listens to ajax post calls to change the filter data
|
||||
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
|
||||
* NOTE: extends the FHC_Controller instead of the Auth_Controller because the FilterCmpt has its
|
||||
* own permissions check
|
||||
*/
|
||||
class Mylv extends Auth_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'Student' => 'student/anrechnung_beantragen:r', // TODO(chris): permissions?
|
||||
'Studiensemester' => 'student/anrechnung_beantragen:r', // TODO(chris): permissions?
|
||||
'Lvs' => 'student/anrechnung_beantragen:r', // TODO(chris): permissions?
|
||||
'Info' => 'student/anrechnung_beantragen:r', // TODO(chris): permissions?
|
||||
'Pruefungen' => 'student/anrechnung_beantragen:r' // TODO(chris): permissions?
|
||||
]);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
*/
|
||||
public function Student()
|
||||
{
|
||||
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
|
||||
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(get_uid());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function Studiensemester()
|
||||
{
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$result = $this->StudiensemesterModel->getWhereStudentHasLvs(get_uid());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function Lvs($studiensemester_kurzbz)
|
||||
{
|
||||
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
|
||||
$result = $this->LehrveranstaltungModel->getLvsByStudentWithGrades(get_uid(), $studiensemester_kurzbz, getUserLanguage());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function Info($studiensemester_kurzbz, $lehrveranstaltung_id)
|
||||
{
|
||||
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
|
||||
$result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id);
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
$lv = current(getData($result) ?: []);
|
||||
|
||||
if (!$lv)
|
||||
return $this->outputJsonError('Could\'t find Lehrveranstaltung with id: ' . $lehrveranstaltung_id);
|
||||
|
||||
|
||||
$this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel');
|
||||
|
||||
$result = $this->LehreinheitmitarbeiterModel->getForLv($lehrveranstaltung_id, $studiensemester_kurzbz);
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$lvinfo = [];
|
||||
$lvinfo['lektoren'] = getData($result) ?: [];
|
||||
|
||||
$kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER);
|
||||
$lvinfo['lektoren'] = array_values(array_filter($lvinfo['lektoren'], function ($v) use ($kollisionsfreie_user) {
|
||||
return !in_array($v->uid, $kollisionsfreie_user);
|
||||
}));
|
||||
|
||||
$lvinfo['lvLeitung'] = array_values(array_filter($lvinfo['lektoren'], function ($v) {
|
||||
return $v->lehrfunktion_kurzbz == 'LV-Leitung';
|
||||
}));
|
||||
|
||||
|
||||
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
|
||||
$result = $this->OrganisationseinheitModel->getWithType($lv->oe_kurzbz);
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$lvinfo['oe'] = current(getData($result) ?: []);
|
||||
|
||||
|
||||
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||
$result = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('Leitung', $lv->oe_kurzbz);
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$lvinfo['oeLeitung'] = getData($result) ?: [];
|
||||
|
||||
|
||||
$result = $this->LehrveranstaltungModel->getKoordinator($lehrveranstaltung_id, $studiensemester_kurzbz);
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$lvinfo['koordinator'] = getData($result) ?: [];
|
||||
|
||||
if (defined('ACTIVE_ADDONS') && in_array('lvinfo', explode(';', ACTIVE_ADDONS)) && file_exists(FHCPATH . 'addons/lvinfo/include/lvinfo.class.php'))
|
||||
{
|
||||
require_once(FHCPATH . 'addons/lvinfo/include/lvinfo.class.php');
|
||||
$lvinfoObj = new lvinfo();
|
||||
$lvinfoObj->loadLVinfo($lehrveranstaltung_id, $studiensemester_kurzbz, null, true);
|
||||
if (is_array($lvinfoObj->result))
|
||||
{
|
||||
$oldP = property_exists($this, 'p') ? $this->p : null;
|
||||
$result = [];
|
||||
$lvinfos = $lvinfoObj->result;
|
||||
$lvinfoSet = new lvinfo();
|
||||
$lvinfoSet->load_lvinfo_set($studiensemester_kurzbz);
|
||||
foreach ($lvinfos as $lvi)
|
||||
{
|
||||
$this->p = null;
|
||||
$this->loadPhrases('ui', $lvi->sprache);
|
||||
$result[$lvi->sprache] = [];
|
||||
foreach ($lvinfoSet->result as $set)
|
||||
{
|
||||
$key = $set->lvinfo_set_kurzbz;
|
||||
if (!isset($lvi->data[$key]))
|
||||
continue;
|
||||
$info['header'] = $set->lvinfo_set_bezeichnung[$lvi->sprache];
|
||||
if (isset($set->einleitungstext[$lvi->sprache]))
|
||||
$info['subheader'] = $set->einleitungstext[$lvi->sprache];
|
||||
switch ($set->lvinfo_set_typ)
|
||||
{
|
||||
case 'boolean':
|
||||
$info['body'] = $this->p->t('ui', $lvi->data[$key] === true ? 'ja' : 'nein');
|
||||
break;
|
||||
case 'array':
|
||||
$info['body'] = array_map('htmlspecialchars', $lvi->data[$key]);
|
||||
break;
|
||||
case 'editor':
|
||||
$info['body'] = $lvi->data[$key];
|
||||
break;
|
||||
default:
|
||||
$info['body'] = htmlspecialchars($lvi->data[$key]);
|
||||
}
|
||||
if ($info['body'])
|
||||
$result[$lvi->sprache][] = $info;
|
||||
}
|
||||
}
|
||||
if ($result)
|
||||
{
|
||||
$lvinfo['lvinfo'] = $result;
|
||||
$lvinfo['lvinfoDefaultLang'] = getUserLanguage();
|
||||
|
||||
$this->load->model('system/Sprache_model', 'SpracheModel');
|
||||
$result = $this->SpracheModel->loadMultiple(array_keys($result));
|
||||
if (!isError($result))
|
||||
{
|
||||
$result = getData($result);
|
||||
$lvinfo['sprachen'] = [];
|
||||
foreach ($result as $sprache) {
|
||||
$lvinfo['sprachen'][$sprache->sprache] = $sprache;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->p = $oldP;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->outputJsonSuccess($lvinfo);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function Pruefungen($lehrveranstaltung_id)
|
||||
{
|
||||
$this->load->model('education/Pruefung_model', 'PruefungModel');
|
||||
|
||||
$result = $this->PruefungModel->getByStudentAndLv(get_uid(), $lehrveranstaltung_id, getUserLanguage());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Phrasen extends FHC_Controller
|
||||
{
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* @param string $module
|
||||
*/
|
||||
public function LoadModule($module)
|
||||
{
|
||||
$this->load->library('PhrasesLib', [$module], 'pj');
|
||||
$this->outputJsonSuccess(json_decode($this->pj->getJSON()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -41,4 +41,38 @@ class Lehreinheitmitarbeiter_model extends DB_Model
|
||||
return error ('Incorrect parameter type');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $lehrveranstaltung_id
|
||||
* @param string $studiensemester_kurzbz
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getForLv($lehrveranstaltung_id, $studiensemester_kurzbz)
|
||||
{
|
||||
$this->addSelect('ma.uid, ma.vorname, ma.nachname, ma.titelpre, ma.titelpost, lehrfunktion_kurzbz');
|
||||
$this->addGroupBy('ma.uid, ma.vorname, ma.nachname, ma.titelpre, ma.titelpost, lehrfunktion_kurzbz');
|
||||
|
||||
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
|
||||
$this->addJoin('campus.vw_mitarbeiter ma', $this->dbTable . '.mitarbeiter_uid=ma.uid');
|
||||
|
||||
$this->addOrder('nachname');
|
||||
$this->addOrder('vorname');
|
||||
|
||||
if (defined('CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON') && CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON != '')
|
||||
{
|
||||
$this->addJoin('(SELECT vertrag_id, CASE WHEN vertragsstatus_kurzbz=\'storno\' THEN 0 WHEN vertragsstatus_kurzbz=\'erteilt\' THEN 1 ELSE 2 END AS vertragsstatus_kurzbz FROM lehre.tbl_vertrag_vertragsstatus) v', 'vertrag_id', 'LEFT');
|
||||
$having = $this->db->compile_binds('(EXISTS (SELECT 1 FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=? AND tbl_studiensemester.start < (SELECT start FROM public.tbl_studiensemester stsem WHERE stsem.studiensemester_kurzbz=?)) OR MIN(vertragsstatus_kurzbz)=1)', [
|
||||
$studiensemester_kurzbz,
|
||||
CIS_LV_LEKTORINNENZUTEILUNG_VERTRAGSPRUEFUNG_VON
|
||||
]);
|
||||
$this->db->having($having);
|
||||
}
|
||||
|
||||
return $this->loadWhere([
|
||||
'lehrveranstaltung_id' => $lehrveranstaltung_id,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -231,6 +231,104 @@ class Lehrveranstaltung_model extends DB_Model
|
||||
return $this->execQuery($qry, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets Lehrveranstaltungen of a student with grades if available
|
||||
*
|
||||
* @param string $student_uid
|
||||
* @param string $studiensemester_kurzbz
|
||||
* @param string|null $sprache
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getLvsByStudentWithGrades($student_uid, $studiensemester_kurzbz, $sprache = null)
|
||||
{
|
||||
if ($sprache) {
|
||||
$sprache_qry = $this->db->compile_binds('SELECT index FROM public.tbl_sprache WHERE sprache = ?', [$sprache]);
|
||||
$bezeichnung = 'bezeichnung_mehrsprachig[(' . $sprache_qry . ')]';
|
||||
$sgbezeichnung = $sprache == 'English' ? 'COALESCE(sg.english, sg.bezeichnung)' : 'sg.bezeichnung';
|
||||
$lvbezeichnung = $sprache == 'English' ? 'COALESCE(v.bezeichnung_english, v.bezeichnung)' : 'v.bezeichnung';
|
||||
} else {
|
||||
$bezeichnung = 'bezeichnung';
|
||||
$sgbezeichnung = 'sg.bezeichnung';
|
||||
$lvbezeichnung = 'v.bezeichnung';
|
||||
}
|
||||
|
||||
$this->addDistinct();
|
||||
// TODO(chris): selects
|
||||
/*
|
||||
semester (?)
|
||||
module
|
||||
bezeichnung
|
||||
sg_bezeichnung
|
||||
studiengang_kuerzel
|
||||
lvnote
|
||||
znote
|
||||
studiengang_kz
|
||||
lehrveranstaltung_id
|
||||
benotung
|
||||
lvinfo
|
||||
farbe
|
||||
|
||||
sprache (?)
|
||||
ects (?)
|
||||
incoming (?)
|
||||
orgform_kurzbz (?)
|
||||
*/
|
||||
// TODO(chris): module or kf
|
||||
#$this->addSelect($this->dbTable . '.*');
|
||||
$this->addSelect('v.*');
|
||||
$this->addSelect($this->dbTable . '.benotung');
|
||||
$this->addSelect($this->dbTable . '.lvinfo');
|
||||
$this->addSelect($this->dbTable . '.farbe');
|
||||
$this->addSelect($this->dbTable . '.incoming');
|
||||
$this->addSelect($this->dbTable . '.orgform_kurzbz');
|
||||
$this->addSelect('v.studiengang_kz');
|
||||
$this->addSelect('v.lehrveranstaltung_id');
|
||||
$this->addSelect('v.semester');
|
||||
|
||||
$this->addSelect('v.sprache');
|
||||
$this->addSelect('v.ects');
|
||||
|
||||
#$this->addSelect('splv.module');
|
||||
$this->addSelect($lvbezeichnung . ' AS bezeichnung');
|
||||
$this->addSelect($sgbezeichnung . ' AS sg_bezeichnung');
|
||||
$this->addSelect('UPPER(sg.typ::VARCHAR(1) || sg.kurzbz) AS studiengang_kuerzel');
|
||||
|
||||
$this->addSelect('COALESCE(gnn.' . $bezeichnung . ', gnn.bezeichnung, gn.note::text) AS lvnote');
|
||||
$this->addSelect('COALESCE(znn.' . $bezeichnung . ', znn.bezeichnung, zn.note::text) AS znote');
|
||||
|
||||
$this->addJoin('campus.vw_student_lehrveranstaltung v', 'lehrveranstaltung_id');
|
||||
$this->addJoin('public.tbl_studiengang sg', $this->dbTable . '.studiengang_kz = sg.studiengang_kz');
|
||||
$this->db->where("v.lehreverzeichnis<>''");
|
||||
|
||||
$this->addJoin('campus.tbl_lvgesamtnote gn', 'gn.lehrveranstaltung_id=v.lehrveranstaltung_id AND gn.student_uid=v.uid AND gn.studiensemester_kurzbz=v.studiensemester_kurzbz', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_note gnn', 'gn.note=gnn.note', 'LEFT');
|
||||
|
||||
$this->addJoin('lehre.tbl_zeugnisnote zn', 'zn.lehrveranstaltung_id=v.lehrveranstaltung_id AND zn.student_uid=v.uid AND zn.studiensemester_kurzbz=v.studiensemester_kurzbz', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_note znn', 'zn.note=znn.note', 'LEFT');
|
||||
|
||||
/*if (!defined("CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN") || !CIS_PROFIL_STUDIENPLAN_MODULE_AUSBLENDEN) {
|
||||
$modulebezeichnung = str_replace('v.', 'm.', $lvbezeichnung);
|
||||
$modulesql = '
|
||||
LEFT JOIN lehre.tbl_studienplan_lehrveranstaltung p ON(lv.studienplan_lehrveranstaltung_id_parent=p.studienplan_lehrveranstaltung_id)
|
||||
LEFT JOIN lehre.tbl_lehrveranstaltung m ON(m.lehrveranstaltung_id = p.lehrveranstaltung_id)';
|
||||
} else {
|
||||
$modulebezeichnung = 'NULL';
|
||||
$modulesql = '';
|
||||
}
|
||||
|
||||
$this->addJoin('(
|
||||
SELECT lv.lehrveranstaltung_id, sps.studiensemester_kurzbz, so.studiengang_kz, lv.semester, ' . $modulebezeichnung . ' AS module
|
||||
FROM lehre.tbl_studienplan_lehrveranstaltung lv
|
||||
LEFT JOIN lehre.tbl_studienplan sp ON(sp.studienplan_id=lv.studienplan_id)
|
||||
JOIN lehre.tbl_studienplan_semester sps ON(sp.studienplan_id=sps.studienplan_id AND sps.semester=lv.semester)
|
||||
JOIN lehre.tbl_studienordnung so ON(so.studienordnung_id=sp.studienordnung_id)
|
||||
' . $modulesql . '
|
||||
) splv', 'splv.lehrveranstaltung_id=v.lehrveranstaltung_id AND splv.studiensemester_kurzbz=v.studiensemester_kurzbz AND splv.studiengang_kz=v.studiengang_kz', 'LEFT');*/
|
||||
|
||||
return $this->loadWhere(['v.uid' => $student_uid, 'v.lehre' => true, 'v.studiensemester_kurzbz' => $studiensemester_kurzbz]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets valid Lehrveranstaltungen with incoming places for a Studiensemester.
|
||||
* Only
|
||||
@@ -471,4 +569,76 @@ class Lehrveranstaltung_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, array($student_uid));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $lehrveranstaltung_id
|
||||
* @param string $studiensemester_kurzbz
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getKoordinator($lehrveranstaltung_id, $studiensemester_kurzbz = null)
|
||||
{
|
||||
$binds = [
|
||||
$lehrveranstaltung_id,
|
||||
$lehrveranstaltung_id,
|
||||
$lehrveranstaltung_id,
|
||||
$lehrveranstaltung_id
|
||||
];
|
||||
$qry = "
|
||||
SELECT
|
||||
a.uid, vorname, nachname, titelpre, titelpost
|
||||
FROM (
|
||||
SELECT
|
||||
koordinator as uid
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
WHERE
|
||||
lehrveranstaltung_id = ?
|
||||
UNION
|
||||
SELECT
|
||||
uid
|
||||
FROM
|
||||
lehre.tbl_lehreinheit
|
||||
JOIN lehre.tbl_lehrveranstaltung AS lehrfach ON(tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id)
|
||||
JOIN public.tbl_fachbereich ON(lehrfach.oe_kurzbz=tbl_fachbereich.oe_kurzbz)
|
||||
JOIN public.tbl_benutzerfunktion ON(tbl_fachbereich.fachbereich_kurzbz=tbl_benutzerfunktion.fachbereich_kurzbz)
|
||||
WHERE
|
||||
tbl_benutzerfunktion.funktion_kurzbz='fbk'
|
||||
AND (tbl_benutzerfunktion.datum_von IS null OR tbl_benutzerfunktion.datum_von <= now())
|
||||
AND (tbl_benutzerfunktion.datum_bis IS null OR tbl_benutzerfunktion.datum_bis >= now())
|
||||
AND tbl_lehreinheit.lehrveranstaltung_id = ?
|
||||
AND tbl_benutzerfunktion.oe_kurzbz = (
|
||||
SELECT
|
||||
tbl_studiengang.oe_kurzbz
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
JOIN public.tbl_studiengang USING(studiengang_kz)
|
||||
WHERE lehrveranstaltung_id = ?
|
||||
)
|
||||
AND EXISTS (
|
||||
SELECT
|
||||
lehrveranstaltung_id
|
||||
FROM
|
||||
lehre.tbl_lehrveranstaltung
|
||||
WHERE
|
||||
lehrveranstaltung_id = ?
|
||||
AND koordinator IS null
|
||||
)
|
||||
";
|
||||
|
||||
if ($studiensemester_kurzbz !== null)
|
||||
{
|
||||
$qry .= " AND tbl_lehreinheit.studiensemester_kurzbz = ?";
|
||||
$binds[] = $studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry .= "
|
||||
) AS a
|
||||
JOIN campus.vw_mitarbeiter ON(a.uid=vw_mitarbeiter.uid)
|
||||
WHERE vw_mitarbeiter.aktiv
|
||||
";
|
||||
|
||||
return $this->execQuery($qry, $binds);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -36,4 +36,34 @@ class Pruefung_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets Pruefungen of a student for a Lehrveranstaltung.
|
||||
*
|
||||
* @param string $uid
|
||||
* @param string $lehrveranstaltung_id
|
||||
* @param string|null $lehrveranstaltung_id
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getByStudentAndLv($uid, $lehrveranstaltung_id, $sprache = null)
|
||||
{
|
||||
$this->dbTable = 'lehre.tbl_pruefung';
|
||||
|
||||
if ($sprache) {
|
||||
$sprache_qry = $this->db->compile_binds('SELECT index FROM public.tbl_sprache WHERE sprache = ?', [$sprache]);
|
||||
$bezeichnung = 'bezeichnung_mehrsprachig[(' . $sprache_qry . ')]';
|
||||
} else {
|
||||
$bezeichnung = 'bezeichnung';
|
||||
}
|
||||
|
||||
$this->addSelect($this->dbTable . '.pruefung_id, ' . $this->dbTable . '.pruefungstyp_kurzbz, ' . $this->dbTable . '.datum, COALESCE(n.' . $bezeichnung . ', n.note::text) AS note');
|
||||
|
||||
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
|
||||
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||
$this->addJoin('lehre.tbl_note n', 'note');
|
||||
|
||||
return $this->loadWhere(['lehrveranstaltung_id' => $lehrveranstaltung_id, 'student_uid' => $uid]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -188,4 +188,18 @@ class Organisationseinheit_model extends DB_Model
|
||||
}
|
||||
return $this->loadWhere($condition);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $oe_kurzbz
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getWithType($oe_kurzbz)
|
||||
{
|
||||
$this->addSelect($this->dbTable . '.*, t.bezeichnung AS organisationseinheittyp');
|
||||
$this->addJoin('public.tbl_organisationseinheittyp t', 'organisationseinheittyp_kurzbz');
|
||||
|
||||
return $this->load($oe_kurzbz);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -204,4 +204,22 @@ class Studiensemester_model extends DB_Model
|
||||
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $student_uid
|
||||
*
|
||||
* @return StdClass
|
||||
*/
|
||||
public function getWhereStudentHasLvs($student_uid)
|
||||
{
|
||||
$this->addDistinct();
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
|
||||
$this->addJoin('campus.vw_student_lehrveranstaltung v', 'studiensemester_kurzbz');
|
||||
$this->db->where("v.lehreverzeichnis<>''");
|
||||
|
||||
$this->addOrder($this->dbTable . '.start');
|
||||
|
||||
return $this->loadWhere(['uid' => $student_uid, 'v.lehre' => true]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,4 +11,19 @@ class Sprache_model extends DB_Model
|
||||
$this->dbTable = 'public.tbl_sprache';
|
||||
$this->pk = 'sprache';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $sprachen
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function loadMultiple($sprachen)
|
||||
{
|
||||
$this->db->where_in('sprache', $sprachen);
|
||||
|
||||
$this->addOrder('index');
|
||||
|
||||
return $this->load();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
$includesArray = array(
|
||||
'customJSModules' => ['public/js/apps/Cis/MyLv/Student.js'],
|
||||
'customCSSs' => [
|
||||
'public/css/components/dashboard.css'
|
||||
]
|
||||
);
|
||||
|
||||
$this->load->view('templates/CISHTML-Header', $includesArray);
|
||||
?>
|
||||
|
||||
<div id="content">
|
||||
<h2>MyLv</h2>
|
||||
<hr>
|
||||
<mylv-student></mylv-student>
|
||||
<?php $studiengaenge = [];foreach ($studiengaenge as $studiengang) { ?>
|
||||
<h3><?= $studiengang['bezeichnung'] . ' - ' . $studiengang['studiengang_kz']; ?></h3>
|
||||
<?php foreach ($studiengang['semester'] as $semester) { ?>
|
||||
<h4><?= implode(",", array_keys($semester['studiensemester_kurzbz'])); ?>, <?= $semester['semester']; ?>.Semester</h4>
|
||||
<?php foreach ($semester['lvs'] as $lv) { ?>
|
||||
<!-- lehrveranstaltung_id: <?= $lv->lehrveranstaltung_id; ?><br>
|
||||
kurzbz: <?= $lv->kurzbz; ?><br> -->
|
||||
bezeichnung: <?= $lv->bezeichnung; ?><br>
|
||||
<!-- studiengang_kz: <?= $lv->studiengang_kz; ?><br>
|
||||
semester: <?= $lv->semester; ?><br>
|
||||
sprache: <?= $lv->sprache; ?><br>
|
||||
ects: <?= $lv->ects; ?><br>
|
||||
semesterstunden: <?= $lv->semesterstunden; ?><br>
|
||||
anmerkung: <?= $lv->anmerkung; ?><br>
|
||||
lehre: <?= $lv->lehre; ?><br>
|
||||
lehreverzeichnis: <?= $lv->lehreverzeichnis; ?><br>
|
||||
aktiv: <?= $lv->aktiv; ?><br>
|
||||
planfaktor: <?= $lv->planfaktor; ?><br>
|
||||
planlektoren: <?= $lv->planlektoren; ?><br>
|
||||
planpersonalkosten: <?= $lv->planpersonalkosten; ?><br>
|
||||
plankostenprolektor: <?= $lv->plankostenprolektor; ?><br>
|
||||
ext_id: <?= $lv->ext_id; ?><br>
|
||||
sort: <?= $lv->sort; ?><br>
|
||||
zeugnis: <?= $lv->zeugnis; ?><br>
|
||||
koordinator: <?= $lv->koordinator; ?><br>
|
||||
projektarbeit: <?= $lv->projektarbeit; ?><br>
|
||||
lehrform_kurzbz: <?= $lv->lehrform_kurzbz; ?><br>
|
||||
bezeichnung_english: <?= $lv->bezeichnung_english; ?><br>
|
||||
orgform_kurzbz: <?= $lv->orgform_kurzbz; ?><br>
|
||||
incoming: <?= $lv->incoming; ?><br>
|
||||
lehrtyp_kurzbz: <?= $lv->lehrtyp_kurzbz; ?><br>
|
||||
oe_kurzbz: <?= $lv->oe_kurzbz; ?><br>
|
||||
raumtyp_kurzbz: <?= $lv->raumtyp_kurzbz; ?><br>
|
||||
anzahlsemester: <?= $lv->anzahlsemester; ?><br>
|
||||
semesterwochen: <?= $lv->semesterwochen; ?><br>
|
||||
lvnr: <?= $lv->lvnr; ?><br>
|
||||
semester_alternativ: <?= $lv->semester_alternativ; ?><br>
|
||||
farbe: <?= $lv->farbe; ?><br>
|
||||
old_lehrfach_id: <?= $lv->old_lehrfach_id; ?><br>
|
||||
sws: <?= $lv->sws; ?><br>
|
||||
lvs: <?= $lv->lvs; ?><br>
|
||||
alvs: <?= $lv->alvs; ?><br>
|
||||
lvps: <?= $lv->lvps; ?><br>
|
||||
las: <?= $lv->las; ?><br>
|
||||
benotung: <?= $lv->benotung; ?><br>
|
||||
lvinfo: <?= $lv->lvinfo; ?><br>
|
||||
lehrauftrag: <?= $lv->lehrauftrag; ?><br>
|
||||
lehrmodus_kurzbz: <?= $lv->lehrmodus_kurzbz; ?><br>
|
||||
lehrveranstaltung_template_id: <?= $lv->lehrveranstaltung_template_id; ?><br>
|
||||
uid: <?= $lv->uid; ?><br>
|
||||
lehreinheit_id: <?= $lv->lehreinheit_id; ?><br> -->
|
||||
studiensemester_kurzbz: <?= $lv->studiensemester_kurzbz; ?><br>
|
||||
<!-- lehrfach_id: <?= $lv->lehrfach_id; ?><br>
|
||||
stundenblockung: <?= $lv->stundenblockung; ?><br>
|
||||
wochenrythmus: <?= $lv->wochenrythmus; ?><br>
|
||||
start_kw: <?= $lv->start_kw; ?><br>
|
||||
raumtyp: <?= $lv->raumtyp; ?><br>
|
||||
raumtypalternativ: <?= $lv->raumtypalternativ; ?><br>
|
||||
lv_lehrform_kurzbz: <?= $lv->lv_lehrform_kurzbz; ?><br> -->
|
||||
<?php } ?>
|
||||
<hr>
|
||||
<?php } ?>
|
||||
<hr>
|
||||
<?php } ?>
|
||||
</div>
|
||||
|
||||
<?php $this->load->view('templates/CISHTML-Footer', $includesArray); ?>
|
||||
@@ -0,0 +1,7 @@
|
||||
import MylvStudent from "../../../components/Cis/Mylv/Student.js";
|
||||
|
||||
Vue.createApp({
|
||||
components: {
|
||||
MylvStudent
|
||||
}
|
||||
}).mount('#content');
|
||||
@@ -0,0 +1,44 @@
|
||||
import MylvSemesterStudiengang from "./Semester/Studiengang.js";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
MylvSemesterStudiengang
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
studien_semester: this.semester
|
||||
}
|
||||
},
|
||||
props: {
|
||||
semester: String,
|
||||
lvs: Array
|
||||
},
|
||||
computed: {
|
||||
ready() { return this.lvs !== null; },
|
||||
studiengaenge() {
|
||||
return [... new Map(
|
||||
this.lvs
|
||||
.map(lv => [
|
||||
lv.studiengang_kz + '#' + lv.semester,
|
||||
{
|
||||
studiengang_kz: lv.studiengang_kz,
|
||||
bezeichnung: lv.sg_bezeichnung,
|
||||
kuerzel: lv.studiengang_kuerzel,
|
||||
semester: lv.semester
|
||||
}
|
||||
])
|
||||
).values()].sort((a, b) => a.bezeichnung.toLowerCase() == b.bezeichnung.toLowerCase() ? a.semester > b.semester : a.bezeichnung.toLowerCase() > b.bezeichnung.toLowerCase());
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
lvsForStudiengang(studiengang) {
|
||||
return this.lvs.filter(lv => lv.studiengang_kz == studiengang.studiengang_kz && lv.semester == studiengang.semester);
|
||||
}
|
||||
},
|
||||
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)"/>
|
||||
</div>
|
||||
<div class="mylv-semester text-center" v-else>
|
||||
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||
</div>`
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
import MylvSemesterStudiengangLv from "./Studiengang/Lv.js";
|
||||
import Phrasen from "../../../../mixins/Phrasen.js";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
MylvSemesterStudiengangLv
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
props: {
|
||||
bezeichnung: String,
|
||||
kuerzel: String,
|
||||
semester: Number,
|
||||
lvs: Array
|
||||
},
|
||||
computed: {
|
||||
lehrveranstaltungen() {
|
||||
return [... new Map(
|
||||
this.lvs
|
||||
.map(lv => [
|
||||
lv.lehrveranstaltung_id,
|
||||
lv
|
||||
])
|
||||
).values()]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
note(lv) {
|
||||
return lv.benotung ? lv.znote || lv.lvnote || null : null;
|
||||
}
|
||||
},
|
||||
template: `<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h4 class="card-title mb-3">{{bezeichnung}} - {{kuerzel}}
|
||||
<small>{{semester}}.{{p.t('lehre/semester')}}</small>
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div v-for="lv in lehrveranstaltungen" :key="lv.lehrveranstaltung_id" class="col-sm-4 mb-3">
|
||||
<mylv-semester-studiengang-lv v-bind="lv" class="text-center h-100"></mylv-semester-studiengang-lv>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`
|
||||
};
|
||||
@@ -0,0 +1,89 @@
|
||||
import LvPruefungen from "./Lv/Pruefungen.js";
|
||||
import LvInfo from "./Lv/Info.js";
|
||||
|
||||
// TODO(chris): L10n
|
||||
|
||||
export default {
|
||||
inject: ['studien_semester'],
|
||||
props: {
|
||||
lehrveranstaltung_id: Number,
|
||||
bezeichnung: String,
|
||||
module: String,
|
||||
farbe: String,
|
||||
lvinfo: Boolean,
|
||||
benotung: Boolean,
|
||||
lvnote: String,
|
||||
znote: String,
|
||||
studiengang_kuerzel: String,
|
||||
semester: String,
|
||||
orgform_kurzbz: String,
|
||||
sprache: String,
|
||||
ects: Number,
|
||||
incoming: Number
|
||||
},
|
||||
data: () => {
|
||||
return {
|
||||
pruefungen: null,
|
||||
info: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
bodyStyle() {
|
||||
const bodyStyle = {};
|
||||
if (this.farbe)
|
||||
bodyStyle['background-color'] = '#' + this.farbe;
|
||||
return bodyStyle;
|
||||
},
|
||||
grade() {
|
||||
return this.benotung ? this.znote || this.lvnote || null : null;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
openPruefungen() {
|
||||
if (!this.pruefungen) {
|
||||
this.pruefungen = true;
|
||||
LvPruefungen.popup({
|
||||
lehrveranstaltung_id: this.lehrveranstaltung_id,
|
||||
bezeichnung: this.bezeichnung
|
||||
}).then(() => this.pruefungen = false).catch(() => this.pruefungen = false);
|
||||
}
|
||||
},
|
||||
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,
|
||||
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);
|
||||
}
|
||||
}
|
||||
},
|
||||
template: `<div class="mylv-semester-studiengang-lv card">
|
||||
<div v-if="module" class="card-header">
|
||||
{{module}}
|
||||
</div>
|
||||
<div class="card-body" :style="bodyStyle">
|
||||
<h5 class="card-title">{{bezeichnung}}</h5>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<div class="row">
|
||||
<a href="#" class="col-auto text-start text-decoration-none" @click.prevent="openPruefungen">
|
||||
{{ grade || '-' }}
|
||||
</a>
|
||||
<div v-if="lvinfo" class="col text-end">
|
||||
<a class="card-link" href="#" @click.prevent="openInfos">
|
||||
<i class="fa fa-info-circle" aria-hidden="true"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`
|
||||
};
|
||||
@@ -0,0 +1,187 @@
|
||||
import BsModal from '../../../../../Bootstrap/Modal.js';
|
||||
import Phrasen from '../../../../../../mixins/Phrasen.js';
|
||||
|
||||
const infos = {};
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal
|
||||
},
|
||||
mixins: [
|
||||
BsModal,
|
||||
Phrasen
|
||||
],
|
||||
props: {
|
||||
lehrveranstaltung_id: Number,
|
||||
bezeichnung: String,
|
||||
studiengang_kuerzel: String,
|
||||
semester: Number,
|
||||
studien_semester: String,
|
||||
orgform_kurzbz: String,
|
||||
sprache: String,
|
||||
ects: Number,
|
||||
incoming: Number,
|
||||
/*
|
||||
* NOTE(chris):
|
||||
* Hack to expose in "emits" declared events to $props which we use
|
||||
* in the v-bind directive to forward all events.
|
||||
* @see: https://github.com/vuejs/core/issues/3432
|
||||
*/
|
||||
onHideBsModal: Function,
|
||||
onHiddenBsModal: Function,
|
||||
onHidePreventedBsModal: Function,
|
||||
onShowBsModal: Function,
|
||||
onShownBsModal: Function
|
||||
},
|
||||
data: () => ({
|
||||
result: true,
|
||||
info: null
|
||||
}),
|
||||
computed: {
|
||||
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;
|
||||
},
|
||||
oe() {
|
||||
return this.info.oe.organisationseinheittyp ? (this.info.oe.organisationseinheittyp + ' ' + this.info.oe.bezeichnung) : '';
|
||||
},
|
||||
oeLeitung() {
|
||||
if (!this.info.oeLeitung || !this.info.oeLeitung.length)
|
||||
return ['-'];
|
||||
return this.info.oeLeitung.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());
|
||||
},
|
||||
koordinator() {
|
||||
if (!this.info.koordinator || !this.info.koordinator.length)
|
||||
return null;
|
||||
return this.info.koordinator.map(e => ((e.titelpre || '') + ' ' + (e.vorname || '') + ' ' + (e.nachname || '') + ' ' + (e.titelpost || '')).trim());
|
||||
},
|
||||
currentLang() {
|
||||
if (!this.info)
|
||||
return null;
|
||||
if (this.info.lastLang)
|
||||
return this.info.lastLang;
|
||||
if (!this.info.lvinfo)
|
||||
return null;
|
||||
return this.info.lvinfoDefaultLang && this.info.lvinfo[this.info.lvinfoDefaultLang] ? this.info.lvinfoDefaultLang : Object.keys(this.info.lvinfo).shift();
|
||||
}
|
||||
},
|
||||
created() {
|
||||
if (infos[this.lehrveranstaltung_id]) {
|
||||
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 = {});
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.modal = this.$refs.modalContainer.modal;
|
||||
},
|
||||
popup(options) {
|
||||
return BsModal.popup.bind(this)(null, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-alert" v-bind="$props" body-class="" dialog-class="modal-fullscreen">
|
||||
<template v-slot:title>
|
||||
{{p.t('lvinfo/lehrveranstaltungsinformationen')}}
|
||||
</template>
|
||||
<template v-slot:default>
|
||||
<div v-if="!info" class="text-center">
|
||||
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||
</div>
|
||||
<table v-else class="table table-hover">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/lehrveranstaltung')}}</th>
|
||||
<td>{{bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/studiengang')}}</th>
|
||||
<td>{{studiengang_kuerzel}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/semester')}}</th>
|
||||
<td>{{semester}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/studiensemester')}}</th>
|
||||
<td>{{studien_semester}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/organisationsform')}}</th>
|
||||
<td>{{orgform_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<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? -->
|
||||
{{name}}
|
||||
</li>
|
||||
</ul>
|
||||
<template v-else>
|
||||
{{p.t('lehre/keinLektorZugeordnet')}}
|
||||
</template>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="lvLeitung">
|
||||
<th>{{p.t('lehre/lvleitung')}}</th>
|
||||
<td>
|
||||
<ul class="list-unstyled mb-0">
|
||||
<li v-for="name in lvLeitung" :key="name">
|
||||
<!-- TODO(chris): link? -->
|
||||
{{name}}
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('global/sprache')}}</th>
|
||||
<td>{{sprache}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/ects')}}</th>
|
||||
<td>{{ects}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/incomingplaetze')}}</th>
|
||||
<td>{{incoming}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre/organisationseinheit')}}</th>
|
||||
<td>
|
||||
{{oe}} <br>
|
||||
(
|
||||
<i>{{p.t('global/leitung')}}: </i>{{oeLeitung.join(', ')}}
|
||||
<template v-if="koordinator">
|
||||
<i>{{p.t('global/koordination')}}: </i>{{koordinator.join(', ')}}
|
||||
</template>
|
||||
)
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div v-if="info && info.lvinfo">
|
||||
<div v-if="Object.keys(info.lvinfo).length > 1" class="text-end">
|
||||
<div class="btn-group" role="group" :title="p.t('global/verfuegbareSprachen')" :aria-label="p.t('global/verfuegbareSprachen')">
|
||||
<template v-for="lang in info.sprachen" :key="lang.index">
|
||||
<button v-if="info.lvinfo[lang.sprache]" type="button" class="btn btn-outline-primary" :class="lang.sprache == currentLang ? 'active' : ''" @click.prevent="info.lastLang = lang.sprache"><img class="d-block" :src="'data:image/gif;base64, ' + lang.flagge" :alt="lang.bezeichnung[lang.index]"></button>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
<template v-for="i in info.lvinfo[currentLang]" :key="info">
|
||||
<h4>{{i.header}}</h4>
|
||||
<h6 v-if="i.subheader">{{i.subheader}}</h6>
|
||||
<ul v-if="Array.isArray(i.body)">
|
||||
<li v-for="e in i.body" :key="e">{{e}}</li>
|
||||
</ul>
|
||||
<p v-else>
|
||||
{{i.body}}
|
||||
</p>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
import BsModal from '../../../../../Bootstrap/Modal.js';
|
||||
|
||||
const pruefungen = {};
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal
|
||||
},
|
||||
mixins: [
|
||||
BsModal
|
||||
],
|
||||
props: {
|
||||
lehrveranstaltung_id: Number,
|
||||
bezeichnung: String,
|
||||
/*
|
||||
* NOTE(chris):
|
||||
* Hack to expose in "emits" declared events to $props which we use
|
||||
* in the v-bind directive to forward all events.
|
||||
* @see: https://github.com/vuejs/core/issues/3432
|
||||
*/
|
||||
onHideBsModal: Function,
|
||||
onHiddenBsModal: Function,
|
||||
onHidePreventedBsModal: Function,
|
||||
onShowBsModal: Function,
|
||||
onShownBsModal: Function
|
||||
},
|
||||
data: () => ({
|
||||
result: true,
|
||||
pruefungen: null
|
||||
}),
|
||||
created() {
|
||||
if (pruefungen[this.lehrveranstaltung_id])
|
||||
this.pruefungen = pruefungen[this.lehrveranstaltung_id];
|
||||
else
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Pruefungen/' + this.lehrveranstaltung_id).then(res => {
|
||||
this.pruefungen = pruefungen[this.lehrveranstaltung_id] = res.data.retval || [];
|
||||
});
|
||||
},
|
||||
mounted() {
|
||||
this.modal = this.$refs.modalContainer.modal;
|
||||
},
|
||||
popup(options) {
|
||||
return BsModal.popup.bind(this)(null, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-alert" v-bind="$props" body-class="">
|
||||
<template v-slot:title>
|
||||
Prüfungen: {{bezeichnung}}
|
||||
</template>
|
||||
<template v-slot:default>
|
||||
<div v-if="!pruefungen" class="text-center">
|
||||
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||
</div>
|
||||
<p v-else-if="!pruefungen.length" class="alert alert-info mb-0">
|
||||
Keine Prüfungen vorhanden!
|
||||
</p>
|
||||
<table v-else class="table table-hover">
|
||||
<thead>
|
||||
<td> </td>
|
||||
<td>Datum</td>
|
||||
<td class="text-end">Note</td>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="pruefung in pruefungen" :key="pruefung.pruefung_id">
|
||||
<th>{{pruefung.pruefungstyp_kurzbz}}</th>
|
||||
<td>{{pruefung.datum}}</td>
|
||||
<td class="text-end">{{pruefung.note}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
import MylvSemester from "./Semester.js";
|
||||
import Phrasen from "../../../mixins/Phrasen.js";
|
||||
|
||||
// TODO(chris): phrase: global/studiensemester_auswaehlen
|
||||
// TODO(chris): phrase: next & prev +aria-label
|
||||
|
||||
export default {
|
||||
components: {
|
||||
MylvSemester
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
data: () => {
|
||||
return {
|
||||
firstLoad: true,
|
||||
studiensemester: null,
|
||||
lvs: {},
|
||||
currentSemester: null
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
ready() {
|
||||
return this.studiensemester !== null && (!this.firstLoad || this.current.lvs !== null);
|
||||
},
|
||||
current() {
|
||||
if (this.currentSemester === null)
|
||||
return { semester: null, lvs: null };
|
||||
if (this.lvs[this.currentSemester] === undefined) {
|
||||
this.lvs[this.currentSemester] = {
|
||||
semester: this.currentSemester,
|
||||
lvs: null
|
||||
};
|
||||
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.firstLoad = false;
|
||||
});
|
||||
}
|
||||
return this.lvs[this.currentSemester];
|
||||
},
|
||||
nearestSem() {
|
||||
let now = Date.now();
|
||||
let nearestSem = null;
|
||||
let nearestSemDiff = 0;
|
||||
this.studiensemester.forEach(sem => {
|
||||
let start = new Date(sem.start);
|
||||
let end = new Date(sem.ende);
|
||||
if (now >= start && now <= end) {
|
||||
nearestSem = sem.studiensemester_kurzbz;
|
||||
nearestSemDiff = 0;
|
||||
return;
|
||||
}
|
||||
let diff = Math.min(Math.abs(now - start), Math.abs(now - end));
|
||||
if (nearestSem === null || diff < nearestSemDiff) {
|
||||
nearestSem = sem.studiensemester_kurzbz;
|
||||
nearestSemDiff = diff;
|
||||
}
|
||||
|
||||
});
|
||||
return nearestSem;
|
||||
},
|
||||
currentIsFirst() {
|
||||
return this.studiensemester[0].studiensemester_kurzbz == this.currentSemester;
|
||||
},
|
||||
currentIsLast() {
|
||||
return this.studiensemester[this.studiensemester.length-1].studiensemester_kurzbz == this.currentSemester;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
prevSem() {
|
||||
this.$refs.studiensemester.selectedIndex--;
|
||||
this.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
},
|
||||
nextSem() {
|
||||
this.$refs.studiensemester.selectedIndex++;
|
||||
this.$refs.studiensemester.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
},
|
||||
setHash(val) {
|
||||
location.hash = val;
|
||||
}
|
||||
},
|
||||
created() {
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Mylv/Studiensemester').then(res => {
|
||||
this.studiensemester = res.data.retval;
|
||||
const hash = location.hash.substring(1);
|
||||
if (hash && this.studiensemester.filter(s => s.studiensemester_kurzbz == hash).length)
|
||||
this.currentSemester = hash;
|
||||
else
|
||||
this.currentSemester = this.nearestSem;
|
||||
});
|
||||
},
|
||||
template: `<div class="mylv-student" v-if="ready">
|
||||
<div class="row justify-content-center mb-3">
|
||||
<div class="col-auto d-none">
|
||||
<label class="col-form-label">{{p.t('lehre/studiensemester')}}</label>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="input-group">
|
||||
<button class="btn btn-outline-secondary" type="button" :disabled="currentIsFirst" @click="prevSem">
|
||||
<i class="fa fa-caret-left" aria-hidden="true"></i>
|
||||
</button>
|
||||
<select ref="studiensemester" v-model="currentSemester" class="form-select" :aria-label="p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
|
||||
<option v-for="semester in studiensemester" :key="semester.studiensemester_kurzbz">{{semester.studiensemester_kurzbz}}</option>
|
||||
</select>
|
||||
<button class="btn btn-outline-secondary" type="button" :disabled="currentIsLast" @click="nextSem">
|
||||
<i class="fa fa-caret-right" aria-hidden="true"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<mylv-semester v-bind="current"/>
|
||||
</div>
|
||||
<div class="mylv-student text-center" v-else>
|
||||
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||
</div>`
|
||||
};
|
||||
@@ -0,0 +1,69 @@
|
||||
const categories = {};
|
||||
const loadingModules = {};
|
||||
|
||||
function extractCategory(obj, category) {
|
||||
return obj.filter(e => e.category == category).reduce((res, elem) => {
|
||||
if (!res[elem.phrase])
|
||||
res[elem.phrase] = elem.text;
|
||||
return res;
|
||||
}, {});
|
||||
}
|
||||
function loadLazy(category, val) {
|
||||
// NOTE(chris): load module if it's not loaded yet
|
||||
if (loadingModules[category]) {
|
||||
loadingModules[category].push(val);
|
||||
if (categories[category]) // NOTE(chris): this is for safety in case the loading finished the moment before the val was pushed into the array
|
||||
while (loadingModules[category].length)
|
||||
Vue.triggerRef(loadingModules[category].pop());
|
||||
return Vue.unref(val);
|
||||
}
|
||||
loadingModules[category] = [val];
|
||||
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/LoadModule/' + category).then(res => {
|
||||
if (res.data.retval)
|
||||
categories[category] = extractCategory(res.data.retval, category);
|
||||
else
|
||||
categories[category] = {};
|
||||
|
||||
while (loadingModules[category].length)
|
||||
Vue.triggerRef(loadingModules[category].pop());
|
||||
}).catch(err => console.error(err));
|
||||
}
|
||||
|
||||
export default {
|
||||
data: () => {
|
||||
return {
|
||||
p: {
|
||||
t(category, phrase, params) {
|
||||
if (params === undefined && (
|
||||
(Array.isArray(category) && category.length == 2) ||
|
||||
(category.split && category.split('/').length == 2))
|
||||
) {
|
||||
params = phrase;
|
||||
[category, phrase] = category.split ? category.split('/') : category;
|
||||
}
|
||||
if (phrase === undefined) {
|
||||
console.error('invalid input');
|
||||
return '';
|
||||
}
|
||||
if (!categories[category]) {
|
||||
if (window.FHC_JS_PHRASES_STORAGE_OBJECT !== undefined)
|
||||
categories[category] = extractCategory(FHC_JS_PHRASES_STORAGE_OBJECT, category);
|
||||
|
||||
if (!categories[category] || Object.keys(categories[category]).length === 0) {
|
||||
let val = Vue.ref('');
|
||||
loadLazy(category, val);
|
||||
return Vue.unref(val);
|
||||
}
|
||||
}
|
||||
let result = categories[category][phrase];
|
||||
if (!result)
|
||||
return '<< PHRASE ' + phrase + '>>';
|
||||
if (params)
|
||||
return result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] || match);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17137,6 +17137,186 @@ array(
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lvinfo',
|
||||
'phrase' => 'lehrveranstaltungsinformationen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Lehrveranstaltungsinformationen",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Course Information",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'keinLektorZugeordnet',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Aktuell ist dieser Lehrveranstaltung noch kein Lektor zugeordnet",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "ENG Aktuell ist dieser Lehrveranstaltung noch kein Lektor zugeordnet",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'incomingplaetze',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Incomingplätze",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Places Available for Incoming Students",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'lehrbeauftragter',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Lehrbeauftragte*r",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Lecturer(s)",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'lvleitung',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "LV-Leiter*in",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Head of Course",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'leitung',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Leitung",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Head",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'koordination',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Koordination",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Coordination",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'sprache',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Sprache",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Language",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'global',
|
||||
'phrase' => 'verfuegbareSprachen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => "Verfügbare Sprachen",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => "Available languages",
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user