import { createMemo, createSignal, For, JSX, Setter, createEffect, Show } from "solid-js"; import css from './index.module.css'; interface ComboBoxProps { id: string; class?: string; value: K; setValue?: Setter; values: Record; open?: boolean; children: (key: K, value: T) => JSX.Element; filter?: (query: string, key: K, value: T) => boolean; } export function ComboBox(props: ComboBoxProps) { const [dialog, setDialog] = createSignal(); const [value, setValue] = createSignal(props.value); const [open, setOpen] = createSignal(props.open ?? false); const [query, setQuery] = createSignal(''); const values = createMemo(() => { let entries = Object.entries(props.values) as [K, T][]; const filter = props.filter; const q = query(); if (filter) { entries = entries.filter(([k, v]) => filter(q, k, v)); } return entries; }); createEffect(() => { props.setValue?.(() => value()); }); createEffect(() => { dialog()?.[open() ? 'showPopover' : 'hidePopover'](); }); return
setOpen(e.newState === 'open')}>
setQuery(e.target.value)} />
{ ([k, v]) => { const selected = createMemo(() => value() === k); return { setValue(() => k); dialog()?.hidePopover(); }}>{props.children(k, v)}; } }
; }