22
33import  React ,  {  useState  }  from  "react" ; 
44import  {  Button  }  from  "./ui/button" ; 
5+ import  {  Package ,  Monitor ,  Wrench ,  Server ,  FileText ,  Calendar  }  from  "lucide-react" ; 
56
67export  interface  FilterState  { 
78  searchQuery : string ; 
@@ -20,10 +21,10 @@ interface FilterBarProps {
2021} 
2122
2223const  SCRIPT_TYPES  =  [ 
23-   {  value : "ct" ,  label : "LXC Container" ,  icon :  "📦"  } , 
24-   {  value : "vm" ,  label : "Virtual Machine" ,  icon :  "💻"  } , 
25-   {  value : "addon" ,  label : "Add-on" ,  icon :  "🔧"  } , 
26-   {  value : "pve" ,  label : "PVE Host" ,  icon :  "🖥️"  } , 
24+   {  value : "ct" ,  label : "LXC Container" ,  Icon :  Package  } , 
25+   {  value : "vm" ,  label : "Virtual Machine" ,  Icon :  Monitor  } , 
26+   {  value : "addon" ,  label : "Add-on" ,  Icon :  Wrench  } , 
27+   {  value : "pve" ,  label : "PVE Host" ,  Icon :  Server  } , 
2728] ; 
2829
2930export  function  FilterBar ( { 
@@ -183,38 +184,41 @@ export function FilterBar({
183184          { isTypeDropdownOpen  &&  ( 
184185            < div  className = "absolute top-full left-0 z-10 mt-1 w-48 rounded-lg border border-border bg-card shadow-lg" > 
185186              < div  className = "p-2" > 
186-                 { SCRIPT_TYPES . map ( ( type )  =>  ( 
187-                   < label 
188-                     key = { type . value } 
189-                     className = "flex cursor-pointer items-center space-x-3 rounded-md px-3 py-2 hover:bg-accent" 
190-                   > 
191-                     < input 
192-                       type = "checkbox" 
193-                       checked = { filters . selectedTypes . includes ( type . value ) } 
194-                       onChange = { ( e )  =>  { 
195-                         if  ( e . target . checked )  { 
196-                           updateFilters ( { 
197-                             selectedTypes : [ 
198-                               ...filters . selectedTypes , 
199-                               type . value , 
200-                             ] , 
201-                           } ) ; 
202-                         }  else  { 
203-                           updateFilters ( { 
204-                             selectedTypes : filters . selectedTypes . filter ( 
205-                               ( t )  =>  t  !==  type . value , 
206-                             ) , 
207-                           } ) ; 
208-                         } 
209-                       } } 
210-                       className = "rounded border-input text-primary focus:ring-primary" 
211-                     /> 
212-                     < span  className = "text-lg" > { type . icon } </ span > 
213-                     < span  className = "text-sm text-muted-foreground" > 
214-                       { type . label } 
215-                     </ span > 
216-                   </ label > 
217-                 ) ) } 
187+                 { SCRIPT_TYPES . map ( ( type )  =>  { 
188+                   const  IconComponent  =  type . Icon ; 
189+                   return  ( 
190+                     < label 
191+                       key = { type . value } 
192+                       className = "flex cursor-pointer items-center space-x-3 rounded-md px-3 py-2 hover:bg-accent" 
193+                     > 
194+                       < input 
195+                         type = "checkbox" 
196+                         checked = { filters . selectedTypes . includes ( type . value ) } 
197+                         onChange = { ( e )  =>  { 
198+                           if  ( e . target . checked )  { 
199+                             updateFilters ( { 
200+                               selectedTypes : [ 
201+                                 ...filters . selectedTypes , 
202+                                 type . value , 
203+                               ] , 
204+                             } ) ; 
205+                           }  else  { 
206+                             updateFilters ( { 
207+                               selectedTypes : filters . selectedTypes . filter ( 
208+                                 ( t )  =>  t  !==  type . value , 
209+                               ) , 
210+                             } ) ; 
211+                           } 
212+                         } } 
213+                         className = "rounded border-input text-primary focus:ring-primary" 
214+                       /> 
215+                       < IconComponent  className = "h-4 w-4"  /> 
216+                       < span  className = "text-sm text-muted-foreground" > 
217+                         { type . label } 
218+                       </ span > 
219+                     </ label > 
220+                   ) ; 
221+                 } ) } 
218222              </ div > 
219223              < div  className = "border-t border-border p-2" > 
220224                < Button 
@@ -236,16 +240,25 @@ export function FilterBar({
236240        { /* Sort Options */ } 
237241        < div  className = "flex items-center space-x-2" > 
238242          { /* Sort By Dropdown */ } 
239-           < select 
240-             value = { filters . sortBy } 
241-             onChange = { ( e )  => 
242-               updateFilters ( {  sortBy : e . target . value  as  "name"  |  "created"  } ) 
243-             } 
244-             className = "rounded-lg border border-input bg-background px-3 py-2 text-sm text-foreground focus:ring-2 focus:ring-primary focus:outline-none" 
245-           > 
246-             < option  value = "name" > 📝 By Name</ option > 
247-             < option  value = "created" > 📅 By Created Date</ option > 
248-           </ select > 
243+           < div  className = "relative inline-flex items-center" > 
244+             < select 
245+               value = { filters . sortBy } 
246+               onChange = { ( e )  => 
247+                 updateFilters ( {  sortBy : e . target . value  as  "name"  |  "created"  } ) 
248+               } 
249+               className = "rounded-lg border border-input bg-background pl-9 pr-3 py-2 text-sm text-foreground focus:ring-2 focus:ring-primary focus:outline-none appearance-none" 
250+             > 
251+               < option  value = "name" > By Name</ option > 
252+               < option  value = "created" > By Created Date</ option > 
253+             </ select > 
254+             < div  className = "absolute left-2 pointer-events-none" > 
255+               { filters . sortBy  ===  "name"  ? ( 
256+                 < FileText  className = "h-4 w-4 text-muted-foreground"  /> 
257+               )  : ( 
258+                 < Calendar  className = "h-4 w-4 text-muted-foreground"  /> 
259+               ) } 
260+             </ div > 
261+           </ div > 
249262
250263          { /* Sort Order Button */ } 
251264          < Button 
0 commit comments