feat:#28 rewrote frontend input for filter eventTypes

This commit is contained in:
Elmar Kresse
2024-05-18 12:44:41 +02:00
parent 0c71a0ce49
commit bb613dc5c4
2 changed files with 50 additions and 5 deletions

View File

@@ -0,0 +1,33 @@
//Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
//Copyright (C) 2024 HTWKalender support@htwkalender.de
//This program is free software: you can redistribute it and/or modify
//it under the terms of the GNU Affero General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//(at your option) any later version.
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU Affero General Public License for more details.
//You should have received a copy of the GNU Affero General Public License
//along with this program. If not, see <https://www.gnu.org/licenses/>.
// function to fetch course data from the API
export async function fetchEventTypes(): Promise<string[]> {
const eventTypes: string[] = [];
await fetch("/api/events/types")
.then((response) => {
return response.json() as Promise<string[]>;
})
.then((responseModules: string[]) => {
responseModules.forEach((eventType: string) => {
eventTypes.push(
eventType,
);
});
});
return eventTypes;
}

View File

@@ -30,6 +30,7 @@ import { useDialog } from "primevue/usedialog";
import router from "../router"; import router from "../router";
import { fetchModule } from "../api/fetchModule.ts"; import { fetchModule } from "../api/fetchModule.ts";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import { fetchEventTypes } from "../api/fetchEvents.ts";
const dialog = useDialog(); const dialog = useDialog();
const { t } = useI18n({ useScope: "global" }); const { t } = useI18n({ useScope: "global" });
@@ -39,6 +40,9 @@ if (store.isEmpty()) {
router.replace("/"); router.replace("/");
} }
const eventTypes: Ref<string[]> = ref([]);
const mobilePage = inject("mobilePage") as Ref<boolean>; const mobilePage = inject("mobilePage") as Ref<boolean>;
const filters = ref({ const filters = ref({
course: { course: {
@@ -51,7 +55,7 @@ const filters = ref({
}, },
eventType: { eventType: {
value: null, value: null,
matchMode: FilterMatchMode.CONTAINS, matchMode: FilterMatchMode.IN,
}, },
prof: { prof: {
value: null, value: null,
@@ -63,7 +67,7 @@ const loadedModules: Ref<Module[]> = ref(new Array(10));
const loadingData = ref(true); const loadingData = ref(true);
onMounted(() => { onMounted( () => {
fetchAllModules() fetchAllModules()
.then( .then(
(data) => (data) =>
@@ -74,6 +78,10 @@ onMounted(() => {
.finally(() => { .finally(() => {
loadingData.value = false; loadingData.value = false;
}); });
fetchEventTypes().then((data) => {
eventTypes.value = data;
});
}); });
const ModuleInformation = defineAsyncComponent( const ModuleInformation = defineAsyncComponent(
@@ -184,16 +192,20 @@ function unselectModule(event: DataTableRowUnselectEvent) {
</Column> </Column>
<Column <Column
field="eventType" field="eventType"
filter-field="eventType"
:filter-menu-style="{ width: '10rem' }"
style="min-width: 10rem"
:header="$t('additionalModules.eventType')" :header="$t('additionalModules.eventType')"
:show-clear-button="false" :show-clear-button="false"
:show-filter-menu="false" :show-filter-menu="false"
> >
<template #filter="{ filterModel, filterCallback }"> <template #filter="{ filterModel, filterCallback }">
<InputText <MultiSelect
v-model="filterModel.value" v-model="filterModel.value"
type="text" :options="eventTypes"
class="p-column-filter max-w-10rem" class="p-column-filter max-w-10rem"
@input="filterCallback()" style="min-width: 10rem"
@change="filterCallback()"
/> />
</template> </template>
<template v-if="loadingData" #body> <template v-if="loadingData" #body>