Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions src/apps/admin/src/lib/services/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,23 @@ export const getMemberSuggestionsByHandle = async (
maxRating?: unknown
}

const response = await xhrGetAsync<MemberAutocompleteResponse[]>(
`${EnvironmentConfig.API.V6}/members/autocomplete/${sanitizedHandle}`,
type MemberAutocompletePagedResponse = {
result?: MemberAutocompleteResponse[]
}

// Prefer the query-param autocomplete endpoint: any authenticated member can
// call it. The path-param variant historically required copilot/admin only.
const response = await xhrGetAsync<
MemberAutocompleteResponse[] | MemberAutocompletePagedResponse
>(
`${EnvironmentConfig.API.V6}/members/autocomplete?term=${sanitizedHandle}`,
)

return response.map(member => ({
const members = Array.isArray(response)
? response
: (response?.result ?? [])

return members.map(member => ({
firstName: member.firstName ?? undefined,
handle: member.handle,
lastName: member.lastName ?? undefined,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
import { Dispatch, FC, SetStateAction, useCallback, useMemo, useState } from 'react'
import {
Dispatch,
FC,
MouseEvent,
SetStateAction,
useCallback,
useMemo,
useState,
} from 'react'

import { InputHandlesSelector } from '~/apps/admin/src/lib/components/InputHandlesSelector'
import { SearchUserInfo } from '~/apps/admin/src/lib/models'
Expand Down Expand Up @@ -40,6 +48,14 @@ const buildDownloadName = (extension: 'json' | 'csv'): string => (
`bulk-member-lookup.${extension}`
)

/**
* Stops table-row click handling so profile links can navigate.
* Table rows call preventDefault on click by default.
*/
function handleProfileLinkClick(event: MouseEvent<HTMLAnchorElement>): void {
event.stopPropagation()
}

/**
* Parses the blob response from the reports API into lookup rows.
* @param blob JSON blob returned from `/identity/users-by-handles`.
Expand Down Expand Up @@ -178,9 +194,10 @@ export const BulkMemberLookupPage: FC = () => {
data.handle ? (
<a
className={styles.handleLink}
href={`${EnvironmentConfig.USER_PROFILE_URL}/${encodeURIComponent(data.handle)}`}
href={`${EnvironmentConfig.USER_PROFILE_URL}/${encodeURIComponent(data.handle.toLowerCase())}`}
target='_blank'
rel='noreferrer'
onClick={handleProfileLinkClick}
>
{data.handle}
</a>
Expand Down Expand Up @@ -348,7 +365,11 @@ export const BulkMemberLookupPage: FC = () => {

<div className={styles.tableWrapper}>
{results.length ? (
<Table columns={tableColumns} data={results} />
<Table
columns={tableColumns}
data={results}
preventDefault
/>
) : (
<div className={styles.emptyState}>
No members were returned for the provided handles.
Expand Down
Loading