Merge branch 'feature-61235/Cis4_Studium_Uebersicht' into merge_C4_25999_61235_61730

This commit is contained in:
Harald Bamberger
2025-05-22 07:45:30 +02:00
12 changed files with 564 additions and 137 deletions
@@ -17,6 +17,9 @@
*/
if (! defined('BASEPATH')) exit('No direct script access allowed');
use CI3_Events as Events;
class Studium extends FHCAPI_Controller
{
@@ -29,6 +32,7 @@ class Studium extends FHCAPI_Controller
'getStudienAllSemester'=> self::PERM_LOGGED,
'getStudiengaengeForStudienSemester'=> self::PERM_LOGGED,
'getStudienplaeneBySemester'=> self::PERM_LOGGED,
'getLvEvaluierungInfo'=> self::PERM_LOGGED,
]);
$this->load->model('crm/Student_model', 'StudentModel');
@@ -39,6 +43,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,10 +58,26 @@ 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;
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAkt()));
if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester->studiensemester_kurzbz]);
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
$student_studiensemester = $studentLehrverband->studiensemester_kurzbz;
$student_studiengang = $studentLehrverband->studiengang_kz;
$student_semester = $studentLehrverband->semester;
$student_studienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId())->studienplan_id;
if(!isset($parameter_studiensemester))
$parameter_studiensemester = $student_studiensemester;
if(!isset($parameter_studiengang))
$parameter_studiengang = $student_studiengang;
if(!isset($parameter_semester))
$parameter_semester = $student_semester;
if(!isset($parameter_studienplan))
$parameter_studienplan = $student_studienplan;
}
if(isset($parameter_studiensemester)){
$parameter_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz" => $parameter_studiensemester])));
@@ -76,11 +97,10 @@ class Studium extends FHCAPI_Controller
// fetch studiensemester
$allStudienSemester = $this->getDataOrTerminateWithError($this->StudiensemesterModel->load());
$aktuelles_studiensemester = current($this->getDataOrTerminateWithError($this->StudiensemesterModel->getAkt()));
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 +113,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 +131,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,10 +146,24 @@ 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 = [];
}
// result object
$result = new stdClass();
$result->studienSemester = [];
@@ -142,30 +174,18 @@ class Studium extends FHCAPI_Controller
$result->semester["all"] =$semester;
$result->semester["preselected"] =$aktuelles_semester;
$result->studienplan["all"]=$semester_studienplan;
$result->studienplan["preselected"]=$aktuelles_studienplan;
$result->test1=$test1;
$result->test2=$test2;
$result->test3=$test3;
$result->test4=$test4;
$result->studienplan["preselected"]=$aktuelles_studienplan;
$result->lehrveranstaltungen=$aktuelles_lehrveranstaltungen;
/* if($this->getDataOrTerminateWithError($this->StudentModel->isStudent(getAuthUID()))){
$studentLehrverband =$this->StudentlehrverbandModel->loadWhere(["student_uid" => getAuthUID(), "studiensemester_kurzbz" => $aktuelles_studiensemester_kz]);
$studentLehrverband = current($this->getDataOrTerminateWithError($studentLehrverband));
$result->studentLehrverband = $studentLehrverband;
//$currentStudienplan = $this->StudienplanModel->loadWhere(["studiengang_kz"=>$studentLehrverband->studiengang_kz,"semester"=>$studentLehrverband->semester, "verband"=>$studentLehrverband->verband, "gruppe"=>$studentLehrverband->gruppe]);
$studienplaene = $this->getDataOrTerminateWithError($this->computeStudienplaene($studentLehrverband->studiengang_kz, $studentLehrverband->studiensemester_kurzbz));
$result->studienPleane = $studienplaene;
//get the studienplan for the user
$preselectedStudienplan = $this->getStudienPlanFromPrestudentStatus(getAuthPersonId());
$this->terminateWithSuccess($result);
}
//set the preselected semester
$preselectedSemester = $preselectedStudienplan->semester;
//get the studienordnung for the studienplan
$preselectedStudienordnung = $this->getStudienOrdnungForStudienplan($preselectedStudienplan->studienplan_id);
} */
public function getLvEvaluierungInfo($studiensemester_kurzbz, $lehrveranstaltung_id){
$result = [];
Events::trigger('lvEvaluierungsInfo', function & () use (&$result) {
return $result;
},$lehrveranstaltung_id, $studiensemester_kurzbz);
$this->terminateWithSuccess($result);
}
@@ -201,6 +221,37 @@ class Studium extends FHCAPI_Controller
return $studienplaene;
}
private function computeStudienplanLehrveranstaltungen($studienplan_id, $semester){
$lehrveranstaltungen = $this->StudienplanModel->getStudienplanLehrveranstaltung($studienplan_id, $semester);
$lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen);
usort($lehrveranstaltungen, function($a, $b){
if($a->lehrtyp_kurzbz == "modul"){
return -1;
}
else if($b->lehrtyp_kurzbz == "modul"){
return 1;
}
return 0;
});
$lehrveranstaltungen= array_reduce($lehrveranstaltungen,function($carry, $lehrv){
if($lehrv->lehrtyp_kurzbz == "modul"){
$lehrv->lehrveranstaltungen = [];
array_push($carry, $lehrv);
}
else{
$parent =array_filter($carry, function($item)use($lehrv){
return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent;
});
$parent = current($parent);
if($parent){
$parent->lehrveranstaltungen[] = $lehrv;
}
}
return $carry;
}, []);
return $lehrveranstaltungen;
}
private function computeStudiengaenge($studiensemester){
$studiengang_studiensemester_result = $this->StudiengangModel->getStudiengaengeByStudiensemester($studiensemester);
$studiengang_studiensemester_result = $this->getDataOrTerminateWithError($studiengang_studiensemester_result);
@@ -212,6 +263,21 @@ 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,6 +36,7 @@ class Stundenplan extends FHCAPI_Controller
'StundenplanEvents' => self::PERM_LOGGED,
'getLehreinheitStudiensemester' => self::PERM_LOGGED,
'studiensemesterDateInterval' => self::PERM_LOGGED,
'getLvStundenplanForStudiensemester' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
@@ -85,11 +86,6 @@ class Stundenplan extends FHCAPI_Controller
{
$stundenplan_events = array();
}
else
{
$stundenplan_events = $this->getDataOrTerminateWithError($stundenplan_events);
}
// fetching moodle events
$moodle_events = [];
Events::trigger(
@@ -126,6 +122,19 @@ class Stundenplan extends FHCAPI_Controller
$studiensemester =current($this->getDataOrTerminateWithError($studiensemester));
$this->terminateWithSuccess($studiensemester);
}
public function getLvStundenplanForStudiensemester($studiensemester,$lvid){
$this->load->library('StundenplanLib');
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$studiensemester_result = $this->StudiensemesterModel->loadWhere(["studiensemester_kurzbz"=>$studiensemester]);
$studiensemester_result = current($this->getDataOrTerminateWithError($studiensemester_result));
$timespan_start = new DateTime($studiensemester_result->start);
$timespan_ende = new DateTime($studiensemester_result->ende);
$stundenplan = $this->stundenplanlib->getStundenplan(date_format($timespan_start, 'Y-m-d'),date_format($timespan_ende, 'Y-m-d'), $lvid);
$this->terminateWithSuccess($stundenplan);
}
/**
+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
@@ -178,6 +178,25 @@ html {
color:var(--fhc-light);
}
/* 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;
}
}
+15 -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}
@@ -30,4 +29,19 @@ export default {
}
);
},
getLvStundenplanForStudiensemester: function (studiensemester, lvid) {
return this.$fhcApi.get(
`/api/frontend/v1/Stundenplan/getLvStundenplanForStudiensemester/${studiensemester}/${lvid}`,
{
}
);
},
getLvEvaluierungInfo: function (studiensemester_kurzbz, lvid) {
return this.$fhcApi.get(
`/api/frontend/v1/Studium/getLvEvaluierungInfo/${studiensemester_kurzbz}/${lvid}`,
{
}
);
},
}
+3 -3
View File
@@ -58,13 +58,13 @@ export default {
<table class="table table-hover mb-4">
<template v-if="event.type == LV_TYPES.moodle">
<tbody>
<tr>
<tr v-if="event?.datum">
<th>{{
$p.t('global','datum')?
$p.t('global','datum')+':'
:''
}}</th>
<td>{{methodFormatDate(event.datum)}}</td>
<td>{{methodFormatDate(event?.datum)}}</td>
</tr>
<tr>
<th>{{$p.t('global','aktivitaet')}}:</th>
@@ -100,7 +100,7 @@ export default {
</template>
<template v-else>
<tbody>
<tr>
<tr v-if="event?.datum">
<th>{{
$p.t('global','datum')?
$p.t('global','datum')+':'
+8
View File
@@ -7,6 +7,11 @@ export default {
},
containerStyles: Array,
rowStyles: Array,
hasLvStundenplanEintraege: {
required:false,
default:true,
type:Boolean,
},
},
data(){
return{
@@ -18,6 +23,9 @@ export default {
if (!this.c4_link(menuItem) && !menuItem.c4_moodle_links?.length) {
return true;
}
if (menuItem.id == "addon_fhtw_menu_lvplan_lva" && !this.hasLvStundenplanEintraege){
return true;
}
return null;
},
c4_target: function (menuItem) {
+1 -1
View File
@@ -51,7 +51,7 @@ export default {
if (this.event.type == 'lehreinheit') {
this.$api
.call(ApiStundenplan.getLehreinheitStudiensemester(this.event.lehreinheit_id[0]))
.call(ApiStundenplan.getLehreinheitStudiensemester(Array.isArray(this.event.lehreinheit_id) ? this.event.lehreinheit_id[0] : this.event.lehreinheit_id))
.then(res => res.data)
.then(studiensemester_kurzbz => this.$api.call(
ApiAddons.getLvMenu(
+53 -7
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,
@@ -23,7 +33,8 @@ export default {
result: false,
menu: [],
isMenuSelected:false,
hasLvStundenplanEintraege: true,
lvEvaluierungMessage: "",
}
},
mixins:[BsModal],
@@ -31,6 +42,7 @@ export default {
BsModal,
LvMenu,
},
inject: ["studium_studiensemester"],
methods:{
hiddenModal: function(){
@@ -39,7 +51,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;
@@ -48,20 +60,54 @@ export default {
} else {
this.isMenuSelected = true;
}
// check lv evaluierung info
if (this.studium_studiensemester) {
this.$fhcApi.factory.studium.getLvEvaluierungInfo(this.studium_studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
.then(data => data.data)
.then(res => {
this.lvEvaluierungMessage = res.message;
})
}
// check if the lv has stundenplan entries for this studiensemester
if (this.studiensemester && this.event) {
return this.$fhcApi.factory.studium.getLvStundenplanForStudiensemester(this.studiensemester, this.event.lehreinheit_id ?? this.event.lehrveranstaltung_id)
.then(data => data.data)
.then(res => {
if (Array.isArray(res) && res.length > 0) {
this.hasLvStundenplanEintraege = true;
} else {
this.hasLvStundenplanEintraege = false;
}
});
}
},
},
mounted(){
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>
<lv-menu v-model:isMenuSelected="isMenuSelected" :preselectedMenu="preselectedMenu" :menu="menu" @hideModal="hide"></lv-menu>
<div class="mb-4" v-if="lvEvaluierungMessage" v-html="lvEvaluierungMessage"></div>
<slot name="content"></slot>
<lv-menu v-model:isMenuSelected="isMenuSelected" :hasLvStundenplanEintraege="hasLvStundenplanEintraege" :preselectedMenu="preselectedMenu" :menu="menu" @hideModal="hide"></lv-menu>
</template>
</bs-modal>
+256 -87
View File
@@ -1,3 +1,6 @@
import LvUebersicht from "../Mylv/LvUebersicht.js";
export default {
data(){
return {
@@ -9,18 +12,95 @@ export default {
selectedStudienordnung: null,
semester:[],
selectedSemester:null,
lehrveranstaltungen: [],
selectedLehrveranstaltung: null,
menu:null,
}
},
provide(){
return {
studium_studiengang : Vue.computed(()=> this.selectedStudiengang),
studium_studiensemester: Vue.computed(() => this.selectedStudiensemester),
studium_semester: Vue.computed(() => this.selectedSemester),
studium_studienordnung: Vue.computed(() => this.selectedStudienordnung),
}
},
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);
@@ -33,20 +113,25 @@ 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);
})
},
/* loadStudienplan(studiengang, studiensemester){
this.$fhcApi.factory.studium.getStudienplaeneBySemester(studiengang, studiensemester)
.then(data => data.data)
.then(res => {
console.log("This is the result", res)
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;
if(this.selectedLehrveranstaltung){
Vue.nextTick(()=>{
this.$refs.lvUebersicht.show();
})
}, */
}
},
sortStudienSemester(studienSemester){
let regex = new RegExp(/^(WS|SS)([0-9]{4})/);
studienSemester.sort((sem1,sem2)=>{
@@ -63,7 +148,7 @@ export default {
location.hash = val;
},
extractPropertyValues(res){
let { studienSemester, studiengang, semester, studienplan } = res;
let { studienSemester, studiengang, semester, studienplan, lehrveranstaltungen } = res;
this.sortStudienSemester(studienSemester.all);
this.studienSemester = studienSemester.all;
this.selectedStudiensemester = studienSemester.preselected.studiensemester_kurzbz;
@@ -74,10 +159,31 @@ 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;
this.lehrveranstaltungen.sort((lv1, lv2) => {
if (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) {
return 1;
} else if (lv1.bezeichnung.toLowerCase() < lv2.bezeichnung.toLowerCase()) {
return -1;
} else {
return 0;
}
});
this.lehrveranstaltungen.forEach((lehrveranstaltung)=>{
lehrveranstaltung.lehrveranstaltungen.sort((lv1,lv2)=>{
if (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) {
return 1;
} else if (lv1.bezeichnung.toLowerCase() < lv2.bezeichnung.toLowerCase()) {
return -1;
} else {
return 0;
}
})
})
},
studienordnungTitel(studienordnung){
if(!studienordnung) return "";
@@ -103,91 +209,154 @@ 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})`;
},
computedStudienOrdnung(){
if(!this.studienOrdnung) return null;
return Object.values(this.studienOrdnung).reduce((carry, item)=>{
if(!carry[item.bezeichnung]){
carry[item.bezeichnung] = [];
}
carry[item.bezeichnung].push(item);
return carry;
},{});
},
computedStudienOrdnungSelectValues() {
if (!this.computedStudienOrdnung) return null;
let result = [];
Object.entries(this.computedStudienOrdnung).forEach(([key,value])=>{
result.push({
bezeichnung: `Studienordnung: ${key}`,
disabled: true,
});
value.forEach((studienplan)=>{
result.push({
studienplan:studienplan,
diabled: false,
bezeichnung: `${studienplan?.bezeichnung}-${studienplan?.orgform_kurzbz} ( ${studienplan?.orgform_bezeichnung}, ${studienplan?.sprache} )`
});
})
});
return result;
},
},
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);
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: `
<h2>this is a test titel</h2>
<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>
<h2>Studium</h2>
<hr>
<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>
<h4>Menu:</h4>
</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>
<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>
<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>
<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 computedStudienOrdnungSelectValues" :disabled="ordnung.disabled" @click="changeSelectedStudienPlan(ordnung?.studienplan?.studienplan_id)" :key="ordnung?.studienplan?.bezeichnung " :value="ordnung?.studienplan?.studienplan_id">{{ordnung.bezeichnung}}</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>
<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>
<hr>
<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.lehrform_kurzbz}}</h6>
</div>
<div class="card-body">
<ul class="list-group list-group-flush">
<li class="d-flex list-group-item" v-for="lv in lehrveranstaltung.lehrveranstaltungen">
<a class="link-dark d-block me-auto" href="#" @click="openLvUebersicht(lv)">{{lv.bezeichnung}}</a>
<p>{{lv.lehrform_kurzbz}}</p>
</li>
</ul>
</div>
</div>
</template>
</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 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>
`