diff --git a/backend/danswer/server/manage/users.py b/backend/danswer/server/manage/users.py index 23ae68efa..c63546991 100644 --- a/backend/danswer/server/manage/users.py +++ b/backend/danswer/server/manage/users.py @@ -85,12 +85,15 @@ async def demote_admin( @router.get("/manage/users") def list_all_users( - q: str, - accepted_page: int, - invited_page: int, + q: str | None = None, + accepted_page: int | None = None, + invited_page: int | None = None, _: User | None = Depends(current_admin_user), db_session: Session = Depends(get_session), ) -> AllUsersResponse: + if not q: + q = "" + users = [ user for user in list_users(db_session, q=q) @@ -106,6 +109,26 @@ def list_all_users( accepted_count = len(accepted_emails) invited_count = len(invited_emails) + # If any of q, accepted_page, or invited_page is None, return all users + if accepted_page is None or invited_page is None: + return AllUsersResponse( + accepted=[ + FullUserSnapshot( + id=user.id, + email=user.email, + role=user.role, + status=UserStatus.LIVE + if user.is_active + else UserStatus.DEACTIVATED, + ) + for user in users + ], + invited=[InvitedUserSnapshot(email=email) for email in invited_emails], + accepted_pages=1, + invited_pages=1, + ) + + # Otherwise, return paginated results return AllUsersResponse( accepted=[ FullUserSnapshot( diff --git a/web/src/app/admin/users/page.tsx b/web/src/app/admin/users/page.tsx index db0c6c03f..a61f176e2 100644 --- a/web/src/app/admin/users/page.tsx +++ b/web/src/app/admin/users/page.tsx @@ -17,6 +17,7 @@ import useSWR, { mutate } from "swr"; import { ErrorCallout } from "@/components/ErrorCallout"; import { HidableSection } from "@/app/admin/assistants/HidableSection"; import BulkAdd from "@/components/admin/users/BulkAdd"; +import { UsersResponse } from "@/lib/users/interfaces"; const ValidDomainsDisplay = ({ validDomains }: { validDomains: string[] }) => { if (!validDomains.length) { @@ -51,13 +52,6 @@ const ValidDomainsDisplay = ({ validDomains }: { validDomains: string[] }) => { ); }; -interface UsersResponse { - accepted: User[]; - invited: User[]; - accepted_pages: number; - invited_pages: number; -} - const UsersTables = ({ q, setPopup, diff --git a/web/src/app/ee/admin/groups/[groupId]/page.tsx b/web/src/app/ee/admin/groups/[groupId]/page.tsx index 1259ef363..5c45bc524 100644 --- a/web/src/app/ee/admin/groups/[groupId]/page.tsx +++ b/web/src/app/ee/admin/groups/[groupId]/page.tsx @@ -61,7 +61,7 @@ const Page = ({ params }: { params: { groupId: string } }) => { {userGroup ? ( { setShowForm(false); }} setPopup={setPopup} - users={users} + users={users.accepted} ccPairs={ccPairs} /> )} diff --git a/web/src/lib/hooks.ts b/web/src/lib/hooks.ts index 18a859f88..54756dfa0 100644 --- a/web/src/lib/hooks.ts +++ b/web/src/lib/hooks.ts @@ -14,6 +14,7 @@ import { SourceMetadata } from "./search/interfaces"; import { EE_ENABLED } from "./constants"; import { destructureValue } from "./llm/utils"; import { ChatSession } from "@/app/chat/interfaces"; +import { UsersResponse } from "./users/interfaces"; const CREDENTIAL_URL = "/api/manage/admin/credential"; @@ -119,7 +120,8 @@ export function useFilters(): FilterManager { export const useUsers = () => { const url = "/api/manage/users"; - const swrResponse = useSWR(url, errorHandlingFetcher); + + const swrResponse = useSWR(url, errorHandlingFetcher); return { ...swrResponse, diff --git a/web/src/lib/users/interfaces.ts b/web/src/lib/users/interfaces.ts new file mode 100644 index 000000000..1bcd00ae2 --- /dev/null +++ b/web/src/lib/users/interfaces.ts @@ -0,0 +1,8 @@ +import { User } from "../types"; + +export interface UsersResponse { + accepted: User[]; + invited: User[]; + accepted_pages: number; + invited_pages: number; +}