feat(view_users.tsx): support filtering by sso user id

This commit is contained in:
Krrish Dholakia 2025-04-22 15:37:05 -07:00
parent bacc2671e7
commit 76a82b0e04
3 changed files with 31 additions and 0 deletions

View file

@ -951,6 +951,9 @@ async def get_users(
user_ids: Optional[str] = fastapi.Query(
default=None, description="Get list of users by user_ids"
),
sso_user_ids: Optional[str] = fastapi.Query(
default=None, description="Get list of users by sso_user_id"
),
user_email: Optional[str] = fastapi.Query(
default=None, description="Filter users by partial email match"
),
@ -981,6 +984,8 @@ async def get_users(
- internal_user_viewer
user_ids: Optional[str]
Get list of users by user_ids. Comma separated list of user_ids.
sso_ids: Optional[str]
Get list of users by sso_ids. Comma separated list of sso_ids.
user_email: Optional[str]
Filter users by partial email match
team: Optional[str]
@ -1028,6 +1033,12 @@ async def get_users(
"has": team # Array contains for string arrays in Prisma
}
if sso_user_ids is not None and isinstance(sso_user_ids, str):
sso_id_list = [sid.strip() for sid in sso_user_ids.split(",") if sid.strip()]
where_conditions["sso_user_id"] = {
"in": sso_id_list,
}
## Filter any none fastapi.Query params - e.g. where_conditions: {'user_email': {'contains': Query(None), 'mode': 'insensitive'}, 'teams': {'has': Query(None)}}
where_conditions = {k: v for k, v in where_conditions.items() if v is not None}

View file

@ -679,6 +679,7 @@ export const userListCall = async (
userEmail: string | null = null,
userRole: string | null = null,
team: string | null = null,
sso_user_id: string | null = null,
sortBy: string | null = null,
sortOrder: 'asc' | 'desc' | null = null,
) => {
@ -716,6 +717,10 @@ export const userListCall = async (
queryParams.append('team', team);
}
if (sso_user_id) {
queryParams.append('sso_user_ids', sso_user_id);
}
if (sortBy) {
queryParams.append('sort_by', sortBy);
}

View file

@ -84,6 +84,7 @@ interface FilterState {
email: string;
user_id: string;
user_role: string;
sso_user_id: string;
team: string;
model: string;
min_spend: number | null;
@ -126,6 +127,7 @@ const ViewUserDashboard: React.FC<ViewUserDashboardProps> = ({
email: "",
user_id: "",
user_role: "",
sso_user_id: "",
team: "",
model: "",
min_spend: null,
@ -189,6 +191,7 @@ const ViewUserDashboard: React.FC<ViewUserDashboardProps> = ({
filters.email || null,
filters.user_role || null,
filters.team || null,
filters.sso_user_id || null,
filters.sort_by,
filters.sort_order
);
@ -493,6 +496,7 @@ const ViewUserDashboard: React.FC<ViewUserDashboardProps> = ({
user_id: "",
user_role: "",
team: "",
sso_user_id: "",
model: "",
min_spend: null,
max_spend: null,
@ -574,6 +578,17 @@ const ViewUserDashboard: React.FC<ViewUserDashboardProps> = ({
))}
</Select>
</div>
{/* SSO ID Search */}
<div className="relative w-64">
<input
type="text"
placeholder="Filter by SSO ID"
className="w-full px-3 py-2 pl-8 border rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
value={filters.sso_user_id}
onChange={(e) => handleFilterChange('sso_user_id', e.target.value)}
/>
</div>
</div>
)}