164 lines
6.4 KiB
Vue
164 lines
6.4 KiB
Vue
<template>
|
|
<div class="flex flex-col gap-2 h-full w-full overflow-y-auto">
|
|
<div v-if="activeMemberObj != null" class="flex flex-col gap-2 w-full">
|
|
<div>
|
|
<label for="id">Interne Id</label>
|
|
<input type="text" id="id" :value="activeMemberObj.internalId" readonly />
|
|
</div>
|
|
<div>
|
|
<label for="salutation">Anrede</label>
|
|
<input type="text" id="salutation" :value="activeMemberObj.salutation.salutation" readonly />
|
|
</div>
|
|
<div>
|
|
<label for="firstname">Vorname</label>
|
|
<input type="text" id="firstname" :value="activeMemberObj.firstname" readonly />
|
|
</div>
|
|
<div>
|
|
<label for="lastname">Nachname</label>
|
|
<input type="text" id="lastname" :value="activeMemberObj.lastname" readonly />
|
|
</div>
|
|
<div>
|
|
<label for="nameaffix">Nameaffix</label>
|
|
<input type="text" id="nameaffix" :value="activeMemberObj.nameaffix" readonly />
|
|
</div>
|
|
<div>
|
|
<label for="birthdate">Geburtsdatum</label>
|
|
<input type="date" id="birthdate" :value="activeMemberObj.birthdate" readonly />
|
|
</div>
|
|
<div v-if="membershipStatistics.length != 0">
|
|
<p>Statistiken zur Mitgliedschaft</p>
|
|
<div class="flex flex-col h-fit w-full border border-primary rounded-md">
|
|
<div
|
|
v-for="stat in membershipStatistics"
|
|
class="bg-primary p-2 text-white flex flex-row justify-between items-center"
|
|
>
|
|
<p>
|
|
{{ stat.status }} für gesamt {{ stat.durationInDays }} Tage
|
|
<span class="whitespace-nowrap"> ~> {{ stat.exactDuration }}</span>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="activeMemberObj.firstMembershipEntry">
|
|
<p>Erster Eintrag Mitgliedschaft</p>
|
|
<div class="flex flex-col h-fit w-full border border-primary rounded-md">
|
|
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
|
|
<p>
|
|
{{ activeMemberObj.firstMembershipEntry.start }} bis
|
|
{{ activeMemberObj.firstMembershipEntry.end ?? "heute" }}:
|
|
{{ activeMemberObj.firstMembershipEntry.status }}
|
|
</p>
|
|
</div>
|
|
<div v-if="activeMemberObj.firstMembershipEntry.terminationReason" class="p-2">
|
|
<p>Grund: {{ activeMemberObj.firstMembershipEntry.terminationReason }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div
|
|
v-if="
|
|
activeMemberObj.lastMembershipEntry &&
|
|
activeMemberObj.firstMembershipEntry?.id != activeMemberObj.lastMembershipEntry?.id
|
|
"
|
|
>
|
|
<p>Neuster Eintrag Mitgliedschaft</p>
|
|
<div class="flex flex-col h-fit w-full border border-primary rounded-md">
|
|
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
|
|
<p>
|
|
{{ activeMemberObj.lastMembershipEntry.start }} bis
|
|
{{ activeMemberObj.lastMembershipEntry.end ?? "heute" }}:
|
|
{{ activeMemberObj.lastMembershipEntry.status }}
|
|
</p>
|
|
</div>
|
|
<div v-if="activeMemberObj.lastMembershipEntry.terminationReason" class="p-2">
|
|
<p>Grund: {{ activeMemberObj.lastMembershipEntry.terminationReason }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="activeMemberObj.preferredCommunication?.length != 0">
|
|
<p>bevorzugte Kommunikationswege</p>
|
|
<div class="flex flex-col gap-2">
|
|
<div
|
|
v-for="com in activeMemberObj.preferredCommunication"
|
|
class="flex flex-col h-fit w-full border border-primary rounded-md"
|
|
>
|
|
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
|
|
<p>
|
|
{{ com.type.type }}
|
|
</p>
|
|
</div>
|
|
<div class="p-2">
|
|
<p v-for="field in com.type.fields" :key="field">{{ field }}: {{ com[field] || "--" }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="activeMemberObj.smsAlarming?.length != 0">
|
|
<p>sende SMS-Alarmierung an:</p>
|
|
<div class="flex flex-col gap-2">
|
|
<div
|
|
v-for="com in activeMemberObj.smsAlarming"
|
|
class="flex flex-col h-fit w-full border border-primary rounded-md"
|
|
>
|
|
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
|
|
<p>
|
|
{{ com.type.type }}
|
|
</p>
|
|
</div>
|
|
<div class="p-2">
|
|
<p v-for="field in com.type.fields" :key="field">{{ field }}: {{ com[field] || "--" }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="activeMemberObj.sendNewsletter">
|
|
<p>sende Newsletter an:</p>
|
|
<div class="flex flex-col h-fit w-full border border-primary rounded-md">
|
|
<div class="bg-primary p-2 text-white flex flex-row justify-between items-center">
|
|
<p>
|
|
{{ activeMemberObj.sendNewsletter.type.type }}
|
|
</p>
|
|
</div>
|
|
<div class="p-2">
|
|
<p v-for="field in activeMemberObj.sendNewsletter.type.fields" :key="field">
|
|
{{ field }}: {{ activeMemberObj.sendNewsletter[field] || "--" }}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<Spinner v-if="loadingActive == 'loading'" class="mx-auto" />
|
|
<p v-else-if="loadingActive == 'failed'" @click="fetchMemberByActiveId" class="cursor-pointer">
|
|
↺ laden fehlgeschlagen
|
|
</p>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { defineComponent } from "vue";
|
|
import { mapActions, mapState } from "pinia";
|
|
import Spinner from "@/components/Spinner.vue";
|
|
import { useMemberStore } from "@/stores/admin/club/member/member";
|
|
import { useMembershipStore } from "@/stores/admin/club/member/membership";
|
|
</script>
|
|
|
|
<script lang="ts">
|
|
export default defineComponent({
|
|
props: {
|
|
memberId: String,
|
|
},
|
|
computed: {
|
|
...mapState(useMemberStore, ["activeMemberObj", "activeMemberStatistics", "loadingActive"]),
|
|
...mapState(useMembershipStore, ["membershipStatistics"]),
|
|
},
|
|
mounted() {
|
|
this.fetchMemberByActiveId();
|
|
this.fetchMemberStatisticsByActiveId();
|
|
this.fetchMembershipStatisticsForMember();
|
|
},
|
|
methods: {
|
|
...mapActions(useMemberStore, ["fetchMemberByActiveId", "fetchMemberStatisticsByActiveId"]),
|
|
...mapActions(useMembershipStore, ["fetchMembershipStatisticsForMember"]),
|
|
},
|
|
});
|
|
</script>
|