Fix searching group members

This commit is contained in:
Natsumi
2025-08-29 17:18:03 +12:00
parent 6754b72e92
commit d854f3f009
2 changed files with 56 additions and 27 deletions
@@ -1212,7 +1212,8 @@
userImage, userImage,
userStatusClass, userStatusClass,
formatDateFilter, formatDateFilter,
textToHex textToHex,
debounce
} from '../../../shared/utils'; } from '../../../shared/utils';
import { import {
useAppearanceSettingsStore, useAppearanceSettingsStore,
@@ -1253,8 +1254,6 @@
const groupDialogRef = ref(null); const groupDialogRef = ref(null);
const isGroupMembersDone = ref(false); const isGroupMembersDone = ref(false);
const isGroupMembersLoading = ref(false); const isGroupMembersLoading = ref(false);
const groupMembersSearchTimer = ref(null);
const groupMembersSearchPending = ref(false);
const groupDialogGalleryCurrentName = ref('0'); const groupDialogGalleryCurrentName = ref('0');
const groupDialogTabCurrentName = ref('0'); const groupDialogTabCurrentName = ref('0');
const isGroupGalleryLoading = ref(false); const isGroupGalleryLoading = ref(false);
@@ -1328,37 +1327,22 @@
} }
function groupMembersSearch() { function groupMembersSearch() {
if (groupMembersSearchTimer.value) { if (groupDialog.value.memberSearch.length < 3) {
groupMembersSearchPending.value = true; groupDialog.value.memberSearchResults = [];
} else { isGroupMembersLoading.value = false;
groupMembersSearchExecute(); return;
groupMembersSearchTimer.value = setTimeout(() => {
if (groupMembersSearchPending.value) {
groupMembersSearchExecute();
}
groupMembersSearchTimer.value = null;
}, 500);
} }
debounce(groupMembersSearchDebounced, 200)();
} }
function groupMembersSearchExecute() { function groupMembersSearchDebounced() {
try {
groupMembersSearchDebounce();
} catch (err) {
console.error(err);
}
groupMembersSearchTimer.value = null;
groupMembersSearchPending.value = false;
}
function groupMembersSearchDebounce() {
const D = groupDialog.value; const D = groupDialog.value;
const search = D.memberSearch; const search = D.memberSearch;
D.memberSearchResults = []; D.memberSearchResults = [];
if (!search || search.length < 3) { if (!search || search.length < 3) {
return; return;
} }
isGroupMembersLoading.value = false; isGroupMembersLoading.value = true;
groupRequest groupRequest
.getGroupMembersSearch({ .getGroupMembersSearch({
groupId: D.id, groupId: D.id,
@@ -846,7 +846,7 @@
import * as workerTimers from 'worker-timers'; import * as workerTimers from 'worker-timers';
import { groupRequest, userRequest } from '../../../api'; import { groupRequest, userRequest } from '../../../api';
import { groupDialogFilterOptions, groupDialogSortingOptions } from '../../../shared/constants'; import { groupDialogFilterOptions, groupDialogSortingOptions } from '../../../shared/constants';
import { hasGroupPermission, userImage, userImageFull, formatDateFilter } from '../../../shared/utils'; import { hasGroupPermission, userImage, userImageFull, formatDateFilter, debounce } from '../../../shared/utils';
import { useAppearanceSettingsStore, useGalleryStore, useGroupStore, useUserStore } from '../../../stores'; import { useAppearanceSettingsStore, useGalleryStore, useGroupStore, useUserStore } from '../../../stores';
import GroupMemberModerationExportDialog from './GroupMemberModerationExportDialog.vue'; import GroupMemberModerationExportDialog from './GroupMemberModerationExportDialog.vue';
@@ -864,7 +864,6 @@
const selectedUsersArray = ref([]); const selectedUsersArray = ref([]);
const isGroupMembersLoading = ref(false); const isGroupMembersLoading = ref(false);
const isGroupMembersDone = ref(false); const isGroupMembersDone = ref(false);
const groupMembersSearch = ref('');
const memberFilter = ref({ const memberFilter = ref({
id: null, id: null,
name: 'dialog.group.members.filters.everyone' name: 'dialog.group.members.filters.everyone'
@@ -1774,6 +1773,52 @@
.replace(/\b\w/g, (l) => l.toUpperCase()); .replace(/\b\w/g, (l) => l.toUpperCase());
} }
function groupMembersSearch() {
if (memberSearch.value.length < 3) {
groupMemberModerationTable.data = [];
isGroupMembersLoading.value = false;
return;
}
isGroupMembersLoading.value = true;
debounce(groupMembersSearchDebounced, 200)();
}
function groupMembersSearchDebounced() {
const groupId = groupMemberModeration.value.id;
const search = memberSearch.value;
groupMemberModerationTable.data = [];
if (memberSearch.value.length < 3) {
return;
}
isGroupMembersLoading.value = true;
groupRequest
.getGroupMembersSearch({
groupId,
query: search,
n: 100,
offset: 0
})
.then((args) => {
for (const json of args.json.results) {
handleGroupMember({
json,
params: {
groupId: args.params.groupId
}
});
}
if (groupId === args.params.groupId) {
groupMemberModerationTable.data = args.json.results.map((member) => ({
...member,
$selected: Boolean(selectedUsers[member.userId])
}));
}
})
.finally(() => {
isGroupMembersLoading.value = false;
});
}
async function getGroupMembers() { async function getGroupMembers() {
members.value = []; members.value = [];
isGroupMembersDone.value = false; isGroupMembersDone.value = false;