fetching actual semester/verband/gruppe options for reservation creation form

This commit is contained in:
adisposkofh
2026-08-13 16:55:16 +02:00
parent 4d01b60808
commit ab1c8e63ee
4 changed files with 159 additions and 42 deletions
@@ -16,7 +16,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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);
}
}
@@ -40,5 +40,14 @@ export default {
reservierung_id: reservierung_id
}
};
},
getGroupOptions(studiengangKz) {
return {
method: 'get',
url: '/api/frontend/v1/calendar/RoomPlan/getGroupOptions',
params: {
studiengangKz
}
};
}
}
@@ -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,
@@ -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"
>
<option
v-for="semester in event.createContext.room_create_information.semester"
v-for="semester in semesterOptions"
:value="semester"
:key="semester"
>
@@ -202,7 +269,7 @@ export default {
name="semester"
>
<option
v-for="verband in event.createContext.room_create_information.verband"
v-for="verband in verbandOptions"
:value="verband"
:key="verband"
>
@@ -218,7 +285,7 @@ export default {
name="gruppe"
>
<option
v-for="gruppe in event.createContext.room_create_information.gruppe"
v-for="gruppe in gruppeOptions"
:value="gruppe"
:key="gruppe"
>
@@ -244,5 +311,5 @@ export default {
<button class="btn btn-primary mt-3" @click="saveEvent">Speichern</button>
</div>
`
`,
};