GUI for Participant management
This commit is contained in:
@@ -1,31 +1,116 @@
|
||||
<script setup>
|
||||
import { reactive, watch } from "vue";
|
||||
import AmountInput from "../../../../Views/Components/AmountInput.vue";
|
||||
|
||||
const props = defineProps({
|
||||
editMode: Boolean,
|
||||
participant: Object,
|
||||
})
|
||||
const props = defineProps({
|
||||
editMode: Boolean,
|
||||
participant: Object,
|
||||
event: Object,
|
||||
});
|
||||
|
||||
const emit = defineEmits(['closeParticipantDetails', 'markCocExisting','paymentComplete', 'cancelParticipation'])
|
||||
console.log(props.participant)
|
||||
|
||||
function markCocExisting(participant) {
|
||||
emit('markCocExisting', participant)
|
||||
close()
|
||||
}
|
||||
const emit = defineEmits([
|
||||
'closeParticipantDetails',
|
||||
'markCocExisting',
|
||||
'paymentComplete',
|
||||
'cancelParticipation',
|
||||
'editParticipant',
|
||||
'saveParticipant',
|
||||
]);
|
||||
|
||||
function paymentComplete(participant) {
|
||||
emit('paymentComplete', participant)
|
||||
close()
|
||||
}
|
||||
const form = reactive({
|
||||
firstname: '',
|
||||
lastname: '',
|
||||
nickname: '',
|
||||
address_1: '',
|
||||
address_2: '',
|
||||
postcode: '',
|
||||
city: '',
|
||||
localgroup: '',
|
||||
birthday: '',
|
||||
email_1: '',
|
||||
phone_1: '',
|
||||
contact_person: '',
|
||||
email_2: '',
|
||||
phone_2: '',
|
||||
arrival: '',
|
||||
departure: '',
|
||||
participationType: '',
|
||||
eatingHabit: '',
|
||||
allergies: '',
|
||||
intolerances: '',
|
||||
medications: '',
|
||||
extendedFirstAid: '',
|
||||
swimmingPermission: '',
|
||||
tetanusVaccination: '',
|
||||
notes: '',
|
||||
amountPaid: '',
|
||||
amountExpected: '',
|
||||
cocStatus: '',
|
||||
});
|
||||
|
||||
function close() {
|
||||
emit('closeParticipantDetails')
|
||||
watch(
|
||||
() => props.participant,
|
||||
(participant) => {
|
||||
form.firstname = participant?.firstname ?? '';
|
||||
form.lastname = participant?.lastname ?? '';
|
||||
form.nickname = participant?.nickname ?? '';
|
||||
form.address_1 = participant?.address_1 ?? '';
|
||||
form.address_2 = participant?.address_2 ?? '';
|
||||
form.postcode = participant?.postcode ?? '';
|
||||
form.city = participant?.city ?? '';
|
||||
form.localgroup = participant?.local_group ?? '';
|
||||
form.birthday = participant?.birthdayDate ?? '';
|
||||
form.email_1 = participant?.email_1 ?? '';
|
||||
form.phone_1 = participant?.phone_1 ?? '';
|
||||
form.contact_person = participant?.contact_person ?? '';
|
||||
form.email_2 = participant?.email_2 ?? '';
|
||||
form.phone_2 = participant?.phone_2 ?? '';
|
||||
form.arrival = participant?.arrival ?? '';
|
||||
form.departure = participant?.departure ?? '';
|
||||
form.participationType = participant?.participation_type ?? '';
|
||||
form.eatingHabit = participant?.eating_habit ?? '';
|
||||
form.allergies = participant?.allergies ?? '';
|
||||
form.intolerances = participant?.intolerances ?? '';
|
||||
form.medications = participant?.medications ?? '';
|
||||
form.extendedFirstAid = participant?.first_aid_permission ?? '';
|
||||
form.swimmingPermission = participant?.swimming_permission ?? '';
|
||||
form.tetanusVaccination = participant?.tetanus_vaccination ?? '';
|
||||
form.notes = participant?.notes ?? '';
|
||||
form.amountPaid = participant?.amountPaid.short ?? '';
|
||||
form.amountExpected = participant?.amountExpected.short ?? '';
|
||||
form.cocStatus = participant?.efz_status ?? '';
|
||||
},
|
||||
{ immediate: true }
|
||||
);
|
||||
|
||||
}
|
||||
function markCocExisting(participant) {
|
||||
emit('markCocExisting', participant);
|
||||
close();
|
||||
}
|
||||
|
||||
function cancelParticipation(participant) {
|
||||
emit('cancelParticipation', participant)
|
||||
close()
|
||||
}
|
||||
function paymentComplete(participant) {
|
||||
emit('paymentComplete', participant);
|
||||
close();
|
||||
}
|
||||
|
||||
function close() {
|
||||
emit('closeParticipantDetails');
|
||||
}
|
||||
|
||||
function cancelParticipation(participant) {
|
||||
emit('cancelParticipation', participant);
|
||||
close();
|
||||
}
|
||||
|
||||
function enableEditMode() {
|
||||
emit('editParticipant');
|
||||
}
|
||||
|
||||
function saveParticipant() {
|
||||
emit('saveParticipant', { ...form });
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -40,7 +125,11 @@
|
||||
<th>Name</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">
|
||||
{{props.participant.firstname}} {{props.participant.lastname}}
|
||||
{{ props.participant.firstname }} {{ props.participant.lastname }}
|
||||
</span>
|
||||
<span v-else>
|
||||
<input v-model="form.firstname" type="text" placeholder="Vorname" />
|
||||
<input v-model="form.lastname" type="text" placeholder="Nachname" />
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -48,7 +137,8 @@
|
||||
<tr>
|
||||
<th>Pfadiname</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.nickname}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.nickname }}</span>
|
||||
<input v-else v-model="form.nickname" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -56,25 +146,35 @@
|
||||
<th>Anschrift</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">
|
||||
{{props.participant.address_1}}<br />
|
||||
{{props.participant.address_2}}<br />
|
||||
{{props.participant.postcode}}
|
||||
{{props.participant.city}}
|
||||
{{ props.participant.address_1 }}<br />
|
||||
{{ props.participant.address_2 }}<br />
|
||||
{{ props.participant.postcode }}
|
||||
{{ props.participant.city }}
|
||||
</span>
|
||||
<span v-else>
|
||||
<input v-model="form.address_1" type="text" placeholder="Adresse 1" />
|
||||
<input v-model="form.address_2" type="text" placeholder="Adresse 2" />
|
||||
<input v-model="form.postcode" type="text" placeholder="PLZ" />
|
||||
<input v-model="form.city" type="text" placeholder="Ort" />
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Stamm</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.localgroup}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.localgroup }}</span>
|
||||
<select v-else v-model="form.localgroup">
|
||||
<option v-for="group in props.event.contributingLocalGroups" :key="group.id" :value="group.slug">{{ group.name }}</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Geburtsdatum</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">
|
||||
{{props.participant.birthday}}
|
||||
</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.birthday }}</span>
|
||||
<input v-else v-model="form.birthday" type="date" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -86,35 +186,175 @@
|
||||
<tr>
|
||||
<th>E-Mail</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.email_1}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.email_1 }}</span>
|
||||
<input v-else v-model="form.email_1" type="email" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Telefon</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.phone_1}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.phone_1 }}</span>
|
||||
<input v-else v-model="form.phone_1" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Ansprechperson</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.contact_person}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.contact_person }}</span>
|
||||
<input v-else v-model="form.contact_person" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Ansprechperson E-Mail</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.email_2}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.email_2 }}</span>
|
||||
<input v-else v-model="form.email_2" type="email" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Ansprechperson Telefon</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.phone_2}}</span>
|
||||
<span v-if="!props.editMode">{{ props.participant.phone_2 }}</span>
|
||||
<input v-else v-model="form.phone_2" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="participationData">
|
||||
<div>
|
||||
<h3>Teilnahmedetails</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Anreise</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.arrival }}</span>
|
||||
<input v-else v-model="form.arrival" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Abreise</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.departure }}</span>
|
||||
<input v-else v-model="form.departure" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Teilnahmegruppe</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.participationType }}</span>
|
||||
<select v-else v-model="form.participationType">
|
||||
<option
|
||||
v-for="participationType in event.participationTypes"
|
||||
:value="participationType.type.slug"
|
||||
>
|
||||
{{ participationType.type.name }}
|
||||
</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Ernährung</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.eatingHabit }}</span>
|
||||
<select v-else v-model="form.eatingHabit">
|
||||
<option
|
||||
v-for="eatingHabit in event.eatingHabits"
|
||||
:value="eatingHabit.slug"
|
||||
>
|
||||
{{ eatingHabit.name }}
|
||||
</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>eFZ-Status</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.efzStatusReadable }}</span>
|
||||
<select v-else v-model="form.cocStatus">
|
||||
<option value="not_checked">Nicht geprüft</option>
|
||||
<option value="not_required">Nicht erforderlich</option>
|
||||
<option value="checked_valid">Geprüft und Vorhanden</option>
|
||||
<option value="checked_invalid">Nicht vorhanden</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Beitrag</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.amountPaid.readable }} / {{ props.participant.amountExpected.readable }}</span>
|
||||
<span v-else>
|
||||
<AmountInput v-model="form.amountPaid" style="width:74px" /> Euro
|
||||
/
|
||||
<AmountInput v-model="form.amountExpected" style="width: 74px" /> Euro
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h3>Medizinische Informationen</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Allergien</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.allergies }}</span>
|
||||
<input type="text" v-else v-model="form.allergies" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Unverträglichkeiten</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.intolerances }}</span>
|
||||
<input type="text" v-else v-model="form.intolerances" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Medikamente</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.medications }}</span>
|
||||
<input type="text" v-else v-model="form.medications" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Erweiterte Erste Hilfe</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.extendedFirstAid }}</span>
|
||||
<select v-else v-model="form.extendedFirstAid">
|
||||
<option value="FIRST_AID_PERMISSION_ALLOWED">Erlaubt</option>
|
||||
<option value="FIRST_AID_PERMISSION_DENIED">Verweigert</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Badeerlaubnis</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.swimmingPermission }}</span>
|
||||
<select v-else v-model="form.swimmingPermission">
|
||||
<option value="SWIMMING_PERMISSION_ALLOWED">Vorhanden, kann schwimmen</option>
|
||||
<option value="SWIMMING_PERMISSION_LIMITED">Vorhanden, kann nicht schwimmen</option>
|
||||
<option value="SWIMMING_PERMISSION_DENIED">Verweigert</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Letzte Tetanus-Impfung</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.tetanusVaccination }}</span>
|
||||
<input v-else v-model="form.tetanusVaccination" type="date" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Anmerkungen</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{ props.participant.notes }}</span>
|
||||
<textarea v-else v-model="form.notes"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -122,104 +362,9 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="participationData">
|
||||
<div>
|
||||
<h3>Teilnahmedetails</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Anreise</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.arrival}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Abreise</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.departure}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Teilnahmegruppe</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.participationType}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<button v-if="!props.editMode" class="button" @click="enableEditMode">Bearbeiten</button>
|
||||
<button v-else class="button" @click="saveParticipant">Speichern</button>
|
||||
|
||||
<tr>
|
||||
<th>Ernährung</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.eatingHabit}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>eFZ-Status</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.efzStatusReadable}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Beitrag</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.amountPaid.readable}} / {{props.participant.amountExpected.readable}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Medizinische Informationen</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Allergien</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.allergies}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Unverträglichkeiten</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.intolerances}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Medikamente</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.medications}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Erweiterte Erste Hilfe</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.extendedFirstAid}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Badeerlaubnis</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.swimmingPermission}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Letzte Tetanus-Impfung</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.tetanusVaccination}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Anmerkungen</th>
|
||||
<td>
|
||||
<span v-if="!props.editMode">{{props.participant.notes}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="button">Bearbeiten</button>
|
||||
<button class="button" @click="paymentComplete(props.participant)">Zahlung vollständig</button>
|
||||
<button class="button" @click="markCocExisting(props.participant)">eFZ liegt vor</button>
|
||||
<button class="button" @click="cancelParticipation(props.participant)">Abmelden</button>
|
||||
@@ -231,6 +376,7 @@
|
||||
.participationData {
|
||||
display: flex;
|
||||
margin-bottom: 20px;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.participationData div {
|
||||
@@ -238,4 +384,19 @@
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
input[type="text"],
|
||||
input[type="email"],
|
||||
input[type="date"],
|
||||
textarea
|
||||
{
|
||||
width: 250px
|
||||
}
|
||||
|
||||
textarea {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
select {
|
||||
width: 262px;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user