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';
|