mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 06:54:04 +00:00
fetching actual semester/verband/gruppe options for reservation creation form
This commit is contained in:
@@ -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>
|
||||
`
|
||||
`,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user