1
- import { tag } from "@mendix/filter-commons/condition-utils" ;
1
+ import { reduceMap , restoreMap } from "@mendix/filter-commons/condition-utils" ;
2
2
import { FilterData , FiltersSettingsMap , PlainJs , Serializable } from "@mendix/filter-commons/typings/settings" ;
3
3
import { FilterCondition } from "mendix/filters" ;
4
- import { and } from "mendix/filters/builders" ;
5
- import { autorun , makeAutoObservable } from "mobx" ;
4
+ import { action , autorun , makeAutoObservable } from "mobx" ;
6
5
import { Filter , ObservableFilterHost } from "../../typings/ObservableFilterHost" ;
6
+ import { ConditionWithMeta } from "./CombinedFilter" ;
7
7
8
8
export class CustomFilterHost implements ObservableFilterHost , Serializable {
9
9
private filters : Map < string , [ store : Filter , dispose : ( ) => void ] > = new Map ( ) ;
10
10
private settingsBuffer : FiltersSettingsMap < string > = new Map ( ) ;
11
+ private _state : Map < string , FilterCondition | undefined > = new Map ( ) ;
12
+
13
+ readonly metaKey = "custom-filter-host" ;
11
14
12
15
constructor ( ) {
13
- makeAutoObservable ( this ) ;
16
+ makeAutoObservable ( this , {
17
+ hydrate : action
18
+ } ) ;
14
19
}
15
20
16
21
get settings ( ) : FiltersSettingsMap < string > {
@@ -21,22 +26,26 @@ export class CustomFilterHost implements ObservableFilterHost, Serializable {
21
26
this . settingsBuffer = data ;
22
27
}
23
28
24
- get conditions ( ) : Array < FilterCondition | undefined > {
25
- return [ ...this . filters ] . map ( ( [ key , [ { condition } ] ] ) => {
26
- return condition ? and ( tag ( key ) , condition ) : undefined ;
27
- } ) ;
28
- }
29
-
30
29
observe ( key : string , filter : Filter ) : void {
31
30
this . unobserve ( key ) ;
32
- const clear = autorun ( ( ) => {
31
+ const clearSettingsSync = autorun ( ( ) => {
33
32
if ( this . settingsBuffer . has ( key ) ) {
34
33
filter . fromJSON ( this . settingsBuffer . get ( key ) ) ;
35
34
}
36
35
} ) ;
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
+
37
44
const dispose = ( ) : void => {
38
- clear ( ) ;
45
+ clearSettingsSync ( ) ;
46
+ clearStateSync ( ) ;
39
47
this . filters . delete ( key ) ;
48
+ this . _state . delete ( key ) ;
40
49
} ;
41
50
this . filters . set ( key , [ filter , dispose ] ) ;
42
51
}
@@ -58,4 +67,24 @@ export class CustomFilterHost implements ObservableFilterHost, Serializable {
58
67
59
68
this . settings = new Map ( data as Array < [ string , FilterData ] > ) ;
60
69
}
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
+ }
61
90
}
0 commit comments