Skip to content

Commit 17738ec

Browse files
authored
Add warning message on search of terms (#27759)
* Add warning message on search of terms * nit
1 parent fb0d5ec commit 17738ec

1 file changed

Lines changed: 32 additions & 13 deletions

File tree

openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/TermsRowEditor.component.tsx

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import {
3333
TermsRowProps,
3434
} from './RelatedTerms.interface';
3535

36+
const NO_RESULTS_KEY = '__no_results__';
37+
3638
const TermsRow: React.FC<TermsRowProps> = ({
3739
rowId,
3840
initialRelationType,
@@ -50,9 +52,11 @@ const TermsRow: React.FC<TermsRowProps> = ({
5052
initialTerms.map((term) => ({ id: term.value, label: term.label }))
5153
);
5254
const [searchedTerms, setSearchedTerms] = useState<GlossaryTerm[]>([]);
55+
const [searchQuery, setSearchQuery] = useState('');
5356
const searchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
5457

55-
const activeTerms = searchedTerms.length > 0 ? searchedTerms : preloadedTerms;
58+
const isSearchActive = searchQuery.trim().length > 0;
59+
const activeTerms = isSearchActive ? searchedTerms : preloadedTerms;
5660

5761
const termEntityMap = useMemo(() => {
5862
const map: Record<string, EntityReference> = {};
@@ -73,16 +77,20 @@ const TermsRow: React.FC<TermsRowProps> = ({
7377
return map;
7478
}, [preloadedTerms, searchedTerms, initialTerms]);
7579

76-
const dropdownItems = useMemo<TermSelectItem[]>(
77-
() =>
78-
activeTerms
79-
.filter((term) => term.fullyQualifiedName !== excludeFQN)
80-
.map((term) => ({
81-
id: term.fullyQualifiedName ?? '',
82-
label: getEntityName(term),
83-
})),
84-
[activeTerms, excludeFQN]
85-
);
80+
const dropdownItems = useMemo<TermSelectItem[]>(() => {
81+
const items = activeTerms
82+
.filter((term) => term.fullyQualifiedName !== excludeFQN)
83+
.map((term) => ({
84+
id: term.fullyQualifiedName ?? '',
85+
label: getEntityName(term),
86+
}));
87+
88+
if (isSearchActive && items.length === 0) {
89+
return [{ id: NO_RESULTS_KEY, label: t('message.no-match-found') }];
90+
}
91+
92+
return items;
93+
}, [activeTerms, excludeFQN, isSearchActive, t]);
8694

8795
const toTermItems = useCallback(
8896
(items: TermSelectItem[]): TermItem[] =>
@@ -103,6 +111,7 @@ const TermsRow: React.FC<TermsRowProps> = ({
103111
);
104112

105113
const handleSearchChange = useCallback((value: string) => {
114+
setSearchQuery(value);
106115
if (searchTimerRef.current) {
107116
clearTimeout(searchTimerRef.current);
108117
}
@@ -120,13 +129,16 @@ const TermsRow: React.FC<TermsRowProps> = ({
120129
});
121130
setSearchedTerms(result.data);
122131
} catch {
123-
// search failures fall back to preloaded terms
132+
// silently handle
124133
}
125134
}, 300);
126135
}, []);
127136

128137
const handleItemInserted = useCallback(
129138
(key: Key) => {
139+
if (key === NO_RESULTS_KEY) {
140+
return;
141+
}
130142
const term = [...preloadedTerms, ...searchedTerms].find(
131143
(t) => t.fullyQualifiedName === key
132144
);
@@ -137,6 +149,8 @@ const TermsRow: React.FC<TermsRowProps> = ({
137149
];
138150
setSelectedTerms(updated);
139151
onTermsChange(rowId, toTermItems(updated));
152+
setSearchQuery('');
153+
setSearchedTerms([]);
140154
}
141155
},
142156
[
@@ -188,7 +202,12 @@ const TermsRow: React.FC<TermsRowProps> = ({
188202
onItemInserted={handleItemInserted}
189203
onSearchChange={handleSearchChange}>
190204
{(item) => (
191-
<Autocomplete.Item id={item.id} key={item.id} label={item.label} />
205+
<Autocomplete.Item
206+
id={item.id}
207+
isDisabled={item.id === NO_RESULTS_KEY}
208+
key={item.id}
209+
label={item.label}
210+
/>
192211
)}
193212
</Autocomplete>
194213
</div>

0 commit comments

Comments
 (0)