1- import { tag } from "@mendix/filter-commons/condition-utils" ;
1+ import { reduceMap , restoreMap } from "@mendix/filter-commons/condition-utils" ;
22import { FilterData , FiltersSettingsMap , PlainJs , Serializable } from "@mendix/filter-commons/typings/settings" ;
33import { FilterCondition } from "mendix/filters" ;
4- import { and } from "mendix/filters/builders" ;
5- import { autorun , makeAutoObservable } from "mobx" ;
4+ import { action , autorun , makeAutoObservable } from "mobx" ;
65import { Filter , ObservableFilterHost } from "../../typings/ObservableFilterHost" ;
6+ import { ConditionWithMeta } from "./CombinedFilter" ;
77
88export class CustomFilterHost implements ObservableFilterHost , Serializable {
99 private filters : Map < string , [ store : Filter , dispose : ( ) => void ] > = new Map ( ) ;
1010 private settingsBuffer : FiltersSettingsMap < string > = new Map ( ) ;
11+ private _state : Map < string , FilterCondition | undefined > = new Map ( ) ;
12+
13+ readonly metaKey = "custom-filter-host" ;
1114
1215 constructor ( ) {
13- makeAutoObservable ( this ) ;
16+ makeAutoObservable ( this , {
17+ hydrate : action
18+ } ) ;
1419 }
1520
1621 get settings ( ) : FiltersSettingsMap < string > {
@@ -21,22 +26,26 @@ export class CustomFilterHost implements ObservableFilterHost, Serializable {
2126 this . settingsBuffer = data ;
2227 }
2328
24- get conditions ( ) : Array < FilterCondition | undefined > {
25- return [ ...this . filters ] . map ( ( [ key , [ { condition } ] ] ) => {
26- return condition ? and ( tag ( key ) , condition ) : undefined ;
27- } ) ;
28- }
29-
3029 observe ( key : string , filter : Filter ) : void {
3130 this . unobserve ( key ) ;
32- const clear = autorun ( ( ) => {
31+ const clearSettingsSync = autorun ( ( ) => {
3332 if ( this . settingsBuffer . has ( key ) ) {
3433 filter . fromJSON ( this . settingsBuffer . get ( key ) ) ;
3534 }
3635 } ) ;
36+ const clearStateSync = autorun ( ( ) => {
37+ this . _state . set ( key , filter . condition ) ;
38+ } ) ;
39+ const skipInit = this . settingsBuffer . has ( key ) ;
40+ if ( ! skipInit && this . _state . has ( key ) ) {
41+ filter . fromViewState ( this . _state . get ( key ) ! ) ;
42+ }
43+
3744 const dispose = ( ) : void => {
38- clear ( ) ;
45+ clearSettingsSync ( ) ;
46+ clearStateSync ( ) ;
3947 this . filters . delete ( key ) ;
48+ this . _state . delete ( key ) ;
4049 } ;
4150 this . filters . set ( key , [ filter , dispose ] ) ;
4251 }
@@ -58,4 +67,24 @@ export class CustomFilterHost implements ObservableFilterHost, Serializable {
5867
5968 this . settings = new Map ( data as Array < [ string , FilterData ] > ) ;
6069 }
70+
71+ get condWithMeta ( ) : ConditionWithMeta {
72+ const conditions : Record < string , FilterCondition | undefined > = { } ;
73+
74+ for ( const [ key , [ filter ] ] of this . filters ) {
75+ conditions [ key ] = filter . condition ;
76+ }
77+
78+ const [ cond , meta ] = reduceMap ( conditions ) ;
79+
80+ return {
81+ cond,
82+ meta
83+ } ;
84+ }
85+
86+ hydrate ( { cond, meta } : ConditionWithMeta ) : void {
87+ const map = restoreMap ( cond , meta ) ;
88+ this . _state = new Map ( Object . entries ( map ) ) ;
89+ }
6190}
0 commit comments