diff --git a/ui/src/components/roles/roleView.vue b/ui/src/components/roles/roleView.vue index d6be8c5..20a54c4 100644 --- a/ui/src/components/roles/roleView.vue +++ b/ui/src/components/roles/roleView.vue @@ -2,12 +2,14 @@ import { getRoleDetails, getRoleMembers } from '@/api/roles' import type { MemberLight } from '@shared/types/member' import type { Role } from '@shared/types/roles' -import { onMounted, ref, watch } from 'vue' +import { computed, onMounted, ref, watch } from 'vue' import { useRoute } from 'vue-router' import Button from '@/components/ui/button/Button.vue' import Separator from '@/components/ui/separator/Separator.vue' -import { Plus, X } from 'lucide-vue-next' +import { Plus, SearchIcon, X } from 'lucide-vue-next' import MemberCard from '../members/MemberCard.vue' +import InputGroup from '../ui/input-group/InputGroup.vue' +import InputGroupAddon from '../ui/input-group/InputGroupAddon.vue' const route = useRoute() @@ -25,6 +27,16 @@ async function loadRole() { loading.value = false } +const searchQuery = ref('') +const roleMembersFiltered = computed(() => { + if (!searchQuery.value) return roleMembers.value + const query = searchQuery.value.toLowerCase() + return roleMembers.value.filter(member => + member.displayName?.toLowerCase().includes(query) || + member.username?.toLowerCase().includes(query) + ) +}) + // const availableMembers = computed(() => { // if (!activeRole.value) return []; // return allMembers.value.filter( @@ -81,11 +93,20 @@ watch(() => route.params.id, loadRole)

Members ({{ roleMembers.length }})

+
+ + + + - + + + +
@@ -95,11 +116,11 @@ watch(() => route.params.id, loadRole)