Enhance member training participation tracking and UI feedback

This commit adds functionality to track training participations for members in the backend, updating the MemberService to include a count of training participations. The frontend components, DiaryView and MembersView, have been updated to display warning icons based on the number of training participations, providing visual feedback for members with significant participation. CSS styles for warning icons have also been refined to improve visibility and user experience.
This commit is contained in:
Torsten Schulz (local)
2025-11-13 12:12:49 +01:00
parent 4c1a919d17
commit cf3bd3cd6d
3 changed files with 61 additions and 4 deletions

View File

@@ -70,6 +70,21 @@ class MemberService {
}));
}
// Berechne Trainingsteilnahmen
const trainingParticipations = await Participant.count({
include: [{
model: DiaryDate,
as: 'diaryDate',
where: {
clubId: clubId
}
}],
where: {
memberId: member.id
}
});
memberJson.trainingParticipations = trainingParticipations;
const imageData = await this._prepareMemberImages(member, { forceReload: true });
memberJson.images = imageData.images;
memberJson.primaryImageId = imageData.primaryImageId;

View File

@@ -389,11 +389,15 @@
<input type="checkbox" :value="member.id" @change="toggleParticipant(member.id)"
:checked="isParticipant(member.id)">
</label>
<span class="clickable participant-name" @click.stop="openNotesModal(member)">{{
<span class="clickable participant-name" @click.stop="openNotesModal(member)">
<span v-if="member && member.testMembership && member.trainingParticipations >= 6" class="warning-icon warning-icon-severe" title="6 oder mehr Trainingsteilnahmen">🛑</span>
<span v-else-if="member && member.testMembership && member.trainingParticipations >= 3" class="warning-icon" title="3 oder mehr Trainingsteilnahmen"></span>
{{
member ? member.firstName : ''
}} {{
member ? member.lastName : ''
}}</span>
}}
</span>
<div class="participant-actions">
<!-- Gruppenzuordnung für aktive Teilnehmer -->
<select v-if="isParticipant(member.id) && groups.length > 0"
@@ -2581,6 +2585,27 @@ li.participant-row .participant-actions {
margin-left: 0.25rem;
}
.warning-icon {
margin-right: 0.25rem;
font-size: 0.8rem;
}
.warning-icon-severe {
font-size: 0.8rem;
animation: pulse-warning 2s infinite;
}
@keyframes pulse-warning {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.1);
}
}
.multiselect {
margin-bottom: 10px;
width: 100%;

View File

@@ -177,7 +177,8 @@
<td>
<span class="gender-symbol" :class="['gender-' + (member.gender || 'unknown'), { 'is-inactive': !member.active }]" :title="labelGender(member.gender)">{{ genderSymbol(member.gender) }}</span>
<span class="gender-name" :class="['gender-' + (member.gender || 'unknown'), { 'is-inactive': !member.active }]">
<span v-if="member.testMembership && member.trainingParticipations >= 5" class="warning-icon" title="5 oder mehr Trainingsteilnahmen"></span>
<span v-if="member.testMembership && member.trainingParticipations >= 6" class="warning-icon warning-icon-severe" title="6 oder mehr Trainingsteilnahmen">🛑</span>
<span v-else-if="member.testMembership && member.trainingParticipations >= 3" class="warning-icon" title="3 oder mehr Trainingsteilnahmen"></span>
{{ member.lastName }}, {{ member.firstName }}
<span v-if="!member.active && showInactiveMembers" class="inactive-badge">inaktiv</span>
</span>
@@ -1919,7 +1920,23 @@ table td {
.warning-icon {
margin-right: 0.25rem;
font-size: 1.1em;
font-size: 0.8rem;
}
.warning-icon-severe {
font-size: 0.8rem;
animation: pulse-warning 2s infinite;
}
@keyframes pulse-warning {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.1);
}
}
.member-image-gallery {