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" >