From 5b2b715a169f83e0e29a186577e39bcae984da20 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 7 Jul 2025 08:59:36 +0200 Subject: [PATCH] userstory 61241: bugs behoben --- .../api/frontend/v1/Lehrveranstaltung.php | 16 +- .../controllers/api/frontend/v1/lv/Gruppe.php | 11 +- .../api/frontend/v1/lv/Lehreinheit.php | 7 +- .../models/education/Lehreinheit_model.php | 290 ++++++++---------- .../education/Lehreinheitgruppe_model.php | 4 +- .../education/Lehrveranstaltung_model.php | 17 +- public/css/Lvverwaltung.css | 5 +- .../components/LVVerwaltung/LVVerwaltung.js | 2 +- .../js/components/LVVerwaltung/Setup/Table.js | 139 ++++++--- .../js/components/LVVerwaltung/Tabs/Notiz.js | 2 +- system/phrasesupdate.php | 42 +++ 11 files changed, 300 insertions(+), 235 deletions(-) diff --git a/application/controllers/api/frontend/v1/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php index 1b2e2bc35..098d44712 100644 --- a/application/controllers/api/frontend/v1/Lehrveranstaltung.php +++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php @@ -39,6 +39,12 @@ class Lehrveranstaltung extends FHCAPI_Controller $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); $this->_ci->load->library('VariableLib', ['uid' => $this->_uid]); + + $this->loadPhrases( + array( + 'ui' + ) + ); } public function loadByEmployee($mitarbeiter_uid = null, $stg_kz = null) { @@ -54,7 +60,7 @@ class Lehrveranstaltung extends FHCAPI_Controller foreach ($lehrveranstaltungen_data as $lehrveranstaltung) { - $lehreinheiten = $this->_ci->LehreinheitModel->getLEByLV($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid); + $lehreinheiten = $this->_ci->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz, $mitarbeiter_uid); $lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten); if (!isset($lehrveranstaltung->_children)) @@ -69,8 +75,8 @@ class Lehrveranstaltung extends FHCAPI_Controller public function loadByStudiengang($studiengang_kz = null, $semester = null) { - if (is_null($studiengang_kz) || !ctype_digit((string)$studiengang_kz)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $verband = null; if (!is_null($semester) && !is_numeric($semester)) @@ -164,7 +170,7 @@ class Lehrveranstaltung extends FHCAPI_Controller if (is_null($lehrveranstaltung_id) || !ctype_digit((string)$lehrveranstaltung_id)) $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); - $this->_ci->LehrveranstaltungModel->addSelect('lehrveranstaltung_id, lehrform_kurzbz, lehre, bezeichnung as lvbezeichnung'); + $this->_ci->LehrveranstaltungModel->addSelect('lehrveranstaltung_id, lehrform_kurzbz, lehre, bezeichnung as lvbezeichnung, sprache'); $lehrveranstaltung_result = $this->_ci->LehrveranstaltungModel->loadWhere(array('lehrveranstaltung_id' => $lehrveranstaltung_id)); $lehrveranstaltung_result = $this->getDataOrTerminateWithError($lehrveranstaltung_result); $lehrveranstaltung = $lehrveranstaltung_result[0]; @@ -202,7 +208,7 @@ class Lehrveranstaltung extends FHCAPI_Controller foreach ($lehrveranstaltungen_data as $lehrveranstaltung) { - $lehreinheiten = $this->LehreinheitModel->getLEByLV($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz); + $lehreinheiten = $this->LehreinheitModel->getByLvidStudiensemester($lehrveranstaltung->lehrveranstaltung_id, $studiensemester_kurzbz); $lehreinheiten_data = $this->getDataOrTerminateWithError($lehreinheiten); if (!isset($lehrveranstaltung->_children)) diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php index 01c11f98f..09f253a59 100644 --- a/application/controllers/api/frontend/v1/lv/Gruppe.php +++ b/application/controllers/api/frontend/v1/lv/Gruppe.php @@ -19,6 +19,13 @@ class Gruppe extends FHCAPI_Controller $this->_ci = &get_instance(); $this->_setAuthUID(); + $this->_ci->load->library('PhrasesLib'); + $this->loadPhrases( + array( + 'ui' + ) + ); + $this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel'); $this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); $this->_ci->load->model('education/Lehreinheitgruppe_model', 'LehreinheitgruppeModel'); @@ -57,10 +64,6 @@ class Gruppe extends FHCAPI_Controller if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($gid) || !ctype_digit((string)$gid) || is_null($lehrverband)) $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); - $gruppe_result = $this->_ci->GruppeModel->loadWhere(array('gid' => $gid)); - if (!hasData($gruppe_result) || isError($gruppe_result)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); - $this->checkPermission($lehreinheit_id); $result = $this->_ci->LehreinheitgruppeModel->addGroup($lehreinheit_id, $gid, !($lehrverband === 'false')); diff --git a/application/controllers/api/frontend/v1/lv/Lehreinheit.php b/application/controllers/api/frontend/v1/lv/Lehreinheit.php index 84ee66d5d..0c42c0082 100644 --- a/application/controllers/api/frontend/v1/lv/Lehreinheit.php +++ b/application/controllers/api/frontend/v1/lv/Lehreinheit.php @@ -164,7 +164,6 @@ class Lehreinheit extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } - $updateData = array(); foreach ($updatableFields as $field) { @@ -183,6 +182,12 @@ class Lehreinheit extends FHCAPI_Controller $updateData ); + if (!isset($updateData['unr'])) + { + $unr = getData($result); + $this->_ci->LehreinheitModel->update($unr, array('unr' => $unr)); + } + $this->terminateWithSuccess($result); } diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index ba9e82c64..ce414bad2 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -335,7 +335,7 @@ EOSQL; } - public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz) + public function getByLvidStudiensemester($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null) { $qry = "WITH lehreinheiten AS ( SELECT * @@ -343,98 +343,64 @@ EOSQL; WHERE lehrveranstaltung_id = ? AND studiensemester_kurzbz = ? ), - gruppen AS ( - SELECT - COALESCE( - string_agg( - tbl_lehreinheitgruppe.gruppe_kurzbz, ' ' - ) FILTER (WHERE NOT direktinskription), - string_agg( - COALESCE( - upper(tbl_studiengang.typ::varchar(1) ||tbl_studiengang.kurzbz) || - '-'|| - COALESCE(tbl_lehreinheitgruppe.semester::varchar, '') || - COALESCE(tbl_lehreinheitgruppe.verband::varchar, '')|| - COALESCE(tbl_lehreinheitgruppe.gruppe, '')), ', ' - ) - ) AS gruppe, - lehreinheit_id - FROM - lehre.tbl_lehreinheitgruppe - LEFT JOIN public.tbl_studiengang USING(studiengang_kz) - LEFT JOIN public.tbl_gruppe USING(gruppe_kurzbz) - GROUP BY lehreinheit_id - ), - mitarbeiter AS ( - SELECT kurzbz, semesterstunden, planstunden, lehreinheit_id - FROM lehre.tbl_lehreinheitmitarbeiter - JOIN public.tbl_mitarbeiter USING(mitarbeiter_uid) - ), - fachbereich AS ( - SELECT - tbl_organisationseinheit.bezeichnung, - tbl_organisationseinheit.organisationseinheittyp_kurzbz, - lehreinheit_id - FROM - public.tbl_organisationseinheit, - lehre.tbl_lehrveranstaltung as lehrfach, - lehre.tbl_lehreinheit - WHERE tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz - AND lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id - ), - tag_data_agg AS ( - SELECT - lehreinheit_id, - COALESCE(json_agg(tag ORDER BY id), '[]'::json) AS tags - FROM ( - SELECT DISTINCT ON (public.tbl_notiz.notiz_id) - tbl_notiz.notiz_id AS id, - typ_kurzbz, - array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung, - text AS notiz, - style, - erledigt AS done, - lehreinheit_id - FROM public.tbl_notizzuordnung - JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id - JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz - WHERE lehreinheit_id IN (SELECT lehreinheit_id FROM lehreinheiten) - ) AS tag - GROUP BY lehreinheit_id - ) + ". $this->_getGruppenCTE() . ", + ". $this->_getLektorenCTE() . ", + ". $this->_getFachbereichCTE() . ", + ". $this->_getTagsCTE() . " + SELECT lehreinheiten.*, lehreinheiten.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, COALESCE(tag_data_agg.tags, '[]'::json) AS tags, - ( - SELECT string_agg(gr.gruppe, ' ') - FROM gruppen gr - WHERE gr.lehreinheit_id = lehreinheiten.lehreinheit_id - ) AS gruppen, - ( - SELECT string_agg(ma.kurzbz, ' ') - FROM mitarbeiter ma - WHERE ma.lehreinheit_id = lehreinheiten.lehreinheit_id - ) AS lektoren, - ( - SELECT string_agg(fachbereich.bezeichnung, ' ') - FROM fachbereich - WHERE fachbereich.lehreinheit_id = lehreinheiten.lehreinheit_id - ) AS fachbereich + gruppen.gruppen, + mitarbeiter.lektoren, + mitarbeiter.le_planstunden, + mitarbeiter.semesterstunden, + fachbereich.bezeichnung as fachbereich, + UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang, + semester FROM lehreinheiten LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = lehreinheiten.lehrfach_id - LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id"; + LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN tag_data_agg ON tag_data_agg.lehreinheit_id = lehreinheiten.lehreinheit_id + LEFT JOIN mitarbeiter ON lehreinheiten.lehreinheit_id = mitarbeiter.lehreinheit_id + LEFT JOIN fachbereich ON lehreinheiten.lehreinheit_id = fachbereich.lehreinheit_id + LEFT JOIN gruppen ON lehreinheiten.lehreinheit_id = gruppen.lehreinheit_id + WHERE true + "; - return $this->execReadOnlyQuery($qry, array($lv_id, $studiensemester_kurzbz)); + $params = array($lv_id, $studiensemester_kurzbz); + + if ($mitarbeiter_uid !== null) + { + $qry .= " AND lehreinheiten.lehreinheit_id IN ( SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE mitarbeiter_uid = ?) "; + $params[] = $mitarbeiter_uid; + } + + if($fachbereich_kurzbz !== null) + { + $qry .= " AND EXISTS ( SELECT 1 FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_fachbereich USING(oe_kurzbz) WHERE fachbereich_kurzbz= ? AND lehrveranstaltung_id=lehreinheiten.lehrfach_id)"; + $params[] = $fachbereich_kurzbz; + } + $qry .= " ORDER BY lehrveranstaltung_id;"; + + return $this->execReadOnlyQuery($qry, $params); } private function getLVTmp($stg_kz = null) { $qry = "SELECT DISTINCT ON(lehrveranstaltung_id) *, - '' as studienplan_id, '' as studienplan_beeichnung, - CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz) as studiengang - FROM campus.vw_lehreinheit + '' as stundenblockung, + '' as lehreinheit_id, + '' as wochenrythmus, + '' as raumtyp, + '' as raumtypalternativ, + '' as gruppen, + '' as studienplan_id, + '' as studienplan_beeichnung, + UPPER(CONCAT(vw_lehreinheit.stg_typ, vw_lehreinheit.stg_kurzbz)) as studiengang + FROM campus.vw_lehreinheit WHERE mitarbeiter_uid = ? AND studiensemester_kurzbz = ?"; @@ -460,89 +426,6 @@ EOSQL; return $this->execReadOnlyQuery($qry, $params); } - - - public function getLEByLV($lv_id, $studiensemester_kurzbz, $mitarbeiter_uid = null, $fachbereich_kurzbz = null) - { - $qry = " - WITH gruppen AS ( - SELECT - COALESCE( - string_agg( - tbl_lehreinheitgruppe.gruppe_kurzbz, ', ' - ) FILTER (WHERE NOT direktinskription), - string_agg( - COALESCE( - upper(tbl_studiengang.typ::varchar(1) ||tbl_studiengang.kurzbz) || - '-'|| - COALESCE(tbl_lehreinheitgruppe.semester::varchar, '') || - COALESCE(tbl_lehreinheitgruppe.verband::varchar, '')|| - COALESCE(tbl_lehreinheitgruppe.gruppe, '')), ', ' - ) - ) AS gruppen, - lehreinheit_id - FROM - lehre.tbl_lehreinheitgruppe - LEFT JOIN public.tbl_studiengang USING(studiengang_kz) - LEFT JOIN public.tbl_gruppe USING(gruppe_kurzbz) - GROUP BY lehreinheit_id - ), - lektoren AS ( - SELECT string_agg(kurzbz, ' ') as lektoren, - string_agg(semesterstunden::text, ' ') as semesterstunden, - string_agg(planstunden::text, ' ') as planstunden, - lehreinheit_id - FROM lehre.tbl_lehreinheitmitarbeiter - JOIN public.tbl_mitarbeiter USING(mitarbeiter_uid) - GROUP BY lehreinheit_id - ), - fachbereich AS ( - SELECT - string_agg(CONCAT(tbl_organisationseinheit.bezeichnung, ' (', tbl_organisationseinheit.organisationseinheittyp_kurzbz, ')'),' ') as fachbereich, - lehreinheit_id - FROM - public.tbl_organisationseinheit, - lehre.tbl_lehrveranstaltung as lehrfach, - lehre.tbl_lehreinheit - WHERE - tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz - AND lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id - GROUP BY lehreinheit_id - ) - SELECT tbl_lehreinheit.*, - tbl_lehrveranstaltung.*, - tbl_lehrveranstaltung.kurzbz as lv_kurzbz, - tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, - lektoren.lektoren, - lektoren.semesterstunden, - lektoren.planstunden, - fachbereich.fachbereich - FROM lehre.tbl_lehreinheit - LEFT JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id - LEFT JOIN gruppen ON tbl_lehreinheit.lehreinheit_id = gruppen.lehreinheit_id - LEFT JOIN lektoren ON tbl_lehreinheit.lehreinheit_id = lektoren.lehreinheit_id - LEFT JOIN fachbereich ON tbl_lehreinheit.lehreinheit_id = fachbereich.lehreinheit_id - WHERE tbl_lehreinheit.lehrveranstaltung_id = ? - AND studiensemester_kurzbz = ? - "; - - $params = array($lv_id, $studiensemester_kurzbz); - if ($mitarbeiter_uid !== null) - { - $qry .= " AND tbl_lehreinheit.lehreinheit_id IN ( SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE mitarbeiter_uid = ?) "; - $params[] = $mitarbeiter_uid; - } - - if($fachbereich_kurzbz !== null) - { - $qry .= " AND EXISTS ( SELECT 1 FROM lehre.tbl_lehrveranstaltung JOIN public.tbl_fachbereich USING(oe_kurzbz) WHERE fachbereich_kurzbz= ? AND lehrveranstaltung_id=tbl_lehreinheit.lehrfach_id)"; - $params[] = $fachbereich_kurzbz; - } - $qry .= " ORDER BY lehreinheit_id;"; - - return $this->execReadOnlyQuery($qry, $params); - } - public function deleteLehreinheit($lehreinheit_id) { $lehreinheit = $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); @@ -741,4 +624,85 @@ EOSQL; $this->db->trans_commit(); return success('Contract successfully updated.'); } + + private function _getGruppenCTE() + { + return "gruppen AS ( + SELECT + lehreinheit_id, + STRING_AGG( + CASE + WHEN (tbl_lehreinheitgruppe.gruppe_kurzbz IS NULL OR tbl_lehreinheitgruppe.gruppe_kurzbz = '') + THEN + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) || + COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), '') || + COALESCE(TRIM(tbl_lehreinheitgruppe.verband), '') || + COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), '') + ELSE + CASE + WHEN NOT tbl_gruppe.direktinskription THEN tbl_lehreinheitgruppe.gruppe_kurzbz + ELSE NULL + END + END, + ' ' + ) AS gruppen + FROM lehre.tbl_lehreinheitgruppe + LEFT JOIN public.tbl_studiengang USING (studiengang_kz) + LEFT JOIN public.tbl_gruppe USING (gruppe_kurzbz) + JOIN lehreinheiten USING(lehreinheit_id) + GROUP BY lehreinheit_id + )"; + } + private function _getLektorenCTE() + { + return "mitarbeiter AS ( + SELECT + tbl_lehreinheitmitarbeiter.lehreinheit_id, + STRING_AGG(m.kurzbz, ' ') AS lektoren, + STRING_AGG(tbl_lehreinheitmitarbeiter.semesterstunden::text, ' ') AS semesterstunden, + STRING_AGG(tbl_lehreinheitmitarbeiter.planstunden::text, ' ') AS le_planstunden + FROM lehre.tbl_lehreinheitmitarbeiter + JOIN public.tbl_mitarbeiter m USING (mitarbeiter_uid) + JOIN lehreinheiten USING(lehreinheit_id) + GROUP BY tbl_lehreinheitmitarbeiter.lehreinheit_id + )"; + } + + private function _getFachbereichCTE() + { + return "fachbereich AS ( + SELECT + CONCAT(tbl_organisationseinheit.bezeichnung, ' (', tbl_organisationseinheit.organisationseinheittyp_kurzbz, ')') as bezeichnung, + lehreinheiten.lehreinheit_id + FROM public.tbl_organisationseinheit + JOIN lehre.tbl_lehrveranstaltung AS lehrfach ON tbl_organisationseinheit.oe_kurzbz = lehrfach.oe_kurzbz + JOIN lehre.tbl_lehreinheit ON lehrfach.lehrveranstaltung_id = tbl_lehreinheit.lehrfach_id + JOIN lehreinheiten ON tbl_lehreinheit.lehreinheit_id = lehreinheiten.lehreinheit_id + )"; + } + + private function _getTagsCTE() + { + return "tag_data_agg AS ( + SELECT + lehreinheit_id, + COALESCE(json_agg(tag ORDER BY id), '[]'::json) AS tags + FROM ( + SELECT DISTINCT ON (public.tbl_notiz.notiz_id) + tbl_notiz.notiz_id AS id, + typ_kurzbz, + array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung, + text AS notiz, + style, + erledigt AS done, + lehreinheit_id + FROM public.tbl_notizzuordnung + JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id + JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz + WHERE lehreinheit_id IN (SELECT lehreinheit_id FROM lehreinheiten) + ) AS tag + GROUP BY lehreinheit_id + )"; + } + } diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php index 5dd2fa66c..8fc8e09f3 100644 --- a/application/models/education/Lehreinheitgruppe_model.php +++ b/application/models/education/Lehreinheitgruppe_model.php @@ -304,7 +304,7 @@ class Lehreinheitgruppe_model extends DB_Model } else if ($verband === true) { - $gruppen_result = $this->_ci->LehrverbandModel->loadWhere(array('gid' => $gid)); + $gruppen_result = $this->LehrverbandModel->loadWhere(array('gid' => $gid)); if (!hasData($gruppen_result)) return error('No group found for gid ' . $gid); @@ -470,6 +470,6 @@ class Lehreinheitgruppe_model extends DB_Model END AS verplant"); $this->addJoin('tbl_studiengang', 'studiengang_kz', 'LEFT'); $this->addJoin('public.tbl_gruppe', 'gruppe_kurzbz', 'LEFT'); - return $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'tbl_gruppe.direktinskription' => false)); + return $this->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); } } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 955177273..121de9233 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -1122,9 +1122,9 @@ class Lehrveranstaltung_model extends DB_Model $qry .= " SELECT DISTINCT on(lehrveranstaltung_id) lehrveranstaltung_id, - kurzbz as lv_kurzbz, - bezeichnung as lv_bezeichnung, - bezeichnung_english as lv_bezeichnung_english, + tbl_lehrveranstaltung.kurzbz as lv_kurzbz, + tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, + tbl_lehrveranstaltung.bezeichnung_english as lv_bezeichnung_english, studiengang_kz, semester, tbl_lehrveranstaltung.sprache, @@ -1133,7 +1133,7 @@ class Lehrveranstaltung_model extends DB_Model tbl_lehrveranstaltung.anmerkung, tbl_lehrveranstaltung.lehre, lehreverzeichnis as lv_lehreverzeichnis, - aktiv, + tbl_lehrveranstaltung.aktiv, planfaktor as lv_planfaktor, planlektoren as lv_planlektoren, planpersonalkosten as lv_planpersonalkosten, @@ -1143,9 +1143,11 @@ class Lehrveranstaltung_model extends DB_Model ''::text as studienplan_id, '' as studienplan_bezeichnung, '' as studienplan_lehrveranstaltung_id_parent, - tbl_lehrveranstaltung.lehrtyp_kurzbz + tbl_lehrveranstaltung.lehrtyp_kurzbz, + UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING (lehrveranstaltung_id) + JOIN public.tbl_studiengang USING(studiengang_kz) WHERE studiengang_kz = ? AND studiensemester_kurzbz = ? "; @@ -1178,17 +1180,18 @@ class Lehrveranstaltung_model extends DB_Model { return " SELECT - lehrveranstaltung_id, kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz, + lehrveranstaltung_id, tbl_lehrveranstaltung.kurzbz as lv_kurzbz, tbl_lehrveranstaltung.bezeichnung as lv_bezeichnung, bezeichnung_english as lv_bezeichnung_english, studiengang_kz, tbl_studienplan_lehrveranstaltung.semester, tbl_lehrveranstaltung.sprache, ects as lv_ects, semesterstunden, anmerkung, lehre, lehreverzeichnis as lv_lehreverzeichnis, tbl_lehrveranstaltung.aktiv, planfaktor as lv_planfaktor, planlektoren as lv_planlektoren, planpersonalkosten as lv_planpersonalkosten, plankostenprolektor as lv_plankostenprolektor, lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.orgform_kurzbz, tbl_studienplan_lehrveranstaltung.studienplan_id::text as studienplan_id, tbl_studienplan.bezeichnung as studienplan_bezeichnung, tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent::text, - tbl_lehrveranstaltung.lehrtyp_kurzbz + tbl_lehrveranstaltung.lehrtyp_kurzbz, UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_studienplan_lehrveranstaltung USING(lehrveranstaltung_id) JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN tbl_studiengang USING(studiengang_kz) WHERE tbl_lehrveranstaltung.aktiv AND ((studienplan_id, tbl_studienplan_lehrveranstaltung.semester) IN ( " . implode(',', $placeholders) . ")) UNION diff --git a/public/css/Lvverwaltung.css b/public/css/Lvverwaltung.css index 1ca3f0be1..38d74def4 100644 --- a/public/css/Lvverwaltung.css +++ b/public/css/Lvverwaltung.css @@ -14,14 +14,17 @@ textarea[name="anmerkung"] { .lv_table_icon.icon-modul::before { content: '\f468'; + color: #4e4ed2; } .lv_table_icon.icon-lv::before { content: '\f466'; + color: black; } .lv_table_icon.icon-::before { content: '\f073'; -} \ No newline at end of file + color: #f3c541; +} diff --git a/public/js/components/LVVerwaltung/LVVerwaltung.js b/public/js/components/LVVerwaltung/LVVerwaltung.js index 772af5a47..c7c34802d 100644 --- a/public/js/components/LVVerwaltung/LVVerwaltung.js +++ b/public/js/components/LVVerwaltung/LVVerwaltung.js @@ -186,7 +186,7 @@ export default { : this.$route.params.stg; } - this.$p.loadCategory(['lehre', 'person']) + this.$p.loadCategory(['lehre', 'person', 'global']) this.$api.call(ApiDetails.getStudiensemester()) .then(result => { diff --git a/public/js/components/LVVerwaltung/Setup/Table.js b/public/js/components/LVVerwaltung/Setup/Table.js index 9b0ae71f3..b4674ccff 100644 --- a/public/js/components/LVVerwaltung/Setup/Table.js +++ b/public/js/components/LVVerwaltung/Setup/Table.js @@ -100,7 +100,6 @@ export default { expanded: [], selectedColumnValues: [], tagEndpoint: ApiTag, - iconPath: FHC_JS_DATA_STORAGE_OBJECT.app_root + '/skin/images/lehrtyp_', tabulatorEvents: [ { event: 'rowSelectionChanged', @@ -119,7 +118,8 @@ export default { handler: (data) => { this.getExpandedRows() } - },{ + }, + { event: 'dataTreeRowCollapsed', handler: (data) => { this.getExpandedRows() @@ -157,19 +157,18 @@ export default { initialSort:[ {column: 'lv_bezeichnung', dir: 'desc'}, ], + dataTreeChildIndent: 20, dataTreeElementColumn: "lv_kurzbz", - dataTreeFilter: true, dataTreeStartExpanded: false, dataTreeCollapseElement: '', dataTreeExpandElement: '', columnDefaults: { tooltip: true, headerFilter: "input", - headerFilterFunc: extendedHeaderFilter + headerFilterFunc: extendedHeaderFilter, }, layout: 'fitDataStretch', - layoutColumnsOnNewData: false, - height: '100%', + persistenceID: 'lehrveranstaltungen_2025_07_07_v1', selectableRowsRangeMode: 'click', selectableRows: true, rowContextMenu: (component, e) => { @@ -217,7 +216,6 @@ export default { ]; }, - persistenceID: 'lehrveranstaltungen_2025_05_27_v1', columns: [ { title: this.$p.t('lehre', 'kurzbz'), @@ -302,45 +300,55 @@ export default { }, width: 150, }, + { + title: this.$p.t('lehre', 'kurzbz'), + field: "lv_kurzbz_anzeige", + headerFilterFuncParams: {field: 'lv_kurzbz_anzeige'}, + formatter: (cell, formatterParams) => { + let rowData = cell.getRow().getData(); + return rowData?.lv_kurzbz?.toUpperCase(); + }, + headerFilter: true + }, { title: this.$p.t('lehre', 'lehrveranstaltung_id'), field: "lehrveranstaltung_id", headerFilterFuncParams: {field: 'lehrveranstaltung_id'}, - headerFilter: true + headerFilter: true, + visible: false }, {title: this.$p.t('ui', 'bezeichnung'), field: "lv_bezeichnung", headerFilter: true, headerFilterFuncParams: {field: 'lv_bezeichnung'}}, - {title: this.$p.t('lehre', 'bezeichnungeng'), field: "lv_bezeichnung_english", headerFilter: true, headerFilterFuncParams: {field: 'lv_bezeichnung_english'}}, + {title: this.$p.t('lehre', 'bezeichnungeng'), field: "lv_bezeichnung_english", headerFilter: true, headerFilterFuncParams: {field: 'lv_bezeichnung_english'}, visible: false}, { title: this.$p.t('lehre', 'studiengangskennzahlLehre'), field: "lv_studiengang_kz", headerFilter: true, - headerFilterFuncParams: {field: 'lv_studiengang_kz'} + headerFilterFuncParams: {field: 'lv_studiengang_kz'}, + visible: false }, - {title: this.$p.t('lehre', 'studiengang'), field: "studiengang", headerFilter: true, headerFilterFuncParams: {field: 'studiengang'}}, + {title: this.$p.t('lehre', 'studiengang'), field: "studiengang", headerFilter: true, headerFilterFuncParams: {field: 'studiengang'}, visible: false}, {title: this.$p.t('lehre', 'semester'), field: "semester", headerFilter: true, headerFilterFuncParams: {field: 'semester'}}, - {title: this.$p.t('global', 'sprache'), field: "sprache", headerFilter: true, headerFilterFuncParams: {field: 'sprache'}}, - {title: this.$p.t('lehre', 'ects'), field: "lv_ects", headerFilter: true, headerFilterFuncParams: {field: 'lv_ects'}}, - {title: this.$p.t('lehre', 'semesterstunden'), field: "semesterstunden", headerFilter: true, headerFilterFuncParams: {field: 'semesterstunden'}}, - {title: this.$p.t('global', 'anmerkung'), field: "anmerkung", headerFilter: true, headerFilterFuncParams: {field: 'anmerkung'}}, - {title: this.$p.t('lehre', 'lehre'), field: "lehre", headerFilter: true, headerFilterFuncParams: {field: 'lehre'}}, - {title: "Lehreverzeichnis", field: "lehreverzeichnis", headerFilter: true, headerFilterFuncParams: {field: 'lehreverzeichnis'}}, - {title: this.$p.t('person', 'aktiv'), field: "aktiv", headerFilter: true, headerFilterFuncParams: {field: 'aktiv'}}, - {title: "Planfaktor", field: "planfaktor", headerFilter: true, headerFilterFuncParams: {field: 'planfaktor'}}, - {title: "Planlektoren", field: "planlektoren", headerFilter: true, headerFilterFuncParams: {field: 'planlektoren'}}, - {title: "planpersonalkosten", field: "planpersonalkosten", headerFilter: true, headerFilterFuncParams: {field: 'planpersonalkosten'}}, - {title: "plankostenprolektor", field: "plankostenprolektor", headerFilter: true, headerFilterFuncParams: {field: 'plankostenprolektor'}}, - {title: this.$p.t('ui', 'organisationsform'), field: "orgform_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'orgform_kurzbz'}}, - {title: this.$p.t('ui', 'studienplan_id'), field: "studienplan_id", headerFilter: true, headerFilterFuncParams: {field: 'studienplan_id'}}, - {title: "studienplan_bezeichnung", field: "studienplan_bezeichnung", headerFilter: true, headerFilterFuncParams: {field: 'studienplan_bezeichnung'}}, - {title: "lehrtyp_kurzbz", field: "lehrtyp_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'lehrtyp_kurzbz'}}, + {title: this.$p.t('global', 'sprache'), field: "sprache", headerFilter: true, headerFilterFuncParams: {field: 'sprache'}, visible: false}, + {title: this.$p.t('lehre', 'ects'), field: "lv_ects", headerFilter: true, headerFilterFuncParams: {field: 'lv_ects'}, visible: false}, + {title: this.$p.t('lehre', 'semesterstunden'), field: "semesterstunden", headerFilter: true, headerFilterFuncParams: {field: 'semesterstunden'}, visible: false}, + {title: this.$p.t('global', 'anmerkung'), field: "anmerkung", headerFilter: true, headerFilterFuncParams: {field: 'anmerkung'}, visible: false}, + {title: this.$p.t('lehre', 'lehre'), field: "lehre", headerFilter: true, headerFilterFuncParams: {field: 'lehre'}, formatter: (cell) => cell.getValue() ? this.toUpperCase(this.$p.t('ui', 'ja')) : this.toUpperCase(this.$p.t('ui', 'nein')), visible: false}, + {title: this.$p.t('person', 'aktiv'), field: "aktiv", headerFilter: true, headerFilterFuncParams: {field: 'aktiv'}, formatter: (cell) => cell.getValue() ? this.toUpperCase(this.$p.t('ui', 'ja')) : this.toUpperCase(this.$p.t('ui', 'nein')), visible: false}, + {title: this.$p.t('lehre', 'organisationsform'), field: "orgform_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'orgform_kurzbz'}}, + {title: this.$p.t('ui', 'studienplan_id'), field: "studienplan_id", headerFilter: true, headerFilterFuncParams: {field: 'studienplan_id'}, visible: false}, + {title: this.$p.t('lehre', 'studienplan'), field: "studienplan_bezeichnung", headerFilter: true, headerFilterFuncParams: {field: 'studienplan_bezeichnung'}, visible: false}, + {title: this.$p.t('lehre', 'lehrtyp'), field: "lehrtyp_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'lehrtyp_kurzbz'}, visible: false}, {title: this.$p.t('lehre', 'lehrform'), field: "lehrform_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'lehrform_kurzbz'}}, - {title: this.$p.t('lehre', 'leplanstunden'), field: "le_planstunden", headerFilter: true, headerFilterFuncParams: {field: 'le_planstunden'}}, - {title: this.$p.t('lehre', 'lehreinheit_id'), field: "lehreinheit_id", headerFilter: true, headerFilterFuncParams: {field: 'lehreinheit_id'}}, - {title: this.$p.t('lehre', 'stundenblockung'), field: "stundenblockung", headerFilter: true, headerFilterFuncParams: {field: 'stundenblockung'}}, - {title: this.$p.t('lehre', 'wochenrhytmus'), field: "wochenrythmus", headerFilter: true, headerFilterFuncParams: {field: 'wochenrythmus'}}, - {title: this.$p.t('lehre', 'startkw'), field: "startkw", headerFilter: true, headerFilterFuncParams: {field: 'startkw'}}, - {title: this.$p.t('lehre', 'raumtyp'), field: "raumtyp", headerFilter: true, headerFilterFuncParams: {field: 'raumtyp'}}, - {title: this.$p.t('lehre', 'raumtypalternativ'), field: "raumtypalternativ", headerFilter: true, headerFilterFuncParams: {field: 'raumtypalternativ'}}, + {title: this.$p.t('lehre', 'leplanstunden'), field: "le_planstunden", headerFilter: true, headerFilterFuncParams: {field: 'le_planstunden'}, visible: false}, + {title: this.$p.t('lehre', 'lehreinheit_id'), field: "lehreinheit_id", headerFilter: true, headerFilterFuncParams: {field: 'lehreinheit_id'}, visible: false}, + {title: this.$p.t('lehre', 'studiensemester'), field: "studiensemester_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'studiensemester_kurzbz'}, visible: false}, + {title: this.$p.t('lehre', 'unr'), field: "unr", headerFilter: true, headerFilterFuncParams: {field: 'unr'}, visible: false}, + {title: this.$p.t('lehre', 'fachbereich'), field: "fachbereich", headerFilter: true, headerFilterFuncParams: {field: 'fachbereich'}, visible: false}, + {title: this.$p.t('lehre', 'stundenblockung'), field: "stundenblockung", headerFilter: true, headerFilterFuncParams: {field: 'stundenblockung'}, visible: false}, + {title: this.$p.t('lehre', 'wochenrhythmus'), field: "wochenrythmus", headerFilter: true, headerFilterFuncParams: {field: 'wochenrythmus'}, visible: false}, + {title: this.$p.t('lehre', 'startkw'), field: "start_kw", headerFilter: true, headerFilterFuncParams: {field: 'startkw'}, visible: false}, + {title: this.$p.t('lehre', 'raumtyp'), field: "raumtyp", headerFilter: true, headerFilterFuncParams: {field: 'raumtyp'}, visible: false}, + {title: this.$p.t('lehre', 'raumtypalternativ'), field: "raumtypalternativ", headerFilter: true, headerFilterFuncParams: {field: 'raumtypalternativ'}, visible: false}, {title: this.$p.t('lehre', 'gruppen'), field: "gruppen", headerFilter: true, headerFilterFuncParams: {field: 'gruppen'}}, {title: this.$p.t('lehre', 'lehrende'), field: "lektoren", headerFilter: true, headerFilterFuncParams: {field: 'lektoren'}}, ], @@ -359,6 +367,11 @@ export default { shouldAutoLoad() { return this.filter && this.filter.activeFilter; }, + toUpperCase(str) { + if (!str) + return ''; + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase() + }, async reload() { @@ -369,7 +382,7 @@ export default { }, rowSelectionChanged(data) { this.selectedRows = this.$refs.table.tabulator.getSelectedRows(); - this.selectedColumnValues = this.selectedRows.filter(row => row.getData().lehreinheit_id !== undefined).map(row => row.getData().lehreinheit_id); + this.selectedColumnValues = this.selectedRows.filter(row => row.getData().lehreinheit_id !== undefined && row.getData().lehreinheit_id).map(row => row.getData().lehreinheit_id); if (data[0]?.lehreinheit_id !== undefined && this.selectedColumnValues.length === 1) { @@ -471,9 +484,7 @@ export default { if (Array.isArray(addedTag.response)) { addedTag.response.forEach(tag => { - - const all = this.getAllRows(table.getRows()); - const targetRow = all.find(row => row.getData().lehreinheit_id === tag.lehreinheit_id); + const targetRow = this.allRows.find(row => row.getData().lehreinheit_id === tag.lehreinheit_id); if (targetRow) { const rowData = targetRow.getData(); @@ -496,10 +507,7 @@ export default { }); }, deletedTag(deletedTag) { - const table = this.$refs.table.tabulator; - const all = this.getAllRows(table.getRows()); - - const targetRow = all.find(row => { + const targetRow = this.allRows.find(row => { const rowData = row.getData(); let tags = []; @@ -532,10 +540,7 @@ export default { }, updatedTag(updatedTag) { - const table = this.$refs.table.tabulator; - const all = this.getAllRows(table.getRows()); - - const targetRow = all.find(row => { + const targetRow = this.allRows.find(row => { const rowData = row.getData(); let tags = []; @@ -587,9 +592,8 @@ export default { async getExpandedRows() { this.expanded = []; - let rows = this.$refs.table.tabulator.getRows(); - let allRows = this.getAllRows(rows); - allRows.forEach(row => { + + this.allRows.forEach(row => { if (row.getTreeChildren().length > 0 && row.isTreeExpanded()) { this.expanded.push(row.getData().uniqueindex); @@ -597,9 +601,9 @@ export default { }); }, reexpandRows() { - const all = this.getAllRows(this.$refs.table.tabulator.getRows()); + this.allRows = this.getAllRows(this.$refs.table.tabulator.getRows()); - const matchingRows = all.filter(row => + const matchingRows = this.allRows.filter(row => this.expanded.includes(row.getData().uniqueindex) ); @@ -637,6 +641,39 @@ export default { }); return result; }, + resetTree() { + this.allRows.forEach(row => { + row._row.modules.dataTree.open = false; + }); + + let rootRows = this.$refs.table.tabulator.getRows(true); + var lastRow = rootRows[rootRows.length - 1]; + lastRow.treeCollapse(true) + + this.currentTreeLevel = 0; + }, + expandTree() + { + this.currentTreeLevel = (this.currentTreeLevel || 0) + 1; + + let lastMatchingRow = null; + + this.allRows.forEach(row => { + const level = row._row.modules.dataTree?.index ?? 0; + + if (level === this.currentTreeLevel - 1 ) + { + row._row.modules.dataTree.open = true; + lastMatchingRow = row; + } + }); + + if (lastMatchingRow) + { + lastMatchingRow.treeExpand(); + } + this.$refs.table.tabulator.redraw(); + }, }, template: ` + +