@@ -59,6 +59,7 @@ export function TableFilter({
5959 onClose,
6060} : TableFilterProps ) {
6161 const lastAppliedFilterRef = useRef < string | undefined > ( undefined )
62+ const deferredAppliedRulesRef = useRef < Map < string , FilterRule > > ( new Map ( ) )
6263 const [ rules , setRules ] = useState < FilterRule [ ] > ( ( ) => {
6364 const fromFilter = predicateToFilterRules ( filter )
6465 return fromFilter . length > 0 ? fromFilter : [ createRule ( columns ) ]
@@ -75,15 +76,39 @@ export function TableFilter({
7576
7677 const applyRules = useCallback (
7778 ( update : ( current : FilterRule [ ] ) => FilterRule [ ] , deferIncompleteRuleId ?: string ) => {
78- const nextRules = update ( rulesRef . current )
79+ const currentRules = rulesRef . current
80+ const nextRules = update ( currentRules )
7981 rulesRef . current = nextRules
8082 setRules ( nextRules )
8183 if ( ! autoApply ) return
8284
8385 const deferredRule = nextRules . find ( ( rule ) => rule . id === deferIncompleteRuleId )
84- if ( deferredRule && ! isCompleteRule ( deferredRule ) ) return
86+ if ( deferredRule && ! isCompleteRule ( deferredRule ) ) {
87+ const previouslyAppliedRule = currentRules . find ( ( rule ) => rule . id === deferredRule . id )
88+ if ( previouslyAppliedRule && isCompleteRule ( previouslyAppliedRule ) ) {
89+ const deferredRules = deferredAppliedRulesRef . current
90+ if ( ! deferredRules . has ( deferredRule . id ) ) {
91+ deferredRules . set ( deferredRule . id , previouslyAppliedRule )
92+ }
93+ }
94+ }
95+
96+ const nextRulesById = new Map ( nextRules . map ( ( rule ) => [ rule . id , rule ] ) )
97+ for ( const [ id ] of deferredAppliedRulesRef . current ) {
98+ const nextRule = nextRulesById . get ( id )
99+ if ( ! nextRule || isCompleteRule ( nextRule ) ) {
100+ deferredAppliedRulesRef . current . delete ( id )
101+ }
102+ }
103+
104+ const appliedRules = nextRules . map ( ( rule ) => {
105+ const deferredRule = deferredAppliedRulesRef . current . get ( rule . id )
106+ return deferredRule && ! isCompleteRule ( rule )
107+ ? { ...deferredRule , logicalOperator : rule . logicalOperator }
108+ : rule
109+ } )
85110
86- const nextFilter = toAppliedPredicate ( nextRules , columns , true )
111+ const nextFilter = toAppliedPredicate ( appliedRules , columns , true )
87112 const signature = JSON . stringify ( nextFilter )
88113 if ( signature === lastAppliedFilterRef . current ) return
89114 lastAppliedFilterRef . current = signature
0 commit comments