@@ -16,7 +16,7 @@ import Label from 'components/Label/Label.react';
16
16
import Popover from 'components/Popover/Popover.react' ;
17
17
import TextInput from 'components/TextInput/TextInput.react' ;
18
18
import { CurrentApp } from 'context/currentApp' ;
19
- import { List , Map } from 'immutable' ;
19
+ import { List , Map as ImmutableMap } from 'immutable' ;
20
20
import * as ClassPreferences from 'lib/ClassPreferences' ;
21
21
import * as Filters from 'lib/Filters' ;
22
22
import Position from 'lib/Position' ;
@@ -116,8 +116,9 @@ export default class BrowserFilter extends React.Component {
116
116
hasRelativeDates = filterData . some ( filter =>
117
117
filter . compareTo && filter . compareTo . __type === 'RelativeDate'
118
118
) ;
119
- } catch {
120
- // If parsing fails, assume no relative dates
119
+ } catch ( error ) {
120
+ // Log parsing errors for debugging
121
+ console . warn ( 'Failed to parse saved filter:' , error ) ;
121
122
hasRelativeDates = false ;
122
123
}
123
124
@@ -279,7 +280,7 @@ export default class BrowserFilter extends React.Component {
279
280
} ) ;
280
281
return result ;
281
282
} // Helper method to convert RelativeDate objects to Parse Date format for saving
282
- convertRelativeDatesForDisplay ( filters ) {
283
+ convertRelativeDatesToParseFormat ( filters ) {
283
284
return filters . map ( filter => {
284
285
const compareTo = filter . get ( 'compareTo' ) ;
285
286
if ( compareTo && compareTo . __type === 'RelativeDate' ) {
@@ -295,6 +296,45 @@ export default class BrowserFilter extends React.Component {
295
296
} ) ;
296
297
}
297
298
299
+ deleteCurrentFilter ( ) {
300
+ const currentFilterInfo = this . getCurrentFilterInfo ( ) ;
301
+ if ( ! currentFilterInfo . id ) {
302
+ this . setState ( { confirmDelete : false } ) ;
303
+ return ;
304
+ }
305
+
306
+ // Delete the filter from ClassPreferences
307
+ const preferences = ClassPreferences . getPreferences (
308
+ this . context . applicationId ,
309
+ this . props . className
310
+ ) ;
311
+
312
+ if ( preferences . filters ) {
313
+ const updatedFilters = preferences . filters . filter ( filter => filter . id !== currentFilterInfo . id ) ;
314
+ ClassPreferences . updatePreferences (
315
+ this . context . applicationId ,
316
+ this . props . className ,
317
+ { ...preferences , filters : updatedFilters }
318
+ ) ;
319
+ }
320
+
321
+ // Remove filterId from URL
322
+ const urlParams = new URLSearchParams ( window . location . search ) ;
323
+ urlParams . delete ( 'filterId' ) ;
324
+ const newUrl = `${ window . location . pathname } ${ urlParams . toString ( ) ? '?' + urlParams . toString ( ) : '' } ` ;
325
+ window . history . replaceState ( { } , '' , newUrl ) ;
326
+
327
+ // Clear current filters and close dialog
328
+ this . props . onChange ( new ImmutableMap ( ) ) ;
329
+ this . setState ( { confirmDelete : false } ) ;
330
+ this . toggle ( ) ;
331
+
332
+ // Call onDeleteFilter prop if provided
333
+ if ( this . props . onDeleteFilter ) {
334
+ this . props . onDeleteFilter ( currentFilterInfo . id ) ;
335
+ }
336
+ }
337
+
298
338
toggle ( ) {
299
339
let filters = this . props . filters ;
300
340
if ( this . props . filters . size === 0 ) {
@@ -306,7 +346,7 @@ export default class BrowserFilter extends React.Component {
306
346
) ;
307
347
const { filterClass, filterField, filterConstraint } = Filters . getFilterDetails ( available ) ;
308
348
filters = new List ( [
309
- new Map ( { class : filterClass , field : filterField , constraint : filterConstraint } ) ,
349
+ new ImmutableMap ( { class : filterClass , field : filterField , constraint : filterConstraint } ) ,
310
350
] ) ;
311
351
} else {
312
352
// Convert only Parse Date objects to JavaScript Date objects, preserve RelativeDate objects
@@ -333,14 +373,14 @@ export default class BrowserFilter extends React.Component {
333
373
const { filterClass, filterField, filterConstraint } = Filters . getFilterDetails ( available ) ;
334
374
this . setState ( ( { filters } ) => ( {
335
375
filters : filters . push (
336
- new Map ( { class : filterClass , field : filterField , constraint : filterConstraint } )
376
+ new ImmutableMap ( { class : filterClass , field : filterField , constraint : filterConstraint } )
337
377
) ,
338
378
editMode : true ,
339
379
} ) ) ;
340
380
}
341
381
342
382
clear ( ) {
343
- this . props . onChange ( new Map ( ) ) ;
383
+ this . props . onChange ( new ImmutableMap ( ) ) ;
344
384
}
345
385
346
386
apply ( ) {
@@ -542,42 +582,7 @@ export default class BrowserFilter extends React.Component {
542
582
primary = { true }
543
583
width = "120px"
544
584
onClick = { ( ) => {
545
- const currentFilterInfo = this . getCurrentFilterInfo ( ) ;
546
- if ( currentFilterInfo . id ) {
547
- // Delete the filter from ClassPreferences
548
- const preferences = ClassPreferences . getPreferences (
549
- this . context . applicationId ,
550
- this . props . className
551
- ) ;
552
-
553
- if ( preferences . filters ) {
554
- const updatedFilters = preferences . filters . filter ( filter => filter . id !== currentFilterInfo . id ) ;
555
- ClassPreferences . updatePreferences (
556
- this . context . applicationId ,
557
- this . props . className ,
558
- { ...preferences , filters : updatedFilters }
559
- ) ;
560
- }
561
-
562
- // Remove filterId from URL
563
- const urlParams = new URLSearchParams ( window . location . search ) ;
564
- urlParams . delete ( 'filterId' ) ;
565
- const newUrl = `${ window . location . pathname } ${ urlParams . toString ( ) ? '?' + urlParams . toString ( ) : '' } ` ;
566
- window . history . replaceState ( { } , '' , newUrl ) ;
567
-
568
- // Clear current filters and close dialog
569
- this . props . onChange ( new Map ( ) ) ;
570
- this . setState ( { confirmDelete : false } ) ;
571
- this . toggle ( ) ;
572
-
573
- // Call onDeleteFilter prop if provided
574
- if ( this . props . onDeleteFilter ) {
575
- this . props . onDeleteFilter ( currentFilterInfo . id ) ;
576
- }
577
- } else {
578
- // Close the confirmation dialog if no filter ID
579
- this . setState ( { confirmDelete : false } ) ;
580
- }
585
+ this . deleteCurrentFilter ( ) ;
581
586
} }
582
587
/>
583
588
</ div >
@@ -616,59 +621,28 @@ export default class BrowserFilter extends React.Component {
616
621
</ div >
617
622
) }
618
623
< div className = { styles . btnFlex } >
619
- { ( ( ) => {
620
- const currentFilter = this . getCurrentFilterInfo ( ) ;
621
- const isAppliedSavedFilter = currentFilter . isApplied && this . props . filters . size > 0 ;
622
-
623
- if ( isAppliedSavedFilter && ! this . state . showMore ) {
624
- return (
625
- < >
626
- < span
627
- style = { { cursor : 'pointer' , display : 'inline-flex' , alignItems : 'center' , justifyContent : 'center' } }
628
- onClick = { ( ) => this . toggleMore ( ) }
629
- >
630
- < Icon
631
- name = "down-solid"
632
- width = { 20 }
633
- height = { 20 }
634
- fill = "white"
635
- />
636
- </ span >
637
- < Button
638
- color = "white"
639
- value = "Clear"
640
- disabled = { this . state . filters . size === 0 }
641
- width = "120px"
642
- onClick = { ( ) => this . clear ( ) }
643
- />
644
- </ >
645
- ) ;
646
- } else if ( ! this . state . showMore ) {
647
- return (
648
- < >
649
- < span
650
- style = { { cursor : 'pointer' , display : 'inline-flex' , alignItems : 'center' , justifyContent : 'center' } }
651
- onClick = { ( ) => this . toggleMore ( ) }
652
- >
653
- < Icon
654
- name = "down-solid"
655
- width = { 20 }
656
- height = { 20 }
657
- fill = "white"
658
- />
659
- </ span >
660
- < Button
661
- color = "white"
662
- value = "Clear"
663
- disabled = { this . state . filters . size === 0 }
664
- width = "120px"
665
- onClick = { ( ) => this . clear ( ) }
666
- />
667
- </ >
668
- ) ;
669
- }
670
- return null ;
671
- } ) ( ) }
624
+ { ! this . state . showMore && (
625
+ < >
626
+ < span
627
+ style = { { cursor : 'pointer' , display : 'inline-flex' , alignItems : 'center' , justifyContent : 'center' } }
628
+ onClick = { ( ) => this . toggleMore ( ) }
629
+ >
630
+ < Icon
631
+ name = "down-solid"
632
+ width = { 20 }
633
+ height = { 20 }
634
+ fill = "white"
635
+ />
636
+ </ span >
637
+ < Button
638
+ color = "white"
639
+ value = "Clear"
640
+ disabled = { this . state . filters . size === 0 }
641
+ width = "120px"
642
+ onClick = { ( ) => this . clear ( ) }
643
+ />
644
+ </ >
645
+ ) }
672
646
</ div >
673
647
< div className = { styles . btnFlex } >
674
648
< Button
0 commit comments