@@ -33,6 +33,8 @@ import {
3333 TermsRowProps ,
3434} from './RelatedTerms.interface' ;
3535
36+ const NO_RESULTS_KEY = '__no_results__' ;
37+
3638const 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