From 4a62406de9a01cdb599b1918b0186c9dbd048d83 Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Tue, 7 Jan 2025 13:41:26 +0100 Subject: [PATCH] refactor select to use dropdown --- src/components/dropdown/index.tsx | 83 +++++++++++-------------------- src/components/select/index.tsx | 69 ++++++++++--------------- 2 files changed, 55 insertions(+), 97 deletions(-) diff --git a/src/components/dropdown/index.tsx b/src/components/dropdown/index.tsx index e19821c..4179a03 100644 --- a/src/components/dropdown/index.tsx +++ b/src/components/dropdown/index.tsx @@ -1,56 +1,46 @@ -import { createMemo, createSignal, For, JSX, Setter, createEffect, Show } from "solid-js"; +import { createMemo, createSignal, For, JSX, Setter, createEffect, Show, ParentProps, children } from "solid-js"; import { FaSolidAngleDown } from "solid-icons/fa"; import css from './index.module.css'; -interface DropdownProps { - id: string; - class?: string; - value?: K; - setValue?: Setter; - values: Record; - open?: boolean; - showCaret?: boolean; - children: (key: K, value: T) => JSX.Element; - filter?: (query: string, key: K, value: T) => boolean; +export interface DropdownApi { + show(): void; + hide(): void; } -export function Dropdown(props: DropdownProps) { +interface DropdownProps { + api?: (api: DropdownApi) => any, + id: string; + class?: string; + open?: boolean; + showCaret?: boolean; + text: JSX.Element; + children: JSX.Element; +} + +export function Dropdown(props: DropdownProps) { const [dialog, setDialog] = createSignal(); - const [key, setKey] = 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; - }); const showCaret = createMemo(() => props.showCaret ?? true); - createEffect(() => { - props.setValue?.(() => key()); - }); - createEffect(() => { dialog()?.[open() ? 'showPopover' : 'hidePopover'](); }); + createEffect(() => { + props.api?.({ + show() { + dialog()?.showPopover(); + }, + hide() { + dialog()?.hidePopover(); + }, + }); + }); + return
setOpen(e.newState === 'open')}> - -
- setQuery(e.target.value)} /> -
-
- -
- { - ([k, v]) => { - const selected = createMemo(() => key() === k); - - return { - setKey(() => k); - dialog()?.hidePopover(); - }}>{props.children(k, v)}; - } - } -
+ {props.children}
; } \ No newline at end of file diff --git a/src/components/select/index.tsx b/src/components/select/index.tsx index 4bca60c..d22b4fa 100644 --- a/src/components/select/index.tsx +++ b/src/components/select/index.tsx @@ -1,5 +1,5 @@ import { createMemo, createSignal, For, JSX, Setter, createEffect, Show } from "solid-js"; -import { FaSolidAngleDown } from "solid-icons/fa"; +import { Dropdown, DropdownApi } from "../dropdown"; import css from './index.module.css'; interface SelectProps { @@ -15,9 +15,8 @@ interface SelectProps { } export function Select(props: SelectProps) { - const [dialog, setDialog] = createSignal(); + const [dropdown, setDropdown] = createSignal(); const [key, setKey] = createSignal(props.value); - const [open, setOpen] = createSignal(props.open ?? false); const [query, setQuery] = createSignal(''); const values = createMemo(() => { @@ -32,50 +31,36 @@ export function Select(props: SelectProps) { return entries; }); - const showCaret = createMemo(() => props.showCaret ?? true); - createEffect(() => { props.setValue?.(() => key()); }); - createEffect(() => { - dialog()?.[open() ? 'showPopover' : 'hidePopover'](); - }); + const text = { + key => { + const value = createMemo(() => props.values[key()]); - return
- - - setOpen(e.newState === 'open')}> - -
- setQuery(e.target.value)} /> -
-
- -
- { - ([k, v]) => { - const selected = createMemo(() => key() === k); - - return { - setKey(() => k); - dialog()?.hidePopover(); - }}>{props.children(k, v)}; - } - } -
-
-
; + } + + } \ No newline at end of file