feat: add new tag hint to dropdown

This commit is contained in:
Antonella Sgarlatta
2021-05-25 16:19:02 -03:00
parent ee975df6d3
commit 42b1f4d62f

View File

@@ -6,6 +6,7 @@ import { Icon } from './Icon';
import { Disclosure, DisclosurePanel } from '@reach/disclosure'; import { Disclosure, DisclosurePanel } from '@reach/disclosure';
import { useCloseOnBlur } from './utils'; import { useCloseOnBlur } from './utils';
import { AppState } from '@/ui_models/app_state'; import { AppState } from '@/ui_models/app_state';
import { Tag } from './Tag';
type Props = { type Props = {
application: WebApplication; application: WebApplication;
@@ -32,9 +33,11 @@ export const AutocompleteTagInput: FunctionalComponent<Props> = ({
const inputRef = useRef<HTMLInputElement>(); const inputRef = useRef<HTMLInputElement>();
const dropdownRef = useRef<HTMLDivElement>(); const dropdownRef = useRef<HTMLDivElement>();
const [closeOnBlur] = useCloseOnBlur(dropdownRef, (visible: boolean) => const [closeOnBlur] = useCloseOnBlur(dropdownRef, (visible: boolean) => {
setDropdownVisible(visible) setDropdownVisible(visible);
); setSearchQuery('');
setTagResults(getActiveNoteTagResults(''));
});
const showDropdown = () => { const showDropdown = () => {
const { clientHeight } = document.documentElement; const { clientHeight } = document.documentElement;
@@ -44,19 +47,18 @@ export const AutocompleteTagInput: FunctionalComponent<Props> = ({
}; };
const reloadTags = (query: string) => { const reloadTags = (query: string) => {
const tags = getActiveNoteTagResults(query); setTagResults(getActiveNoteTagResults(query));
setTagResults(tags);
}; };
const onSearchQueryChange = (event: Event) => { const onSearchQueryChange = (event: Event) => {
const query = (event.target as HTMLInputElement).value; const query = (event.target as HTMLInputElement).value;
reloadTags(query); reloadTags(query);
setSearchQuery(query); setSearchQuery(query);
setDropdownVisible(tagResults.length > 0);
}; };
const onOptionClick = async (tag: SNTag) => { const onOptionClick = async (tag: SNTag) => {
await appState.notes.addTagToActiveNote(tag); await appState.notes.addTagToActiveNote(tag);
setSearchQuery('');
reloadTags(searchQuery); reloadTags(searchQuery);
}; };
@@ -70,11 +72,7 @@ export const AutocompleteTagInput: FunctionalComponent<Props> = ({
onChange={onSearchQueryChange} onChange={onSearchQueryChange}
type="text" type="text"
onBlur={closeOnBlur} onBlur={closeOnBlur}
onFocus={() => { onFocus={showDropdown}
if (tagResults.length > 0) {
showDropdown();
}
}}
/> />
{dropdownVisible && ( {dropdownVisible && (
<DisclosurePanel <DisclosurePanel
@@ -86,8 +84,7 @@ export const AutocompleteTagInput: FunctionalComponent<Props> = ({
return ( return (
<button <button
key={tag.uuid} key={tag.uuid}
className={`flex items-center border-0 focus:inner-ring-info cursor-pointer className="sn-dropdown-item"
hover:bg-contrast color-text bg-transparent px-3 text-left py-1.5`}
onClick={() => onOptionClick(tag)} onClick={() => onOptionClick(tag)}
onBlur={closeOnBlur} onBlur={closeOnBlur}
> >
@@ -109,6 +106,22 @@ export const AutocompleteTagInput: FunctionalComponent<Props> = ({
</button> </button>
); );
})} })}
{searchQuery !== '' && (
<>
{tagResults.length > 0 && (
<div className="h-1px my-2 bg-border"></div>
)}
<button
className="sn-dropdown-item"
onBlur={closeOnBlur}
>
<span>
Create new tag:
</span>
<Tag title={searchQuery} className="ml-2" />
</button>
</>
)}
</DisclosurePanel> </DisclosurePanel>
)} )}
</Disclosure> </Disclosure>