44 <CreateCompanyDialogTrigger />
55 </div >
66
7- <ParticipationFilters
8- v-model:selected =" selectedStatus"
9- v-model:selected-package =" selectedPackage"
10- :packages =" packages"
11- />
7+ <div class =" flex flex-wrap gap-3 mb-4 items-center" >
8+ <ParticipationFilters
9+ v-model:selected =" selectedStatus"
10+ v-model:selected-package =" selectedPackage"
11+ :packages =" packages"
12+ />
13+ <Select v-model =" selectedTeamId" >
14+ <SelectTrigger class =" w-52" >
15+ <SelectValue placeholder =" All teams" />
16+ </SelectTrigger >
17+ <SelectContent >
18+ <SelectItem value =" all" >All teams</SelectItem >
19+ <SelectItem
20+ v-for =" team in coordinationTeams"
21+ :key =" team.id"
22+ :value =" team.id"
23+ >
24+ {{ team.name }}
25+ </SelectItem >
26+ </SelectContent >
27+ </Select >
28+ </div >
1229
1330 <div
1431 v-if =" !membersSorted.length && companiesLoading"
2340
2441 <DynamicScroller
2542 v-else
43+ :key =" selectedTeamId"
2644 :items =" membersSorted"
27- class = " h-100 "
45+ page-mode
2846 :min-item-size =" 1"
2947 >
3048 <template #default =" { item } " >
7088<script setup lang="ts">
7189import type { Company , CompanyParticipation } from " @/dto/companies" ;
7290import type { Member } from " @/dto/members" ;
91+ import type { CoordinationTeam } from " @/dto/coordinationTeams" ;
7392import MemberWithAvatar from " @/components/members/MemberWithAvatar.vue" ;
7493import { DynamicScroller } from " vue-virtual-scroller" ;
7594import { useInsertionSort , useSortByParticipationStatus } from " @/lib/utils" ;
@@ -82,17 +101,34 @@ import { useParticipationFilter } from "@/composables/useParticipationFilter";
82101import type { ObjectID , ParticipationStatus } from " @/dto" ;
83102import ParticipationFilters from " @/components/ParticipationFilters.vue" ;
84103import { useEventPackagesQuery } from " @/mutations/packages" ;
104+ import {
105+ Select ,
106+ SelectContent ,
107+ SelectItem ,
108+ SelectTrigger ,
109+ SelectValue ,
110+ } from " @/components/ui/select" ;
85111
86112const props = defineProps <{
87113 companies: Company [];
88114 companiesLoading? : boolean ;
89115 members: Member [];
90116 eventId: number ;
117+ coordinationTeams? : CoordinationTeam [];
91118}>();
92119
93120// TODO shift me to top
94121const membersSorted = computed (() => {
95- return [... props .members ]?.sort ((a , b ) => a .name .localeCompare (b .name ));
122+ const sorted = [... props .members ]?.sort ((a , b ) =>
123+ a .name .localeCompare (b .name ),
124+ );
125+ if (! selectedTeamId .value || selectedTeamId .value === " all" ) return sorted ;
126+ const team = props .coordinationTeams ?.find (
127+ (t ) => t .id === selectedTeamId .value ,
128+ );
129+ if (! team ) return sorted ;
130+ const teamMemberSet = new Set (team .coordinatedMembers );
131+ return sorted .filter ((m ) => teamMemberSet .has (m .id ));
96132});
97133
98134const membersMap = computed (() => {
@@ -105,6 +141,11 @@ const membersMap = computed(() => {
105141 );
106142});
107143
144+ // Set of member IDs visible after team filtering
145+ const visibleMemberIds = computed (
146+ () => new Set (membersSorted .value .map ((m ) => m .id )),
147+ );
148+
108149interface CompanyWithParticipation extends Company {
109150 participation: CompanyParticipation ;
110151}
@@ -118,6 +159,7 @@ const participations = computed(() =>
118159 if (currParticipation && currParticipation .member in membersMap .value ! ) {
119160 const member = membersMap .value ?.[currParticipation .member ];
120161 if (! member ) return acc ; // Skip if member not found
162+ if (! visibleMemberIds .value .has (member .id )) return acc ; // skip filtered-out members
121163
122164 if (! acc .has (member .id )) acc .set (member .id , []);
123165
@@ -138,6 +180,7 @@ const participations = computed(() =>
138180
139181const selectedStatus = ref <ParticipationStatus | null >(null );
140182const selectedPackage = ref <ObjectID | null >(null );
183+ const selectedTeamId = ref <string >(" all" );
141184
142185// Fetch packages for filter, pre-filtered by current event
143186const { data : packages } = useEventPackagesQuery ();
0 commit comments