1 line
3.9 KiB
JavaScript
1 line
3.9 KiB
JavaScript
import{a as i,j as r}from"./vendor-react-BHG7lGYR.js";import{D as P}from"./dropdown-BYn_8IId.js";import{I as F}from"./input-BGBI2Wze.js";import{B as G,d as j}from"./index-BWcMVITa.js";import{X as U,c as X,l as S}from"./vendor-icons-DaGlTw4_.js";function T({options:a,value:s,onChange:d,multiple:o=!1,searchable:l=!1,placeholder:c="Select an option...",disabled:O=!1,className:E,name:m,"aria-label":w,"aria-labelledby":D}){const[u,k]=i.useState(!1),[h,g]=i.useState(""),y=i.useRef(null),f=i.useMemo(()=>{const e={},n=[];return a.forEach(t=>{t.group?(e[t.group]||(e[t.group]=[]),e[t.group].push(t)):n.push(t)}),{groups:e,ungrouped:n}},[a]),p=i.useMemo(()=>{if(!l||!h)return{groups:f.groups,ungrouped:f.ungrouped};const e=h.toLowerCase(),n={},t=[];return Object.entries(f.groups).forEach(([x,K])=>{const v=K.filter(M=>M.label.toLowerCase().includes(e));v.length>0&&(n[x]=v)}),t.push(...f.ungrouped.filter(x=>x.label.toLowerCase().includes(e))),{groups:n,ungrouped:t}},[l,h,f]),b=s?(Array.isArray(s)?s:[s]).map(n=>a.find(t=>t.value===n)?.label).filter(Boolean):[],I=o?b.length>0?`${b.length} selected`:c:b[0]||c,N=e=>s?o?Array.isArray(s)&&s.includes(e):s===e:!1,A=e=>{if(o){const n=Array.isArray(s)?s:[],t=n.includes(e)?n.filter(x=>x!==e):[...n,e];d(t)}else d(e),k(!1),g("")},L=e=>{e.stopPropagation(),d(o?[]:"")};i.useEffect(()=>{u&&l&&y.current&&y.current.focus()},[u,l]),i.useEffect(()=>{u||g("")},[u]);const B=r.jsxs(G,{variant:"outline",disabled:O,className:j("w-full justify-between",!s||Array.isArray(s)&&s.length===0?"text-muted-foreground":"",E),type:"button","aria-label":w,"aria-labelledby":D,"aria-haspopup":"listbox","aria-expanded":u,children:[r.jsx("span",{className:"truncate",children:I}),r.jsxs("div",{className:"flex items-center gap-1 ml-2",children:[s&&(Array.isArray(s)&&s.length>0||!Array.isArray(s))&&r.jsx(U,{className:"h-4 w-4 shrink-0 opacity-50 hover:opacity-100",onClick:L}),r.jsx(X,{className:"h-4 w-4 shrink-0 opacity-50"})]})]}),R=r.jsxs("div",{className:"w-full min-w-[200px] max-h-[300px] overflow-y-auto",role:"listbox","aria-label":w||m||c,children:[l&&r.jsx("div",{className:"p-2 border-b",children:r.jsx(F,{ref:y,type:"text",placeholder:"Search...",value:h,onChange:e=>g(e.target.value),onClick:e=>e.stopPropagation(),className:"w-full"})}),p.ungrouped.length>0&&r.jsx("div",{className:"py-1",children:p.ungrouped.map(e=>r.jsx(C,{option:e,isSelected:N(e.value),multiple:o,onSelect:A},e.value))}),Object.entries(p.groups).map(([e,n])=>r.jsxs("div",{className:"py-1",children:[r.jsx("div",{className:"px-4 py-1.5 text-xs font-semibold text-kodo-content-dim uppercase",children:e}),n.map(t=>r.jsx(C,{option:t,isSelected:N(t.value),multiple:o,onSelect:A},t.value))]},e)),p.ungrouped.length===0&&Object.keys(p.groups).length===0&&r.jsx("div",{className:"px-4 py-2 text-sm text-kodo-content-dim text-center",children:"No options found"})]});return r.jsxs(r.Fragment,{children:[r.jsx(P,{trigger:B,align:"left",onOpenChange:k,className:"w-full",children:R}),m&&r.jsx("input",{type:"hidden",name:m,value:Array.isArray(s)?s.join(","):s||""})]})}function C({option:a,isSelected:s,multiple:d,onSelect:o}){const l=c=>{a.disabled||(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),o(a.value))};return r.jsxs("div",{role:"option","aria-selected":s,className:j("relative flex items-center px-4 py-2 text-sm cursor-pointer","hover:bg-white/5 hover:text-white","focus:bg-white/5 focus:text-white","transition-colors text-kodo-text-main",s&&"bg-kodo-steel/10 text-kodo-steel",a.disabled&&"opacity-50 cursor-not-allowed pointer-events-none"),onClick:()=>!a.disabled&&o(a.value),onKeyDown:l,tabIndex:a.disabled?-1:0,children:[d&&r.jsx("div",{className:j("mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-kodo-steel",s&&"bg-kodo-cyan border-kodo-steel text-kodo-void"),children:s&&r.jsx(S,{className:"h-3 w-3"})}),r.jsx("span",{className:"flex-1",children:a.label}),!d&&s&&r.jsx(S,{className:"h-4 w-4 text-kodo-steel"})]})}export{T as S};
|