3
3
createSingleFilter ,
4
4
isEqualPath ,
5
5
isValidRule ,
6
- type FilterGroup ,
6
+ type FilterGroupInput ,
7
7
type SingleFilter ,
8
+ type SingleFilterInput ,
8
9
} from "@fn-sphere/core" ;
9
10
import { fromFilterMap , getDepthOfRule , toFilterMap } from "../filter-map.js" ;
10
11
import { useFilterSchemaContext } from "./use-filter-schema-context.js" ;
@@ -40,19 +41,27 @@ export const useFilterRule = (rule: SingleFilter) => {
40
41
( filter ) => filter . name === rule . name ,
41
42
) ;
42
43
43
- // TODO ignore FilterId in user input
44
- const updateRule = ( newRule : SingleFilter ) => {
44
+ const setRule = ( input : SingleFilterInput ) => {
45
45
onFilterMapChange ( {
46
46
...filterMap ,
47
47
[ rule . id ] : {
48
48
type : "Filter" ,
49
- data : newRule ,
49
+ data : {
50
+ ...createSingleFilter ( input ) ,
51
+ id : rule . id ,
52
+ } ,
50
53
parentId,
51
54
} ,
52
55
} ) ;
53
56
} ;
54
57
55
- const appendRule = ( newRule : SingleFilter = createSingleFilter ( ) ) => {
58
+ /**
59
+ * @deprecated Use {@link setRule} instead
60
+ */
61
+ const updateRule = setRule ;
62
+
63
+ const appendRule = ( input ?: SingleFilterInput ) => {
64
+ const newRule = createSingleFilter ( input ) ;
56
65
onFilterMapChange ( {
57
66
...filterMap ,
58
67
[ parentId ] : {
@@ -72,12 +81,20 @@ export const useFilterRule = (rule: SingleFilter) => {
72
81
return newRule ;
73
82
} ;
74
83
84
+ const duplicateRule = ( ) => {
85
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
86
+ const { id : _ , ...ruleWithoutId } = rule ;
87
+ const newRule = createSingleFilter ( ruleWithoutId ) ;
88
+ return appendRule ( newRule ) ;
89
+ } ;
90
+
75
91
const appendGroup = (
76
- newFilterGroup : FilterGroup = createFilterGroup ( {
92
+ input : FilterGroupInput = {
77
93
op : "and" ,
78
94
conditions : [ createSingleFilter ( ) ] ,
79
- } ) ,
95
+ } ,
80
96
) => {
97
+ const newFilterGroup = createFilterGroup ( input ) ;
81
98
onFilterMapChange ( {
82
99
...filterMap ,
83
100
[ parentId ] : {
@@ -139,6 +156,15 @@ export const useFilterRule = (rule: SingleFilter) => {
139
156
onFilterMapChange ( newFilterMap ) ;
140
157
} ;
141
158
159
+ const invertRule = ( invert ?: SingleFilter [ "invert" ] ) => {
160
+ const oldInvert = rule . invert ;
161
+ const newInvert = invert === undefined ? ! oldInvert : invert ;
162
+ if ( oldInvert === newInvert ) {
163
+ return ;
164
+ }
165
+ setRule ( { ...rule , invert : newInvert } ) ;
166
+ } ;
167
+
142
168
const isLastRule = index === parentNode . conditionIds . length - 1 ;
143
169
144
170
return {
@@ -170,12 +196,17 @@ export const useFilterRule = (rule: SingleFilter) => {
170
196
selectedField,
171
197
selectedFilter,
172
198
199
+ setRule,
200
+ /**
201
+ * @deprecated Use {@link setRule} instead
202
+ */
173
203
updateRule,
174
204
appendRule,
175
205
appendGroup,
176
206
removeRule,
177
207
// moveRule,
178
- // duplicateRule,
208
+ duplicateRule,
209
+ invertRule,
179
210
// turnIntoGroup,
180
211
} ;
181
212
} ;
0 commit comments