diff --git a/src/views/UsersView.vue b/src/views/UsersView.vue index ba0a39c..7b35753 100644 --- a/src/views/UsersView.vue +++ b/src/views/UsersView.vue @@ -106,6 +106,10 @@ async function removeUserFromCell(cellId: string, userId: number) { await loadCells() } +function userCells(userId: number) { + return cells.value.filter(c => (cellMembers.value[c.id] || []).some((m: any) => m.userId === userId)) +} + function userName(id: number): string { return store.users.find(u => u.id === id)?.full_name || `Usuario ${id}` } @@ -113,15 +117,39 @@ function userName(id: number): string { // ─── Table ─────────────────────────────────────────────── const searchQuery = ref('') const currentPage = ref(1) +const filterRole = ref('__all') +const filterProject = ref('__all') const PAGE_SIZE = 15 +const uniqueRoles = computed(() => { + const roles = new Set(store.users.map(u => u.role).filter(Boolean)) + return Array.from(roles).sort() as string[] +}) + +const uniqueProjects = computed(() => { + const projs = new Set() + store.users.forEach(u => u.projects.forEach(p => projs.add(p))) + return Array.from(projs).sort() +}) + const filteredUsers = computed(() => { + let list = store.users const q = searchQuery.value.toLowerCase().trim() - if (!q) return store.users - return store.users.filter(u => - u.full_name?.toLowerCase().includes(q) || - u.email?.toLowerCase().includes(q) - ) + if (q) { + list = list.filter(u => + u.full_name?.toLowerCase().includes(q) || + u.email?.toLowerCase().includes(q) || + u.role?.toLowerCase().includes(q) || + u.cell?.toLowerCase().includes(q) + ) + } + if (filterRole.value && filterRole.value !== '__all') { + list = list.filter(u => u.role === filterRole.value) + } + if (filterProject.value && filterProject.value !== '__all') { + list = list.filter(u => u.projects.includes(filterProject.value)) + } + return list }) const totalPages = computed(() => Math.ceil(filteredUsers.value.length / PAGE_SIZE)) @@ -131,6 +159,19 @@ const paginatedUsers = computed(() => { return filteredUsers.value.slice(start, start + PAGE_SIZE) }) +function goToPage(p: number) { + currentPage.value = Math.max(1, Math.min(p, totalPages.value)) +} + +const pageNumbers = computed(() => { + const total = totalPages.value + const curr = currentPage.value + if (total <= 5) return Array.from({ length: total }, (_, i) => i + 1) + if (curr <= 3) return [1, 2, 3, 4, "...", total] + if (curr >= total - 2) return [1, "...", total - 3, total - 2, total - 1, total] + return [1, "...", curr - 1, curr, curr + 1, "...", total] +}) + function initials(u: { first_name?: string; last_name?: string }) { return `${(u.first_name || '')[0] || ''}${(u.last_name || '')[0] || ''}` } @@ -147,7 +188,7 @@ onMounted(() => {

{{ t('users.teamTitle') }}

-

{{ store.users.length }} usuarios · {{ cells.length }} células

+

{{ store.users.length }} usuarios · {{ store.employees.length }} asignaciones · {{ cells.length }} células