implemented myLv supervisor view

This commit is contained in:
adisposkofh
2026-09-30 13:23:03 +02:00
parent 22500a96c1
commit af978e1312
5 changed files with 343 additions and 9 deletions
@@ -37,7 +37,45 @@ class Betreuungen extends FHCAPI_Controller
public function getBetreuungen()
{
$semester = $this->input->get("semester");
if (!$semester) $this->terminateWithError("Missing parameters!");
$personId = getAuthPersonId();
$betreuungenQuery = "SELECT
tbl_lehrveranstaltung.bezeichnung,
tbl_projektarbeit.titel,
(SELECT nachname || ' ' || vorname
FROM public.tbl_benutzer
JOIN public.tbl_person USING(person_id)
WHERE uid=student_uid)
as name,
(SELECT uid
FROM public.tbl_benutzer
WHERE uid=student_uid)
as uid,
tbl_lehrveranstaltung.studiengang_kz,
tbl_lehrveranstaltung.semester,
tbl_studiengang.kurzbzlang as studiengang,
tbl_studiengang.email,
tbl_betreuerart.beschreibung AS beutreuerart_beschreibung,
tbl_projektbetreuer.stunden
FROM
lehre.tbl_lehrveranstaltung, lehre.tbl_projektarbeit, lehre.tbl_projektbetreuer, public.tbl_studiengang, lehre.tbl_betreuerart
WHERE
tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_projektarbeit.lehrveranstaltung_id AND
tbl_projektarbeit.studiensemester_kurzbz = '$semester' AND
tbl_projektarbeit.projektarbeit_id = tbl_projektbetreuer.projektarbeit_id AND
tbl_lehrveranstaltung.studiengang_kz = tbl_studiengang.studiengang_kz AND
tbl_projektbetreuer.betreuerart_kurzbz = tbl_betreuerart.betreuerart_kurzbz AND
tbl_projektbetreuer.person_id = '$personId'";
$this->addMeta("query", $betreuungenQuery);
$this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel');
$result = $this->LehrveranstaltungModel->execReadOnlyQuery($betreuungenQuery);
$result = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($result);
}
}
+28
View File
@@ -0,0 +1,28 @@
/**
* 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/>.
*/
export default {
getBetreuungen(semester) {
return {
method: 'get',
url: '/api/frontend/v1/lv/Betreuungen/getBetreuungen',
params: {
semester
},
};
},
};
+6 -4
View File
@@ -17,7 +17,7 @@ export default {
studiensemester: null,
lvs: {},
currentSemester: null,
modes: ["lvs", "lehrenheiten", "supervision"],
modes: ["lvs", "lehrenheiten", "supervision", "all"],
selectedMode: "lvs"
};
},
@@ -153,9 +153,11 @@ export default {
</div>
</div>
<div class="pt-4">
<lvs v-if="selectedMode === 'lvs'" :current="current" />
<lehrenheiten v-else-if="selectedMode === 'lehrenheiten'" :current="current" />
<supervisor v-else-if="selectedMode === 'supervision'" :current="current" />
<lvs v-if="selectedMode === 'lvs' || selectedMode === 'all'" :current="current" />
<hr v-if="selectedMode === 'all'">
<lehrenheiten v-if="selectedMode === 'lehrenheiten' || selectedMode === 'all'" :current="current" />
<hr v-if="selectedMode === 'all'">
<supervisor v-if="selectedMode === 'supervision' || selectedMode === 'all'" :semester="currentSemester" />
</div>
</div>
<div v-else class="alert alert-danger" role="alert">
+128 -4
View File
@@ -1,12 +1,136 @@
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
import ApiBetreuungen from "../../../api/factory/betreuungen.js";
export default {
name: "Supervisor",
props: ["current"],
components: {
CoreFilterCmpt
},
props: {
semester: null | String,
},
data() {
return {};
return {
students: [],
isFetchingStudents: false,
supervisorTableOptions: {
index: 'lehrveranstaltung_id',
layout: 'fitColumns',
columns: [
{
titlePhrase: "betreuungen/studiengang",
title: "placeholder",
field: "studiengang",
widthGrow: 1,
},
{
titlePhrase: "betreuungen/semester",
title: "placeholder",
field: "semester",
widthGrow: 1,
},
{
titlePhrase: "betreuungen/stunden",
title: "placeholder",
field: "stunden",
widthGrow: 1,
},
{
titlePhrase: "betreuungen/lvBezeichnung",
title: "placeholder",
field: "bezeichnung",
widthGrow: 3,
},
{
titlePhrase: "betreuungen/student",
title: "placeholder",
field: "name",
widthGrow: 3,
formatter: "link",
formatterParams: {
target:"_blank",
url: (cell) => {
const uid = cell._cell.row.data.uid;
// todo: get full profilview url (or just use cell click instead of link formatter)
return this.$router.resolve("ProfilView").href;
},
},
},
{
titlePhrase: "betreuungen/betreuungsart",
title: "placeholder",
field: "beutreuerart_beschreibung",
widthGrow: 3,
},
{
titlePhrase: "betreuungen/titelProjektarbeit",
title: "placeholder",
field: "titel",
widthGrow: 6,
},
],
locale: true,
persistence: false,
persistenceID: "supervisorTable",
},
};
},
watch: {
semester() {
this.getStudents();
},
},
methods: {
async getStudents() {
if (!this.$props.semester?.length) return;
this.students = [];
this.isFetchingStudents = true;
const studentsResponse = await this.$api.call(
ApiBetreuungen.getBetreuungen(this.$props.semester),
);
if (studentsResponse.meta.status === "success") {
this.students = studentsResponse.data;
this.setTableData();
}
this.isFetchingStudents = false;
},
handleTableBuilt() {
this.setTableData();
},
setTableData() {
if (this.$refs.supervisorTable && this.students?.length) {
this.$refs.supervisorTable.tabulator.setData(
this.students
);
}
},
},
mounted() {
this.getStudents();
console.log(this.$router);
},
template: /*html*/ `
<div>
SUPERVISOR PLACEHOLDER
<div v-if="isFetchingStudents" class="d-flex flex-row justify-content-center pt-3">
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
</div>
<div v-else-if="students?.length">
<span>{{ students.length + " supervised students" }}</span>
<core-filter-cmpt
@tableBuilt="handleTableBuilt()"
ref="supervisorTable"
tableOnly
:tabulator-options="supervisorTableOptions"
:sideMenu="false"
/>
</div>
<div v-else class="d-flex flex-row justify-content-center pt-3">
<h4>No supervised students found!</h4>
</div>
</div>
`,
}
};
+142
View File
@@ -67013,6 +67013,148 @@ I have been informed that I am under no obligation to consent to the transmissio
)
)
),
// BETREUUNGEN PHRASES START
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'studiengang',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Stg',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'DP',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'semester',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Sem',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Sem',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'stunden',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Std',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Hrs',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'lvBezeichnung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'LV Bezeichnung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Course title',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'student',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Student/in',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Student',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'betreuungsart',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Betreuungsart',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Supervision type',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'betreuungen',
'phrase' => 'titelProjektarbeit',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Titel der Projektarbeit',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Project title',
'description' => '',
'insertvon' => 'system'
)
)
),
// BETREUUNGEN PHRASES END
);