Tengo una lista de usuarios de servicios con ID que quiero filtrar de la lista de búsqueda si ya existen en una tabla de grupo.
Hay 2 tablas involucradas, en primer lugar, 'grupo-usuario', que incluye groupId y serviceUserId, la segunda tabla es 'group' y tiene groupId y groupName.
Cuando se llama a la función addUserToGroupModal, quiero mostrar solo los nombres que no tienen un grupo asignado.
onInIt se llama a la función listGroups para obtener todos los grupos y usuarios dentro del grupo -
async listGroups() { await Promise.all([ this.groupService.getGroups(true).then((result) => (this.groups = [...result])), this.userService.getActiveAndInHospitalServiceUsers(false).then((result) => (this.serviceUsers = [...result])), this.groupService.getGroupUsers(true).then((result) => (this.groupUsers = [...result])) ]).then(() => { this.groupMap.clear(); this.groupIdMap.clear(); this.groups.forEach((group) => { const idsForUsersInGroup = this.groupUsers.filter((groupUser) => groupUser.groupId === group.id).map((groupUser) => groupUser.serviceUserId); const usersInGroup = this.serviceUsers.filter((serviceUser) => idsForUsersInGroup.includes(serviceUser.id)); this.groupIdMap.set(group.id, group.name); this.groupMap.set(group.name, {id: group.id, users: usersInGroup}); }); }); }Cuando se llama a la función modal, necesito que se aplique el filtro para mostrar solo a los usuarios de servicio que no tienen un grupo.
async addUserToGroupModal(template: TemplateRef<any>) { this.addUserRef = this.modalService.show(template, {class: 'modal-lg', backdrop: 'static', keyboard: false}); }Estoy usando una lista de datos para mostrar los usuarios:
<datalist id="groupSelect"> <option *ngFor="let serviceUser of serviceUsers" [value]="serviceUser.id" > {{serviceUser.firstName}} {{serviceUser.lastName}} </datalist>Puede agregar una variable adicional usersWithAGroup que memorice todos los usuarios realmente asignados a un grupo:
let usersWithAGroup = []; this.groups.forEach((group) => { const idsForUsersInGroup = this.groupUsers.filter((groupUser) => groupUser.groupId === group.id).map((groupUser) => groupUser.serviceUserId); Array.prototype.push.apply(usersWithAGroup, idsForUsersInGroup ); const usersInGroup = this.serviceUsers.filter((serviceUser) => idsForUsersInGroup.includes(serviceUser.id)); this.groupIdMap.set(group.id, group.name); this.groupMap.set(group.name, {id: group.id, users: usersInGroup}); }); Luego, en su html, filtra si el usuario no está presente en usersWithAGroup :
<datalist id="groupSelect"> <option *ngFor="let serviceUser of serviceUsers" [value]="serviceUser.id"> <span *ngIf="!usersWithAGroup.includes(serviceUser.id)">{{serviceUser.firstName}} {{serviceUser.lastName}}</span> </datalist>