import { Switch } from "~/components/primitives/Switch"; import { Select, SelectItem } from "~/components/primitives/Select"; import { Input } from "~/components/primitives/Input"; import { cn } from "~/utils/cn"; export const UNSET_VALUE = "__unset__"; export function BooleanControl({ value, onChange, dimmed, }: { value: boolean | undefined; onChange: (val: boolean) => void; dimmed: boolean; }) { return ( ); } export function EnumControl({ value, options, onChange, dimmed, }: { value: string | undefined; options: string[]; onChange: (val: string) => void; dimmed: boolean; }) { const items = [UNSET_VALUE, ...options]; return ( ); } export type WorkerGroup = { id: string; name: string }; export function WorkerGroupControl({ value, workerGroups, onChange, dimmed, }: { value: string | undefined; workerGroups: WorkerGroup[]; onChange: (val: string) => void; dimmed: boolean; }) { const items = [UNSET_VALUE, ...workerGroups.map((wg) => wg.id)]; return ( ); } export function NumberControl({ value, onChange, min, max, dimmed, }: { value: number | undefined; onChange: (val: number | undefined) => void; min?: number; max?: number; dimmed: boolean; }) { // Number and string fields share the same input shape; surface the range // (or "number") as the placeholder so an unset field still signals its type. const placeholder = min !== undefined && max !== undefined ? `${min}-${max}` : "number"; return ( { const next = e.target.valueAsNumber; onChange(Number.isNaN(next) ? undefined : next); }} placeholder={placeholder} className={cn("w-40", dimmed && "opacity-50")} /> ); } export function StringControl({ value, onChange, dimmed, }: { value: string; onChange: (val: string) => void; dimmed: boolean; }) { return ( onChange(e.target.value)} placeholder="unset" className={cn("w-40", dimmed && "opacity-50")} /> ); }