[MM-63597] Fix From: autocompletion (#30673)
Этот коммит содержится в:
@@ -57,3 +57,33 @@ test('Search box suggestion must be case insensitive', async ({pw}) => {
|
|||||||
// * The search box should contain the selected suggestion
|
// * The search box should contain the selected suggestion
|
||||||
await expect(channelsPage.globalHeader.searchBox.getByText(searchOutput, {exact: true})).toBeVisible();
|
await expect(channelsPage.globalHeader.searchBox.getByText(searchOutput, {exact: true})).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('remove extra whitespace when selecting a user', async ({pw}) => {
|
||||||
|
// # Set up test with two users
|
||||||
|
const {user, adminUser: admin} = await pw.initSetup();
|
||||||
|
|
||||||
|
// # Log in as the test user
|
||||||
|
const {channelsPage} = await pw.testBrowser.login(user);
|
||||||
|
|
||||||
|
// # Visit a default channel page
|
||||||
|
await channelsPage.goto();
|
||||||
|
await channelsPage.toBeVisible();
|
||||||
|
|
||||||
|
// # Open the search UI
|
||||||
|
await channelsPage.globalHeader.openSearch();
|
||||||
|
|
||||||
|
// # Type "from:" followed by multiple spaces
|
||||||
|
const {searchInput} = channelsPage.searchPopover;
|
||||||
|
await searchInput.pressSequentially(`from: ${admin.username}`);
|
||||||
|
|
||||||
|
// * The suggestion should be visible
|
||||||
|
await expect(channelsPage.searchPopover.selectedSuggestion).toBeVisible();
|
||||||
|
await expect(channelsPage.searchPopover.selectedSuggestion).toHaveText(`@` + admin.username);
|
||||||
|
|
||||||
|
// # Press enter to validate the selection
|
||||||
|
await searchInput.press('Enter');
|
||||||
|
|
||||||
|
// * Verify the search box shows "from:username" without extra spaces
|
||||||
|
const expectedText = `from:${admin.username} `;
|
||||||
|
await expect(searchInput).toHaveValue(expectedText);
|
||||||
|
});
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ const SearchBox = forwardRef(
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSearchTerms(
|
setSearchTerms(
|
||||||
searchTerms.slice(0, caretPosition).replace(new RegExp(escapedMatchedPretext + '$', 'i'), '') +
|
searchTerms.slice(0, caretPosition).replace(new RegExp(escapedMatchedPretext + '$', 'i'), '').trimEnd() +
|
||||||
val +
|
val +
|
||||||
extraSpace +
|
extraSpace +
|
||||||
searchTerms.slice(caretPosition),
|
searchTerms.slice(caretPosition),
|
||||||
@@ -228,7 +228,8 @@ const SearchBox = forwardRef(
|
|||||||
const changeSearchTeam = (selectedTeam: string) => {
|
const changeSearchTeam = (selectedTeam: string) => {
|
||||||
const newTerms = searchTerms.
|
const newTerms = searchTerms.
|
||||||
replace(/\bin:[^\s]*/gi, '').replace(/\s{2,}/g, ' ').
|
replace(/\bin:[^\s]*/gi, '').replace(/\s{2,}/g, ' ').
|
||||||
replace(/\bfrom:[^\s]*/gi, '').replace(/\s{2,}/g, ' ');
|
replace(/\bfrom:[^\s]*/gi, '').replace(/\s{2,}/g, ' ').
|
||||||
|
trim();
|
||||||
|
|
||||||
if (newTerms !== searchTerms) {
|
if (newTerms !== searchTerms) {
|
||||||
clearTimeout(filterResetTimeout.current);
|
clearTimeout(filterResetTimeout.current);
|
||||||
|
|||||||
@@ -71,6 +71,11 @@ export default class SearchUserProvider extends Provider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<UserProfile>, teamId: string) {
|
handlePretextChanged(pretext: string, resultsCallback: ResultsCallback<UserProfile>, teamId: string) {
|
||||||
|
// no autocomplete on All teams
|
||||||
|
if (teamId === '') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const captured = (/\bfrom:\s*(\S*)$/i).exec(pretext.toLowerCase());
|
const captured = (/\bfrom:\s*(\S*)$/i).exec(pretext.toLowerCase());
|
||||||
|
|
||||||
this.doAutocomplete(captured, teamId, resultsCallback);
|
this.doAutocomplete(captured, teamId, resultsCallback);
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user