user list for moderation of pending users - #877

This commit is contained in:
Laurent GAY
2025-09-13 19:57:53 +02:00
parent 23cd7333c4
commit 726a5e1d78
8 changed files with 252 additions and 8 deletions

View File

@@ -271,6 +271,7 @@ export const LIST_USERS = gql`
query ListUsers(
$email: String
$currentSignInIp: String
$pendingUser: Boolean
$page: Int
$limit: Int
$sort: SortableUserField
@@ -279,6 +280,7 @@ export const LIST_USERS = gql`
users(
email: $email
currentSignInIp: $currentSignInIp
pendingUser: $pendingUser
page: $page
limit: $limit
sort: $sort

View File

@@ -854,7 +854,7 @@
"Open user menu": "Open user menu",
"Opened reports": "Opened reports",
"Open": "Open",
"Options":"Options",
"Options": "Options",
"Or": "Or",
"Ordered list": "Ordered list",
"Organized": "Organized",
@@ -1374,6 +1374,7 @@
"User suspended and report resolved": "User suspended and report resolved",
"Username": "Username",
"Users": "Users",
"Users pending for moderation": "Users pending for moderation",
"Validating account": "Validating account",
"Validating email": "Validating email",
"Video Conference": "Video Conference",

View File

@@ -10,8 +10,13 @@
]"
/>
<div v-if="users">
<form @submit.prevent="activateFilters">
<form>
<o-field class="mb-5" grouped group-multiline>
<p class="control mb-3 m-auto" v-if="registrationsModeration">
<o-checkbox v-model="pendingFieldValue">{{
$t("Users pending for moderation")
}}</o-checkbox>
</p>
<o-field :label="$t('Email')" expanded>
<o-input trap-focus icon="email" v-model="emailFilterFieldValue" />
</o-field>
@@ -19,7 +24,7 @@
<o-input icon="web" v-model="ipFilterFieldValue" />
</o-field>
<p class="control self-end mb-0">
<o-button variant="primary" native-type="submit">{{
<o-button variant="primary" @click="filterUsers">{{
$t("Filter")
}}</o-button>
</p>
@@ -112,17 +117,29 @@ import { useI18n } from "vue-i18n";
import { useHead } from "@/utils/head";
import { integerTransformer, useRouteQuery } from "vue-use-route-query";
import { formatDateTimeString } from "@/filters/datetime";
import { useRegistrationConfig } from "@/composition/apollo/config";
const { registrationsModeration } = useRegistrationConfig();
const USERS_PER_PAGE = 10;
const emailFilter = useRouteQuery("emailFilter", "");
const ipFilter = useRouteQuery("ipFilter", "");
const pendingFilter = useRouteQuery("pendingFilter", "true");
const page = useRouteQuery("page", 1, integerTransformer);
const languagesCodes = computed((): string[] => {
return (users.value?.elements ?? []).map((user: IUser) => user.locale);
});
const pendingFilterBuilder = computed(() => {
if (registrationsModeration.value) {
return pendingFilter.value == "true";
} else {
return false;
}
});
const {
result: usersResult,
fetchMore,
@@ -130,6 +147,7 @@ const {
} = useQuery<{ users: Paginate<IUser> }>(LIST_USERS, () => ({
email: emailFilter.value,
currentSignInIp: ipFilter.value,
pendingUser: pendingFilterBuilder.value,
page: page.value,
limit: USERS_PER_PAGE,
}));
@@ -156,6 +174,7 @@ useHead({
const emailFilterFieldValue = ref(emailFilter.value);
const ipFilterFieldValue = ref(ipFilter.value);
const pendingFieldValue = ref(pendingFilter.value == "true");
const getLanguageNameForCode = (code: string): string => {
return (
@@ -171,20 +190,31 @@ const onPageChange = async (newPage: number): Promise<void> => {
variables: {
email: emailFilter.value,
currentSignInIp: ipFilter.value,
pendingUser: pendingFilterBuilder.value,
page: page.value,
limit: USERS_PER_PAGE,
},
});
};
const activateFilters = (): void => {
const filterUsers = async (): void => {
emailFilter.value = emailFilterFieldValue.value;
ipFilter.value = ipFilterFieldValue.value;
if (registrationsModeration.value) {
if (pendingFieldValue.value) {
pendingFilter.value = "true";
} else {
pendingFilter.value = "false";
}
} else {
pendingFilter.value = "";
}
};
const resetFilters = (): void => {
emailFilterFieldValue.value = "";
ipFilterFieldValue.value = "";
pendingFieldValue.value = true;
activateFilters();
};
</script>