diff --git a/dashboard/src/views/GroupsView.vue b/dashboard/src/views/GroupsView.vue index beb01a279..19a72c61f 100644 --- a/dashboard/src/views/GroupsView.vue +++ b/dashboard/src/views/GroupsView.vue @@ -4,8 +4,8 @@ import { useI18n } from 'vue-i18n'; const i18n = useI18n(); const t = i18n.t; -import { ref, onMounted, useTemplateRef, inject } from 'vue'; -import { Button, Menu, TableView, InputDialog } from '@cloudron/pankow'; +import { ref, onMounted, useTemplateRef, inject, computed } from 'vue'; +import { Button, Menu, TableView, InputDialog, TextInput } from '@cloudron/pankow'; import Section from '../components/Section.vue'; import GroupDialog from '../components/GroupDialog.vue'; import UsersModel from '../models/UsersModel.js'; @@ -88,6 +88,21 @@ function groupMembers(group) { return group.userIds.filter(function (uid) { return !!usersById.value[uid]; }).map(function (uid) { return usersById.value[uid].username || usersById.value[uid].email; }).join(' '); } +const searchFilter = ref(''); + +const filteredGroups = computed(() => { + if (!searchFilter.value) return groups.value; + + return groups.value.filter(g => { + const search = searchFilter.value.toLowerCase(); + + if (g.name.toLowerCase().indexOf(search) !== -1) return true; + if (groupMembers(g).toLowerCase().indexOf(search) !== -1) return true; + + return false; + }); +}); + function onEditOrAddGroup(group = null) { if (group || features.value.userGroups) groupDialog.value.open(group); else subscriptionRequiredDialog.value.open(); @@ -141,14 +156,16 @@ onMounted(async () => {
+ - +