Skip to content

Commit e374b26

Browse files
Merge pull request #1175 from Real-Dev-Squad/develop
[Sync] Dev to main
2 parents af0f671 + 4637cc9 commit e374b26

File tree

4 files changed

+69
-65
lines changed

4 files changed

+69
-65
lines changed

__tests__/Utils/generateSuggestions.test.ts

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,10 @@ describe('generateSuggestions', () => {
1010
expect(result).toEqual([{ title: 'test' }]);
1111
});
1212

13-
it('should handle user input with a colon separator', () => {
14-
const userInput = 'assignee:John';
15-
const chosenOptions = [{ title: 'test' }];
16-
const result = generateSuggestions(userInput, chosenOptions);
17-
expect(result).toEqual([{ assignee: 'john' }]);
18-
});
19-
2013
it('should handle user input without a colon separator', () => {
2114
const userInput = 'test';
2215
const result = generateSuggestions(userInput);
23-
expect(result).toEqual([{ title: 'test' }, { assignee: 'test' }]);
16+
expect(result).toEqual([{ title: 'test' }]);
2417
});
2518

2619
it('should handle empty user input', () => {
@@ -41,35 +34,18 @@ describe('generateSuggestions', () => {
4134
expect(result).toEqual([{ title: 'test' }]);
4235
});
4336

44-
it('should suggest assignee even if it already selected ', () => {
45-
const userInput = 'joy';
46-
const chosenOptions = [{ assignee: 'amit' }];
47-
const typedKey = 'assignee';
48-
const result = generateSuggestions(userInput, chosenOptions, typedKey);
49-
expect(result).toEqual([{ assignee: 'joy' }]);
50-
});
5137
it('should not generate suggestion for title or status if already selected', () => {
5238
const userInput = 'joy';
5339
const chosenOptions = [{ title: 'amit' }];
5440
const typedKey = '';
5541
const result = generateSuggestions(userInput, chosenOptions, typedKey);
56-
expect(result).toEqual([{ assignee: 'joy' }]);
57-
});
58-
it('should not generate duplicate assignee suggestion', () => {
59-
const userInput = 'joy';
60-
const chosenOptions = [{ assignee: 'joy' }];
61-
const typedKey = 'assignee';
62-
const result = generateSuggestions(userInput, chosenOptions, typedKey);
6342
expect(result).toEqual([]);
6443
});
6544
it('should handle case sensitivity for status suggestion', () => {
6645
const userInput = 'Joy-gupta';
6746
const chosenOptions = [{ status: 'amit' }];
6847
const typedKey = '';
6948
const result = generateSuggestions(userInput, chosenOptions, typedKey);
70-
expect(result).toEqual([
71-
{ title: 'Joy-gupta' },
72-
{ assignee: 'joy-gupta' },
73-
]);
49+
expect(result).toEqual([{ title: 'Joy-gupta' }]);
7450
});
7551
});

src/components/tasks/TaskSearchDev/TaskSearchDev.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ const TaskSearchDev = ({
114114
);
115115
setSelectedFilters(newOptions);
116116
setOnEditSelectedFilterIndex(false);
117+
onClickSearchButton(
118+
convertSearchOptionsToQuery(newOptions)
119+
);
117120
setOnRemoveSelectedFilterIndex(-1);
118121
}
119122
}
@@ -181,6 +184,7 @@ const TaskSearchDev = ({
181184
setSelectedFilters(updatedOptions);
182185
setOnEditSelectedFilterValue('');
183186
toggleInputFocus();
187+
onClickSearchButton(convertSearchOptionsToQuery(updatedOptions));
184188
};
185189

186190
const onSuggestionSelected = (

src/components/tasks/TaskSearchDev/useFilterSuggestion.tsx

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,23 @@ export const useFilterSuggestion = ({
2222
activeFilterSuggestionDropdownIndex,
2323
setActiveFilterSuggestionDropdownIndex,
2424
}: Props) => {
25-
const { data: searchedUsers } = useGetUsersByUsernameQuery(
25+
const { key: typedKey, value: typedValue } = getUserInput();
26+
const { data: userSearchResponse } = useGetUsersByUsernameQuery(
2627
{
27-
searchString: defferedUserInput,
28+
searchString: typedValue,
2829
},
2930
{
30-
skip: defferedUserInput.length < 3,
31+
// skip if typed key is not ['', 'assignee'] or if typed value is less than 3
32+
skip: typedValue.length < 3 || !['', 'assignee'].includes(typedKey),
3133
}
3234
);
33-
const assigneeSuggestions =
34-
searchedUsers?.users?.map((user) => ({
35-
assignee: user.username || user.github_display_name,
36-
})) || [];
35+
3736
const filterSuggestions = [
38-
...assigneeSuggestions,
39-
...getFilterSuggestions(),
37+
...getLocalSuggestions(),
38+
...getAssigneeSuggestions(),
4039
];
4140

42-
function getFilterSuggestions() {
41+
function getUserInput() {
4342
let userInput;
4443
if (
4544
onEditSelectedFilterIndex === false &&
@@ -52,7 +51,10 @@ export const useFilterSuggestion = ({
5251
) {
5352
userInput = defferedPillValue;
5453
} else {
55-
return [];
54+
return {
55+
key: '',
56+
value: '',
57+
};
5658
}
5759

5860
userInput = userInput.trimStart();
@@ -64,12 +66,48 @@ export const useFilterSuggestion = ({
6466
key = potentialKey.trim();
6567
userInput = values.join(':').trimStart();
6668
}
69+
70+
return {
71+
key,
72+
value: userInput,
73+
};
6774
}
68-
if (userInput.length > 2) {
75+
76+
return {
77+
key: '',
78+
value: userInput,
79+
};
80+
}
81+
82+
function getAssigneeSuggestions() {
83+
const serializedUserSuggestion =
84+
userSearchResponse?.users?.map((user) => ({
85+
assignee: user.username || user.github_display_name,
86+
})) || [];
87+
88+
function removeSelectedUsersFromSuggestions(
89+
suggestions: { assignee: string }[]
90+
) {
91+
return suggestions.filter((suggestion) => {
92+
// Return false if the suggestion is in selectedFilters
93+
return !selectedFilters.some(
94+
(filter) => filter.assignee === suggestion.assignee
95+
);
96+
});
97+
}
98+
99+
const result = removeSelectedUsersFromSuggestions(
100+
serializedUserSuggestion
101+
);
102+
return result;
103+
}
104+
105+
function getLocalSuggestions() {
106+
if (typedValue.length > 2) {
69107
const result = generateSuggestions(
70-
userInput,
108+
typedValue,
71109
selectedFilters,
72-
key,
110+
typedKey,
73111
onEditSelectedFilterIndex
74112
);
75113

src/utils/generateSuggestions.ts

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,31 +40,17 @@ export default function generateSuggestions(
4040

4141
for (const field of SEARCH_OPTIONS) {
4242
const includeFieldInSuggestion = typedKey ? typedKey === field : true; // True, if typedKey matches field, if present, else True all the time
43-
const matchedOptions = updatedOptions.find((option) => {
44-
if (field === 'assignee') {
45-
return option['assignee'] === userInput; // If assignee is the key, check for its value, as assignee can be multiple
46-
} else {
47-
return option[field]; // Otherwise check if the field is present
48-
}
49-
});
50-
if (matchedOptions || !includeFieldInSuggestion) {
51-
continue;
52-
} else {
53-
if (field === 'title') {
54-
const value = {
55-
[field]: typedValue.trim(),
56-
};
57-
suggestions.push(value);
58-
} else if (field === 'assignee') {
59-
const value = {
60-
[field]: typedValue.trim(),
61-
};
62-
value[field] = value[field].replace(/ /g, '-').toLowerCase();
63-
suggestions.push(value);
64-
} else if (field === 'status') {
65-
const result = matchStatus(typedValue);
66-
if (result) suggestions = [...suggestions, ...result];
67-
}
43+
const matchedOptions = updatedOptions.find((option) => option[field]); // Otherwise check if the field is present
44+
if (matchedOptions || !includeFieldInSuggestion) continue;
45+
46+
if (field === 'title') {
47+
const value = {
48+
[field]: typedValue.trim(),
49+
};
50+
suggestions.push(value);
51+
} else if (field === 'status') {
52+
const result = matchStatus(typedValue);
53+
if (result) suggestions = [...suggestions, ...result];
6854
}
6955
}
7056
return suggestions;

0 commit comments

Comments
 (0)