update(Cis4 Studium): finilizes Studium feature

This commit is contained in:
SimonGschnell
2025-05-06 13:30:06 +02:00
parent eae44bc634
commit b5d3bf3f1e
8 changed files with 331 additions and 118 deletions
@@ -39,6 +39,7 @@ class Studium extends FHCAPI_Controller
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
$this->load->model('codex/Orgform_model','OrgformModel');
$this->load->model('person/Person_model','PersonModel');
}
@@ -53,11 +54,6 @@ class Studium extends FHCAPI_Controller
$parameter_semester = $this->input->get('semester',true);
$parameter_studienplan = $this->input->get('studienplan',true);
$test1=null;
$test2=null;
$test3=null;
$test4=null;
if(isset($parameter_studiensemester)){
$parameter_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $parameter_studiensemester])));
}
@@ -80,7 +76,6 @@ class Studium extends FHCAPI_Controller
if(isset($parameter_studiensemester) && !empty(array_filter($allStudienSemester, function($studiensemester) use($parameter_studiensemester){
return $studiensemester->studiensemester_kurzbz == $parameter_studiensemester->studiensemester_kurzbz;
}))){
$test1=true;
$aktuelles_studiensemester = $parameter_studiensemester;
}
@@ -93,7 +88,6 @@ class Studium extends FHCAPI_Controller
if(isset($parameter_studiengang) && !empty(array_filter( $studiengaenge,function($studiengang)use($parameter_studiengang){
return $studiengang->studiengang_kz == $parameter_studiengang->studiengang_kz;
}))){
$test2=true;
$aktuelles_studiengang = $parameter_studiengang;
}
@@ -112,14 +106,13 @@ class Studium extends FHCAPI_Controller
$aktuelles_semester = null;
}
if(isset($parameter_semester) && in_array($parameter_semester, $semester)){
$test3=true;
$aktuelles_semester = $parameter_semester;
}
$semester_studienplan = array_filter($studienplaene, function($item) use($aktuelles_semester){
return $item->semester == $aktuelles_semester;
});
// fetch current studienplan based on semester
$aktuelles_studienplan = current($semester_studienplan);
if(!$aktuelles_studienplan){
@@ -128,13 +121,19 @@ class Studium extends FHCAPI_Controller
if(isset($parameter_studienplan) && !empty(array_filter( $semester_studienplan, function($stundenplan) use($parameter_studienplan){
return $stundenplan->studienplan_id == $parameter_studienplan->studienplan_id;
}))){
$test4=true;
$aktuelles_studienplan = $parameter_studienplan ;
}
// fetch studienplan lehrveranstaltungen
if($aktuelles_studienplan){
$lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester);
foreach($lehrveranstaltungen as $lehrv){
foreach($lehrv->lehrveranstaltungen as $lv){
$lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz);
$lv->lektoren = $lvLektoren;
}
}
$aktuelles_lehrveranstaltungen = $lehrveranstaltungen;
}else{
$aktuelles_lehrveranstaltungen = [];
@@ -152,10 +151,6 @@ class Studium extends FHCAPI_Controller
$result->studienplan["all"]=$semester_studienplan;
$result->studienplan["preselected"]=$aktuelles_studienplan;
$result->lehrveranstaltungen=$aktuelles_lehrveranstaltungen;
$result->test1=$test1;
$result->test2=$test2;
$result->test3=$test3;
$result->test4=$test4;
/* if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester_kz]);
@@ -224,6 +219,7 @@ class Studium extends FHCAPI_Controller
});
$lehrveranstaltungen= array_reduce($lehrveranstaltungen,function($carry, $lehrv){
if($lehrv->lehrtyp_kurzbz == "modul"){
$lehrv->lehrveranstaltungen = [];
array_push($carry, $lehrv);
}
else{
@@ -251,6 +247,18 @@ class Studium extends FHCAPI_Controller
$studienplan =current($this->getDataOrTerminateWithError($this->StudienplanModel->loadWhere(["studienplan_id"=>$studienplan_id])));
return $studienplan;
}
private function computeLektorenFromLehrveranstaltung($lehreinheit_id, $semester, $studiengang, $studiensemester){
$this->load->library('StundenplanLib');
$lektoren = $this->stundenplanlib->getLektorenFromLehrveranstaltung($lehreinheit_id,$semester, $studiengang,$studiensemester);
if(!$lektoren){
return [];
}
$lektoren = array_map(function($lektor){
return ["name"=>$this->getDataOrTerminateWithError($this->PersonModel->getFullName($lektor)), "email"=>$lektor."@".DOMAIN];
},$lektoren);
return $lektoren;
}
}
+36 -1
View File
@@ -21,6 +21,8 @@ class StundenplanLib{
$this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$this->_ci->load->model('person/Benutzergruppe_model','BenutzergruppeModel');
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$student_uid = getAuthUID();
if(is_null($student_uid))
@@ -55,7 +57,7 @@ class StundenplanLib{
// query lv itself in case its Stundenplan is being queried and it has no entries
$this->_ci->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel');
$lv_result = $this->LehrveranstaltungModel->load($lv_id);
$lv_result = $this->_ci->LehrveranstaltungModel->load($lv_id);
if(isError($lv_result))
{
return error(getData($lv_result));
@@ -143,6 +145,39 @@ class StundenplanLib{
return success($reservierungen);
}
public function getLektorenFromLehrveranstaltung($lehrveranstaltung_id, $semester, $studiengang_kz, $studiensemester_kurzbz){
$this->_ci =& get_instance();
$this->_ci->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester = $this->_ci->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester_kurzbz]);
if(isError($studiensemester))
{
return error(getData($studiensemester));
}
$studiensemester = current(getData($studiensemester));
$lektoren = $this->_ci->StundenplanModel->execReadOnlyQuery("
SELECT DISTINCT uid
FROM campus.vw_stundenplan
WHERE lehrveranstaltung_id = ? AND
studiengang_kz = ? AND
semester = ? AND
(datum BETWEEN ? AND ?)
",[$lehrveranstaltung_id, $studiengang_kz, $semester, $studiensemester->start, $studiensemester->ende]);
if(isError($lektoren))
{
return error(getData($lektoren));
}
$lektoren = getData($lektoren);
if(isset($lektoren)){
$lektoren = array_map(function($lektor){
return $lektor->uid;
},$lektoren);
}
return $lektoren;
}
public function expand_object_information($data){
$this->_ci =& get_instance();
@@ -22,6 +22,7 @@ $includesArray = array(
'public/css/components/Profil.css',
'public/css/components/FormUnderline.css',
'public/css/Cis4/Cms.css',
'public/css/Cis4/Studium.css',
),
'customJSs' => array(
'vendor/npm-asset/primevue/accordion/accordion.min.js',
+19
View File
@@ -59,6 +59,25 @@ html {
color:white;
}
/* lvMenu entry disabled style */
[disabled="true"].menu-entry {
pointer-events: none;
cursor: default;
background-color: #dadada !important;
color: black !important;
-webkit-touch-callout: none;
/* iOS Safari */
-webkit-user-select: none;
/* Safari */
-khtml-user-select: none;
/* Konqueror HTML */
-moz-user-select: none;
/* Old versions of Firefox */
-ms-user-select: none;
/* Internet Explorer/Edge */
user-select: none;
}
/* buttons */
#cis-header .btn-level-1,
#cis-header .btn-level-1 + .btn,
+60
View File
@@ -0,0 +1,60 @@
.lvUebersicht{
display:grid;
gap: 1rem;
}
@media (min-width: 992px) {
.lvUebersicht {
grid-template-columns: 1fr 1fr 1fr;
}
}
@media (max-width: 992px){
.lvUebersicht{
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 576px){
.lvUebersicht{
grid-template-columns: 1fr;
}
}
.lvOptions {
display: grid;
gap: 1rem;
}
.lvOptions > div {
flex-basis: auto;
flex-grow: 1;
flex-shrink: 1;
}
.lvOptions button {
flex-shrink: 0;
}
@media (min-width: 1200px) {
.lvOptions {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
}
@media (max-width: 1200px) {
.lvOptions {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 576px) {
.lvOptions {
grid-template-columns: 1fr;
}
}
-1
View File
@@ -8,7 +8,6 @@ export default {
},
getAllStudienSemester: function (studiensemester=undefined, studiengang=undefined, semester=undefined, studienplan=undefined) {
console.log(studiensemester, studiengang, semester, studienplan)
return this.$fhcApi.get(
'/api/frontend/v1/Studium/getStudienAllSemester',
{studiensemester, studiengang, semester, studienplan}
+24 -4
View File
@@ -11,6 +11,16 @@ export default {
required:true,
default:null,
},
studiensemester: {
type: String,
required: false,
default: null,
},
titel: {
type: String,
required: false,
default: null,
},
// prop used to preselect a menu item and skip the grid overview
preselectedMenu: {
type: Object,
@@ -39,7 +49,7 @@ export default {
showModal: function(){
if (!this.preselectedMenu) {
this.$api
.call(ApiAddons.getLvMenu(this.event.lehrveranstaltung_id, this.event.studiensemester_kurzbz))
.call(ApiAddons.getLvMenu(this.event.lehrveranstaltung_id, (this.studiensemester ?? this.event.studiensemester_kurzbz)))
.then(res => {
if (res.data) {
this.menu = res.data;
@@ -53,14 +63,24 @@ export default {
mounted(){
this.modal = this.$refs.modalContainer;
},
beforeUnmount(){
this.$refs.modalContainer.hide();
},
template:/*html*/`
<bs-modal :bodyClass="isMenuSelected ? '' : 'px-4 py-5'" @showBsModal="showModal" @hiddenBsModal="hiddenModal" ref="modalContainer" :dialogClass="{'modal-lg': !isMenuSelected, 'modal-fullscreen':isMenuSelected}">
<template #title>
<span v-if="event?.lehrfach_bez ">{{event?.lehrfach_bez + (event?.stg_kurzbzlang?' / ' + event?.stg_kurzbzlang:'')}}</span>
<span v-else>Lehrveranstaltungs Übersicht</span>
<template #title>
<template v-if="titel">
<span>{{titel}}</span>
</template>
<template v-else>
<span v-if="event?.lehrfach_bez ">{{event?.lehrfach_bez + (event?.stg_kurzbzlang?' / ' + event?.stg_kurzbzlang:'')}}</span>
<span v-else>Lehrveranstaltungs Übersicht</span>
</template>
</template>
<template #default>
<slot name="content"></slot>
<lv-menu v-model:isMenuSelected="isMenuSelected" :preselectedMenu="preselectedMenu" :menu="menu" @hideModal="hide"></lv-menu>
</template>
+169 -98
View File
@@ -1,4 +1,5 @@
import LvModal from "../Mylv/LvModal.js";
import LvUebersicht from "../Mylv/LvUebersicht.js";
export default {
data(){
@@ -13,21 +14,84 @@ export default {
selectedSemester:null,
lehrveranstaltungen: [],
selectedLehrveranstaltung: null,
menu:null,
}
},
components:{
LvModal,
components: {
LvUebersicht,
},
watch:{
selectedStudiensemester: function(newVal, oldVal){
if(newVal != oldVal){
const studiensemester =this.getDataFromLocalStorage("sudiensemester");
if (!studiensemester || (studiensemester && studiensemester != newVal)){
this.storeDataToLocalStorage("sudiensemester", newVal);
}
}
},
selectedSemester: function (newVal, oldVal) {
if (newVal != oldVal) {
const semester = this.getDataFromLocalStorage("semester");
if (!semester || (semester && semester != newVal)) {
this.storeDataToLocalStorage("semester", newVal);
}
}
},
selectedStudiengang: function (newVal, oldVal) {
if (newVal != oldVal) {
const studiengang = this.getDataFromLocalStorage("studiengang");
if (!studiengang || (studiengang && studiengang != newVal)) {
this.storeDataToLocalStorage("studiengang", JSON.stringify(newVal));
}
}
},
selectedStudienordnung: function (newVal, oldVal) {
if (newVal != oldVal) {
const studienordnung = this.getDataFromLocalStorage("studienordnung");
if (!studienordnung || (studienordnung && studienordnung != newVal)) {
this.storeDataToLocalStorage("studienordnung", JSON.stringify(newVal));
}
}
},
},
methods:{
changeSelectedStudienSemester(studiensemester) {
this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester.studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)
changeStudiensemester(value){
let studiensemester = this.$refs.studiensemester;
studiensemester.selectedIndex = (studiensemester.selectedIndex + value + studiensemester.options.length) % studiensemester.options.length;
this.changeSelectedStudienSemester(studiensemester.value);
},
changeStudiengang(value) {
let studiengang = this.$refs.studiengaenge;
studiengang.selectedIndex = (studiengang.selectedIndex + value + studiengang.options.length) % studiengang.options.length;
this.changeSelectedStudienGang(studiengang.value);
},
changeSemester(value) {
let semester = this.$refs.semester;
semester.selectedIndex = (semester.selectedIndex + value + semester.options.length) % semester.options.length;
this.changeSelectedSemester(semester.value);
},
changeStudienordnung(value) {
let studienordnung = this.$refs.studienordnung;
studienordnung.selectedIndex = (studienordnung.selectedIndex + value + studienordnung.options.length) % studienordnung.options.length;
this.changeSelectedStudienPlan(studienordnung.value);
},
storeDataToLocalStorage(key,value){
localStorage.setItem(key, value);
},
getDataFromLocalStorage(key){
const value = localStorage.getItem(key);
return value;
},
changeSelectedStudienSemester(studiensemester_kurzbz) {
this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester_kurzbz, this.selectedStudiengang, this.selectedSemester, this.selectedStudienordnung)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
changeSelectedStudienGang(studiengang) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang.studiengang_kz, this.selectedSemester, this.selectedStudienordnung)
changeSelectedStudienGang(studiengang_kz) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, studiengang_kz, this.selectedSemester, this.selectedStudienordnung)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
@@ -40,30 +104,24 @@ export default {
this.extractPropertyValues(res);
})
},
changeSelectedStudienPlan(studienplan) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan.studienplan_id)
changeSelectedStudienPlan(studienplan_id) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, this.selectedSemester, studienplan_id)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
},
selectLehrveranstaltung(lehrveranstaltung) {
openLvUebersicht(lehrveranstaltung) {
this.selectedLehrveranstaltung = lehrveranstaltung;
//convert lehrveranstaltung properties for compatibility with Stundenplan LvModal
this.selectedLehrveranstaltung.type ="lehreinheit";
this.selectedLehrveranstaltung.lehreinheit_id = this.selectedLehrveranstaltung.lehrveranstaltung_id;
console.log(this.selectedLehrveranstaltung, "selected lehrveranstaltung")
Vue.nextTick(()=>{
this.$refs.modalContainer.show();
})
if(this.selectedLehrveranstaltung)
Vue.nextTick(()=>{
this.$refs.lvUebersicht.show();
})
},
/* loadStudienplan(studiengang, studiensemester){
this.$fhcApi.factory.studium.getStudienplaeneBySemester(studiengang, studiensemester)
.then(data => data.data)
.then(res => {
console.log("This is the result", res)
})
}, */
sortStudienSemester(studienSemester){
let regex = new RegExp(/^(WS|SS)([0-9]{4})/);
studienSemester.sort((sem1,sem2)=>{
@@ -91,9 +149,7 @@ export default {
this.semester = semester.all;
this.selectedSemester = semester?.preselected;
console.log(studienplan.all,"all studienplan")
this.studienOrdnung = studienplan.all;
console.log(this.studienOrdnung,"studienordnung")
this.selectedStudienordnung = studienplan.preselected?.studienplan_id;
this.lehrveranstaltungen = lehrveranstaltungen;
@@ -122,108 +178,123 @@ export default {
},
computed:{
selectedLehrveranstaltungTitel(){
const studiengang = this.studiengaenge.find((studiengang) => studiengang.studiengang_kz == this.selectedStudiengang);
return `${this.selectedLehrveranstaltung?.bezeichnung} ${this.selectedLehrveranstaltung?.lehrform_kurzbz} / ${studiengang.kurzbzlang}-${this.selectedSemester} ${this.selectedLehrveranstaltung?.orgform_kurzbz} (${this.selectedStudiensemester})`;
},
},
created(){
this.$fhcApi.factory.studium.getAllStudienSemester()
const studiensemester = this.getDataFromLocalStorage("sudiensemester") ?? undefined;
const studiengang = JSON.parse(this.getDataFromLocalStorage("studiengang")) ?? undefined;
const semester = this.getDataFromLocalStorage("semester") ?? undefined;
const studienordnung = JSON.parse(this.getDataFromLocalStorage("studienordnung")) ?? undefined;
// only fetch default data if no data is stored in the local storage
this.$fhcApi.factory.studium.getAllStudienSemester(studiensemester, studiengang, semester, studienordnung)
.then(data => data.data)
.then(res => {
this. extractPropertyValues(res);
})
},
/* selectedStudiensemester(newStudiensemester, oldStudiensemester) {
if (newStudiensemester !== oldStudiensemester) {
this.$fhcApi.factory.studium.getAllStudienSemester(newStudiensemester, this.selectedStudiengang, this.selectedSemester)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
}
},
selectedStudiengang(newStudiengang, oldStudiengang) {
if (newStudiengang !== oldStudiengang) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, newStudiengang, this.selectedSemester)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
}
},
selectedSemester(newSemester, oldSemester) {
if (newSemester !== oldSemester) {
this.$fhcApi.factory.studium.getAllStudienSemester(this.selectedStudiensemester, this.selectedStudiengang, newSemester)
.then(data => data.data)
.then(res => {
this.extractPropertyValues(res);
})
}
} */
template: `
<div>
<h2>Studium</h2>
<hr>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studiensemester" v-model="selectedStudiensemester" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="semester in studienSemester" @click="changeSelectedStudienSemester(semester)" :key="semester" :value="semester.studiensemester_kurzbz">{{studiensemesterTitel(semester.studiensemester_kurzbz) }}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
<lv-uebersicht ref="lvUebersicht" :titel="selectedLehrveranstaltungTitel" :event="selectedLehrveranstaltung" :studiensemester="selectedStudiensemester" v-if="selectedLehrveranstaltung">
<template #content>
<div v-if="Array.isArray(selectedLehrveranstaltung.lektoren) && selectedLehrveranstaltung.lektoren.length>0" class="mb-4">
<h4>Lektoren:</h4>
<a :href="'mailto:'+lektor?.email" class="mx-2" v-for="lektor in selectedLehrveranstaltung.lektoren">{{lektor.name}}</a>
</div>
</template>
</lv-uebersicht>
<div class="lvOptions">
<div>
<h6>Studiensemester:</h6>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiensemester(-1)">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studiensemester" v-model="selectedStudiensemester" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="semester in studienSemester" @click="changeSelectedStudienSemester(semester.studiensemester_kurzbz)" :key="semester" :value="semester.studiensemester_kurzbz">{{studiensemesterTitel(semester.studiensemester_kurzbz) }}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiensemester(1)">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
</div>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studiengaenge" v-model="selectedStudiengang" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="studiengang in studiengaenge" @click="changeSelectedStudienGang(studiengang)" :key="studiengang.studiengang_kz" :value="studiengang.studiengang_kz" >{{studiengangTitel(studiengang)}}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
<div>
<h6>Studiengang:</h6>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiengang(-1)">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studiengaenge" v-model="selectedStudiengang" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="studiengang in studiengaenge" @click="changeSelectedStudienGang(studiengang.studiengang_kz)" :key="studiengang.studiengang_kz" :value="studiengang.studiengang_kz" >{{studiengangTitel(studiengang)}}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudiengang(1)">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
</div>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="semester" v-model="selectedSemester" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="sem in semester" @click="changeSelectedSemester(sem)" :key="semester" :value="sem">{{sem}}. Semester</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
<div>
<h6>Semester:</h6>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeSemester(-1)">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="semester" v-model="selectedSemester" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="sem in semester" @click="changeSelectedSemester(sem)" :key="semester" :value="sem">{{sem}}. Semester</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeSemester(1)">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
</div>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="prevSem">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studienordnung" v-model="selectedStudienordnung" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="ordnung in studienOrdnung" @click="changeSelectedStudienPlan(ordnung)" :key="ordnung.bezeichnung " :value="ordnung.studienplan_id">{{studienordnungTitel(ordnung)}}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="nextSem">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
<div>
<h6>Studienordnung:</h6>
<div class="input-group">
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudienordnung(-1)">
<i class="fa fa-caret-left" aria-hidden="true"></i>
</button>
<select ref="studienordnung" v-model="selectedStudienordnung" class="form-select" :aria-label="$p.t('global/studiensemester_auswaehlen')" @change="setHash($event.target.value)">
<option v-for="ordnung in studienOrdnung" @click="changeSelectedStudienPlan(ordnung.studienplan_id)" :key="ordnung.bezeichnung " :value="ordnung.studienplan_id">{{studienordnungTitel(ordnung)}}</option>
</select>
<button class="btn btn-outline-secondary" type="button" :disabled="false" @click="changeStudienordnung(1)">
<i class="fa fa-caret-right" aria-hidden="true"></i>
</button>
</div>
</div>
</div>
<hr>
<div class="d-grid" style="grid-template-columns: 1fr 1fr 1fr; gap: 1rem;">
<div class="card" v-for="lehrveranstaltung in lehrveranstaltungen" :key="lehrveranstaltung.lehrveranstaltung_id">
<div class="lvUebersicht" >
<template v-for="lehrveranstaltung in lehrveranstaltungen" :key="lehrveranstaltung.lehrveranstaltung_id">
<div class="card" v-if="Array.isArray(lehrveranstaltung.lehrveranstaltungen) && lehrveranstaltung.lehrveranstaltungen.length >0" >
<div class="card-header">
<h5 class=" card-title">{{lehrveranstaltung.bezeichnung}}</h5>
<h6 class=" card-subtitle">{{lehrveranstaltung.lehrtyp_kurzbz}}</h6>
</div>
<div class="card-body">
<a class="d-block" href="#" v-for="lv in lehrveranstaltung.lehrveranstaltungen" @click="selectLehrveranstaltung(lv)">{{lv.bezeichnung}}</a>
<ul class="list-group list-group-flush">
<li class="list-group-item" v-for="lv in lehrveranstaltung.lehrveranstaltungen">
<a class="d-block" href="#" @click="openLvUebersicht(lv)">{{lv.bezeichnung}}</a>
</li>
</ul>
</div>
</div>
</template>
</div>
<lv-modal v-if="selectedLehrveranstaltung" ref="modalContainer" :event="selectedLehrveranstaltung" title="test" >
</div>