@xh/hoist 47.1.1 → 47.1.2
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/CHANGELOG.md +7 -0
- package/data/filter/FieldFilter.js +25 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -80,14 +80,15 @@ export class FieldFilter extends Filter {
|
|
|
80
80
|
|
|
81
81
|
if (store) {
|
|
82
82
|
const storeField = store.getField(field);
|
|
83
|
-
if (!storeField) return () => true; // Ignore if field not in store
|
|
83
|
+
if (!storeField) return () => true; // Ignore (do not filter out) if field not in store
|
|
84
84
|
|
|
85
85
|
const fieldType = storeField.type;
|
|
86
86
|
value = isArray(value) ?
|
|
87
87
|
value.map(v => parseFieldValue(v, fieldType)) :
|
|
88
88
|
parseFieldValue(value, fieldType);
|
|
89
89
|
}
|
|
90
|
-
const getVal = store ? r => r.committedData[field] : r => r[field]
|
|
90
|
+
const getVal = store ? r => r.committedData[field] : r => r[field],
|
|
91
|
+
doNotFilter = r => store && isNil(r.committedData); // Ignore (do not filter out) record if part of a store and it has no committed data
|
|
91
92
|
|
|
92
93
|
if (FieldFilter.ARRAY_OPERATORS.includes(op)) {
|
|
93
94
|
value = castArray(value);
|
|
@@ -96,48 +97,66 @@ export class FieldFilter extends Filter {
|
|
|
96
97
|
switch (op) {
|
|
97
98
|
case '=':
|
|
98
99
|
return r => {
|
|
100
|
+
if (doNotFilter(r)) return true;
|
|
99
101
|
let v = getVal(r);
|
|
100
102
|
if (isNil(v) || v === '') v = null;
|
|
101
103
|
return value.includes(v);
|
|
102
104
|
};
|
|
103
105
|
case '!=':
|
|
104
106
|
return r => {
|
|
107
|
+
if (doNotFilter(r)) return true;
|
|
105
108
|
let v = getVal(r);
|
|
106
109
|
if (isNil(v) || v === '') v = null;
|
|
107
110
|
return !value.includes(v);
|
|
108
111
|
};
|
|
109
112
|
case '>':
|
|
110
113
|
return r => {
|
|
114
|
+
if (doNotFilter(r)) return true;
|
|
111
115
|
const v = getVal(r);
|
|
112
116
|
return !isNil(v) && v > value;
|
|
113
117
|
};
|
|
114
118
|
case '>=':
|
|
115
119
|
return r => {
|
|
120
|
+
if (doNotFilter(r)) return true;
|
|
116
121
|
const v = getVal(r);
|
|
117
122
|
return !isNil(v) && v >= value;
|
|
118
123
|
};
|
|
119
124
|
case '<':
|
|
120
125
|
return r => {
|
|
126
|
+
if (doNotFilter(r)) return true;
|
|
121
127
|
const v = getVal(r);
|
|
122
128
|
return !isNil(v) && v < value;
|
|
123
129
|
};
|
|
124
130
|
case '<=':
|
|
125
131
|
return r => {
|
|
132
|
+
if (doNotFilter(r)) return true;
|
|
126
133
|
const v = getVal(r);
|
|
127
134
|
return !isNil(v) && v <= value;
|
|
128
135
|
};
|
|
129
136
|
case 'like':
|
|
130
137
|
regExps = value.map(v => new RegExp(escapeRegExp(v), 'i'));
|
|
131
|
-
return r =>
|
|
138
|
+
return r => {
|
|
139
|
+
if (doNotFilter(r)) return true;
|
|
140
|
+
return regExps.some(re => re.test(getVal(r)));
|
|
141
|
+
};
|
|
132
142
|
case 'not like':
|
|
133
143
|
regExps = value.map(v => new RegExp(escapeRegExp(v), 'i'));
|
|
134
|
-
return r =>
|
|
144
|
+
return r => {
|
|
145
|
+
if (doNotFilter(r)) return true;
|
|
146
|
+
regExps.every(re => !re.test(getVal(r)));
|
|
147
|
+
};
|
|
135
148
|
case 'begins':
|
|
136
149
|
regExps = value.map(v => new RegExp('^' + escapeRegExp(v), 'i'));
|
|
137
|
-
return r =>
|
|
150
|
+
return r => {
|
|
151
|
+
if (doNotFilter(r)) return true;
|
|
152
|
+
regExps.some(re => re.test(getVal(r)));
|
|
153
|
+
};
|
|
138
154
|
case 'ends':
|
|
139
155
|
regExps = value.map(v => new RegExp(escapeRegExp(v) + '$', 'i'));
|
|
140
|
-
return r =>
|
|
156
|
+
return r => {
|
|
157
|
+
if (doNotFilter(r)) return true;
|
|
158
|
+
regExps.some(re => re.test(getVal(r)));
|
|
159
|
+
};
|
|
141
160
|
default:
|
|
142
161
|
throw XH.exception(`Unknown operator: ${op}`);
|
|
143
162
|
}
|