From 1edb23c2c72ad03bd1de8ef865b99f181a0b224a Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 19 Sep 2025 07:17:26 -0500 Subject: [PATCH] wip: desktop work --- packages/app/src/components/select.tsx | 59 +++++++++++++++----------- packages/app/src/pages/index.tsx | 5 ++- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/packages/app/src/components/select.tsx b/packages/app/src/components/select.tsx index 6849f90f..80c8d605 100644 --- a/packages/app/src/components/select.tsx +++ b/packages/app/src/components/select.tsx @@ -1,5 +1,5 @@ import { Select as KobalteSelect } from "@kobalte/core/select" -import { createEffect, createMemo } from "solid-js" +import { createEffect, createMemo, Show } from "solid-js" import type { ComponentProps } from "solid-js" import { Icon } from "@/ui/icon" import fuzzysort from "fuzzysort" @@ -10,12 +10,17 @@ export interface SelectProps { variant?: "default" | "outline" size?: "sm" | "md" | "lg" placeholder?: string + filter?: + | false + | { + placeholder?: string + keys: string[] + } options: T[] current?: T value?: (x: T) => string label?: (x: T) => string groupBy?: (x: T) => string - filterKeys: string[] onFilter?: (query: string) => void onSelect?: (value: T | undefined) => void class?: ComponentProps<"div">["class"] @@ -33,7 +38,10 @@ export function Select(props: SelectProps) { const needle = store.filter.toLowerCase() const result = pipe( props.options, - (x) => (!needle ? x : fuzzysort.go(needle, x, { keys: props.filterKeys }).map((x) => x.obj)), + (x) => + !needle || !props.filter + ? x + : fuzzysort.go(needle, x, { keys: props.filter && props.filter.keys }).map((x) => x.obj), groupBy((x) => (props.groupBy ? props.groupBy(x) : "")), // mapValues((x) => x.sort((a, b) => a.title.localeCompare(b.title))), entries(), @@ -138,6 +146,7 @@ export function Select(props: SelectProps) { (contentRef = el)} onKeyDown={(e) => { + if (!props.filter) return if (e.key === "ArrowUp" || e.key === "ArrowDown" || e.key === "Escape") { return } @@ -150,27 +159,29 @@ export function Select(props: SelectProps) { "data-[expanded]:animate-in data-[expanded]:fade-in-0 data-[expanded]:zoom-in-95": true, }} > -
- (inputRef = el)} - id="select-filter" - type="text" - placeholder="Filter models" - value={store.filter} - onInput={(e) => setStore("filter", e.currentTarget.value)} - onKeyDown={(e) => { - if (e.key === "ArrowUp" || e.key === "ArrowDown" || e.key === "Escape") { - e.preventDefault() - e.stopPropagation() - listboxRef?.focus() - } - }} - classList={{ - "w-full": true, - "px-2 pb-2 text-text font-light placeholder-text-muted/70 text-xs focus:outline-none": true, - }} - /> -
+ +
+ (inputRef = el)} + id="select-filter" + type="text" + placeholder={props.filter ? props.filter.placeholder : "Filter items"} + value={store.filter} + onInput={(e) => setStore("filter", e.currentTarget.value)} + onKeyDown={(e) => { + if (e.key === "ArrowUp" || e.key === "ArrowDown" || e.key === "Escape") { + e.preventDefault() + e.stopPropagation() + listboxRef?.focus() + } + }} + classList={{ + "w-full": true, + "px-2 pb-2 text-text font-light placeholder-text-muted/70 text-xs focus:outline-none": true, + }} + /> +
+
(listboxRef = el)} classList={{ diff --git a/packages/app/src/pages/index.tsx b/packages/app/src/pages/index.tsx index e8d4664a..14c88182 100644 --- a/packages/app/src/pages/index.tsx +++ b/packages/app/src/pages/index.tsx @@ -513,7 +513,10 @@ export default function Page() { onSelect={local.model.set} label={(x) => x.modelID} value={(x) => `${x.providerID}.${x.modelID}`} - filterKeys={["providerID", "modelID"]} + filter={{ + keys: ["providerID", "modelID"], + placeholder: "Filter models", + }} groupBy={(x) => x.providerID} size="sm" class="uppercase"