@vuu-ui/vuu-utils 0.13.44 → 0.13.45
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/cjs/packages/vuu-utils/src/column-utils.js +1 -1
- package/cjs/packages/vuu-utils/src/column-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js +3 -1
- package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
- package/cjs/packages/vuu-utils/src/date/date-utils.js +8 -0
- package/cjs/packages/vuu-utils/src/date/date-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/filters/filter-utils.js +131 -32
- package/cjs/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/form-utils.js +8 -0
- package/cjs/packages/vuu-utils/src/form-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/index.js +2 -0
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/esm/packages/vuu-utils/src/column-utils.js +1 -1
- package/esm/packages/vuu-utils/src/column-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js +3 -1
- package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
- package/esm/packages/vuu-utils/src/date/date-utils.js +8 -0
- package/esm/packages/vuu-utils/src/date/date-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/filters/filter-utils.js +131 -34
- package/esm/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/form-utils.js +9 -1
- package/esm/packages/vuu-utils/src/form-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +1 -1
- package/package.json +6 -6
- package/types/column-utils.d.ts +1 -1
- package/types/date/date-utils.d.ts +4 -1
- package/types/filters/filter-utils.d.ts +23 -10
- package/types/form-utils.d.ts +3 -2
|
@@ -14,7 +14,7 @@ var __typeError = (msg) => {
|
|
|
14
14
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
15
15
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
16
16
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
17
|
-
var
|
|
17
|
+
var _filters, _columns, _filters2, _values;
|
|
18
18
|
const singleValueFilterOps = /* @__PURE__ */ new Set([
|
|
19
19
|
"=",
|
|
20
20
|
"!=",
|
|
@@ -32,8 +32,9 @@ const isSingleValueFilter = (f) => f !== void 0 && singleValueFilterOps.has(f.op
|
|
|
32
32
|
const isFilterClause = (f) => f !== void 0 && (isSingleValueFilter(f) || isMultiValueFilter(f));
|
|
33
33
|
const isMultiValueFilter = (f) => f !== void 0 && f.op === "in";
|
|
34
34
|
const isInFilter = (f) => f.op === "in";
|
|
35
|
-
const isAndFilter = (f) => f
|
|
36
|
-
const
|
|
35
|
+
const isAndFilter = (f) => f?.op === "and";
|
|
36
|
+
const isBetweenFilter = (f) => isAndFilter(f) && f.filters.length === 2 && f.filters[0].column === f.filters[1].column && f.filters[0].op === ">" && f.filters[1].op === "<";
|
|
37
|
+
const isOrFilter = (f) => f?.op === "or";
|
|
37
38
|
const isCompleteFilter = (filter) => isSingleValueFilter(filter) && filter.column !== void 0 && filter.op !== void 0 && filter.value !== void 0;
|
|
38
39
|
function isMultiClauseFilter(f) {
|
|
39
40
|
return f !== void 0 && (f.op === "and" || f.op === "or");
|
|
@@ -87,22 +88,115 @@ const collectFiltersForColumn = (filter, columnName) => {
|
|
|
87
88
|
filters: results
|
|
88
89
|
};
|
|
89
90
|
};
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
const stringifyBoolean = (value) => typeof value === "boolean" ? "${filter.value}" : value;
|
|
92
|
+
const getColumnValueFromFilter = (column, operator, filter) => {
|
|
93
|
+
if (isSingleValueFilter(filter)) {
|
|
94
|
+
if (filter.column === column.name) {
|
|
95
|
+
if (operator === "between") {
|
|
96
|
+
if (filter.op === "=") {
|
|
97
|
+
return [`${filter.value}`, ""];
|
|
98
|
+
} else if (filter.op === "<") {
|
|
99
|
+
return ["", `${filter.value}`];
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
return stringifyBoolean(filter.value);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} else if (isBetweenFilter(filter)) {
|
|
106
|
+
if (filter.filters[0].column === column.name) {
|
|
107
|
+
const [{ value: v1 }, { value: v2 }] = filter.filters;
|
|
108
|
+
return [`${v1}`, `${v2}`];
|
|
109
|
+
} else {
|
|
110
|
+
return ["", ""];
|
|
111
|
+
}
|
|
112
|
+
} else if (isAndFilter(filter)) {
|
|
113
|
+
const filterForColumn = filter.filters.find(
|
|
114
|
+
(f) => isBetweenFilter(f) ? f.filters[0].column === column.name : f.column === column.name
|
|
115
|
+
);
|
|
116
|
+
if (isSingleValueFilter(filterForColumn)) {
|
|
117
|
+
return stringifyBoolean(filterForColumn.value);
|
|
118
|
+
} else if (operator === "between" && isBetweenFilter(filterForColumn)) {
|
|
119
|
+
const [{ value: v1 }, { value: v2 }] = filterForColumn.filters;
|
|
120
|
+
return [`${v1}`, `${v2}`];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (operator === "between") {
|
|
124
|
+
if (column.type === "time") {
|
|
125
|
+
return ["00:00:00", "23:59:59"];
|
|
126
|
+
} else {
|
|
127
|
+
return ["", ""];
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
return "";
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
class FilterAggregator {
|
|
134
|
+
constructor(filter) {
|
|
95
135
|
__privateAdd(this, _filters, /* @__PURE__ */ new Map());
|
|
136
|
+
if (isSingleValueFilter(filter)) {
|
|
137
|
+
__privateGet(this, _filters).set(filter.column, filter);
|
|
138
|
+
} else if (isBetweenFilter(filter)) {
|
|
139
|
+
__privateGet(this, _filters).set(filter.filters[0].column, filter);
|
|
140
|
+
} else if (isAndFilter(filter)) {
|
|
141
|
+
filter.filters.forEach((f) => {
|
|
142
|
+
if (isBetweenFilter(f)) {
|
|
143
|
+
__privateGet(this, _filters).set(f.filters[0].column, f);
|
|
144
|
+
} else {
|
|
145
|
+
__privateGet(this, _filters).set(f.column, f);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
96
149
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
150
|
+
add(column, value) {
|
|
151
|
+
const { serverDataType = "string", type } = column;
|
|
152
|
+
const dataType = columnUtils.isTypeDescriptor(type) ? type.name : type ?? serverDataType;
|
|
153
|
+
console.log(
|
|
154
|
+
`FilterAggregator add ${column.name} ${serverDataType} ${JSON.stringify(type)} ${JSON.stringify(value)}`
|
|
155
|
+
);
|
|
156
|
+
if (Array.isArray(value)) {
|
|
157
|
+
const value1 = formUtils.getTypedValue(value[0].toString(), dataType);
|
|
158
|
+
const value2 = formUtils.getTypedValue(value[1].toString(), dataType);
|
|
159
|
+
if (value1 !== void 0 && value2 !== void 0) {
|
|
160
|
+
__privateGet(this, _filters).set(column.name, {
|
|
161
|
+
op: "and",
|
|
162
|
+
filters: [
|
|
163
|
+
{ column: column.name, op: ">", value: value1 },
|
|
164
|
+
{ column: column.name, op: "<", value: value2 }
|
|
165
|
+
]
|
|
166
|
+
});
|
|
167
|
+
} else if (value1 !== void 0) {
|
|
168
|
+
__privateGet(this, _filters).set(column.name, {
|
|
169
|
+
column: column.name,
|
|
170
|
+
op: "=",
|
|
171
|
+
value: value1
|
|
172
|
+
});
|
|
173
|
+
} else if (value2 !== void 0) {
|
|
174
|
+
__privateGet(this, _filters).set(column.name, {
|
|
175
|
+
column: column.name,
|
|
176
|
+
op: "<",
|
|
177
|
+
value: value2
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
} else {
|
|
181
|
+
const typedValue = formUtils.getTypedValue(value.toString(), dataType, true);
|
|
182
|
+
__privateGet(this, _filters).set(column.name, {
|
|
183
|
+
column: column.name,
|
|
184
|
+
op: "=",
|
|
185
|
+
value: typedValue
|
|
186
|
+
});
|
|
187
|
+
}
|
|
102
188
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
189
|
+
has({ name }) {
|
|
190
|
+
return __privateGet(this, _filters).has(name);
|
|
191
|
+
}
|
|
192
|
+
get({ name }) {
|
|
193
|
+
return __privateGet(this, _filters).get(name);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Remove filter for this colun. Return false if no filter found, otw true
|
|
197
|
+
*/
|
|
198
|
+
remove(column) {
|
|
199
|
+
if (__privateGet(this, _filters).has(column.name)) {
|
|
106
200
|
__privateGet(this, _filters).delete(column.name);
|
|
107
201
|
return true;
|
|
108
202
|
} else {
|
|
@@ -112,15 +206,18 @@ class FilterAggregator extends eventEmitter.EventEmitter {
|
|
|
112
206
|
get filter() {
|
|
113
207
|
const { size } = __privateGet(this, _filters);
|
|
114
208
|
if (size === 0) {
|
|
115
|
-
return
|
|
209
|
+
return void 0;
|
|
210
|
+
} else if (size === 1) {
|
|
211
|
+
const [filter] = __privateGet(this, _filters).values();
|
|
212
|
+
return filter;
|
|
116
213
|
} else {
|
|
117
214
|
return {
|
|
118
|
-
|
|
215
|
+
op: "and",
|
|
216
|
+
filters: Array.from(__privateGet(this, _filters).values())
|
|
119
217
|
};
|
|
120
218
|
}
|
|
121
219
|
}
|
|
122
220
|
}
|
|
123
|
-
_columns = new WeakMap();
|
|
124
221
|
_filters = new WeakMap();
|
|
125
222
|
const convertValueToServerFormat = (column, value) => {
|
|
126
223
|
if (dateUtils.isValidTimeString(value)) {
|
|
@@ -155,7 +252,7 @@ const buildColumnFilterString = (column, op, value) => {
|
|
|
155
252
|
class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
156
253
|
constructor(query = { filter: "" }, columnDescriptors = []) {
|
|
157
254
|
super();
|
|
158
|
-
__privateAdd(this,
|
|
255
|
+
__privateAdd(this, _columns, /* @__PURE__ */ new Map());
|
|
159
256
|
__privateAdd(this, _filters2, /* @__PURE__ */ new Map());
|
|
160
257
|
__privateAdd(this, _values, /* @__PURE__ */ new Map());
|
|
161
258
|
this.filter = query;
|
|
@@ -163,12 +260,12 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
163
260
|
}
|
|
164
261
|
loadColumnDescriptors(columnDescriptors) {
|
|
165
262
|
columnDescriptors.forEach((descriptor) => {
|
|
166
|
-
__privateGet(this,
|
|
263
|
+
__privateGet(this, _columns).set(descriptor.name, descriptor);
|
|
167
264
|
});
|
|
168
265
|
}
|
|
169
266
|
addFilter(column, op, value) {
|
|
170
|
-
if (!__privateGet(this,
|
|
171
|
-
__privateGet(this,
|
|
267
|
+
if (!__privateGet(this, _columns).has(column.name)) {
|
|
268
|
+
__privateGet(this, _columns).set(column.name, column);
|
|
172
269
|
}
|
|
173
270
|
const { serverDataType = "string" } = column;
|
|
174
271
|
const typedValue = Array.isArray(value) ? value : formUtils.getTypedValue(
|
|
@@ -185,8 +282,8 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
185
282
|
this.emit("onChange", this.filter);
|
|
186
283
|
}
|
|
187
284
|
removeFilter(column) {
|
|
188
|
-
if (__privateGet(this,
|
|
189
|
-
__privateGet(this,
|
|
285
|
+
if (__privateGet(this, _columns).has(column.name)) {
|
|
286
|
+
__privateGet(this, _columns).delete(column.name);
|
|
190
287
|
__privateGet(this, _filters2).delete(column.name);
|
|
191
288
|
__privateGet(this, _values).delete(column.name);
|
|
192
289
|
this.emit("onChange", this.filter);
|
|
@@ -197,7 +294,7 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
197
294
|
}
|
|
198
295
|
}
|
|
199
296
|
resetFilters() {
|
|
200
|
-
__privateGet(this,
|
|
297
|
+
__privateGet(this, _columns).clear();
|
|
201
298
|
__privateGet(this, _filters2).clear();
|
|
202
299
|
__privateGet(this, _values).clear();
|
|
203
300
|
this.emit("onChange", this.filter);
|
|
@@ -211,7 +308,7 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
211
308
|
return { filter: "" };
|
|
212
309
|
} else {
|
|
213
310
|
const result = Array.from(__privateGet(this, _filters2).entries()).map(([column, descriptor]) => {
|
|
214
|
-
const columnDescriptor = __privateGet(this,
|
|
311
|
+
const columnDescriptor = __privateGet(this, _columns).get(column);
|
|
215
312
|
if (columnDescriptor)
|
|
216
313
|
return buildColumnFilterString(
|
|
217
314
|
columnDescriptor,
|
|
@@ -225,7 +322,7 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
225
322
|
}
|
|
226
323
|
}
|
|
227
324
|
set filter(query) {
|
|
228
|
-
__privateGet(this,
|
|
325
|
+
__privateGet(this, _columns).clear();
|
|
229
326
|
__privateGet(this, _filters2).clear();
|
|
230
327
|
__privateGet(this, _values).clear();
|
|
231
328
|
if (query.filter) {
|
|
@@ -233,10 +330,10 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
233
330
|
const addToStore = (f2) => {
|
|
234
331
|
if (f2.column) {
|
|
235
332
|
const defaultColumnDescriptor = columnUtils.toColumnDescriptor(f2.column);
|
|
236
|
-
if (!__privateGet(this,
|
|
237
|
-
__privateGet(this,
|
|
333
|
+
if (!__privateGet(this, _columns).has(f2.column)) {
|
|
334
|
+
__privateGet(this, _columns).set(f2.column, defaultColumnDescriptor);
|
|
238
335
|
}
|
|
239
|
-
const columnDescriptor = __privateGet(this,
|
|
336
|
+
const columnDescriptor = __privateGet(this, _columns).get(f2.column) || defaultColumnDescriptor;
|
|
240
337
|
const existing = __privateGet(this, _filters2).get(f2.column);
|
|
241
338
|
if (isSingleValueFilter(f2)) {
|
|
242
339
|
const v = existing ? [
|
|
@@ -263,7 +360,7 @@ class ColumnFilterStore extends eventEmitter.EventEmitter {
|
|
|
263
360
|
}
|
|
264
361
|
}
|
|
265
362
|
}
|
|
266
|
-
|
|
363
|
+
_columns = new WeakMap();
|
|
267
364
|
_filters2 = new WeakMap();
|
|
268
365
|
_values = new WeakMap();
|
|
269
366
|
|
|
@@ -272,7 +369,9 @@ exports.FilterAggregator = FilterAggregator;
|
|
|
272
369
|
exports.applyFilterToColumns = applyFilterToColumns;
|
|
273
370
|
exports.buildColumnFilterString = buildColumnFilterString;
|
|
274
371
|
exports.extractFilterForColumn = extractFilterForColumn;
|
|
372
|
+
exports.getColumnValueFromFilter = getColumnValueFromFilter;
|
|
275
373
|
exports.isAndFilter = isAndFilter;
|
|
374
|
+
exports.isBetweenFilter = isBetweenFilter;
|
|
276
375
|
exports.isCompleteFilter = isCompleteFilter;
|
|
277
376
|
exports.isFilterClause = isFilterClause;
|
|
278
377
|
exports.isFilteredColumn = isFilteredColumn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-utils.js","sources":["../../../../../../../packages/vuu-utils/src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n ColumnFilterDescriptor,\n ColumnFilterOp,\n ColumnFilterValue,\n Filter,\n FilterClauseOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { VuuFilter, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { getTypedValue } from \"../form-utils\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n asTimeString,\n isValidTimeString,\n Time,\n TimeString,\n toCalendarDate,\n} from \"../date\";\nimport {\n isDateTimeDataValue,\n isTimeDataValue,\n toColumnDescriptor,\n} from \"../column-utils\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isValidFilterClauseOp = (op?: string): op is FilterClauseOp =>\n op === \"in\" || singleValueFilterOps.has(op as SingleValueFilterClauseOp);\n\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (\n f?: Partial<Filter>,\n): f is MultiValueFilterClause => f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Partial<Filter>): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (f: Partial<Filter>): f is AndFilter =>\n f.op === \"and\";\nexport const isOrFilter = (f: Partial<Filter>): f is OrFilter => f.op === \"or\";\n\nexport const isCompleteFilter = (filter: Partial<Filter>): filter is Filter =>\n isSingleValueFilter(filter) &&\n filter.column !== undefined &&\n filter.op !== undefined &&\n filter.value !== undefined;\n\nexport function isMultiClauseFilter(\n f?: Partial<Filter> | FilterWithPartialClause,\n): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n\nexport const applyFilterToColumns = (\n columns: RuntimeColumnDescriptor[],\n { filterStruct }: DataSourceFilter,\n) =>\n columns.map((column) => {\n // TODO this gives us a dependency on vuu-filters\n const filter = extractFilterForColumn(filterStruct, column.name);\n if (filter !== undefined) {\n return {\n ...column,\n filter,\n };\n } else if (column.filter) {\n return {\n ...column,\n filter: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const isFilteredColumn = (column: RuntimeColumnDescriptor) =>\n column.filter !== undefined;\n\nexport const stripFilterFromColumns = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => {\n const { filter, ...rest } = col;\n return filter ? rest : col;\n });\n\nexport const extractFilterForColumn = (\n filter: Filter | undefined,\n columnName: string,\n) => {\n if (isMultiClauseFilter(filter)) {\n return collectFiltersForColumn(filter, columnName);\n }\n if (isFilterClause(filter)) {\n return filter.column === columnName ? filter : undefined;\n }\n return undefined;\n};\n\nconst collectFiltersForColumn = (\n filter: MultiClauseFilter,\n columnName: string,\n) => {\n const { filters, op } = filter;\n const results: Filter[] = [];\n filters.forEach((filter) => {\n const ffc = extractFilterForColumn(filter, columnName);\n if (ffc) {\n results.push(ffc);\n }\n });\n if (results.length === 0) {\n return undefined;\n } else if (results.length === 1) {\n return results[0];\n }\n return {\n op,\n filters: results,\n };\n};\n\nexport type FilterEvents = {\n filter: (vuuFilter: VuuFilter) => void;\n};\n\nconst createFilterClause = (column: string, value: VuuRowDataItemType) =>\n typeof value === \"string\"\n ? `${column} contains \"${value}\"`\n : `${column} = ${value}`;\n\nexport class FilterAggregator extends EventEmitter<FilterEvents> {\n #columns = new Map<string, ColumnDescriptor>();\n #filters = new Map<string, VuuRowDataItemType>();\n\n addFilter(column: ColumnDescriptor, value: string | number) {\n this.#columns.set(column.name, column);\n const { serverDataType = \"string\" } = column;\n const typedValue = getTypedValue(value.toString(), serverDataType, true);\n\n this.#filters.set(column.name, typedValue);\n // this.emit(\"filter\", this.filter);\n }\n\n removeFilter(column: ColumnDescriptor) {\n if (this.#columns.has(column.name)) {\n this.#columns.delete(column.name);\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get filter(): VuuFilter {\n const { size } = this.#filters;\n if (size === 0) {\n return { filter: \"\" };\n } else {\n return {\n filter: Array.from(this.#filters.entries())\n .map((args) => createFilterClause(...args))\n .join(\" and \"),\n };\n }\n }\n}\n\nconst convertValueToServerFormat = (\n column: ColumnDescriptor,\n value: ColumnFilterValue,\n): ColumnFilterValue | Time => {\n if (isValidTimeString(value)) {\n return Time(value as TimeString)\n .asDate()\n .getTime();\n } else if (isDateTimeDataValue(column)) {\n return new Date(value as number).getTime(); //value is already in utc milliseconds? conversion may not be required\n }\n return value;\n};\n\nconst convertValueToUIFormat = (\n column: ColumnDescriptor,\n value: ColumnFilterValue,\n): ColumnFilterValue => {\n if (isTimeDataValue(column)) {\n return asTimeString(value, false);\n } else if (isDateTimeDataValue(column)) {\n return toCalendarDate(new Date(value as number)).toString();\n } else {\n return value;\n }\n};\n\n//TODO extend this to support <= and >=\nconst buildBetweenQueryString = (column: ColumnDescriptor, range: string[]) => {\n const lowerRange: string | undefined =\n range[0] !== undefined && range[0].length > 0\n ? `${column.name} > ${convertValueToServerFormat(column, range[0])}`\n : undefined;\n\n const upperRange: string | undefined =\n range[1] !== undefined && range[1].length > 0\n ? `${column.name} < ${convertValueToServerFormat(column, range[1])}`\n : undefined;\n\n if (lowerRange === undefined) return lowerRange;\n if (upperRange === undefined) return lowerRange;\n return `${lowerRange} and ${upperRange}`;\n};\n\n//Supports only SingleValue & Range filters\nexport const buildColumnFilterString = (\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n value: ColumnFilterValue,\n) => {\n if (Array.isArray(value)) {\n return buildBetweenQueryString(column, value);\n }\n return typeof value === \"string\" && !isValidTimeString(value)\n ? `${column.name} ${op} \"${value}\"`\n : `${column.name} ${op} ${convertValueToServerFormat(column, value)}`;\n};\n\nexport type ColumnFilterStoreEvents = {\n onChange: (filter: VuuFilter) => void;\n};\nexport class ColumnFilterStore extends EventEmitter<ColumnFilterStoreEvents> {\n #columns = new Map<string, ColumnDescriptor>();\n #filters = new Map<string, ColumnFilterDescriptor>();\n #values = new Map<string, ColumnFilterValue>();\n\n constructor(\n query: VuuFilter = { filter: \"\" },\n columnDescriptors: ColumnDescriptor[] = [],\n ) {\n super();\n this.filter = query;\n this.loadColumnDescriptors(columnDescriptors);\n }\n\n private loadColumnDescriptors(columnDescriptors: ColumnDescriptor[]) {\n columnDescriptors.forEach((descriptor) => {\n this.#columns.set(descriptor.name, descriptor);\n });\n }\n\n addFilter(\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n value: ColumnFilterValue,\n ) {\n if (!this.#columns.has(column.name)) {\n this.#columns.set(column.name, column);\n }\n\n const { serverDataType = \"string\" } = column;\n const typedValue = Array.isArray(value)\n ? value\n : (getTypedValue(\n value.toString(),\n serverDataType,\n true,\n ) as ColumnFilterValue);\n\n this.#values.set(column.name, typedValue);\n this.#filters.set(column.name, {\n column,\n op,\n filterValue: typedValue,\n });\n this.emit(\"onChange\", this.filter);\n }\n\n removeFilter(column: ColumnDescriptor) {\n if (this.#columns.has(column.name)) {\n this.#columns.delete(column.name);\n this.#filters.delete(column.name);\n this.#values.delete(column.name);\n this.emit(\"onChange\", this.filter);\n return true;\n } else {\n this.emit(\"onChange\", this.filter);\n return false;\n }\n }\n\n resetFilters() {\n this.#columns.clear();\n this.#filters.clear();\n this.#values.clear();\n this.emit(\"onChange\", this.filter);\n }\n\n get columnValues(): Map<string, ColumnFilterValue> {\n return this.#values;\n }\n\n get filter(): VuuFilter {\n const { size } = this.#filters;\n if (size === 0) {\n return { filter: \"\" };\n } else {\n const result = Array.from(this.#filters.entries())\n .map(([column, descriptor]) => {\n const columnDescriptor = this.#columns.get(column);\n if (columnDescriptor)\n return buildColumnFilterString(\n columnDescriptor,\n descriptor.op,\n descriptor.filterValue,\n );\n })\n .filter((value) => value !== undefined);\n return {\n filter: result.join(result.length > 1 ? \" and \" : \"\"),\n };\n }\n }\n\n set filter(query: VuuFilter) {\n this.#columns.clear();\n this.#filters.clear();\n this.#values.clear();\n\n if (query.filter) {\n const f = parseFilter(query.filter);\n\n const addToStore = (f: Filter) => {\n if (f.column) {\n const defaultColumnDescriptor = toColumnDescriptor(f.column);\n if (!this.#columns.has(f.column)) {\n this.#columns.set(f.column, defaultColumnDescriptor);\n }\n const columnDescriptor: ColumnDescriptor =\n this.#columns.get(f.column) || defaultColumnDescriptor;\n\n const existing = this.#filters.get(f.column);\n if (isSingleValueFilter(f)) {\n const v = existing\n ? [\n existing.filterValue as string,\n convertValueToUIFormat(columnDescriptor, f.value as string),\n ]\n : convertValueToUIFormat(\n columnDescriptor,\n f.value as ColumnFilterValue,\n );\n\n this.#values.set(f.column, v as ColumnFilterValue);\n this.#filters.set(f.column, {\n column: columnDescriptor,\n op: f.op,\n filterValue: v as ColumnFilterValue,\n });\n }\n }\n };\n\n if (isMultiClauseFilter(f)) {\n f.filters.forEach((f) => addToStore(f));\n } else if (isFilterClause(f)) {\n addToStore(f);\n }\n }\n }\n}\n"],"names":["_columns","_filters","filter","EventEmitter","getTypedValue","isValidTimeString","Time","isDateTimeDataValue","isTimeDataValue","asTimeString","toCalendarDate","parseFilter","f","toColumnDescriptor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-utils.js","sources":["../../../../../../../packages/vuu-utils/src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnFilterDescriptor,\n ColumnFilterOp,\n ColumnFilterValue,\n Filter,\n FilterClauseOp,\n FilterContainerFilter,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { getTypedValue } from \"../form-utils\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n asTimeString,\n isValidTimeString,\n Time,\n TimeString,\n toCalendarDate,\n} from \"../date\";\nimport {\n isDateTimeDataValue,\n isTimeDataValue,\n isTypeDescriptor,\n toColumnDescriptor,\n} from \"../column-utils\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isValidFilterClauseOp = (op?: string): op is FilterClauseOp =>\n op === \"in\" || singleValueFilterOps.has(op as SingleValueFilterClauseOp);\n\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (\n f?: Partial<Filter>,\n): f is MultiValueFilterClause => f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Partial<Filter>): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (\n f?: Partial<Filter>,\n): f is MultiClauseFilter<\"and\"> => f?.op === \"and\";\n\nexport const isBetweenFilter = (\n f?: Filter,\n): f is MultiClauseFilter<\"and\", SingleValueFilterClause> =>\n isAndFilter(f) &&\n f.filters.length === 2 &&\n f.filters[0].column === f.filters[1].column &&\n f.filters[0].op === \">\" &&\n f.filters[1].op === \"<\";\n\nexport const isOrFilter = (f?: Partial<Filter>): f is MultiClauseFilter<\"or\"> =>\n f?.op === \"or\";\n\nexport const isCompleteFilter = (filter: Partial<Filter>): filter is Filter =>\n isSingleValueFilter(filter) &&\n filter.column !== undefined &&\n filter.op !== undefined &&\n filter.value !== undefined;\n\nexport function isMultiClauseFilter(\n f?: Partial<Filter> | FilterWithPartialClause,\n): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n\nexport const applyFilterToColumns = (\n columns: RuntimeColumnDescriptor[],\n { filterStruct }: DataSourceFilter,\n) =>\n columns.map((column) => {\n // TODO this gives us a dependency on vuu-filters\n const filter = extractFilterForColumn(filterStruct, column.name);\n if (filter !== undefined) {\n return {\n ...column,\n filter,\n };\n } else if (column.filter) {\n return {\n ...column,\n filter: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const isFilteredColumn = (column: RuntimeColumnDescriptor) =>\n column.filter !== undefined;\n\nexport const stripFilterFromColumns = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => {\n const { filter, ...rest } = col;\n return filter ? rest : col;\n });\n\nexport const extractFilterForColumn = (\n filter: Filter | undefined,\n columnName: string,\n) => {\n if (isMultiClauseFilter(filter)) {\n return collectFiltersForColumn(filter, columnName);\n }\n if (isFilterClause(filter)) {\n return filter.column === columnName ? filter : undefined;\n }\n return undefined;\n};\n\nconst collectFiltersForColumn = (\n filter: MultiClauseFilter,\n columnName: string,\n) => {\n const { filters, op } = filter;\n const results: Filter[] = [];\n filters.forEach((filter) => {\n const ffc = extractFilterForColumn(filter, columnName);\n if (ffc) {\n results.push(ffc);\n }\n });\n if (results.length === 0) {\n return undefined;\n } else if (results.length === 1) {\n return results[0];\n }\n return {\n op,\n filters: results,\n };\n};\n\n// Just until we fully support bool values in filters\nconst stringifyBoolean = (value: string | number | boolean) =>\n typeof value === \"boolean\" ? \"${filter.value}\" : value;\n\nexport const getColumnValueFromFilter = (\n column: ColumnDescriptor,\n operator: ColumnFilterOp,\n filter?: FilterContainerFilter,\n): ColumnFilterValue => {\n if (isSingleValueFilter(filter)) {\n if (filter.column === column.name) {\n if (operator === \"between\") {\n if (filter.op === \"=\") {\n return [`${filter.value}`, \"\"];\n } else if (filter.op === \"<\") {\n return [\"\", `${filter.value}`];\n }\n } else {\n return stringifyBoolean(filter.value);\n }\n }\n } else if (isBetweenFilter(filter)) {\n if (filter.filters[0].column === column.name) {\n const [{ value: v1 }, { value: v2 }] = filter.filters;\n return [`${v1}`, `${v2}`];\n } else {\n return [\"\", \"\"];\n }\n } else if (isAndFilter(filter)) {\n const filterForColumn = filter.filters.find((f) =>\n isBetweenFilter(f)\n ? f.filters[0].column === column.name\n : f.column === column.name,\n );\n if (isSingleValueFilter(filterForColumn)) {\n return stringifyBoolean(filterForColumn.value);\n } else if (operator === \"between\" && isBetweenFilter(filterForColumn)) {\n const [{ value: v1 }, { value: v2 }] = filterForColumn.filters;\n return [`${v1}`, `${v2}`];\n }\n }\n if (operator === \"between\") {\n if (column.type === \"time\") {\n return [\"00:00:00\", \"23:59:59\"];\n } else {\n return [\"\", \"\"];\n }\n } else {\n return \"\";\n }\n};\n\n/**\n * Manages a filter that can be updated one clause at a time.\n * Works with FilterContainer to aggregate multiple filter\n * clauses edited via individual controls. It is just a wrapper\n * around a Map, does not support switching filters - create a\n * new FilterAggregator for a new filter.\n *\n */\nexport class FilterAggregator {\n #filters = new Map<string, FilterContainerFilter>();\n\n constructor(filter?: FilterContainerFilter) {\n if (isSingleValueFilter(filter)) {\n this.#filters.set(filter.column, filter);\n } else if (isBetweenFilter(filter)) {\n this.#filters.set(filter.filters[0].column, filter);\n } else if (isAndFilter(filter)) {\n filter.filters.forEach((f) => {\n if (isBetweenFilter(f)) {\n this.#filters.set(f.filters[0].column, f);\n } else {\n this.#filters.set(f.column, f);\n }\n });\n }\n }\n\n add(column: ColumnDescriptor, value: ColumnFilterValue) {\n const { serverDataType = \"string\", type } = column;\n const dataType = isTypeDescriptor(type)\n ? type.name\n : (type ?? serverDataType);\n console.log(\n `FilterAggregator add ${column.name} ${serverDataType} ${JSON.stringify(type)} ${JSON.stringify(value)}`,\n );\n if (Array.isArray(value)) {\n const value1 = getTypedValue(value[0].toString(), dataType);\n const value2 = getTypedValue(value[1].toString(), dataType);\n\n if (value1 !== undefined && value2 !== undefined) {\n this.#filters.set(column.name, {\n op: \"and\",\n filters: [\n { column: column.name, op: \">\", value: value1 },\n { column: column.name, op: \"<\", value: value2 },\n ],\n });\n } else if (value1 !== undefined) {\n this.#filters.set(column.name, {\n column: column.name,\n op: \"=\",\n value: value1,\n });\n } else if (value2 !== undefined) {\n this.#filters.set(column.name, {\n column: column.name,\n op: \"<\",\n value: value2,\n });\n }\n } else {\n const typedValue = getTypedValue(value.toString(), dataType, true);\n\n this.#filters.set(column.name, {\n column: column.name,\n op: \"=\",\n value: typedValue,\n });\n }\n }\n\n has({ name }: ColumnDescriptor) {\n return this.#filters.has(name);\n }\n\n get({ name }: ColumnDescriptor) {\n return this.#filters.get(name);\n }\n\n /**\n * Remove filter for this colun. Return false if no filter found, otw true\n */\n remove(column: ColumnDescriptor) {\n if (this.#filters.has(column.name)) {\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get filter(): FilterContainerFilter | undefined {\n const { size } = this.#filters;\n if (size === 0) {\n return undefined;\n } else if (size === 1) {\n const [filter] = this.#filters.values();\n return filter;\n } else {\n return {\n op: \"and\",\n filters: Array.from(this.#filters.values()),\n } as FilterContainerFilter;\n }\n }\n}\n\nconst convertValueToServerFormat = (\n column: ColumnDescriptor,\n value: ColumnFilterValue,\n): ColumnFilterValue | Time => {\n if (isValidTimeString(value)) {\n return Time(value as TimeString)\n .asDate()\n .getTime();\n } else if (isDateTimeDataValue(column)) {\n return new Date(value as number).getTime(); //value is already in utc milliseconds? conversion may not be required\n }\n return value;\n};\n\nconst convertValueToUIFormat = (\n column: ColumnDescriptor,\n value: ColumnFilterValue,\n): ColumnFilterValue => {\n if (isTimeDataValue(column)) {\n return asTimeString(value, false);\n } else if (isDateTimeDataValue(column)) {\n return toCalendarDate(new Date(value as number)).toString();\n } else {\n return value;\n }\n};\n\n//TODO extend this to support <= and >=\nconst buildBetweenQueryString = (column: ColumnDescriptor, range: string[]) => {\n const lowerRange: string | undefined =\n range[0] !== undefined && range[0].length > 0\n ? `${column.name} > ${convertValueToServerFormat(column, range[0])}`\n : undefined;\n\n const upperRange: string | undefined =\n range[1] !== undefined && range[1].length > 0\n ? `${column.name} < ${convertValueToServerFormat(column, range[1])}`\n : undefined;\n\n if (lowerRange === undefined) return lowerRange;\n if (upperRange === undefined) return lowerRange;\n return `${lowerRange} and ${upperRange}`;\n};\n\n//Supports only SingleValue & Range filters\nexport const buildColumnFilterString = (\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n value: ColumnFilterValue,\n) => {\n if (Array.isArray(value)) {\n return buildBetweenQueryString(column, value);\n }\n return typeof value === \"string\" && !isValidTimeString(value)\n ? `${column.name} ${op} \"${value}\"`\n : `${column.name} ${op} ${convertValueToServerFormat(column, value)}`;\n};\n\nexport type ColumnFilterStoreEvents = {\n onChange: (filter: VuuFilter) => void;\n};\nexport class ColumnFilterStore extends EventEmitter<ColumnFilterStoreEvents> {\n #columns = new Map<string, ColumnDescriptor>();\n #filters = new Map<string, ColumnFilterDescriptor>();\n #values = new Map<string, ColumnFilterValue>();\n\n constructor(\n query: VuuFilter = { filter: \"\" },\n columnDescriptors: ColumnDescriptor[] = [],\n ) {\n super();\n this.filter = query;\n this.loadColumnDescriptors(columnDescriptors);\n }\n\n private loadColumnDescriptors(columnDescriptors: ColumnDescriptor[]) {\n columnDescriptors.forEach((descriptor) => {\n this.#columns.set(descriptor.name, descriptor);\n });\n }\n\n addFilter(\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n value: ColumnFilterValue,\n ) {\n if (!this.#columns.has(column.name)) {\n this.#columns.set(column.name, column);\n }\n\n const { serverDataType = \"string\" } = column;\n const typedValue = Array.isArray(value)\n ? value\n : (getTypedValue(\n value.toString(),\n serverDataType,\n true,\n ) as ColumnFilterValue);\n\n this.#values.set(column.name, typedValue);\n this.#filters.set(column.name, {\n column,\n op,\n filterValue: typedValue,\n });\n this.emit(\"onChange\", this.filter);\n }\n\n removeFilter(column: ColumnDescriptor) {\n if (this.#columns.has(column.name)) {\n this.#columns.delete(column.name);\n this.#filters.delete(column.name);\n this.#values.delete(column.name);\n this.emit(\"onChange\", this.filter);\n return true;\n } else {\n this.emit(\"onChange\", this.filter);\n return false;\n }\n }\n\n resetFilters() {\n this.#columns.clear();\n this.#filters.clear();\n this.#values.clear();\n this.emit(\"onChange\", this.filter);\n }\n\n get columnValues(): Map<string, ColumnFilterValue> {\n return this.#values;\n }\n\n get filter(): VuuFilter {\n const { size } = this.#filters;\n if (size === 0) {\n return { filter: \"\" };\n } else {\n const result = Array.from(this.#filters.entries())\n .map(([column, descriptor]) => {\n const columnDescriptor = this.#columns.get(column);\n if (columnDescriptor)\n return buildColumnFilterString(\n columnDescriptor,\n descriptor.op,\n descriptor.filterValue,\n );\n })\n .filter((value) => value !== undefined);\n return {\n filter: result.join(result.length > 1 ? \" and \" : \"\"),\n };\n }\n }\n\n set filter(query: VuuFilter) {\n this.#columns.clear();\n this.#filters.clear();\n this.#values.clear();\n\n if (query.filter) {\n const f = parseFilter(query.filter);\n\n const addToStore = (f: Filter) => {\n if (f.column) {\n const defaultColumnDescriptor = toColumnDescriptor(f.column);\n if (!this.#columns.has(f.column)) {\n this.#columns.set(f.column, defaultColumnDescriptor);\n }\n const columnDescriptor: ColumnDescriptor =\n this.#columns.get(f.column) || defaultColumnDescriptor;\n\n const existing = this.#filters.get(f.column);\n if (isSingleValueFilter(f)) {\n const v = existing\n ? [\n existing.filterValue as string,\n convertValueToUIFormat(columnDescriptor, f.value as string),\n ]\n : convertValueToUIFormat(\n columnDescriptor,\n f.value as ColumnFilterValue,\n );\n\n this.#values.set(f.column, v as ColumnFilterValue);\n this.#filters.set(f.column, {\n column: columnDescriptor,\n op: f.op,\n filterValue: v as ColumnFilterValue,\n });\n }\n }\n };\n\n if (isMultiClauseFilter(f)) {\n f.filters.forEach((f) => addToStore(f));\n } else if (isFilterClause(f)) {\n addToStore(f);\n }\n }\n }\n}\n"],"names":["_filters","filter","isTypeDescriptor","getTypedValue","isValidTimeString","Time","isDateTimeDataValue","isTimeDataValue","asTimeString","toCalendarDate","EventEmitter","parseFilter","f","toColumnDescriptor"],"mappings":"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"}
|
|
@@ -42,6 +42,14 @@ function getTypedValue(value, type, throwIfInvalid = false) {
|
|
|
42
42
|
}
|
|
43
43
|
case "boolean":
|
|
44
44
|
return value === "true" ? true : false;
|
|
45
|
+
case "time":
|
|
46
|
+
if (dateUtils.isValidTimeString(value)) {
|
|
47
|
+
return +dateUtils.Time(value).asDate();
|
|
48
|
+
} else if (throwIfInvalid) {
|
|
49
|
+
throw Error(`value ${value} is not a valid ${type}`);
|
|
50
|
+
} else {
|
|
51
|
+
return void 0;
|
|
52
|
+
}
|
|
45
53
|
default:
|
|
46
54
|
return value;
|
|
47
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-utils.js","sources":["../../../../../../packages/vuu-utils/src/form-utils.ts"],"sourcesContent":["import {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { queryClosest } from \"./html-utils\";\nimport { stringIsValidDecimal, stringIsValidInt } from \"./data-utils\";\nimport { isValidTimeString } from \"./date\";\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport const isNumber = (\n type: string,\n value: VuuRowDataItemType,\n): value is number => type === \"number\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T = VuuRowDataItemType,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfInvalid\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType |
|
|
1
|
+
{"version":3,"file":"form-utils.js","sources":["../../../../../../packages/vuu-utils/src/form-utils.ts"],"sourcesContent":["import {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { queryClosest } from \"./html-utils\";\nimport { stringIsValidDecimal, stringIsValidInt } from \"./data-utils\";\nimport { isValidTimeString, Time } from \"./date\";\nimport { DataValueTypeSimple } from \"@vuu-ui/vuu-data-types\";\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport const isNumber = (\n type: string,\n value: VuuRowDataItemType,\n): value is number => type === \"number\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T = VuuRowDataItemType,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfInvalid\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid?: false,\n): VuuRowDataItemType | undefined;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid: true,\n): VuuRowDataItemType;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid = false,\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n if (stringIsValidInt(value)) {\n return parseInt(value, 10);\n } else if (isValidTimeString(value)) {\n //TOCHECK\n return value;\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"double\":\n case \"number\": {\n if (stringIsValidDecimal(value)) {\n return parseFloat(value);\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n\n case \"time\":\n if (isValidTimeString(value)) {\n return +Time(value).asDate();\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n default:\n return value;\n }\n}\n"],"names":["queryClosest","stringIsValidInt","isValidTimeString","stringIsValidDecimal","Time"],"mappings":";;;;;;;;AAea,MAAA,YAAA,GAAe,CAAC,MAA8C,KAAA;AACzE,EAAM,MAAA,aAAA,GAAgBA,sBAAa,CAAA,MAAA,EAAQ,cAAc,CAAA;AACzD,EAAM,MAAA,SAAA,GAAY,eAAe,OAAQ,CAAA,KAAA;AACzC,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,4BAA4B,CAAA;AAAA;AAE5C;AAIO,MAAM,QAAW,GAAA,CACtB,IACA,EAAA,KAAA,KACoB,IAAS,KAAA;AA8BxB,SAAS,aACd,CAAA,KAAA,EACA,IACA,EAAA,cAAA,GAAiB,KACe,EAAA;AAChC,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,KAAA;AAAA,IACL,KAAK,MAAQ,EAAA;AACX,MAAI,IAAAC,0BAAA,CAAiB,KAAK,CAAG,EAAA;AAC3B,QAAO,OAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,OAC3B,MAAA,IAAWC,2BAAkB,CAAA,KAAK,CAAG,EAAA;AAEnC,QAAO,OAAA,KAAA;AAAA,iBACE,cAAgB,EAAA;AACzB,QAAA,MAAM,KAAM,CAAA,CAAA,MAAA,EAAS,KAAK,CAAA,gBAAA,EAAmB,IAAI,CAAE,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA;AACT;AACF,IAEA,KAAK,QAAA;AAAA,IACL,KAAK,QAAU,EAAA;AACb,MAAI,IAAAC,8BAAA,CAAqB,KAAK,CAAG,EAAA;AAC/B,QAAA,OAAO,WAAW,KAAK,CAAA;AAAA,iBACd,cAAgB,EAAA;AACzB,QAAA,MAAM,KAAM,CAAA,CAAA,MAAA,EAAS,KAAK,CAAA,gBAAA,EAAmB,IAAI,CAAE,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA;AACT;AACF,IAEA,KAAK,SAAA;AACH,MAAO,OAAA,KAAA,KAAU,SAAS,IAAO,GAAA,KAAA;AAAA,IAEnC,KAAK,MAAA;AACH,MAAI,IAAAD,2BAAA,CAAkB,KAAK,CAAG,EAAA;AAC5B,QAAA,OAAO,CAACE,cAAA,CAAK,KAAK,CAAA,CAAE,MAAO,EAAA;AAAA,iBAClB,cAAgB,EAAA;AACzB,QAAA,MAAM,KAAM,CAAA,CAAA,MAAA,EAAS,KAAK,CAAA,gBAAA,EAAmB,IAAI,CAAE,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA;AACT,IACF;AACE,MAAO,OAAA,KAAA;AAAA;AAEb;;;;;;"}
|
|
@@ -255,7 +255,9 @@ exports.FilterAggregator = filterUtils.FilterAggregator;
|
|
|
255
255
|
exports.applyFilterToColumns = filterUtils.applyFilterToColumns;
|
|
256
256
|
exports.buildColumnFilterString = filterUtils.buildColumnFilterString;
|
|
257
257
|
exports.extractFilterForColumn = filterUtils.extractFilterForColumn;
|
|
258
|
+
exports.getColumnValueFromFilter = filterUtils.getColumnValueFromFilter;
|
|
258
259
|
exports.isAndFilter = filterUtils.isAndFilter;
|
|
260
|
+
exports.isBetweenFilter = filterUtils.isBetweenFilter;
|
|
259
261
|
exports.isCompleteFilter = filterUtils.isCompleteFilter;
|
|
260
262
|
exports.isFilterClause = filterUtils.isFilterClause;
|
|
261
263
|
exports.isFilteredColumn = filterUtils.isFilteredColumn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -81,7 +81,7 @@ const isNumericColumn = ({ serverDataType, type }) => {
|
|
|
81
81
|
return false;
|
|
82
82
|
};
|
|
83
83
|
const isDateTimeDataValue = (column) => (isTypeDescriptor(column.type) ? column.type.name : column.type) === "date/time";
|
|
84
|
-
const isTimeDataValue = (column) => (isTypeDescriptor(column
|
|
84
|
+
const isTimeDataValue = (column) => (isTypeDescriptor(column?.type) ? column.type.name : column?.type) === "time";
|
|
85
85
|
const isPinned = (column) => typeof column.pin === "string";
|
|
86
86
|
const hasHeadings = (column) => Array.isArray(column.heading) && column.heading.length > 0;
|
|
87
87
|
const isResizing = (column) => column.resizing;
|