@pibit.ai/cure-design-system 0.6.36 → 0.6.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +311 -288
- package/dist/patterns/condition-builder/condition-builder.d.ts.map +1 -1
- package/dist/patterns/condition-builder/condition-builder.js +47 -47
- package/dist/patterns/condition-builder/utils.d.ts.map +1 -1
- package/dist/patterns/filter-group/date-adapter.d.ts +20 -0
- package/dist/patterns/filter-group/date-adapter.d.ts.map +1 -0
- package/dist/patterns/filter-group/date-adapter.js +38 -0
- package/dist/patterns/filter-group/document-fields-to-tree.d.ts +33 -0
- package/dist/patterns/filter-group/document-fields-to-tree.d.ts.map +1 -0
- package/dist/patterns/filter-group/document-fields-to-tree.js +53 -0
- package/dist/patterns/filter-group/filter-condition-row.d.ts +47 -0
- package/dist/patterns/filter-group/filter-condition-row.d.ts.map +1 -0
- package/dist/patterns/filter-group/filter-condition-row.js +642 -0
- package/dist/patterns/filter-group/filter-group-builder.d.ts +42 -0
- package/dist/patterns/filter-group/filter-group-builder.d.ts.map +1 -0
- package/dist/patterns/filter-group/filter-group-builder.js +92 -0
- package/dist/patterns/filter-group/filter-group-card.d.ts +25 -0
- package/dist/patterns/filter-group/filter-group-card.d.ts.map +1 -0
- package/dist/patterns/filter-group/filter-group-card.js +266 -0
- package/dist/patterns/filter-group/index.d.ts +11 -0
- package/dist/patterns/filter-group/index.d.ts.map +1 -0
- package/dist/patterns/filter-group/nested-field-select.d.ts +68 -0
- package/dist/patterns/filter-group/nested-field-select.d.ts.map +1 -0
- package/dist/patterns/filter-group/nested-field-select.js +431 -0
- package/dist/patterns/filter-group/types.d.ts +105 -0
- package/dist/patterns/filter-group/types.d.ts.map +1 -0
- package/dist/patterns/filter-group/types.js +222 -0
- package/dist/patterns/filter-group/use-filter-group.d.ts +38 -0
- package/dist/patterns/filter-group/use-filter-group.d.ts.map +1 -0
- package/dist/patterns/filter-group/use-filter-group.js +81 -0
- package/dist/patterns/filter-group/validation.d.ts +13 -0
- package/dist/patterns/filter-group/validation.d.ts.map +1 -0
- package/dist/patterns/filter-group/validation.js +19 -0
- package/dist/styles/components.css +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
const n = [
|
|
2
|
+
{
|
|
3
|
+
label: "is empty",
|
|
4
|
+
id: "empty",
|
|
5
|
+
applicableTo: ["string", "number", "float", "list", "date", "dict", "boolean"],
|
|
6
|
+
requiresValue: !1
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
label: "is not empty",
|
|
10
|
+
id: "notEmpty",
|
|
11
|
+
applicableTo: ["string", "number", "float", "list", "date", "dict", "boolean"],
|
|
12
|
+
requiresValue: !1
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
label: "exists",
|
|
16
|
+
id: "exists",
|
|
17
|
+
applicableTo: ["string", "number", "float", "list", "date", "dict", "boolean"],
|
|
18
|
+
requiresValue: !1
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
label: "does not exist",
|
|
22
|
+
id: "notExists",
|
|
23
|
+
applicableTo: ["string", "number", "float", "list", "date", "dict", "boolean"],
|
|
24
|
+
requiresValue: !1
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
label: "name match using AI",
|
|
28
|
+
id: "name_match_using_ai",
|
|
29
|
+
applicableTo: ["string"],
|
|
30
|
+
requiresValue: !0
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "name match using AI in List",
|
|
34
|
+
id: "name_match_using_ai_in_list",
|
|
35
|
+
applicableTo: ["string"],
|
|
36
|
+
requiresValue: !0
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: "equals",
|
|
40
|
+
id: "==",
|
|
41
|
+
applicableTo: ["string", "number", "float", "date", "boolean"],
|
|
42
|
+
requiresValue: !0
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: "not equals",
|
|
46
|
+
id: "!=",
|
|
47
|
+
applicableTo: ["string", "number", "float", "date", "boolean"],
|
|
48
|
+
requiresValue: !0
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
label: "greater than",
|
|
52
|
+
id: ">",
|
|
53
|
+
applicableTo: ["number", "float", "date"],
|
|
54
|
+
requiresValue: !0
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: "greater than or equal",
|
|
58
|
+
id: ">=",
|
|
59
|
+
applicableTo: ["number", "float", "date"],
|
|
60
|
+
requiresValue: !0
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
label: "less than",
|
|
64
|
+
id: "<",
|
|
65
|
+
applicableTo: ["number", "float", "date"],
|
|
66
|
+
requiresValue: !0
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
label: "less than or equal",
|
|
70
|
+
id: "<=",
|
|
71
|
+
applicableTo: ["number", "float", "date"],
|
|
72
|
+
requiresValue: !0
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
label: "in",
|
|
76
|
+
id: "in",
|
|
77
|
+
applicableTo: ["string"],
|
|
78
|
+
requiresValue: !0,
|
|
79
|
+
requiresMultipleValues: !0
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
label: "not in",
|
|
83
|
+
id: "notIn",
|
|
84
|
+
applicableTo: ["string"],
|
|
85
|
+
requiresValue: !0,
|
|
86
|
+
requiresMultipleValues: !0
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
label: "present in",
|
|
90
|
+
id: "presentIn",
|
|
91
|
+
applicableTo: ["string"],
|
|
92
|
+
requiresValue: !0,
|
|
93
|
+
requiresMultipleValues: !0
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
label: "not present in",
|
|
97
|
+
id: "notPresentIn",
|
|
98
|
+
applicableTo: ["string"],
|
|
99
|
+
requiresValue: !0,
|
|
100
|
+
requiresMultipleValues: !0
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
label: "contains",
|
|
104
|
+
id: "contains",
|
|
105
|
+
applicableTo: ["string", "list"],
|
|
106
|
+
requiresValue: !0
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
label: "Does not contains",
|
|
110
|
+
id: "notContains",
|
|
111
|
+
applicableTo: ["string", "list"],
|
|
112
|
+
requiresValue: !0
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
label: "Contains all",
|
|
116
|
+
id: "containsAll",
|
|
117
|
+
applicableTo: ["list"],
|
|
118
|
+
requiresValue: !0,
|
|
119
|
+
requiresMultipleValues: !0
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
label: "Contains any",
|
|
123
|
+
id: "containsAny",
|
|
124
|
+
applicableTo: ["list"],
|
|
125
|
+
requiresValue: !0,
|
|
126
|
+
requiresMultipleValues: !0
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
label: "Contains none",
|
|
130
|
+
id: "containsNone",
|
|
131
|
+
applicableTo: ["list"],
|
|
132
|
+
requiresValue: !0,
|
|
133
|
+
requiresMultipleValues: !0
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
label: "Is true",
|
|
137
|
+
id: "isTrue",
|
|
138
|
+
applicableTo: ["boolean"],
|
|
139
|
+
requiresValue: !1
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
label: "Is false",
|
|
143
|
+
id: "isFalse",
|
|
144
|
+
applicableTo: ["boolean"],
|
|
145
|
+
requiresValue: !1
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
label: "Before",
|
|
149
|
+
id: "before",
|
|
150
|
+
applicableTo: ["date"],
|
|
151
|
+
requiresValue: !1
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
label: "After",
|
|
155
|
+
id: "after",
|
|
156
|
+
applicableTo: ["date"],
|
|
157
|
+
requiresValue: !0
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
label: "On or before",
|
|
161
|
+
id: "onOrBefore",
|
|
162
|
+
applicableTo: ["date"],
|
|
163
|
+
requiresValue: !0
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
label: "On or After",
|
|
167
|
+
id: "onOrAfter",
|
|
168
|
+
applicableTo: ["date"],
|
|
169
|
+
requiresValue: !0
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
label: "Between",
|
|
173
|
+
id: "between",
|
|
174
|
+
applicableTo: ["date"],
|
|
175
|
+
requiresValue: !0
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
label: "Regex matches",
|
|
179
|
+
id: "regexMatch",
|
|
180
|
+
applicableTo: ["string", "number", "float"],
|
|
181
|
+
requiresValue: !0
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
label: "Regex does not matches",
|
|
185
|
+
id: "regexNotMatch",
|
|
186
|
+
applicableTo: ["string", "number", "float"],
|
|
187
|
+
requiresValue: !0
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
label: "Starts with",
|
|
191
|
+
id: "startsWith",
|
|
192
|
+
applicableTo: ["string"],
|
|
193
|
+
requiresValue: !0
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
label: "Ends with",
|
|
197
|
+
id: "endsWith",
|
|
198
|
+
applicableTo: ["string"],
|
|
199
|
+
requiresValue: !0
|
|
200
|
+
}
|
|
201
|
+
], i = () => crypto.randomUUID(), p = (l, t = n) => {
|
|
202
|
+
var a;
|
|
203
|
+
const e = l[0], r = (e == null ? void 0 : e.type) || "string", u = ((a = t.filter((s) => s.applicableTo.includes(r))[0]) == null ? void 0 : a.id) || "";
|
|
204
|
+
return {
|
|
205
|
+
id: i(),
|
|
206
|
+
type: "condition",
|
|
207
|
+
fieldId: (e == null ? void 0 : e.id) || "",
|
|
208
|
+
operatorId: u,
|
|
209
|
+
value: ""
|
|
210
|
+
};
|
|
211
|
+
}, b = (l = "and") => ({
|
|
212
|
+
id: i(),
|
|
213
|
+
type: "group",
|
|
214
|
+
operator: l,
|
|
215
|
+
children: []
|
|
216
|
+
});
|
|
217
|
+
export {
|
|
218
|
+
n as DEFAULT_OPERATORS,
|
|
219
|
+
p as createEmptyCondition,
|
|
220
|
+
b as createEmptyGroup,
|
|
221
|
+
i as generateId
|
|
222
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FilterGroup, FilterField, FilterOperator, FilterLogicalOperator } from './types';
|
|
2
|
+
export interface UseFilterGroupOptions {
|
|
3
|
+
/** Initial filter group state */
|
|
4
|
+
initialValue?: FilterGroup;
|
|
5
|
+
/** Available fields for filtering */
|
|
6
|
+
fields: FilterField[];
|
|
7
|
+
/** Available operators */
|
|
8
|
+
operators?: FilterOperator[];
|
|
9
|
+
/** Callback when filters change */
|
|
10
|
+
onChange?: (value: FilterGroup) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface UseFilterGroupReturn {
|
|
13
|
+
/** Current filter group state */
|
|
14
|
+
filterGroup: FilterGroup;
|
|
15
|
+
/** Update the entire filter group */
|
|
16
|
+
setFilterGroup: (group: FilterGroup) => void;
|
|
17
|
+
/** Add a condition at the root level */
|
|
18
|
+
addCondition: () => void;
|
|
19
|
+
/** Add a nested group at the root level */
|
|
20
|
+
addGroup: (operator?: FilterLogicalOperator) => void;
|
|
21
|
+
/** Clear all filters */
|
|
22
|
+
clearAll: () => void;
|
|
23
|
+
/** Check if there are any active filters */
|
|
24
|
+
hasFilters: boolean;
|
|
25
|
+
/** Get the count of active conditions */
|
|
26
|
+
conditionCount: number;
|
|
27
|
+
/** Convert to a query-friendly format */
|
|
28
|
+
toQueryParams: () => Record<string, unknown>;
|
|
29
|
+
/** Check if the filter configuration is valid */
|
|
30
|
+
isValid: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Hook for managing filter group state
|
|
34
|
+
* Provides utilities for common operations and state management
|
|
35
|
+
*/
|
|
36
|
+
export declare const useFilterGroup: ({ initialValue, fields, operators, onChange, }: UseFilterGroupOptions) => UseFilterGroupReturn;
|
|
37
|
+
export default useFilterGroup;
|
|
38
|
+
//# sourceMappingURL=use-filter-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-filter-group.d.ts","sourceRoot":"","sources":["../../../src/patterns/filter-group/use-filter-group.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAA+B,WAAW,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG5H,MAAM,WAAW,qBAAqB;IAClC,iCAAiC;IACjC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,qCAAqC;IACrC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACjC,iCAAiC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,qCAAqC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,wCAAwC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACrD,wBAAwB;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,aAAa,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,gDAK5B,qBAAqB,KAAG,oBAsH1B,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { useState as b, useCallback as o, useMemo as m } from "react";
|
|
2
|
+
import { createEmptyGroup as v, createEmptyCondition as I, DEFAULT_OPERATORS as O } from "./types.js";
|
|
3
|
+
const R = ({
|
|
4
|
+
initialValue: G,
|
|
5
|
+
fields: s,
|
|
6
|
+
operators: l = O,
|
|
7
|
+
onChange: a
|
|
8
|
+
}) => {
|
|
9
|
+
const [r, q] = b(G || v("and")), c = o(
|
|
10
|
+
(e) => {
|
|
11
|
+
q(e), a == null || a(e);
|
|
12
|
+
},
|
|
13
|
+
[a]
|
|
14
|
+
), F = o(() => {
|
|
15
|
+
const e = I(s, l);
|
|
16
|
+
c({
|
|
17
|
+
...r,
|
|
18
|
+
children: [...r.children, e]
|
|
19
|
+
});
|
|
20
|
+
}, [r, s, l, c]), E = o(
|
|
21
|
+
(e) => {
|
|
22
|
+
const i = v(e || (r.operator === "and" ? "or" : "and"));
|
|
23
|
+
i.children = [I(s, l)], c({
|
|
24
|
+
...r,
|
|
25
|
+
children: [...r.children, i]
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
[r, s, l, c]
|
|
29
|
+
), V = o(() => {
|
|
30
|
+
c(v("and"));
|
|
31
|
+
}, [c]), f = o((e) => e.type === "condition" ? 1 : e.children.reduce((i, t) => i + f(t), 0), []), y = m(
|
|
32
|
+
() => r.children.reduce((e, i) => e + f(i), 0),
|
|
33
|
+
[r, f]
|
|
34
|
+
), w = y > 0, p = o(
|
|
35
|
+
(e) => {
|
|
36
|
+
if (e.type === "condition") {
|
|
37
|
+
const t = e;
|
|
38
|
+
if (!t.fieldId || !t.operatorId) return !1;
|
|
39
|
+
const u = l.find((d) => d.id === t.operatorId);
|
|
40
|
+
return !(u != null && u.requiresValue && !t.value || u != null && u.requiresTwoValues && (!t.value || !t.value2));
|
|
41
|
+
}
|
|
42
|
+
const i = e;
|
|
43
|
+
return i.children.length === 0 ? !0 : i.children.every((t) => p(t));
|
|
44
|
+
},
|
|
45
|
+
[l]
|
|
46
|
+
), A = m(() => r.children.length === 0 ? !0 : r.children.every((e) => p(e)), [r, p]), S = o(() => {
|
|
47
|
+
const e = (t) => {
|
|
48
|
+
if (t.type === "condition") {
|
|
49
|
+
const n = t;
|
|
50
|
+
if (!n.fieldId || !n.operatorId) return null;
|
|
51
|
+
const h = l.find((T) => T.id === n.operatorId);
|
|
52
|
+
return h != null && h.requiresValue && !n.value ? null : {
|
|
53
|
+
field: n.fieldId,
|
|
54
|
+
operator: n.operatorId,
|
|
55
|
+
value: n.value,
|
|
56
|
+
...n.value2 && { value2: n.value2 }
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const u = t, d = u.children.map((n) => e(n)).filter(Boolean);
|
|
60
|
+
return d.length === 0 ? null : d.length === 1 ? d[0] : {
|
|
61
|
+
[u.operator]: d
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
return e(r) || {};
|
|
65
|
+
}, [r, l]);
|
|
66
|
+
return {
|
|
67
|
+
filterGroup: r,
|
|
68
|
+
setFilterGroup: c,
|
|
69
|
+
addCondition: F,
|
|
70
|
+
addGroup: E,
|
|
71
|
+
clearAll: V,
|
|
72
|
+
hasFilters: w,
|
|
73
|
+
conditionCount: y,
|
|
74
|
+
toQueryParams: S,
|
|
75
|
+
isValid: A
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export {
|
|
79
|
+
R as default,
|
|
80
|
+
R as useFilterGroup
|
|
81
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FilterGroup, FilterOperator } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Validates a filter group and returns a Set of invalid condition IDs
|
|
4
|
+
* @param group The filter group to validate
|
|
5
|
+
* @param operators Available operators
|
|
6
|
+
* @returns Set of condition IDs that are invalid
|
|
7
|
+
*/
|
|
8
|
+
export declare const validateFilterGroup: (group: FilterGroup, operators?: FilterOperator[]) => Set<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if a filter group is valid (all conditions are complete)
|
|
11
|
+
*/
|
|
12
|
+
export declare const isFilterGroupValid: (group: FilterGroup, operators?: FilterOperator[]) => boolean;
|
|
13
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/patterns/filter-group/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA+B,cAAc,EAAE,MAAM,SAAS,CAAC;AAoDxF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC5B,OAAO,WAAW,EAClB,YAAW,cAAc,EAAsB,KAChD,GAAG,CAAC,MAAM,CAcZ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,WAAW,EAAE,YAAW,cAAc,EAAsB,KAAG,OAGxG,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DEFAULT_OPERATORS as l } from "./types.js";
|
|
2
|
+
const f = (e, t = l) => {
|
|
3
|
+
var i, a, n;
|
|
4
|
+
if (!e.fieldId || !e.operatorId)
|
|
5
|
+
return !1;
|
|
6
|
+
const r = t.find((u) => u.id === e.operatorId);
|
|
7
|
+
return !(!r || r.requiresValue && !((i = e.value) != null && i.trim()) || r.requiresTwoValues && (!((a = e.value) != null && a.trim()) || !((n = e.value2) != null && n.trim())));
|
|
8
|
+
}, s = (e, t = l, r = /* @__PURE__ */ new Set()) => (e.type === "condition" ? f(e, t) || r.add(e.id) : e.children.forEach((i) => {
|
|
9
|
+
s(i, t, r);
|
|
10
|
+
}), r), d = (e, t = l) => {
|
|
11
|
+
const r = /* @__PURE__ */ new Set();
|
|
12
|
+
return e.children.length === 0 || e.children.forEach((i) => {
|
|
13
|
+
s(i, t, r);
|
|
14
|
+
}), r;
|
|
15
|
+
}, c = (e, t = l) => d(e, t).size === 0;
|
|
16
|
+
export {
|
|
17
|
+
c as isFilterGroupValid,
|
|
18
|
+
d as validateFilterGroup
|
|
19
|
+
};
|