@@ -34,6 +34,7 @@ import { render as renderToast } from "roamjs-components/components/Toast";
3434import setInputSetting from "roamjs-components/util/setInputSetting" ;
3535import setInputSettings from "roamjs-components/util/setInputSettings" ;
3636import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree" ;
37+ import fuzzy from "fuzzy" ;
3738
3839const CONFIG = `roam/js/attribute-select` ;
3940
@@ -122,9 +123,6 @@ const AttributeButtonPopover = <T extends ReactText>({
122123 filterable = false ,
123124 isOpen,
124125} : AttributeButtonPopoverProps < T > ) => {
125- const itemPredicate = ( query : string , item : T ) => {
126- return String ( item ) . toLowerCase ( ) . includes ( query . toLowerCase ( ) ) ;
127- } ;
128126 const [ sliderValue , setSliderValue ] = useState ( 0 ) ;
129127
130128 useEffect ( ( ) => {
@@ -182,7 +180,17 @@ const AttributeButtonPopover = <T extends ReactText>({
182180 return (
183181 < MenuItemSelect
184182 className = "inline-menu-item-select"
185- itemPredicate = { itemPredicate }
183+ itemListPredicate = { ( query : string , items : T [ ] ) => {
184+ if ( ! query ) return items ;
185+ const stringItems = items . map ( String ) ;
186+ const results = fuzzy
187+ . filter ( query , stringItems )
188+ . map ( ( f ) => items [ stringItems . indexOf ( f . original ) ] ) ;
189+ if ( results . length > 50 ) {
190+ return results . slice ( 0 , 50 ) . concat ( "Only first 50 shown ..." as T ) ;
191+ }
192+ return results ;
193+ } }
186194 items = { items }
187195 activeItem = { currentValue as T }
188196 filterable = { shouldFilter }
0 commit comments