- merged master

- updaed Verbandsbaum to work with the new version
This commit is contained in:
ma0048
2026-08-31 14:58:27 +02:00
parent 51886960bb
commit fb36b2a548
9 changed files with 204 additions and 23 deletions
+5
View File
@@ -27,3 +27,8 @@ $config['lvv'] = [
"library" => "treemenu/LvVwLib",
"permissions" => ["admin:r", "assistenz:r"]
];
$config['tempus'] = [
"library" => "treemenu/TempusLib",
"permissions" => ["admin:r", "assistenz:r", "lehre/lvplan:r"]
];
@@ -0,0 +1,32 @@
<?php
/**
* Copyright (C) 2026 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['root'] = [
'stg' => [
'semester' => [
'group',
'verband' => [
'group'
]
],
'orgform'
]
];
@@ -154,7 +154,7 @@ class Coursepicker extends FHCAPI_Controller
}
$first = false;
$this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $studiengang['studiengang_kz']);
$this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $studiengang['stg_kz']);
if (isset($studiengang['semester']))
$this->_ci->LehreinheitModel->db->where('tbl_lehrveranstaltung.semester', $studiengang['semester']);
+1 -1
View File
@@ -412,7 +412,7 @@ class KalenderLib
foreach ($studiengaenge as $studiengang)
{
$conditions = array();
$conditions[] = 'filter_lv.studiengang_kz = ' . $db->escape($studiengang['studiengang_kz']);
$conditions[] = 'filter_lv.studiengang_kz = ' . $db->escape($studiengang['stg_kz']);
if (isset($studiengang['semester']))
$conditions[] = 'filter_lv.semester = ' . $db->escape($studiengang['semester']);
@@ -0,0 +1,148 @@
<?php
/**
* Copyright (C) 2026 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Tempus Menu library
*/
class TempusLib
{
protected $_ci = null;
public $config = [];
public function __construct()
{
// Get code igniter instance
$this->_ci =& get_instance();
// Load Tree-config
$this->_ci->load->config('treemenu/custom/tempus');
$this->config = $this->_ci->config->item('root');
// Load Libraries
$this->_ci->load->library('treemenu/base/StgLib');
// Load Model
$this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
public function stg($path_template)
{
$permittedStgs = $this->getPermittedStudiengangKzs();
if (!$permittedStgs)
return [];
return $this->_ci->stglib->studiengang($path_template, $permittedStgs);
}
public function semester($path_template, $has_children, $stg)
{
$stg = $this->getStgFromUrl($stg);
if ($stg === null)
return [];
if (!$has_children)
$this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
return $this->_ci->stglib->semester($path_template, $stg->studiengang_kz);
}
public function verband($path_template, $stg, $semester)
{
$stg = $this->getStgFromUrl($stg);
if ($stg === null)
return [];
$this->_ci->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf");
$this->_ci->StudiengangModel->addGroupBy('v.studiengang_kz, v.semester');
return $this->_ci->stglib->verband($path_template, $stg->studiengang_kz, $semester);
}
public function group($path_template, $stg, $semester, $verband)
{
$stg = $this->getStgFromUrl($stg);
if ($stg === null)
return [];
$this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
if ($verband === null) {
$this->_ci->load->model('organisation/Gruppe_model', 'GruppeModel');
$this->_ci->GruppeModel->addSelect('semester');
return $this->_ci->stglib->group($path_template, $stg->studiengang_kz, $semester);
}
return $this->_ci->stglib->verbandsgroup($path_template, $stg->studiengang_kz, $semester, $verband);
}
public function orgform($path_template, $stg)
{
$stg = $this->getStgFromUrl($stg);
if ($stg === null)
return [];
if (!$stg->mischform)
return [];
$this->_ci->StudiengangModel->db->select('TRUE AS leaf', false);
$this->_ci->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
$this->_ci->StudienordnungModel->addSelect("p.orgform_kurzbz");
return $this->_ci->stglib->orgform($path_template, $stg->studiengang_kz);
}
protected function getPermittedStudiengangKzs()
{
$permittedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('admin') ?: [];
$permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('assistenz') ?: []);
$permittedStgs = array_merge($permittedStgs, $this->_ci->permissionlib->getSTG_isEntitledFor('lehre/lvplan') ?: []);
return $permittedStgs;
}
protected function getStgFromUrl($stg)
{
$permittedStgs = $this->getPermittedStudiengangKzs();
if (!$permittedStgs)
return null;
$this->_ci->StudiengangModel->db->where_in('studiengang_kz', $permittedStgs);
$stg = $this->_ci->StudiengangModel->loadWhere([
'LOWER(CONCAT(typ, kurzbz)) =' => $stg
]);
if (!hasData($stg))
return null;
return current(getData($stg));
}
}
+2 -2
View File
@@ -103,8 +103,8 @@ export default {
return;
}
let payload = stg.map(({ studiengang_kz, semester, orgform_kurzbz }) => ({
studiengang_kz,
let payload = stg.map(({ stg_kz, semester, orgform_kurzbz }) => ({
stg_kz,
semester,
orgform_kurzbz
}));
@@ -20,13 +20,14 @@ export default {
}
else
{
this.$emit('update:studiengaenge', this.studiengaenge.filter(studiengang => !(studiengang.studiengang_kz === stg_kz && studiengang.semester === semester && studiengang.orgform_kurzbz === orgform_kurzbz)));
this.$emit('update:studiengaenge', this.studiengaenge.filter(studiengang => !(studiengang.stg_kz === stg_kz && studiengang.semester === semester && (!orgform_kurzbz || studiengang.orgform_kurzbz === orgform_kurzbz))));
}
},
stgLabel(stg)
{
let found = this.studiengaengeAll.find(s => s.studiengang_kz == stg.studiengang_kz);
let name = found?.name ?? stg.studiengang_kz;
let found = this.studiengaengeAll.find(s => s.studiengang_kz == stg.stg_kz);
let name = found?.name ?? stg.stg_kz;
if (stg.orgform_kurzbz)
return `${name} - ${stg.orgform_kurzbz}`;
@@ -56,7 +57,7 @@ export default {
<button
type="button"
class="btn btn-sm btn-link text-danger p-0"
@click="removeStg(studiengang.studiengang_kz, studiengang.semester, studiengang.orgform_kurzbz)"
@click="removeStg(studiengang.stg_kz, studiengang.semester, studiengang.orgform_kurzbz)"
title="Studiengang entfernen"
>
<i class="fa-solid fa-xmark"></i>
+10 -15
View File
@@ -34,7 +34,8 @@ import AppConfig from "../AppConfig.js";
import BsModal from "../Bootstrap/Modal.js";
import StvVerband from "../Stv/Studentenverwaltung/Verband.js";
import BaseTreemenu from '../Base/Treemenu.js';
import ApiStudiengangTree from "../../api/factory/tempus/studiengangtree.js";
import ApiInfo from "../../api/factory/tempus/info.js";
import StvStudiensemester from "../Stv/Studentenverwaltung/Studiensemester.js";
@@ -63,7 +64,7 @@ export default {
AppMenu,
NavLanguage,
BsModal,
StvVerband,
BaseTreemenu,
StvStudiensemester,
Multiselect: primevue.multiselect,
FormInput,
@@ -281,29 +282,23 @@ export default {
this.rooms = [{ ort_kurzbz: data.ort_kurzbz }];
},
onSelectVerbandAndClose(payload) {
console.log(payload);
this.onSelectVerband(payload);
bootstrap.Offcanvas.getOrCreateInstance(this.$refs.verbandMenu).hide();
},
onSelectVerband({ link, studiengang_kz, semester, orgform_kurzbz, name }) {
if (orgform_kurzbz) {
semester = null;
} else if (typeof link === "string") {
[studiengang_kz, semester] = link.split("/");
}
onSelectVerband({ path, stg_kz, semester, orgform_kurzbz, name }) {
let exists = this.studiengaenge.some(
(stg) =>
stg.studiengang_kz == studiengang_kz &&
stg.stg_kz == stg_kz &&
stg.semester == semester &&
stg.orgform_kurzbz === orgform_kurzbz,
(!orgform_kurzbz || stg.orgform_kurzbz === orgform_kurzbz),
);
if (!exists) {
this.studiengaenge = [
...this.studiengaenge,
{ studiengang_kz, semester, orgform_kurzbz, name },
{ stg_kz, semester, orgform_kurzbz, name },
];
}
},
@@ -408,8 +403,8 @@ export default {
if (hasRooms) filter.ort = this.rooms.map((room) => room.ort_kurzbz);
if (hasStg) {
filter.stg = this.studiengaenge.map(
({ studiengang_kz, semester, orgform_kurzbz }) => ({
studiengang_kz,
({ stg_kz, semester, orgform_kurzbz }) => ({
stg_kz,
semester,
orgform_kurzbz,
}),
@@ -1276,7 +1271,7 @@ export default {
</h5>
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
</div>
<stv-verband :endpoint="endpoint" @select-verband="onSelectVerbandAndClose" class="col" style="height:0%"></stv-verband>
<base-treemenu config="tempus" @select-entry="onSelectVerbandAndClose" class="col" style="height:0%"></base-treemenu>
</div>
<raumauswahl-modal ref="raumModal" @saved="$refs.calendar.resetEventLoader()"/>