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