mirror of
https://github.com/misode/misode.github.io.git
synced 2026-04-23 07:10:41 +00:00
Projects (#192)
* Add file save UI and drafts project * Fix build * Create SearchList component as abstraction * Add project page and file tree view * Create Locale context * Create Theme context * Create Version context * Create Title context * Create Project context * Store current file in project context * Fix issues when renaming file and implement deleting * Style improvements * Make all project strings translatable * Fix z-index
This commit is contained in:
24
src/app/components/forms/SearchList.tsx
Normal file
24
src/app/components/forms/SearchList.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import { useMemo, useState } from 'preact/hooks'
|
||||
import { Btn, BtnInput } from '..'
|
||||
|
||||
interface Props {
|
||||
values?: string[],
|
||||
onSelect?: (value: string) => unknown,
|
||||
searchPlaceholder?: string,
|
||||
noResults?: string,
|
||||
}
|
||||
export function SearchList({ values, onSelect, searchPlaceholder, noResults }: Props) {
|
||||
const [search, setSearch] = useState('')
|
||||
const results = useMemo(() => {
|
||||
const terms = search.trim().split(' ')
|
||||
return values?.filter(v => terms.every(t => v.includes(t))) ?? []
|
||||
}, [values, search])
|
||||
|
||||
return <>
|
||||
<BtnInput icon="search" large value={search} onChange={setSearch} doSelect={1} placeholder={searchPlaceholder ?? 'Search'} />
|
||||
<div class="result-list">
|
||||
{results.map(v => <Btn key={v} label={v} onClick={() => onSelect?.(v)} />)}
|
||||
{results.length === 0 && <Btn label={noResults ?? 'No results'}/>}
|
||||
</div>
|
||||
</>
|
||||
}
|
||||
Reference in New Issue
Block a user