studiensemester_kurzbz aus dem fronted beruecksichtigen

extendedHeaderFilter suche in mehreren spalten moeglich
getAllOe sql abfrage richtig gestellt
This commit is contained in:
ma0048
2025-07-31 09:10:11 +02:00
parent 96cb546b68
commit f9f0748b89
8 changed files with 201 additions and 132 deletions
@@ -27,8 +27,8 @@ class Lehrveranstaltung extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'loadByEmployee' => ['admin:r', 'assistenz:r'],
'loadByStudiengang' => ['admin:r', 'assistenz:r'],
'getByEmp' => ['admin:r', 'assistenz:r'],
'getByStg' => ['admin:r', 'assistenz:r'],
'loadByLV' => ['admin:r', 'assistenz:r'],
]);
@@ -37,6 +37,7 @@ class Lehrveranstaltung extends FHCAPI_Controller
$this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->_ci->load->library('VariableLib', ['uid' => $this->_uid]);
@@ -46,12 +47,14 @@ class Lehrveranstaltung extends FHCAPI_Controller
)
);
}
public function loadByEmployee($mitarbeiter_uid = null, $stg_kz = null)
{
if (is_null($mitarbeiter_uid))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$studiensemester_kurzbz = $this->_ci->variablelib->getVar('semester_aktuell');
public function getByEmp($studiensemester_kurzbz = null, $mitarbeiter_uid = null, $stg_kz = null)
{
if (is_null($mitarbeiter_uid))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$lehrveranstaltungen = $this->_ci->LehreinheitModel->getLvsByEmployee($mitarbeiter_uid, $studiensemester_kurzbz, $stg_kz);
$lehrveranstaltungen_data = $this->getDataOrTerminateWithError($lehrveranstaltungen);
@@ -72,8 +75,7 @@ class Lehrveranstaltung extends FHCAPI_Controller
$this->terminateWithSuccess($tree);
}
public function loadByStudiengang($studiengang_kz = null, $semester = null)
public function getByStg($studiensemester_kurzbz = null, $studiengang_kz = null, $semester = null)
{
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);
@@ -87,7 +89,7 @@ class Lehrveranstaltung extends FHCAPI_Controller
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
$studiensemester_kurzbz = $this->_ci->variablelib->getVar('semester_aktuell');
$studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
$studienplan_data = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
$studienplan_ids = array();
@@ -107,7 +109,6 @@ class Lehrveranstaltung extends FHCAPI_Controller
$lehrveranstaltungen_data = $this->_ci->LehrveranstaltungModel->getLvsByStudiengang($studienplan_ids, $placeholders, $only_ids, $studiengang_kz, $studiensemester_kurzbz, $semester, $verband);
$lehrveranstaltungen_data = hasData($lehrveranstaltungen_data) ? getData($lehrveranstaltungen_data) : array();
$tree = [];
foreach ($lehrveranstaltungen_data as $row)
{
@@ -246,4 +247,19 @@ class Lehrveranstaltung extends FHCAPI_Controller
}
}
}
private function getStudiensemesterKurzbz($studiensemester_kurzbz = null)
{
if (!is_null($studiensemester_kurzbz))
{
$studiensemester_result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
if (isError($studiensemester_result) || !hasData($studiensemester_result))
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
return getData($studiensemester_result)[0]->studiensemester_kurzbz;
}
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
}
}
@@ -356,6 +356,8 @@ EOSQL;
gruppen.gruppen,
mitarbeiter.lektoren,
mitarbeiter.le_planstunden,
mitarbeiter.vorname,
mitarbeiter.nachname,
mitarbeiter.semesterstunden,
fachbereich.bezeichnung as fachbereich,
UPPER(CONCAT(tbl_studiengang.typ,tbl_studiengang.kurzbz)) as studiengang,
@@ -659,11 +661,15 @@ EOSQL;
SELECT
tbl_lehreinheitmitarbeiter.lehreinheit_id,
STRING_AGG(m.kurzbz, ' ') AS lektoren,
STRING_AGG(tbl_person.vorname, ' ') AS vorname,
STRING_AGG(tbl_person.nachname, ' ') AS nachname,
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)
JOIN public.tbl_benutzer ON mitarbeiter_uid = uid
JOIN public.tbl_person ON tbl_benutzer.person_id = tbl_person.person_id
GROUP BY tbl_lehreinheitmitarbeiter.lehreinheit_id
)";
}
@@ -1200,19 +1200,29 @@ class Lehrveranstaltung_model extends DB_Model
public function getAllOe($lv_id, $stg_kz = null)
{
$qry = "SELECT DISTINCT oe_kurzbz
$qry = "(SELECT DISTINCT oe_kurzbz
FROM lehre.tbl_studienplan_lehrveranstaltung
JOIN lehre.tbl_studienplan USING(studienplan_id)
JOIN lehre.tbl_studienordnung USING(studienordnung_id)
JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE lehrveranstaltung_id = ? ";
WHERE lehrveranstaltung_id = ?)";
$params = array($lv_id);
if (!is_null($stg_kz))
{
$qry .= ' OR studiengang_kz = ?';
$qry .= ' UNION
(SELECT oe_kurzbz
FROM public.tbl_studiengang WHERE studiengang_kz = ?)';
$params[] = $stg_kz;
}
else
{
$qry .= ' UNION
(SELECT oe_kurzbz
FROM public.tbl_studiengang WHERE studiengang_kz = (SELECT tbl_lehrveranstaltung.studiengang_kz FROM lehre.tbl_lehrveranstaltung WHERE lehrveranstaltung_id = ?))
';
$params[] = $lv_id;
}
return $this->execReadOnlyQuery($qry, $params);
}
+14 -6
View File
@@ -7,16 +7,24 @@ export default {
url: '/api/frontend/v1/Lehrveranstaltung/loadByLV/' + encodeURIComponent(lehrveranstaltung_id)
};
},
getByStg(studiengang_kz, semester)
getByStg(studiensemester_kurzbz, studiengang_kz, semester = null)
{
return ("/api/frontend/v1/Lehrveranstaltung/loadByStudiengang/" + encodeURIComponent(studiengang_kz) + "/" + encodeURIComponent(semester));
},
let path = "/api/frontend/v1/Lehrveranstaltung/getByStg/" + encodeURIComponent(studiensemester_kurzbz) + "/" + encodeURIComponent(studiengang_kz);
getByEmpStg(mitarbeiter_uid, stg)
if (semester)
path += "/" + encodeURIComponent(semester);
return path;
},
getByEmp(studiensemester_kurzbz, mitarbeiter_uid, stg = null)
{
return ("/api/frontend/v1/Lehrveranstaltung/loadByEmployee/" + encodeURIComponent(mitarbeiter_uid) + "/" + encodeURIComponent(stg));
},
let path = "/api/frontend/v1/Lehrveranstaltung/getByEmp/" + encodeURIComponent(studiensemester_kurzbz) + "/" + encodeURIComponent(mitarbeiter_uid);
if (stg)
path += "/" + encodeURIComponent(stg);
return path;
},
getTable(url)
{
return {
+61 -5
View File
@@ -1,5 +1,6 @@
import LVVerwaltung from "../components/LVVerwaltung/LVVerwaltung.js";
import Phrasen from "../plugins/Phrasen.js";
import {DEFAULT_MODE_RAUMINFO} from "../components/Cis/Mylv/RoomInformation";
const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router;
@@ -13,8 +14,35 @@ const router = VueRouter.createRouter({
},
{
name: `byEmp`,
path: `/emp/:emp/:stg?`,
component: LVVerwaltung
path: `/emp/:studiensemester_kurzbz/:emp/:stg?/:semester?`,
component: LVVerwaltung,
props: route => {
let {emp, stg, semester, studiensemester_kurzbz} = route.params;
if (emp === '')
emp = undefined;
if (stg === '')
stg = undefined;
if (studiensemester_kurzbz === '')
studiensemester_kurzbz = undefined;
return {
studiensemester_kurzbz: studiensemester_kurzbz,
emp: emp,
stg: stg,
};
},
beforeEnter: (to, from, next) => {
const { studiensemester_kurzbz } = to.params;
const isSemester = /^(SS|WS)\d{4}$/.test(studiensemester_kurzbz);
if (!isSemester)
return next({ path: '/' });
else
next();
}
},
/*{
name: `byFachbereich`,
@@ -23,13 +51,41 @@ const router = VueRouter.createRouter({
},*/
{
name: `byStg`,
path: `/stg/:stg/:semester?`,
component: LVVerwaltung
path: '/stg/:studiensemester_kurzbz/:stg?/:semester?/',
component: LVVerwaltung,
props: route => {
let { studiensemester_kurzbz, stg, semester } = route.params;
if (semester === '')
semester = undefined;
if (studiensemester_kurzbz === '')
studiensemester_kurzbz = undefined;
if (stg === '')
semester = undefined;
return {
studiensemester_kurzbz: studiensemester_kurzbz,
stg: stg,
semester: semester != null ? Number(semester) : null,
};
},
beforeEnter: (to, from, next) => {
const studiensemester_kurzbz = to.params?.studiensemester_kurzbz
const isSemester = /^(SS|WS)\d{4}$/.test(studiensemester_kurzbz);
if (!isSemester)
return next({ path: '/' });
else
next();
}
},
{
path: '/:pathMatch(.*)*',
redirect: '/'
}
},
]
});
@@ -26,16 +26,22 @@ export default {
defaultSemester: String,
lvRoot: String,
permissions: Object,
config: Object
config: Object,
stg: { type: String, required: false },
semester: { type: Number, required: false, default: null },
studiensemester_kurzbz: { type: String, required: false, default: null },
emp: { type: String, required: false, default: null }
},
computed: {
type(){
return this.$route.params.type
selectedStudiensemester() {
return this.studiensemester_kurzbz != null
? this.studiensemester_kurzbz
: this.defaultSemester;
}
},
provide() {
return {
currentSemester: Vue.computed(() => this.studiensemesterKurzbz),
currentSemester: Vue.computed(() => this.selectedStudiensemester),
dropdowns: this.dropdowns,
configShowVertragsdetails: this.config.showVertragsdetails,
configShowGewichtung: this.config.showGewichtung,
@@ -49,18 +55,26 @@ export default {
}
},
mounted() {
this.updateFilter(this.$route);
this.updateFilter();
},
watch: {
'$route'(to) {
this.updateFilter(to);
stg() {
this.updateFilter();
},
semester() {
this.updateFilter();
},
selectedStudiensemester() {
this.updateFilter();
},
emp() {
this.updateFilter();
},
},
data() {
return {
selected: [],
studiensemesterKurzbz: this.defaultSemester,
stg: "",
studiengang: "",
filter: {},
endpoint: ApiStudiengangTree,
dropdowns: {
@@ -95,20 +109,16 @@ export default {
}
},
methods: {
updateFilter(route)
updateFilter()
{
let filter = { ...route.params, ...route.query };
if (!filter.activeFilter)
{
if (filter.emp)
{
filter.activeFilter = 'employee';
}
else if (filter.stg)
{
filter.activeFilter = 'verband';
}
const filter = {
stg: this.stg,
emp: this.emp,
semester: this.semester,
studiensemester_kurzbz: this.selectedStudiensemester,
activeFilter: this.emp ? 'employee' : this.stg ? 'verband' : null
}
this.filter = filter;
},
handleRowClicked(data)
@@ -117,18 +127,26 @@ export default {
},
onSelectEmployee(emp)
{
let stg = this.stg === '' ? null : this.stg;
const { stg, semester } = this.filter;
this.$router.push({
name: 'byEmp',
params: { emp, stg, activeFilter: 'employee'},
});
let studiensemester_kurzbz = this.selectedStudiensemester;
const params = { emp };
if (stg)
params.stg = stg;
if (semester !== null)
params.semester = semester;
if (studiensemester_kurzbz)
params.studiensemester_kurzbz = studiensemester_kurzbz;
this.$router.push({ name: 'byEmp', params })
},
onSelectVerband({link})
{
let stg = null;
let semester = null;
let studiensemester_kurzbz = this.selectedStudiensemester;
if (typeof link === 'number')
stg = link;
@@ -137,28 +155,22 @@ export default {
[stg, semester] = link.split('/');
}
this.stg = stg;
const routeName = this.filter.emp ? 'byEmp' : 'byStg';
const params = { stg };
if (this.filter && this.filter.emp)
{
this.$router.push({
name: 'byEmp',
params: { emp: this.filter.emp, stg, activeFilter: 'employee' },
});
}
else
{
this.$router.push({
name: 'byStg',
params: { stg, semester, activeFilter: 'verband' },
});
}
if (semester !== null)
params.semester = Number(semester);
if (studiensemester_kurzbz)
params.studiensemester_kurzbz = studiensemester_kurzbz;
if (this.filter.emp)
params.emp = this.filter.emp;
this.$router.push({ name: routeName, params });
this.selected = [];
},
resetEmployeeFilter()
{
const newParams = { ...this.$route.params, activeFilter: 'verband' };
const newParams = { ...this.filter, activeFilter: 'verband' };
if (newParams.stg === '')
this.$router.replace({ name: 'index' });
else
@@ -166,24 +178,24 @@ export default {
delete newParams.emp;
newParams.semester = null;
this.$router.replace({ name: 'byStg', params: newParams });
}
},
searchfunction(params) {
return this.$api.call(ApiSearchbar.search(params));
},
studiensemesterChanged(newValue) {
this.studiensemesterKurzbz = newValue;
this.$refs.lvTable.reload();
const routeName = this.filter.activeFilter === 'employee' ? 'byEmp' : 'byStg';
const newParams = {...this.filter, studiensemester_kurzbz: newValue};
this.$router.push({ name: routeName, params: newParams });
this.selected = [];
},
},
created() {
if (this.$route.params.stg !== undefined)
if (this.stg !== undefined)
{
this.selectedStudiengang = this.$route.params?.semester !== '' && this.$route.params?.semester
? `${this.$route.params.stg}/${this.$route.params.semester}`
: this.$route.params.stg;
this.selectedStudiengang = this.semester !== '' && this.semester
? `${this.stg}/${this.semester}`
: this.stg;
}
this.$p.loadCategory(['lehre', 'person', 'global'])
@@ -250,7 +262,7 @@ export default {
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
</div>
<stv-verband @select-verband="onSelectVerband" class="col" style="height:0%" :preselectedKey="selectedStudiengang" :endpoint="endpoint"></stv-verband>
<stv-studiensemester :default="defaultSemester" @changed="studiensemesterChanged"></stv-studiensemester>
<stv-studiensemester :default="selectedStudiensemester" @changed="studiensemesterChanged"></stv-studiensemester>
</nav>
<main class="col-md-8 ms-sm-auto col-lg-9 col-xl-10">
@@ -61,42 +61,6 @@ export default {
},
data() {
return {
fieldTitleMap: {
lv_kurzbz: ['lehre', 'kurzbz'],
tags: ['ui', 'tags'],
lehrveranstaltung_id: ['lehre', 'lehrveranstaltung_id'],
lv_bezeichnung: ['ui', 'bezeichnung'],
lv_bezeichnung_english: ['lehre', 'bezeichnungeng'],
lv_studiengang_kz: ['lehre', 'studiengangskennzahlLehre'],
studiengang: ['lehre', 'studiengang'],
semester: ['lehre', 'semester'],
sprache: ['global', 'sprache'],
lv_ects: ['lehre', 'ects'],
semesterstunden: ['lehre', 'semesterstunden'],
anmerkung: ['global', 'anmerkung'],
lehre: ['lehre', 'lehre'],
lehreverzeichnis: ['ui', 'lehreverzeichnis'],
aktiv: ['person', 'aktiv'],
planfaktor: ['ui', 'planfaktor'],
planlektoren: ['ui', 'planlektoren'],
planpersonalkosten: ['ui', 'planpersonalkosten'],
plankostenprolektor: ['ui', 'plankostenprolektor'],
orgform_kurzbz: ['lehre', 'organisationsform'],
studienplan_id: ['ui', 'studienplan_id'],
studienplan_bezeichnung: ['ui', 'studienplan_bezeichnung'],
lehrtyp_kurzbz: ['ui', 'lehrtyp_kurzbz'],
lehrform_kurzbz: ['lehre', 'lehrform'],
le_planstunden: ['lehre', 'leplanstunden'],
lehreinheit_id: ['lehre', 'lehreinheit_id'],
stundenblockung: ['lehre', 'stundenblockung'],
wochenrythmus: ['lehre', 'wochenrhytmus'],
startkw: ['lehre', 'startkw'],
raumtyp: ['lehre', 'raumtyp'],
raumtypalternativ: ['lehre', 'raumtypalternativ'],
gruppen: ['lehre', 'gruppen'],
lektoren: ['lehre', 'lehrende'],
},
expanded: [],
selectedColumnValues: [],
tagEndpoint: ApiTag,
@@ -168,7 +132,7 @@ export default {
headerFilterFunc: extendedHeaderFilter,
},
layout: 'fitDataStretch',
persistenceID: 'lehrveranstaltungen_2025_07_11_v1',
persistenceID: 'lehrveranstaltungen_2025_07_31_v1',
selectableRowsRangeMode: 'click',
selectableRows: true,
rowContextMenu: (component, e) => {
@@ -348,7 +312,7 @@ export default {
{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'}},
{title: this.$p.t('lehre', 'lehrende'), field: "lektoren", headerFilter: true, headerFilterFuncParams: {field: ['lektoren', 'vorname', 'nachname']}},
],
}
@@ -417,18 +381,14 @@ export default {
{
if (this.filter.activeFilter === 'employee' && this.filter.emp)
{
return this.$api.getUri(ApiLv.getByEmpStg(
this.filter.emp,
this.filter.stg
));
const { emp, stg, studiensemester_kurzbz } = this.filter;
return this.$api.getUri(ApiLv.getByEmp(studiensemester_kurzbz, emp, stg));
}
if (this.filter.activeFilter === 'verband' && this.filter.stg)
{
return this.$api.getUri(ApiLv.getByStg(
this.filter.stg,
this.filter.semester
));
const { stg, semester, studiensemester_kurzbz } = this.filter;
return this.$api.getUri(ApiLv.getByStg(studiensemester_kurzbz, stg, semester));
}
},
resetEmployeeFilter()
@@ -437,16 +397,6 @@ export default {
delete newFilter.emp;
newFilter.activeFilter = 'verband';
},
buildParams()
{
const params = {};
for (const [key, value] of Object.entries(this.filter)) {
if (value !== undefined && value !== null) {
params[key] = value;
}
}
return params;
},
showLehreinheitModal() {
this.resetModal();
this.$refs.lehreinheitModal.show();
@@ -649,7 +599,7 @@ export default {
let rootRows = this.$refs.table.tabulator.getRows(true);
var lastRow = rootRows[rootRows.length - 1];
lastRow.treeCollapse(true)
lastRow?.treeCollapse(true)
this.currentTreeLevel = 0;
},
@@ -41,6 +41,17 @@ function parseFilterExpression(expression)
export function extendedHeaderFilter(headerValue, rowValue, rowData, filterParams)
{
const fields = Array.isArray(filterParams?.field)
? filterParams.field
: [filterParams?.field];
if (fields.length > 1 && rowData)
{
rowValue = fields
.map(f => rowData[f] ?? '')
.filter(Boolean)
.join(' ');
}
if (typeof headerValue === 'boolean')
{
return rowValue === headerValue;