[#311] preserve input on unfocus in peopleSearch (#346)

Co-authored-by: Camille Moussu <cmoussu@linagora.com>
This commit is contained in:
Camille Moussu
2025-11-19 16:09:09 +01:00
committed by GitHub
parent ca2e8a479a
commit 8e7b6e18eb
2 changed files with 38 additions and 1 deletions
+31
View File
@@ -216,4 +216,35 @@ describe("PeopleSearch", () => {
await searchPromise; await searchPromise;
}); });
}); });
it("retains input value when field loses focus (blur)", async () => {
let resolveSearch: (value: User[]) => void;
const searchPromise = new Promise<User[]>((resolve) => {
resolveSearch = resolve;
});
mockedSearchUsers.mockReturnValueOnce(searchPromise);
await act(async () => {
setup();
});
const input = screen.getByRole("combobox");
await act(async () => {
userEvent.type(input, "Test");
});
await waitFor(() => {
expect(mockedSearchUsers).toHaveBeenCalledWith("Test", ["user"]);
});
expect(input).toHaveValue("Test");
await act(async () => {
input.blur();
});
await waitFor(() => {
expect(input).toHaveValue("Test");
});
});
}); });
+7 -1
View File
@@ -42,6 +42,7 @@ export function PeopleSearch({
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [options, setOptions] = useState<User[]>([]); const [options, setOptions] = useState<User[]>([]);
const [hasSearched, setHasSearched] = useState(false); const [hasSearched, setHasSearched] = useState(false);
const [isOpen, setIsOpen] = useState(false);
const isValidEmail = (email: string) => const isValidEmail = (email: string) =>
/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
@@ -100,7 +101,11 @@ export function PeopleSearch({
multiple multiple
options={options} options={options}
autoComplete={false} autoComplete={false}
open={!!query && (loading || hasSearched)} clearOnBlur={false}
blurOnSelect={true}
open={isOpen && !!query && (loading || hasSearched)}
onOpen={() => setIsOpen(true)}
onClose={() => setIsOpen(false)}
disabled={disabled} disabled={disabled}
loading={loading} loading={loading}
filterOptions={(x) => x} filterOptions={(x) => x}
@@ -116,6 +121,7 @@ export function PeopleSearch({
}} }}
filterSelectedOptions filterSelectedOptions
value={selectedUsers} value={selectedUsers}
inputValue={query}
onInputChange={(event, value) => setQuery(value)} onInputChange={(event, value) => setQuery(value)}
onChange={(event, value) => { onChange={(event, value) => {
const last = value[value.length - 1]; const last = value[value.length - 1];