diff --git a/frontend/src/components/members/MembersOverviewSection.vue b/frontend/src/components/members/MembersOverviewSection.vue index 5350548a..1794ec90 100644 --- a/frontend/src/components/members/MembersOverviewSection.vue +++ b/frontend/src/components/members/MembersOverviewSection.vue @@ -106,6 +106,15 @@ +
+ + +
@@ -193,6 +202,8 @@ export default { selectedAgeFrom: { type: [String, Number], required: true }, selectedAgeTo: { type: [String, Number], required: true }, selectedGender: { type: String, required: true }, + selectedTrainingGroup: { type: String, required: true }, + trainingGroupOptions: { type: Array, required: true }, selectedSort: { type: String, required: true }, sortDirection: { type: String, required: true }, filteredMembersWithoutFormCount: { type: Number, required: true }, @@ -213,6 +224,7 @@ export default { 'update:selected-age-from', 'update:selected-age-to', 'update:selected-gender', + 'update:selected-training-group', 'clear-filters', 'update:selected-sort', 'toggle-sort-direction', diff --git a/frontend/src/views/MembersView.vue b/frontend/src/views/MembersView.vue index 8a10b059..f0a85536 100644 --- a/frontend/src/views/MembersView.vue +++ b/frontend/src/views/MembersView.vue @@ -15,6 +15,8 @@ :selected-age-from="selectedAgeFrom" :selected-age-to="selectedAgeTo" :selected-gender="selectedGender" + :selected-training-group="selectedTrainingGroup" + :training-group-options="trainingGroupFilterOptions" :selected-sort="selectedSort" :sort-direction="sortDirection" :filtered-members-without-form-count="filteredMembersWithoutForm.length" @@ -33,6 +35,7 @@ @update:selected-age-from="selectedAgeFrom = $event" @update:selected-age-to="selectedAgeTo = $event" @update:selected-gender="selectedGender = $event" + @update:selected-training-group="selectedTrainingGroup = $event" @clear-filters="clearFilters" @update:selected-sort="selectedSort = $event" @toggle-sort-direction="toggleSortDirection" @@ -326,6 +329,7 @@ {{ $t('members.contact') }} {{ $t('members.birthdate') }} {{ $t('members.age') }} + {{ $t('members.lastTraining') }} {{ $t('members.trainingParticipations') }} {{ $t('members.actions') }} @@ -398,6 +402,7 @@ {{ getFormattedBirthdate(member.birthDate) }} {{ getAgeLabel(member.birthDate) }} + {{ getOptionalFormattedDate(member.lastTraining, 'members.previewNoLastTraining') }} {{ member.trainingParticipations || 0 }} - @@ -578,6 +583,22 @@ export default { inactiveMembersCount() { return this.members.filter(member => !member.active).length; }, + + trainingGroupFilterOptions() { + const groups = new Map(); + this.members.forEach((member) => { + this.getMemberTrainingGroups(member).forEach((group) => { + if (!group || group.id == null) { + return; + } + groups.set(String(group.id), group.name || `#${group.id}`); + }); + }); + + return Array.from(groups.entries()) + .map(([id, name]) => ({ id, name })) + .sort((a, b) => a.name.localeCompare(b.name, 'de-DE')); + }, filteredMembers() { return this.members.filter(member => { @@ -648,6 +669,13 @@ export default { } } + if (this.selectedTrainingGroup) { + const memberGroupIds = this.getMemberTrainingGroups(member).map(group => String(group.id)); + if (!memberGroupIds.includes(String(this.selectedTrainingGroup))) { + return false; + } + } + if (search) { const haystack = [ member.firstName, @@ -885,6 +913,7 @@ export default { selectedAgeFrom: '', selectedAgeTo: '', selectedGender: '', + selectedTrainingGroup: '', clickTtPendingMemberIds: [], searchQuery: '', selectedMemberScope: 'active', @@ -2323,6 +2352,7 @@ export default { this.selectedAgeFrom = ''; this.selectedAgeTo = ''; this.selectedGender = ''; + this.selectedTrainingGroup = ''; this.showInactiveMembers = false; this.searchQuery = ''; this.selectedMemberScope = 'active';