Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "roamjs-components",
"description": "Expansive toolset, utilities, & components for developing RoamJS extensions.",
"version": "0.85.4",
"version": "0.85.5",
"main": "index.js",
"types": "index.d.ts",
"scripts": {
Expand Down
10 changes: 10 additions & 0 deletions src/components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ const components = [
const [numResults, setNumResults] = useState(100);
const [disabled, setDisabled] = useState(false);
const [maxItemsDisplayed, setMaxItemsDisplayed] = useState(0);
const [autoSelectFirstOption, setAutoSelectFirstOption] =
useState(true);
const options = useMemo(() => {
const items = [];
for (let i = 0; i < numResults; i++) {
Expand Down Expand Up @@ -102,9 +104,17 @@ const components = [
}
label={"Disabled"}
/>
<Checkbox
checked={autoSelectFirstOption}
onChange={(e) =>
setAutoSelectFirstOption((e.target as HTMLInputElement).checked)
}
label={"Auto Select First Option"}
/>
<Label>
Autocomplete
<AutocompleteInput
autoSelectFirstOption={autoSelectFirstOption}
disabled={disabled}
value={value}
setValue={setValue}
Expand Down
24 changes: 21 additions & 3 deletions src/components/AutocompleteInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export type AutocompleteInputProps<T = string> = {
onNewItem?: OnNewItem<T>;
disabled?: boolean;
maxItemsDisplayed?: number;
autoSelectFirstOption?: boolean;
};

// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
Expand All @@ -62,6 +63,7 @@ const AutocompleteInput = <T extends unknown = string>({
onNewItem: _onNewItem,
disabled,
maxItemsDisplayed = Infinity,
autoSelectFirstOption = true,
}: AutocompleteInputProps<T>): React.ReactElement => {
const [isOpen, setIsOpen] = useState(false);
const itemToQuery = useMemo<ItemToQuery<T>>(
Expand Down Expand Up @@ -121,9 +123,25 @@ const AutocompleteInput = <T extends unknown = string>({
else open();
}, [items, close, open, isTyping]);
useEffect(() => {
if (query && isOpen) setValue(items[activeIndex] || onNewItem(query));
else if (query) setValue(onNewItem(query));
}, [setValue, activeIndex, items, onNewItem, query]);
if (!query) return;
if (!isOpen) {
setValue(onNewItem(query));
return;
}
if (autoSelectFirstOption) {
setValue(items[activeIndex] || onNewItem(query));
return;
}
setValue(onNewItem(query));
}, [
setValue,
activeIndex,
items,
onNewItem,
query,
isOpen,
autoSelectFirstOption,
]);
useEffect(() => {
if (
inputRef.current &&
Expand Down