diff --git a/application/controllers/api/frontend/v1/calendar/RoomPlan.php b/application/controllers/api/frontend/v1/calendar/RoomPlan.php
index 489d83b53..522478f35 100644
--- a/application/controllers/api/frontend/v1/calendar/RoomPlan.php
+++ b/application/controllers/api/frontend/v1/calendar/RoomPlan.php
@@ -16,7 +16,8 @@
* along with this program. If not, see .
*/
-if (! defined('BASEPATH')) exit('No direct script access allowed');
+if (!defined('BASEPATH'))
+ exit('No direct script access allowed');
class RoomPlan extends FHCAPI_Controller
{
@@ -33,6 +34,7 @@ class RoomPlan extends FHCAPI_Controller
'getGruppen' => self::PERM_LOGGED,
'getLektor' => self::PERM_LOGGED,
'getReservableMap' => self::PERM_LOGGED,
+ 'getGroupOptions' => self::PERM_LOGGED,
]);
$this->load->library('LogLib');
@@ -149,16 +151,14 @@ class RoomPlan extends FHCAPI_Controller
$this->GruppeModel->addOrder('gruppe_kurzbz');
$this->GruppeModel->db->group_start();
- foreach ($query_words as $word)
- {
+ foreach ($query_words as $word) {
$this->GruppeModel->db->group_start();
$this->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%");
$this->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%");
$this->GruppeModel->db->or_where('beschreibung ILIKE', "%" . $word . "%");
$this->GruppeModel->db->or_where('orgform_kurzbz ILIKE', "%" . $word . "%");
- if (is_numeric($word))
- {
+ if (is_numeric($word)) {
$this->GruppeModel->db->or_where('studiengang_kz', $word);
}
$this->GruppeModel->db->group_end();
@@ -193,8 +193,7 @@ class RoomPlan extends FHCAPI_Controller
$this->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
$this->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true);
$this->MitarbeiterModel->db->group_start();
- foreach ($query_words as $word)
- {
+ foreach ($query_words as $word) {
$this->MitarbeiterModel->db->group_start();
$this->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
@@ -229,4 +228,49 @@ class RoomPlan extends FHCAPI_Controller
$this->terminateWithSuccess(array('reservierbarMap' => hasData($result) ? getData($result) : []));
}
+ public function getGroupOptions()
+ {
+ $studiengangKz = $this->input->get('studiengangKz');
+
+ $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
+ $this->LehrverbandModel->addSelect('semester, verband, gruppe');
+ $this->LehrverbandModel->db->where('aktiv', true);
+ $this->LehrverbandModel->db->where('studiengang_kz', $studiengangKz);
+ $lehrverbandResult = $this->LehrverbandModel->load();
+
+ if (isError($lehrverbandResult))
+ $this->terminateWithError($lehrverbandResult);
+
+ $lehrverbanden = hasData($lehrverbandResult) ? getData($lehrverbandResult) : [];
+
+ $grouppedValues = [];
+ foreach ($lehrverbanden as $lehrverband) {
+ if (isset($grouppedValues[$lehrverband->semester]) && $lehrverband->verband !== ' ') {
+ $grouppedValues[$lehrverband->semester][] = $lehrverband;
+ } else if (!isset($grouppedValues[$lehrverband->semester]) && $lehrverband->verband !== ' ') {
+ $grouppedValues[$lehrverband->semester] = [$lehrverband];
+ } else if (!isset($grouppedValues[$lehrverband->semester])) {
+ $grouppedValues[$lehrverband->semester] = [];
+ }
+ }
+ $grouppedValues = array_map(
+ function ($semester) {
+ $verbandGruppen = [];
+ foreach ($semester as $lehrverband) {
+ if (isset($verbandGruppen[$lehrverband->verband]) && $lehrverband->gruppe !== ' ') {
+ $verbandGruppen[$lehrverband->verband][] = $lehrverband->gruppe;
+ } else if (!isset($verbandGruppen[$lehrverband->verband]) && $lehrverband->gruppe !== ' ') {
+ $verbandGruppen[$lehrverband->verband] = [$lehrverband->gruppe];
+ } else if (!isset($verbandGruppen[$lehrverband->verband])) {
+ $verbandGruppen[$lehrverband->verband] = [];
+ }
+ }
+ return $verbandGruppen;
+ },
+ $grouppedValues
+ );
+
+ $this->terminateWithSuccess($grouppedValues);
+ }
+
}
diff --git a/public/js/api/factory/calendar/roomPlan.js b/public/js/api/factory/calendar/roomPlan.js
index d27843b37..dc8aee207 100644
--- a/public/js/api/factory/calendar/roomPlan.js
+++ b/public/js/api/factory/calendar/roomPlan.js
@@ -40,5 +40,14 @@ export default {
reservierung_id: reservierung_id
}
};
+ },
+ getGroupOptions(studiengangKz) {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/calendar/RoomPlan/getGroupOptions',
+ params: {
+ studiengangKz
+ }
+ };
}
}
\ No newline at end of file
diff --git a/public/js/components/Cis/Mylv/RoomInformation.js b/public/js/components/Cis/Mylv/RoomInformation.js
index 30722ab62..2c6a5b77c 100644
--- a/public/js/components/Cis/Mylv/RoomInformation.js
+++ b/public/js/components/Cis/Mylv/RoomInformation.js
@@ -34,9 +34,6 @@ export default {
scope: 'slot_room',
show_all_fields: false,
room_create_information: {
- semester: [1, 2, 3, 4, 5, 6, 7, 8],
- verband: ['A', 'B', 'C', 'D', 'E', 'F', 'V'],
- gruppe: [1, 2, 3, 4],
studiengaenge: [],
searchGroup: this.searchGroup,
searchLektor: this.searchLektor,
diff --git a/public/js/components/Cis/Renderer/Slot/roomModalContent.js b/public/js/components/Cis/Renderer/Slot/roomModalContent.js
index 6cc0c9805..124c25192 100644
--- a/public/js/components/Cis/Renderer/Slot/roomModalContent.js
+++ b/public/js/components/Cis/Renderer/Slot/roomModalContent.js
@@ -1,9 +1,10 @@
-import FormInput from '../../../Form/Input.js';
+import FormInput from "../../../Form/Input.js";
+import ApiRoomPlan from "../../../../api/factory/calendar/roomPlan.js";
export default {
- emits: ['create-event'],
+ emits: ["create-event"],
components: {
- FormInput
+ FormInput,
},
inject: {
timeGrid: "timeGrid",
@@ -26,38 +27,85 @@ export default {
verband: null,
gruppe: null,
selectedGruppe: null,
- selectedLektoren: []
+ selectedLektoren: [],
+ nestedGroupOptions: {},
};
},
- mounted() {
- this.syncFromEvent(this.event);
- },
+ computed: {
+ semesterOptions() {
+ if (!this.studiengang) return [];
+ return Object.keys(this.nestedGroupOptions)
+ .map((val) => parseInt(val))
+ .sort((a, b) => a - b);
+ },
+ verbandOptions() {
+ if (!this.semester) return [];
+
+ return Object.keys(this.nestedGroupOptions[this.semester]).sort();
+ },
+ gruppeOptions() {
+ if (!this.verband) return [];
+
+ return this.nestedGroupOptions[this.semester][this.verband]
+ .map((val) => parseInt(val))
+ .sort((a, b) => a - b);
+ },
+ },
watch: {
event: {
handler(newEvent) {
this.syncFromEvent(newEvent);
},
- deep: true
- }
+ deep: true,
+ },
+ studiengang() {
+ this.semester = null;
+ this.verband = null;
+ this.gruppe = null;
+ this.nestedGroupOptions = {};
+ this.fetchGroupOptions();
+ },
+ semester() {
+ this.verband = null;
+ },
+ verband() {
+ this.gruppe = null;
+ },
},
methods: {
syncFromEvent(newEvent) {
if (!newEvent) return;
- const startTime = newEvent.start?.setZone?.(this.timezone)?.toFormat?.('HH:mm:ss');
- const endTime = newEvent.end?.setZone?.(this.timezone)?.toFormat?.('HH:mm:ss');
+ const startTime = newEvent.start
+ ?.setZone?.(this.timezone)
+ ?.toFormat?.("HH:mm:ss");
+ const endTime = newEvent.end
+ ?.setZone?.(this.timezone)
+ ?.toFormat?.("HH:mm:ss");
- this.selectedStart = this.timeGrid.find(t => t.start === startTime)?.start || this.timeGrid[0]?.start;
- this.selectedEnd = this.timeGrid.find(t => t.end === endTime)?.end || this.timeGrid.at(-1)?.end;
+ this.selectedStart =
+ this.timeGrid.find((t) => t.start === startTime)?.start ||
+ this.timeGrid[0]?.start;
+ this.selectedEnd =
+ this.timeGrid.find((t) => t.end === endTime)?.end ||
+ this.timeGrid.at(-1)?.end;
},
saveEvent() {
- const [startHour, startMinute] = this.selectedStart.split(':').map(Number);
- const [endHour, endMinute] = this.selectedEnd.split(':').map(Number);
- const selectedStart = this.event.start.startOf('day').set({ hour: startHour, minute: startMinute });
- const selectedEnd = this.event.start.startOf('day').set({ hour: endHour, minute: endMinute });
+ const [startHour, startMinute] = this.selectedStart
+ .split(":")
+ .map(Number);
+ const [endHour, endMinute] = this.selectedEnd
+ .split(":")
+ .map(Number);
+ const selectedStart = this.event.start
+ .startOf("day")
+ .set({ hour: startHour, minute: startMinute });
+ const selectedEnd = this.event.start
+ .startOf("day")
+ .set({ hour: endHour, minute: endMinute });
- const lektoren_uid = this.selectedLektoren.map(m => m.uid)
+ const lektoren_uid = this.selectedLektoren.map((m) => m.uid);
const spezialgruppe = this.selectedGruppe?.gruppe_kurzbz;
@@ -71,22 +119,41 @@ export default {
verband: this.verband,
gruppe: this.gruppe,
spezialgruppe: spezialgruppe,
- lektoren: lektoren_uid
- }
+ lektoren: lektoren_uid,
+ };
- this.$emit('create-event', event);
+ this.$emit("create-event", event);
},
async searchGroup(event) {
- this.filteredGroups = await this.event.createContext.room_create_information.searchGroup(event)
+ this.filteredGroups =
+ await this.event.createContext.room_create_information.searchGroup(
+ event,
+ );
},
async searchLektor(event) {
- this.filteredLektoren = await this.event.createContext.room_create_information.searchLektor(event)
+ this.filteredLektoren =
+ await this.event.createContext.room_create_information.searchLektor(
+ event,
+ );
},
- capitalize(text)
- {
- if (!text) return ''
- return text.charAt(0).toUpperCase() + text.slice(1)
- }
+ capitalize(text) {
+ if (!text) return "";
+ return text.charAt(0).toUpperCase() + text.slice(1);
+ },
+ async fetchGroupOptions() {
+ if (!this.studiengang) return;
+
+ const groupOptionsResponse = await this.$api.call(
+ ApiRoomPlan.getGroupOptions(this.studiengang),
+ );
+
+ if (groupOptionsResponse.meta.status === "success") {
+ this.nestedGroupOptions = groupOptionsResponse.data;
+ }
+ },
+ },
+ mounted() {
+ this.syncFromEvent(this.event);
},
template: `
@@ -186,7 +253,7 @@ export default {
name="semester"
>