@@ -101,6 +122,7 @@ export default {
:is="renderers[event.type]?.calendarEvent"
:event="event"
:timeSlotDisplayBehavior="'always'"
+ @delete-event="(event) => deleteEvent(event)"
>
diff --git a/public/js/components/Cis/LvPlan/MyLvPlan.js b/public/js/components/Cis/LvPlan/MyLvPlan.js
index cb43a06d9..3fab090a3 100644
--- a/public/js/components/Cis/LvPlan/MyLvPlan.js
+++ b/public/js/components/Cis/LvPlan/MyLvPlan.js
@@ -2,6 +2,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js";
import ApiLvPlan from '../../../api/factory/lvPlan.js';
import ApiAuthinfo from '../../../api/factory/authinfo.js';
+import ApiRoomPlan from '../../../api/factory/calendar/roomPlan.js';
export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week";
export const DEFAULT_MODE_LVPLAN_MOBILE = "List";
@@ -134,6 +135,24 @@ export default {
this.isMitarbeiter = authInfo.isMitarbeiter;
this.isStudent = authInfo.isStudent;
},
+ deleteEvent(event) {
+ if (event.type === "reservierung") {
+ this.deleteReservation(event);
+ }
+ },
+ async deleteReservation(event) {
+ if (
+ luxon.DateTime.fromISO(`${event.datum}T${event.beginn}`) <
+ luxon.DateTime.now()
+ )
+ return;
+
+ await this.$api.call(
+ ApiRoomPlan.deleteRoomReservation(event.reservierung_id),
+ );
+
+ this.$refs.calendar.reset();
+ },
},
async created() {
await this.fetchAuthInfo();
@@ -157,6 +176,7 @@ export default {
@update:date="handleChangeDate"
@update:mode="handleChangeMode"
@update:range="updateRange"
+ @delete-event="(event) => deleteEvent(event)"
class="responsive-calendar"
>
result.data)
- .then(result => {
- if (result.berechtigt)
- {
- this.createContext.room_create_information.studiengaenge = result.studiengaenge
- }
- this.createContext.show_all_fields = result.berechtigt;
- });
- },
methods:{
handleChangeDate(day, newMode) {
return this.handleChangeMode(newMode, day);
@@ -72,12 +59,15 @@ export default {
}
});
},
- async handleCreateEvent(event)
- {
+ async handleCreateEvent(event) {
event.ort_kurzbz = this.propsViewData.ort_kurzbz;
- this.$api.call(ApiRoomPlan.addRoomReservation(event));
- this.$refs.calendar.resetEventLoader();
- this.$refs.calendar.closeModal();
+ const reservationCreationResponse = await this.$api.call(
+ ApiRoomPlan.addRoomReservation(event),
+ );
+ if (reservationCreationResponse.meta.status === "success") {
+ this.$refs.calendar.resetEventLoader();
+ this.$refs.calendar.closeModal();
+ }
},
async handleDeleteEvent(event)
{
@@ -87,7 +77,7 @@ export default {
if (luxon.DateTime.fromISO(`${event.datum}T${event.beginn}`) < luxon.DateTime.now())
return;
- this.$api.call(ApiRoomPlan.deleteRoomReservation(event.reservierung_id));
+ await this.$api.call(ApiRoomPlan.deleteRoomReservation(event.reservierung_id));
this.$refs.calendar.reset();
@@ -152,9 +142,32 @@ export default {
];
}
},
+ async created() {
+ const roomCreationInfoResponse = await this.$api.call(
+ ApiRoomPlan.getRoomCreationInfo(),
+ );
+ if (roomCreationInfoResponse.meta?.status === "success") {
+ const berechtigt = !!roomCreationInfoResponse.data?.berechtigt;
+ if (roomCreationInfoResponse.data?.berechtigt) {
+ this.createContext.room_create_information.studiengaenge =
+ roomCreationInfoResponse.data?.studiengaenge;
+ }
+ this.createContext.show_all_fields =
+ roomCreationInfoResponse.data?.berechtigt;
+ }
+
+ const roomInfoResponse = await this.$api.call(
+ ApiRoom.getRoomInfo(this.$props.propsViewData.ort_kurzbz),
+ );
+ this.roomAdditionalInfo = roomInfoResponse.data.ausstattung;
+ },
template: /*html*/`
{{ $p.t('rauminfo/rauminfo') }} {{ propsViewData.ort_kurzbz }}
+
+ {{ $p.t("search/result_equipment") + ":" }}
+
+
{
res?.data?.forEach(type => {
- type.beschreibung = type.beschreibung.replace('&', '&')
+ type.beschreibung = type.beschreibung?.replace('&', '&')
})
this.selectedType = this.defaultType
this.roomtypes = res?.data ?? []
diff --git a/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js b/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js
index 91c49d5e0..2a0f4db95 100644
--- a/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js
+++ b/public/js/components/Cis/Renderer/Reservierungen/calendarEvent.js
@@ -32,6 +32,11 @@ export default {
this.$p.t('person/ort'),
this.event.ort_kurzbz
].join(": "));
+
+ tooltipArray.push([
+ this.$p.t('lehre/gruppe'),
+ this.event.gruppe[0].kuerzel.split("/")[0]
+ ].join(": "));
if (Array.isArray(this.event.lektor) && this.event.lektor.length > 0) {
if (this.event.lektor.length > 3) {
@@ -103,6 +108,7 @@ export default {
{{ event.topic }}
{{ event.ort_kurzbz }}
+ {{ event.gruppe[0].kuerzel.split("/")[0] }}
+
+ | {{
+ $p.t('lehre','gruppe')?
+ $p.t('lehre','gruppe')+':'
+ :''
+ }} |
+ {{event.gruppe[0].kuerzel.split("/")[0]}} |
+
| {{
$p.t('lehre','lektor')?
diff --git a/public/js/components/Cis/Renderer/Slot/roomModalContent.js b/public/js/components/Cis/Renderer/Slot/roomModalContent.js
index e9f518c75..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: `
@@ -130,6 +197,7 @@ export default {
:label="capitalize($p.t('global', 'titel'))"
type="text"
container-class="col-3"
+ maxlength="10"
v-model="title"
name="title"
/>
@@ -138,6 +206,7 @@ export default {
:label="capitalize($p.t('global', 'beschreibung'))"
type="text"
container-class="col-4"
+ maxlength="32"
v-model="beschreibung"
name="Beschreibung"
/>
@@ -184,7 +253,7 @@ export default {
name="semester"
>
|