mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 06:54:04 +00:00
- merged master
- updaed Verbandsbaum to work with the new version
This commit is contained in:
@@ -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']);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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()"/>
|
||||
|
||||
Reference in New Issue
Block a user