@@ -63,60 +63,84 @@ export const ActiveFilterPills = () => {
6363 return count ;
6464 } , [ selectedSidebarFilters ] ) ;
6565
66+ const handleRemove = ( sectionKey : string , tagToRemove : string ) => {
67+ const sectionToModify = selectedSidebarFilters . find (
68+ ( { section } ) => section . key === sectionKey ,
69+ ) ?. section ;
70+ if ( sectionToModify ?. selectionType === "single" ) {
71+ setSelectedSidebarFilters ( ( prev ) => {
72+ return prev . filter ( ( { section } ) => section . key !== sectionKey ) ;
73+ } ) ;
74+ } else if ( sectionToModify ?. selectionType === "multiple" ) {
75+ setSelectedSidebarFilters ( ( prev ) => {
76+ return prev . map ( ( filter ) =>
77+ filter . section . key === sectionKey
78+ ? {
79+ ...filter ,
80+ tags : filter . tags ?. filter ( ( tag ) => tag !== tagToRemove ) ,
81+ }
82+ : filter ,
83+ ) ;
84+ } ) ;
85+ } else if ( sectionToModify ?. selectionType === "range" ) {
86+ setSelectedSidebarFilters ( ( prev ) => {
87+ return prev . filter ( ( { section } ) => section . key !== sectionKey ) ;
88+ } ) ;
89+ }
90+ } ;
91+
92+ // If no filters are selected, don't render anything
93+ if ( numberOfSelectedFilters === 0 ) return null ;
94+
6695 return (
67- < div
68- className = "trieve-active-filter-pills-container"
69- data-number-selected-filters = { numberOfSelectedFilters }
70- >
71- < div className = "trieve-all-active-filters" >
96+ < div className = "tv-py-2 tv-px-4 tv-bg-white tv-border-b tv-border-zinc-200 tv-flex tv-flex-wrap tv-items-center tv-justify-between tv-w-full" >
97+ < div className = "tv-flex tv-flex-wrap tv-gap-2" >
7298 { activeTagFilters . map ( ( { sectionKey, tags } ) =>
7399 tags ?. map ( ( tag ) => (
74100 < button
75- className = "trieve-active-filter-pill "
101+ className = "tv-inline-flex tv-items-center tv-px-3 tv-py-1.5 tv-rounded-md tv-bg-gray-100 hover:tv-bg-gray-200 tv-text-sm tv-transition-colors "
76102 key = { tag }
77103 onClick = { ( ) => {
78104 setSelectedSidebarFilters ( ( prev ) =>
79105 prev . filter ( ( { section } ) => section . key !== sectionKey ) ,
80106 ) ;
81107 } }
82108 >
83- < span > { tag } </ span >
84- < i
85- className = "trieve-active-filter-pill-remove-icon "
109+ < span className = "tv-text-gray-800" > { tag } </ span >
110+ < span
111+ className = "tv-ml-2 tv-flex tv-items-center tv-justify-center "
86112 onClick = { ( e ) => {
87113 e . stopPropagation ( ) ;
88- setSelectedSidebarFilters ( ( prev ) =>
89- prev . filter ( ( { section } ) => section . key !== sectionKey ) ,
90- ) ;
114+ handleRemove ( sectionKey , tag ) ;
91115 } }
92116 >
93- < XIcon />
94- </ i >
117+ < XIcon className = "tv-w-4 tv-h-4 tv-text-gray-500" />
118+ </ span >
95119 </ button >
96120 ) ) ,
97121 ) }
98122 { activeRangeFilters . map ( ( { sectionKey, range } ) => (
99123 < button
100- className = "trieve-active-filter-pill "
124+ className = "tv-inline-flex tv-items-center tv-px-3 tv-py-1.5 tv-rounded-md tv-bg-gray-100 hover:tv-bg-gray-200 tv-text-sm tv-transition-colors "
101125 key = { `${ sectionKey } -${ range ?. min } -${ range ?. max } ` }
102126 >
103- { range ?. min } - { range ?. max }
104- < i
105- className = "trieve-active-filter-pill-remove-icon"
127+ < span className = "tv-text-gray-800" >
128+ ${ range ?. min } - ${ range ?. max }
129+ </ span >
130+ < span
131+ className = "tv-ml-2 tv-flex tv-items-center tv-justify-center"
106132 onClick = { ( ) => {
107- setSelectedSidebarFilters ( ( prev ) =>
108- prev . filter ( ( { section } ) => section . key !== sectionKey ) ,
109- ) ;
133+ handleRemove ( sectionKey , `${ range ?. min } -${ range ?. max } ` ) ;
110134 } }
111135 >
112- < XIcon />
113- </ i >
136+ < XIcon className = "tv-w-4 tv-h-4 tv-text-gray-500" />
137+ </ span >
114138 </ button >
115139 ) ) }
116140 </ div >
141+
117142 < button
118- className = "trieve-clear-filters-button"
119- data-number-selected-filters = { numberOfSelectedFilters }
143+ className = "tv-px-3 tv-py-1.5 tv-rounded-md tv-text-sm tv-text-gray-800 tv-bg-white tv-border tv-border-gray-300 hover:tv-bg-gray-50 tv-transition-colors"
120144 onClick = { ( ) => {
121145 setSelectedSidebarFilters ( [ ] ) ;
122146 } }
@@ -126,7 +150,6 @@ export const ActiveFilterPills = () => {
126150 </ div >
127151 ) ;
128152} ;
129-
130153export interface AccordionProps {
131154 sectionKey : string ;
132155 title : string ;
@@ -149,8 +172,9 @@ export const Accordion = ({
149172 } [ ] = useMemo ( ( ) => {
150173 const filters = selectedSidebarFilters . filter (
151174 ( { section } ) =>
152- section . filterType === "match_any" ||
153- ( section . filterType === "match_all" && section . key === sectionKey ) ,
175+ ( section . filterType === "match_any" ||
176+ section . filterType === "match_all" ) &&
177+ section . key === sectionKey ,
154178 ) ;
155179 return filters . map ( ( { section, tags } ) => ( {
156180 sectionKey : section . key ,
@@ -178,7 +202,12 @@ export const Accordion = ({
178202 const [ open , setOpen ] = useState ( defaultOpen ) ;
179203
180204 const numberOfSelectedFilters = useMemo ( ( ) => {
181- return activeTagFilters . length + activeRangeFilters . length ;
205+ let count = 0 ;
206+ for ( const item of activeTagFilters ) {
207+ count += item . tags ?. length ?? 0 ;
208+ }
209+ count += activeRangeFilters . length ;
210+ return count ;
182211 } , [ activeTagFilters , activeRangeFilters ] ) ;
183212
184213 return (
@@ -295,7 +324,7 @@ export const FilterButton = ({
295324 setSelectedSidebarFilters ( ( prev ) => {
296325 return prev . map ( ( filter ) =>
297326 filter . section . key === sectionKey
298- ? { ...filter , tags : [ ... ( filter . tags ?? [ ] ) , filterKey ] }
327+ ? { ...filter , tags : [ filterKey ] }
299328 : filter ,
300329 ) ;
301330 } ) ;
@@ -466,51 +495,9 @@ export const FilterButton = ({
466495 ) ;
467496} ;
468497
469- export interface CollapsibleSectionProps {
470- title : string ;
471- children : React . ReactNode ;
472- defaultOpen ?: boolean ;
473- }
474-
475- export const CollapsibleSection = ( {
476- title,
477- children,
478- defaultOpen = false ,
479- } : CollapsibleSectionProps ) => {
480- const [ isOpen , setIsOpen ] = useState ( defaultOpen ) ;
481-
482- return (
483- < div
484- className = "trieve-collapsible-section-container"
485- data-open = { isOpen ? "true" : "false" }
486- >
487- < div
488- className = "trieve-collapsible-section-header"
489- data-open = { isOpen ? "true" : "false" }
490- onClick = { ( ) => setIsOpen ( ! isOpen ) }
491- style = { { cursor : "pointer" } }
492- >
493- < h4 className = "trieve-collapsible-section-title" > { title } </ h4 >
494- < div className = "trieve-collapsible-section-icon-container" >
495- { isOpen ? < ChevronUpicon /> : < ChevronDownIcon /> }
496- </ div >
497- </ div >
498- { isOpen && (
499- < div
500- className = "trieve-collapsible-section-content-container"
501- data-open = { isOpen ? "true" : "false" }
502- >
503- < div className = "trieve-collapsible-section-content" > { children } </ div >
504- </ div >
505- ) }
506- </ div >
507- ) ;
508- } ;
509-
510498export const FilterSidebar = ( { sections } : FilterSidebarProps ) => {
511499 return (
512500 < aside className = "trieve-filter-sidebar" >
513- < ActiveFilterPills />
514501 < div className = "trieve-filter-sidebar-section" >
515502 < div className = "" > Filters</ div >
516503 { sections . map ( ( section ) => (
@@ -528,7 +515,7 @@ export const FilterSidebar = ({ sections }: FilterSidebarProps) => {
528515 key = { option . tag }
529516 section = { section }
530517 filterKey = { option . tag }
531- label = { option . label ?? "" }
518+ label = { option . label }
532519 type = { section . selectionType }
533520 range = { option . range }
534521 />
0 commit comments