summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-09-19 07:17:26 -0500
committerAdam <[email protected]>2025-09-19 07:18:39 -0500
commit1edb23c2c72ad03bd1de8ef865b99f181a0b224a (patch)
tree7614dfbbd175923e7077079aa086305dc2a633d9
parentb1e6b9c7c9ebed944f8267bd0fb90404eba546fb (diff)
downloadopencode-1edb23c2c72ad03bd1de8ef865b99f181a0b224a.tar.gz
opencode-1edb23c2c72ad03bd1de8ef865b99f181a0b224a.zip
wip: desktop work
-rw-r--r--packages/app/src/components/select.tsx59
-rw-r--r--packages/app/src/pages/index.tsx5
2 files changed, 39 insertions, 25 deletions
diff --git a/packages/app/src/components/select.tsx b/packages/app/src/components/select.tsx
index 6849f90f1..80c8d605a 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<T> {
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<T>(props: SelectProps<T>) {
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<T>(props: SelectProps<T>) {
<KobalteSelect.Content
ref={(el) => (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<T>(props: SelectProps<T>) {
"data-[expanded]:animate-in data-[expanded]:fade-in-0 data-[expanded]:zoom-in-95": true,
}}
>
- <form>
- <input
- ref={(el) => (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,
- }}
- />
- </form>
+ <Show when={props.filter}>
+ <form>
+ <input
+ ref={(el) => (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,
+ }}
+ />
+ </form>
+ </Show>
<KobalteSelect.Listbox
ref={(el) => (listboxRef = el)}
classList={{
diff --git a/packages/app/src/pages/index.tsx b/packages/app/src/pages/index.tsx
index e8d4664a4..14c88182f 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"