Skip to content

Commit 6172842

Browse files
authored
Implement fuzzy search for attribute selection in popover component (#501)
1 parent f202e8c commit 6172842

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/features/attributeSelect.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { render as renderToast } from "roamjs-components/components/Toast";
3434
import setInputSetting from "roamjs-components/util/setInputSetting";
3535
import setInputSettings from "roamjs-components/util/setInputSettings";
3636
import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree";
37+
import fuzzy from "fuzzy";
3738

3839
const 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

Comments
 (0)