diff --git a/app/scenes/Settings/Members.tsx b/app/scenes/Settings/Members.tsx index d4262b56b..723703cc3 100644 --- a/app/scenes/Settings/Members.tsx +++ b/app/scenes/Settings/Members.tsx @@ -82,6 +82,8 @@ function Members() { filtered = users.orderedData.filter((u) => userIds.includes(u.id)); } else if (filter === "admins") { filtered = users.admins.filter((u) => userIds.includes(u.id)); + } else if (filter === "members") { + filtered = users.members.filter((u) => userIds.includes(u.id)); } else if (filter === "suspended") { filtered = users.suspended.filter((u) => userIds.includes(u.id)); } else if (filter === "invited") { @@ -96,6 +98,7 @@ function Members() { filter, users.active, users.admins, + users.members, users.orderedData, users.suspended, users.invited, diff --git a/app/scenes/Settings/components/UserStatusFilter.tsx b/app/scenes/Settings/components/UserStatusFilter.tsx index f4dfce773..6aa89f5af 100644 --- a/app/scenes/Settings/components/UserStatusFilter.tsx +++ b/app/scenes/Settings/components/UserStatusFilter.tsx @@ -25,6 +25,10 @@ const UserStatusFilter = ({ activeKey, onSelect, ...rest }: Props) => { key: "all", label: t("Everyone"), }, + { + key: "members", + label: t("Members"), + }, { key: "admins", label: t("Admins"), diff --git a/app/stores/UsersStore.ts b/app/stores/UsersStore.ts index a7248b557..7289c54a6 100644 --- a/app/stores/UsersStore.ts +++ b/app/stores/UsersStore.ts @@ -56,6 +56,13 @@ export default class UsersStore extends BaseStore { return this.orderedData.filter((user) => user.isAdmin); } + @computed + get members(): User[] { + return this.orderedData.filter( + (user) => !user.isViewer && !user.isAdmin && !user.isInvited + ); + } + @computed get viewers(): User[] { return this.orderedData.filter((user) => user.isViewer); diff --git a/server/routes/api/users.ts b/server/routes/api/users.ts index ec001af8d..d5fd4e989 100644 --- a/server/routes/api/users.ts +++ b/server/routes/api/users.ts @@ -50,7 +50,7 @@ router.post("users.list", auth(), pagination(), async (ctx) => { if (filter) { assertIn( filter, - ["invited", "viewers", "admins", "active", "all", "suspended"], + ["invited", "viewers", "admins", "members", "active", "all", "suspended"], "Invalid filter" ); } @@ -86,6 +86,11 @@ router.post("users.list", auth(), pagination(), async (ctx) => { break; } + case "members": { + where = { ...where, isAdmin: false, isViewer: false }; + break; + } + case "suspended": { if (actor.isAdmin) { where = {