@@ -17,11 +17,12 @@ import {
1717 IconButton ,
1818 MenuItem ,
1919 OverflowText ,
20- Spinner
20+ Spinner ,
2121} from "./../../index" ;
2222
2323export interface MultiSuggestFieldSelectionProps < T > {
2424 newlySelected ?: T ;
25+ newlyRemoved ?: T ;
2526 selectedItems : T [ ] ;
2627 createdItems : Partial < T > [ ] ;
2728}
@@ -178,6 +179,8 @@ export function MultiSuggestField<T>({
178179 intent,
179180 ...otherMultiSelectProps
180181} : MultiSuggestFieldProps < T > ) {
182+ type SelectionChange = { type : "selected" ; item : T } | { type : "removed" ; item : T } | { type : "none" } ;
183+
181184 // Options created by a user
182185 const createdItems = useRef < T [ ] > ( [ ] ) ;
183186 // Options passed ouside (f.e. from the backend)
@@ -199,6 +202,7 @@ export function MultiSuggestField<T>({
199202 query ?: string ;
200203 timeoutId ?: number ;
201204 } > ( { } ) ;
205+ const selectionChange = useRef < SelectionChange > ( { type : "none" } ) ;
202206
203207 /** Update external items when they change
204208 * e.g for auto-complete when query change
@@ -209,11 +213,21 @@ export function MultiSuggestField<T>({
209213 } , [ items . map ( ( item ) => itemId ( item ) ) . join ( "|" ) ] ) ;
210214
211215 React . useEffect ( ( ) => {
212- onSelection ?.( {
213- newlySelected : selectedItems . slice ( - 1 ) [ 0 ] ,
216+ const selectionParams : MultiSuggestFieldSelectionProps < T > = {
214217 createdItems : createdItems . current ,
215218 selectedItems,
216- } ) ;
219+ } ;
220+
221+ if ( selectionChange . current . type === "selected" ) {
222+ selectionParams . newlySelected = selectionChange . current . item ;
223+ }
224+
225+ if ( selectionChange . current . type === "removed" ) {
226+ selectionParams . newlyRemoved = selectionChange . current . item ;
227+ }
228+
229+ onSelection ?.( selectionParams ) ;
230+ selectionChange . current = { type : "none" } ;
217231 } , [
218232 onSelection ,
219233 selectedItems . map ( ( item ) => itemId ( item ) ) . join ( "|" ) ,
@@ -228,6 +242,7 @@ export function MultiSuggestField<T>({
228242 return ;
229243 }
230244
245+ selectionChange . current = { type : "none" } ;
231246 setSelectedItems ( externalSelectedItems ) ;
232247 } , [ externalSelectedItems ?. map ( ( item ) => itemId ( item ) ) . join ( "|" ) ] ) ;
233248
@@ -268,13 +283,18 @@ export function MultiSuggestField<T>({
268283 * @param matcher
269284 */
270285 const removeItemSelection = ( matcher : string ) => {
271- const filteredItems = selectedItems . filter ( ( item ) => itemId ( item ) !== matcher ) ;
272- setSelectedItems ( filteredItems ) ;
286+ setSelectedItems ( ( items ) => {
287+ const removedItem = items . find ( ( item ) => itemId ( item ) === matcher ) ;
288+
289+ selectionChange . current = removedItem ? { type : "removed" , item : removedItem } : { type : "none" } ;
290+
291+ return items . filter ( ( item ) => itemId ( item ) !== matcher ) ;
292+ } ) ;
273293 } ;
274294
275295 const defaultFilterPredicate = ( item : T , query : string ) => {
276- const searchWords = highlighterUtils . extractSearchWords ( query , true )
277- return highlighterUtils . matchesAllWords ( itemLabel ( item ) . toLowerCase ( ) , searchWords )
296+ const searchWords = highlighterUtils . extractSearchWords ( query , true ) ;
297+ return highlighterUtils . matchesAllWords ( itemLabel ( item ) . toLowerCase ( ) , searchWords ) ;
278298 } ;
279299
280300 /**
@@ -286,6 +306,7 @@ export function MultiSuggestField<T>({
286306 if ( itemHasBeenSelectedAlready ( itemId ( item ) ) ) {
287307 removeItemSelection ( itemId ( item ) ) ;
288308 } else {
309+ selectionChange . current = { type : "selected" , item } ;
289310 setSelectedItems ( ( items ) => [ ...items , item ] ) ;
290311 }
291312
@@ -365,6 +386,7 @@ export function MultiSuggestField<T>({
365386 const handleClear = ( ) => {
366387 requestState . current . query = "" ;
367388
389+ selectionChange . current = { type : "none" } ;
368390 setSelectedItems ( [ ] ) ;
369391 setFilteredItems ( [ ...externalItems , ...createdItems . current ] ) ;
370392 } ;
@@ -375,7 +397,13 @@ export function MultiSuggestField<T>({
375397 * @param index
376398 */
377399 const removeTagFromSelectionViaIndex = ( _label : React . ReactNode , index : number ) => {
378- setSelectedItems ( [ ...selectedItems . slice ( 0 , index ) , ...selectedItems . slice ( index + 1 ) ] ) ;
400+ setSelectedItems ( ( items ) => {
401+ const removedItem = items [ index ] ;
402+
403+ selectionChange . current = removedItem ? { type : "removed" , item : removedItem } : { type : "none" } ;
404+
405+ return [ ...items . slice ( 0 , index ) , ...items . slice ( index + 1 ) ] ;
406+ } ) ;
379407 } ;
380408
381409 /**
0 commit comments