fix not updating member table close #30

This commit is contained in:
Adrian Zürcher
2025-11-17 16:59:23 +01:00
parent 94dc125a1b
commit afff7c123a
3 changed files with 36 additions and 48 deletions

View File

@@ -38,7 +38,7 @@ export function useAttendeesTable() {
const loading = ref(false); const loading = ref(false);
//updates Attendees list from database //updates Attendees list from database
async function updateAttendees() { async function updateAttendees(eventArray: number) {
loading.value = true; loading.value = true;
let events: Events | undefined; let events: Events | undefined;
@@ -60,11 +60,16 @@ export function useAttendeesTable() {
loading.value = false; loading.value = false;
}); });
if (!events || events.length === 0 || !events[0]?.attendees || events[0].attendees === null) { if (
!events ||
events.length === 0 ||
!events[eventArray]?.attendees ||
events[eventArray].attendees === null
) {
attendees.value = []; attendees.value = [];
return; return;
} }
attendees.value = events[0].attendees ?? []; attendees.value = events[eventArray].attendees ?? [];
} }
return { return {

View File

@@ -21,6 +21,7 @@
dense dense
class="bigger-table-text" class="bigger-table-text"
> >
<!--top left of event table-->
<template v-slot:top-left> <template v-slot:top-left>
<q-btn-group push flat style="color: grey"> <q-btn-group push flat style="color: grey">
<q-btn <q-btn
@@ -28,7 +29,7 @@
dense dense
flat flat
icon="person" icon="person"
@click="openAllValueDialog" @click="openAttendanceDialog"
><q-badge floating transparent color="primary" text-color="primary-text">+</q-badge> ><q-badge floating transparent color="primary" text-color="primary-text">+</q-badge>
<q-tooltip>{{ $t('addNewAttendees') }}</q-tooltip> <q-tooltip>{{ $t('addNewAttendees') }}</q-tooltip>
</q-btn> </q-btn>
@@ -59,6 +60,7 @@
{{ $t('selected') }}: {{ selected.length }} {{ $t('selected') }}: {{ selected.length }}
</div> </div>
</template> </template>
<!--top right of event table-->
<template v-slot:top-right> <template v-slot:top-right>
<q-input filled dense debounce="300" v-model="filter" :placeholder="$t('search')"> <q-input filled dense debounce="300" v-model="filter" :placeholder="$t('search')">
<template v-slot:append> <template v-slot:append>
@@ -66,6 +68,7 @@
</template> </template>
</q-input> </q-input>
</template> </template>
<!--body of event table-->
<template v-slot:body-cell="props"> <template v-slot:body-cell="props">
<q-td v-if="props.col.field === 'attendees'" :props="props"> <q-td v-if="props.col.field === 'attendees'" :props="props">
<q-btn v-if="props.value !== null && props.value.length > 0" dense flat icon="people" <q-btn v-if="props.value !== null && props.value.length > 0" dense flat icon="people"
@@ -91,11 +94,11 @@
</q-td> </q-td>
</template> </template>
</q-table> </q-table>
<DialogFrame ref="memberTableDialog" :header-title="$t('members')" :width="700" :height="500"> <DialogFrame ref="attendanceDialog" :header-title="$t('members')" :width="700" :height="500">
<MembersTable <MembersTable
add-attendees add-attendees
:compare-members="attendees" :compare-members="attendees"
v-on:update-event="updateTable" v-on:update-event="(val) => updateTable(val)"
:event-id="localEvent?.id ?? 0" :event-id="localEvent?.id ?? 0"
/> />
</DialogFrame> </DialogFrame>
@@ -114,6 +117,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
//imports
import { appApi } from 'src/boot/axios'; import { appApi } from 'src/boot/axios';
import { onMounted, type PropType, ref } from 'vue'; import { onMounted, type PropType, ref } from 'vue';
import type { Members } from 'src/vueLib/models/member'; import type { Members } from 'src/vueLib/models/member';
@@ -126,21 +130,24 @@ import type { Event } from 'src/vueLib/models/event';
import MembersTable from '../members/MembersTable.vue'; import MembersTable from '../members/MembersTable.vue';
import { i18n } from 'src/boot/lang'; import { i18n } from 'src/boot/lang';
export interface AttendeesDialog { //use constants and function of imports
getSelected: () => Members; const { attendees, pagination, loading, columns, updateAttendees } = useAttendeesTable();
}
//define given properties
const props = defineProps({ const props = defineProps({
event: { event: {
type: Object as PropType<Event>, type: Object as PropType<Event>,
required: true, required: true,
}, },
eventArray: { type: Number, default: 0, required: true },
}); });
// define emits
const emit = defineEmits(['update']); const emit = defineEmits(['update']);
// definitions
const { NotifyResponse } = useNotify(); const { NotifyResponse } = useNotify();
const memberTableDialog = ref(); const attendanceDialog = ref();
const okDialog = ref(); const okDialog = ref();
const deleteText = ref(''); const deleteText = ref('');
const selectOption = ref(false); const selectOption = ref(false);
@@ -150,16 +157,15 @@ const openSubmenu = ref(false);
const filter = ref(''); const filter = ref('');
const user = useUserStore(); const user = useUserStore();
const { attendees, pagination, loading, columns, updateAttendees } = useAttendeesTable(); // load at page mount
onMounted(() => { onMounted(() => {
localEvent.value = props.event; localEvent.value = props.event;
attendees.value = props.event.attendees ?? []; attendees.value = props.event.attendees ?? [];
}); });
//opens dialog for one value //opens attendance dialog
function openAllValueDialog() { function openAttendanceDialog() {
memberTableDialog.value?.open(); attendanceDialog.value?.open();
} }
//opens remove dialog //opens remove dialog
@@ -173,10 +179,11 @@ function openRemoveDialog(...attendees: Members) {
} else { } else {
deleteText.value = String(attendees.length) + ' ' + i18n.global.t('attendees'); deleteText.value = String(attendees.length) + ' ' + i18n.global.t('attendees');
} }
okDialog.value?.open(attendees); okDialog.value?.open(attendees);
} }
//remove Attendees from database //remove attendees from database
async function removeAttendees(...removeAttendees: Members) { async function removeAttendees(...removeAttendees: Members) {
if (!localEvent.value) { if (!localEvent.value) {
NotifyResponse('event is empty', 'error'); NotifyResponse('event is empty', 'error');
@@ -199,27 +206,17 @@ async function removeAttendees(...removeAttendees: Members) {
.finally(() => { .finally(() => {
loading.value = false; loading.value = false;
}); });
await updateAttendees(); await updateAttendees(props.eventArray);
emit('update'); emit('update', -removeAttendees.length);
} }
async function updateTable() { async function updateTable(amount: number) {
await updateAttendees(); await updateAttendees(props.eventArray);
emit('update'); emit('update', amount);
} }
</script> </script>
<style> <style>
@keyframes blink-yellow {
0%,
100% {
background-color: yellow;
}
50% {
background-color: transparent;
}
}
.bigger-table-text .q-table__middle td { .bigger-table-text .q-table__middle td {
font-size: 14px; font-size: 14px;
} }

View File

@@ -69,7 +69,7 @@
</template> </template>
<template v-slot:body-cell="props"> <template v-slot:body-cell="props">
<q-td v-if="props.col.field === 'attendees'" :props="props"> <q-td v-if="props.col.field === 'attendees'" :props="props">
<q-btn dense flat icon="people" @click="openAttendees(props.row)" <q-btn dense flat icon="people" @click="openAttendees(props.rowIndex, props.row)"
><q-badge color="primary" text-color="primary-text" floating transparent>{{ ><q-badge color="primary" text-color="primary-text" floating transparent>{{
props.row.count props.row.count
}}</q-badge></q-btn }}</q-badge></q-btn
@@ -218,8 +218,8 @@ function openRemoveDialog(...Events: Events) {
okDialog.value?.open(Events); okDialog.value?.open(Events);
} }
function openAttendees(attendees: Members | null) { function openAttendees(eventArray: number, attendees: Members | null) {
attendeesDialog.value.open(attendees); attendeesDialog.value.open(eventArray, attendees);
} }
//remove Event from database //remove Event from database
@@ -244,20 +244,6 @@ function removeEvent(...removeEvents: Events) {
</script> </script>
<style> <style>
@keyframes blink-yellow {
0%,
100% {
background-color: yellow;
}
50% {
background-color: transparent;
}
}
.blink-yellow {
animation: blink-yellow 1.5s step-start 6 !important;
}
.bigger-table-text .q-table__middle td { .bigger-table-text .q-table__middle td {
font-size: 14px; font-size: 14px;
} }