@vuu-ui/vuu-utils 0.13.45 → 0.13.47
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/DataWindow.js.map +1 -1
- package/cjs/packages/vuu-utils/src/filters/filter-utils.js +29 -150
- package/cjs/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/index.js +1 -6
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/cjs/packages/vuu-utils/src/shell-layout-types.js.map +1 -1
- package/cjs/packages/vuu-utils/src/ts-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/DataWindow.js.map +1 -1
- package/esm/packages/vuu-utils/src/filters/filter-utils.js +30 -150
- package/esm/packages/vuu-utils/src/filters/filter-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +1 -2
- package/esm/packages/vuu-utils/src/index.js.map +1 -1
- package/esm/packages/vuu-utils/src/shell-layout-types.js.map +1 -1
- package/esm/packages/vuu-utils/src/ts-utils.js.map +1 -1
- package/package.json +6 -6
- package/types/DataWindow.d.ts +1 -1
- package/types/filters/filter-utils.d.ts +4 -20
- package/types/formatting-utils.d.ts +1 -1
- package/types/index.d.ts +0 -1
- package/types/json-types.d.ts +1 -1
- package/types/shell-layout-types.d.ts +2 -1
- package/types/ts-utils.d.ts +1 -0
- package/cjs/packages/vuu-utils/src/menu-utils.js +0 -10
- package/cjs/packages/vuu-utils/src/menu-utils.js.map +0 -1
- package/esm/packages/vuu-utils/src/menu-utils.js +0 -6
- package/esm/packages/vuu-utils/src/menu-utils.js.map +0 -1
- package/types/menu-utils.d.ts +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataWindow.js","sources":["../../../../../../packages/vuu-utils/src/DataWindow.ts"],"sourcesContent":["import { WindowRange } from \"./range-utils\";\nimport { metadataKeys } from \"./column-utils\";\n\nexport type DataItem = string | number | boolean;\nexport type DataRow = [\n /** index */\n number,\n /** render index */\n number,\n /** isLeaf */\n boolean,\n /** isExpanded */\n boolean,\n /** depth */\n number,\n /** child count */\n number,\n /** key */\n string,\n /** selected */\n number,\n /** data values */\n ...DataItem[]
|
|
1
|
+
{"version":3,"file":"DataWindow.js","sources":["../../../../../../packages/vuu-utils/src/DataWindow.ts"],"sourcesContent":["import { WindowRange } from \"./range-utils\";\nimport { metadataKeys } from \"./column-utils\";\n\nexport type DataItem = string | number | boolean;\nexport type DataRow = [\n /** index */\n number,\n /** render index */\n number,\n /** isLeaf */\n boolean,\n /** isExpanded */\n boolean,\n /** depth */\n number,\n /** child count */\n number,\n /** key */\n string,\n /** selected */\n number,\n /** data values */\n ...DataItem[],\n];\nexport type RangeLike = { from: number; to: number };\n\nconst { KEY } = metadataKeys;\n\n// const log = (message: string) =>\n// console.log(`%c[DataWindow] ${message}`, \"color: purple;font-weight: bold;\");\nexport class DataWindow {\n private range: WindowRange;\n public data: DataRow[];\n public rowCount = 0;\n constructor({ from, to }: RangeLike) {\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(to - from);\n // window.dataWindow = this.data;\n // log(`constructor initial range ${from} - ${to}`);\n }\n\n setRowCount = (rowCount: number) => {\n // log(`rowCount => ${rowCount}`);\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n // return true if existing row was updated\n add(data: DataRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n const isUpdate = this.data[internalIndex] !== undefined;\n this.data[internalIndex] = data;\n return isUpdate;\n } else {\n return false;\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index) && index <= this.rowCount;\n }\n\n setRange(from: number, to: number) {\n // log(`setRange ${from} ${to}`);\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n hasData(from: number, to: number) {\n const offset = this.range.from;\n const start = from - offset;\n const end = Math.min(to - offset - 1, this.rowCount - 1);\n return this.data[start] !== undefined && this.data[end] !== undefined;\n }\n\n getData(from: number, to: number): DataRow[] {\n const { from: clientFrom } = this.range;\n const startOffset = Math.max(0, from - clientFrom);\n const endOffset = Math.min(to - clientFrom, this.rowCount ?? to);\n return this.data.slice(startOffset, endOffset);\n }\n}\n"],"names":["metadataKeys","WindowRange"],"mappings":"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"}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var eventEmitter = require('../event-emitter.js');
|
|
4
3
|
var formUtils = require('../form-utils.js');
|
|
5
|
-
var vuuFilterParser = require('@vuu-ui/vuu-filter-parser');
|
|
6
|
-
var dateUtils = require('../date/date-utils.js');
|
|
7
|
-
require('../date/dateTimePattern.js');
|
|
8
|
-
require('@internationalized/date');
|
|
9
4
|
var columnUtils = require('../column-utils.js');
|
|
10
5
|
|
|
11
6
|
var __typeError = (msg) => {
|
|
@@ -14,7 +9,7 @@ var __typeError = (msg) => {
|
|
|
14
9
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
15
10
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
16
11
|
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 _filters
|
|
12
|
+
var _filters;
|
|
18
13
|
const singleValueFilterOps = /* @__PURE__ */ new Set([
|
|
19
14
|
"=",
|
|
20
15
|
"!=",
|
|
@@ -150,9 +145,6 @@ class FilterAggregator {
|
|
|
150
145
|
add(column, value) {
|
|
151
146
|
const { serverDataType = "string", type } = column;
|
|
152
147
|
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
148
|
if (Array.isArray(value)) {
|
|
157
149
|
const value1 = formUtils.getTypedValue(value[0].toString(), dataType);
|
|
158
150
|
const value2 = formUtils.getTypedValue(value[1].toString(), dataType);
|
|
@@ -193,7 +185,7 @@ class FilterAggregator {
|
|
|
193
185
|
return __privateGet(this, _filters).get(name);
|
|
194
186
|
}
|
|
195
187
|
/**
|
|
196
|
-
* Remove filter for this
|
|
188
|
+
* Remove filter for this column. Return false if no filter found, otw true
|
|
197
189
|
*/
|
|
198
190
|
remove(column) {
|
|
199
191
|
if (__privateGet(this, _filters).has(column.name)) {
|
|
@@ -219,156 +211,43 @@ class FilterAggregator {
|
|
|
219
211
|
}
|
|
220
212
|
}
|
|
221
213
|
_filters = new WeakMap();
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return new Date(value).getTime();
|
|
227
|
-
}
|
|
228
|
-
return value;
|
|
229
|
-
};
|
|
230
|
-
const convertValueToUIFormat = (column, value) => {
|
|
231
|
-
if (columnUtils.isTimeDataValue(column)) {
|
|
232
|
-
return dateUtils.asTimeString(value, false);
|
|
233
|
-
} else if (columnUtils.isDateTimeDataValue(column)) {
|
|
234
|
-
return dateUtils.toCalendarDate(new Date(value)).toString();
|
|
235
|
-
} else {
|
|
236
|
-
return value;
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
const buildBetweenQueryString = (column, range) => {
|
|
240
|
-
const lowerRange = range[0] !== void 0 && range[0].length > 0 ? `${column.name} > ${convertValueToServerFormat(column, range[0])}` : void 0;
|
|
241
|
-
const upperRange = range[1] !== void 0 && range[1].length > 0 ? `${column.name} < ${convertValueToServerFormat(column, range[1])}` : void 0;
|
|
242
|
-
if (lowerRange === void 0) return lowerRange;
|
|
243
|
-
if (upperRange === void 0) return lowerRange;
|
|
244
|
-
return `${lowerRange} and ${upperRange}`;
|
|
245
|
-
};
|
|
246
|
-
const buildColumnFilterString = (column, op, value) => {
|
|
247
|
-
if (Array.isArray(value)) {
|
|
248
|
-
return buildBetweenQueryString(column, value);
|
|
249
|
-
}
|
|
250
|
-
return typeof value === "string" && !dateUtils.isValidTimeString(value) ? `${column.name} ${op} "${value}"` : `${column.name} ${op} ${convertValueToServerFormat(column, value)}`;
|
|
214
|
+
const betweenFiltersAreEqual = (f1, f2) => {
|
|
215
|
+
const [from1, to1] = f1.filters;
|
|
216
|
+
const [from2, to2] = f2.filters;
|
|
217
|
+
return filtersAreEqual(from1, from2) && filtersAreEqual(to1, to2);
|
|
251
218
|
};
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
__privateAdd(this, _values, /* @__PURE__ */ new Map());
|
|
258
|
-
this.filter = query;
|
|
259
|
-
this.loadColumnDescriptors(columnDescriptors);
|
|
260
|
-
}
|
|
261
|
-
loadColumnDescriptors(columnDescriptors) {
|
|
262
|
-
columnDescriptors.forEach((descriptor) => {
|
|
263
|
-
__privateGet(this, _columns).set(descriptor.name, descriptor);
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
addFilter(column, op, value) {
|
|
267
|
-
if (!__privateGet(this, _columns).has(column.name)) {
|
|
268
|
-
__privateGet(this, _columns).set(column.name, column);
|
|
269
|
-
}
|
|
270
|
-
const { serverDataType = "string" } = column;
|
|
271
|
-
const typedValue = Array.isArray(value) ? value : formUtils.getTypedValue(
|
|
272
|
-
value.toString(),
|
|
273
|
-
serverDataType,
|
|
274
|
-
true
|
|
219
|
+
const singleValueFilterClausesAreEqual = (f1, f2) => f1.column === f2.column && f1.op === f2.op && f1.value === f2.value;
|
|
220
|
+
const findEqualFilter = (filters) => (filter) => {
|
|
221
|
+
if (isBetweenFilter(filter)) {
|
|
222
|
+
const target = filters.find(
|
|
223
|
+
(f) => isBetweenFilter(f) && betweenFiltersAreEqual(f, filter)
|
|
275
224
|
);
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
});
|
|
282
|
-
this.emit("onChange", this.filter);
|
|
283
|
-
}
|
|
284
|
-
removeFilter(column) {
|
|
285
|
-
if (__privateGet(this, _columns).has(column.name)) {
|
|
286
|
-
__privateGet(this, _columns).delete(column.name);
|
|
287
|
-
__privateGet(this, _filters2).delete(column.name);
|
|
288
|
-
__privateGet(this, _values).delete(column.name);
|
|
289
|
-
this.emit("onChange", this.filter);
|
|
290
|
-
return true;
|
|
291
|
-
} else {
|
|
292
|
-
this.emit("onChange", this.filter);
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
resetFilters() {
|
|
297
|
-
__privateGet(this, _columns).clear();
|
|
298
|
-
__privateGet(this, _filters2).clear();
|
|
299
|
-
__privateGet(this, _values).clear();
|
|
300
|
-
this.emit("onChange", this.filter);
|
|
301
|
-
}
|
|
302
|
-
get columnValues() {
|
|
303
|
-
return __privateGet(this, _values);
|
|
304
|
-
}
|
|
305
|
-
get filter() {
|
|
306
|
-
const { size } = __privateGet(this, _filters2);
|
|
307
|
-
if (size === 0) {
|
|
308
|
-
return { filter: "" };
|
|
309
|
-
} else {
|
|
310
|
-
const result = Array.from(__privateGet(this, _filters2).entries()).map(([column, descriptor]) => {
|
|
311
|
-
const columnDescriptor = __privateGet(this, _columns).get(column);
|
|
312
|
-
if (columnDescriptor)
|
|
313
|
-
return buildColumnFilterString(
|
|
314
|
-
columnDescriptor,
|
|
315
|
-
descriptor.op,
|
|
316
|
-
descriptor.filterValue
|
|
317
|
-
);
|
|
318
|
-
}).filter((value) => value !== void 0);
|
|
319
|
-
return {
|
|
320
|
-
filter: result.join(result.length > 1 ? " and " : "")
|
|
321
|
-
};
|
|
225
|
+
return target !== void 0;
|
|
226
|
+
} else {
|
|
227
|
+
const target = filters.find((f) => f.column === filter.column);
|
|
228
|
+
if (target) {
|
|
229
|
+
return target.op === filter.op && target.value === filter.value;
|
|
322
230
|
}
|
|
323
231
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
__privateGet(this, _columns).set(f2.column, defaultColumnDescriptor);
|
|
335
|
-
}
|
|
336
|
-
const columnDescriptor = __privateGet(this, _columns).get(f2.column) || defaultColumnDescriptor;
|
|
337
|
-
const existing = __privateGet(this, _filters2).get(f2.column);
|
|
338
|
-
if (isSingleValueFilter(f2)) {
|
|
339
|
-
const v = existing ? [
|
|
340
|
-
existing.filterValue,
|
|
341
|
-
convertValueToUIFormat(columnDescriptor, f2.value)
|
|
342
|
-
] : convertValueToUIFormat(
|
|
343
|
-
columnDescriptor,
|
|
344
|
-
f2.value
|
|
345
|
-
);
|
|
346
|
-
__privateGet(this, _values).set(f2.column, v);
|
|
347
|
-
__privateGet(this, _filters2).set(f2.column, {
|
|
348
|
-
column: columnDescriptor,
|
|
349
|
-
op: f2.op,
|
|
350
|
-
filterValue: v
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
};
|
|
355
|
-
if (isMultiClauseFilter(f)) {
|
|
356
|
-
f.filters.forEach((f2) => addToStore(f2));
|
|
357
|
-
} else if (isFilterClause(f)) {
|
|
358
|
-
addToStore(f);
|
|
359
|
-
}
|
|
232
|
+
return false;
|
|
233
|
+
};
|
|
234
|
+
const filtersAreEqual = (f1, f2) => {
|
|
235
|
+
if (isSingleValueFilter(f1) && isSingleValueFilter(f2)) {
|
|
236
|
+
return singleValueFilterClausesAreEqual(f1, f2);
|
|
237
|
+
} else if (isBetweenFilter(f1) && isBetweenFilter(f2)) {
|
|
238
|
+
return betweenFiltersAreEqual(f1, f2);
|
|
239
|
+
} else if (isAndFilter(f1) && isAndFilter(f2)) {
|
|
240
|
+
if (f1.filters.length === f2.filters.length) {
|
|
241
|
+
return f1.filters.every(findEqualFilter(f2.filters));
|
|
360
242
|
}
|
|
361
243
|
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
_filters2 = new WeakMap();
|
|
365
|
-
_values = new WeakMap();
|
|
244
|
+
return false;
|
|
245
|
+
};
|
|
366
246
|
|
|
367
|
-
exports.ColumnFilterStore = ColumnFilterStore;
|
|
368
247
|
exports.FilterAggregator = FilterAggregator;
|
|
369
248
|
exports.applyFilterToColumns = applyFilterToColumns;
|
|
370
|
-
exports.buildColumnFilterString = buildColumnFilterString;
|
|
371
249
|
exports.extractFilterForColumn = extractFilterForColumn;
|
|
250
|
+
exports.filtersAreEqual = filtersAreEqual;
|
|
372
251
|
exports.getColumnValueFromFilter = getColumnValueFromFilter;
|
|
373
252
|
exports.isAndFilter = isAndFilter;
|
|
374
253
|
exports.isBetweenFilter = isBetweenFilter;
|
|
@@ -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 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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"}
|
|
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 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 { getTypedValue } from \"../form-utils\";\nimport { isTypeDescriptor } 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 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 column. 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\ntype BetweenFilter = MultiClauseFilter<\"and\", SingleValueFilterClause>;\ntype ChildFilterClause = SingleValueFilterClause | BetweenFilter;\n\nconst betweenFiltersAreEqual = (f1: BetweenFilter, f2: BetweenFilter) => {\n const [from1, to1] = f1.filters;\n const [from2, to2] = f2.filters;\n return filtersAreEqual(from1, from2) && filtersAreEqual(to1, to2);\n};\n\nconst singleValueFilterClausesAreEqual = (\n f1: SingleValueFilterClause,\n f2: SingleValueFilterClause,\n) => f1.column === f2.column && f1.op === f2.op && f1.value === f2.value;\n\nconst findEqualFilter =\n (filters: ChildFilterClause[]) => (filter: ChildFilterClause) => {\n if (isBetweenFilter(filter)) {\n const target = filters.find(\n (f) => isBetweenFilter(f) && betweenFiltersAreEqual(f, filter),\n );\n return target !== undefined;\n } else {\n // A FilterContainerFilter only has one filter clause per column\n const target = filters.find((f) => f.column === filter.column);\n if (target) {\n return target.op === filter.op && target.value === filter.value;\n }\n }\n return false;\n };\n\nexport const filtersAreEqual = (\n f1: FilterContainerFilter,\n f2: FilterContainerFilter,\n): boolean => {\n if (isSingleValueFilter(f1) && isSingleValueFilter(f2)) {\n return singleValueFilterClausesAreEqual(f1, f2);\n } else if (isBetweenFilter(f1) && isBetweenFilter(f2)) {\n return betweenFiltersAreEqual(f1, f2);\n } else if (isAndFilter(f1) && isAndFilter(f2)) {\n if (f1.filters.length === f2.filters.length) {\n return f1.filters.every(findEqualFilter(f2.filters));\n }\n }\n\n return false;\n};\n"],"names":["filter","isTypeDescriptor","getTypedValue"],"mappings":"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"}
|
|
@@ -41,7 +41,6 @@ var keyset = require('./keyset.js');
|
|
|
41
41
|
var listUtils = require('./list-utils.js');
|
|
42
42
|
var localStorageUtils = require('./local-storage-utils.js');
|
|
43
43
|
var loggingUtils = require('./logging-utils.js');
|
|
44
|
-
var menuUtils = require('./menu-utils.js');
|
|
45
44
|
var moduleUtils = require('./module-utils.js');
|
|
46
45
|
var movingWindow = require('./moving-window.js');
|
|
47
46
|
var index$2 = require('./nanoid/index.js');
|
|
@@ -250,11 +249,10 @@ exports.isDateTimePattern = types.isDateTimePattern;
|
|
|
250
249
|
exports.isTimePattern = types.isTimePattern;
|
|
251
250
|
exports.supportedDateTimePatterns = types.supportedDateTimePatterns;
|
|
252
251
|
exports.RangeMonitor = debugUtils.RangeMonitor;
|
|
253
|
-
exports.ColumnFilterStore = filterUtils.ColumnFilterStore;
|
|
254
252
|
exports.FilterAggregator = filterUtils.FilterAggregator;
|
|
255
253
|
exports.applyFilterToColumns = filterUtils.applyFilterToColumns;
|
|
256
|
-
exports.buildColumnFilterString = filterUtils.buildColumnFilterString;
|
|
257
254
|
exports.extractFilterForColumn = filterUtils.extractFilterForColumn;
|
|
255
|
+
exports.filtersAreEqual = filterUtils.filtersAreEqual;
|
|
258
256
|
exports.getColumnValueFromFilter = filterUtils.getColumnValueFromFilter;
|
|
259
257
|
exports.isAndFilter = filterUtils.isAndFilter;
|
|
260
258
|
exports.isBetweenFilter = filterUtils.isBetweenFilter;
|
|
@@ -339,9 +337,6 @@ exports.saveLocalEntity = localStorageUtils.saveLocalEntity;
|
|
|
339
337
|
exports.getLoggingConfigForWorker = loggingUtils.getLoggingConfigForWorker;
|
|
340
338
|
exports.logUnhandledMessage = loggingUtils.logUnhandledMessage;
|
|
341
339
|
exports.logger = loggingUtils.logger;
|
|
342
|
-
exports.hasShowNotificationAction = menuUtils.hasShowNotificationAction;
|
|
343
|
-
exports.isGroupMenuItemDescriptor = menuUtils.isGroupMenuItemDescriptor;
|
|
344
|
-
exports.isOpenBulkEditResponse = menuUtils.isOpenBulkEditResponse;
|
|
345
340
|
exports.isModule = moduleUtils.isModule;
|
|
346
341
|
exports.MovingWindow = movingWindow.MovingWindow;
|
|
347
342
|
exports.uuid = index$2.uuid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-layout-types.js","sources":["../../../../../../packages/vuu-utils/src/shell-layout-types.ts"],"sourcesContent":["/**\n * The Vuu Shell creates the outermost application layout. This includes some\n * 'special' identifiers that can be targetted by layout commands to effect or\n * react to layout changes.\n */\nexport const VuuShellLocation = {\n ContextPanel: \"context-panel\",\n MultiWorkspaceContainer: \"vuu-multi-workspace-container\",\n SidePanel: \"vuu-side-panel\",\n SideToolbar: \"vuu-side-toolbar\",\n Workspace: \"vuu-workspace\",\n WorkspaceContainer: \"vuu-workspace-container\",\n} as const;\n\nexport type VuuShellLocation
|
|
1
|
+
{"version":3,"file":"shell-layout-types.js","sources":["../../../../../../packages/vuu-utils/src/shell-layout-types.ts"],"sourcesContent":["import { ValueOf } from \"./ts-utils\";\n\n/**\n * The Vuu Shell creates the outermost application layout. This includes some\n * 'special' identifiers that can be targetted by layout commands to effect or\n * react to layout changes.\n */\nexport const VuuShellLocation = {\n ContextPanel: \"context-panel\",\n MultiWorkspaceContainer: \"vuu-multi-workspace-container\",\n SidePanel: \"vuu-side-panel\",\n SideToolbar: \"vuu-side-toolbar\",\n Workspace: \"vuu-workspace\",\n WorkspaceContainer: \"vuu-workspace-container\",\n} as const;\n\nexport type VuuShellLocation = ValueOf<typeof VuuShellLocation>;\n"],"names":[],"mappings":";;AAOO,MAAM,gBAAmB,GAAA;AAAA,EAC9B,YAAc,EAAA,eAAA;AAAA,EACd,uBAAyB,EAAA,+BAAA;AAAA,EACzB,SAAW,EAAA,gBAAA;AAAA,EACX,WAAa,EAAA,kBAAA;AAAA,EACb,SAAW,EAAA,eAAA;AAAA,EACX,kBAAoB,EAAA;AACtB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-utils.js","sources":["../../../../../../packages/vuu-utils/src/ts-utils.ts"],"sourcesContent":["import { JSXElementConstructor, ReactElement } from \"react\";\nimport { LayoutJSON } from \"./json-types\";\n\nexport function isNotNullOrUndefined<T>(\n value: T | undefined | null,\n): value is NonNullable<T> {\n return value !== undefined && value !== null;\n}\n\nexport const isObject = (o: unknown): o is object =>\n typeof o === \"object\" && o !== null;\n\nexport type OptionalProperty<T, K extends keyof T> = Omit<T, K> &\n Partial<Pick<T, K>>;\n\n/**\n * test whether a given react element implements a custom toJSON\n * serialisation (static) method.\n */\ntype JsonEnabledJSXElementConstructor<P> = JSXElementConstructor<P> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON: (el: ReactElement) => LayoutJSON<any>;\n};\n\ninterface ReactElementWithJSON<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n P = any,\n T extends // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JsonEnabledJSXElementConstructor<any> = JsonEnabledJSXElementConstructor<any>,\n> {\n type: T;\n props: P;\n key: string | null;\n}\nexport const elementImplementsJSONSerialization = (\n element: ReactElement,\n): element is ReactElementWithJSON =>\n typeof (element.type as JsonEnabledJSXElementConstructor<unknown>).toJSON ===\n \"function\";\n"],"names":[],"mappings":";;AAGO,SAAS,qBACd,KACyB,EAAA;AACzB,EAAO,OAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA;AAC1C;AAEO,MAAM,WAAW,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,YAAY,CAAM,KAAA;
|
|
1
|
+
{"version":3,"file":"ts-utils.js","sources":["../../../../../../packages/vuu-utils/src/ts-utils.ts"],"sourcesContent":["import { JSXElementConstructor, ReactElement } from \"react\";\nimport { LayoutJSON } from \"./json-types\";\n\nexport function isNotNullOrUndefined<T>(\n value: T | undefined | null,\n): value is NonNullable<T> {\n return value !== undefined && value !== null;\n}\n\nexport const isObject = (o: unknown): o is object =>\n typeof o === \"object\" && o !== null;\n\nexport type OptionalProperty<T, K extends keyof T> = Omit<T, K> &\n Partial<Pick<T, K>>;\n\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * test whether a given react element implements a custom toJSON\n * serialisation (static) method.\n */\ntype JsonEnabledJSXElementConstructor<P> = JSXElementConstructor<P> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON: (el: ReactElement) => LayoutJSON<any>;\n};\n\ninterface ReactElementWithJSON<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n P = any,\n T extends // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JsonEnabledJSXElementConstructor<any> = JsonEnabledJSXElementConstructor<any>,\n> {\n type: T;\n props: P;\n key: string | null;\n}\nexport const elementImplementsJSONSerialization = (\n element: ReactElement,\n): element is ReactElementWithJSON =>\n typeof (element.type as JsonEnabledJSXElementConstructor<unknown>).toJSON ===\n \"function\";\n"],"names":[],"mappings":";;AAGO,SAAS,qBACd,KACyB,EAAA;AACzB,EAAO,OAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA;AAC1C;AAEO,MAAM,WAAW,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,YAAY,CAAM,KAAA;AA0B1B,MAAM,qCAAqC,CAChD,OAAA,KAEA,OAAQ,OAAA,CAAQ,KAAmD,MACnE,KAAA;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataWindow.js","sources":["../../../../../../packages/vuu-utils/src/DataWindow.ts"],"sourcesContent":["import { WindowRange } from \"./range-utils\";\nimport { metadataKeys } from \"./column-utils\";\n\nexport type DataItem = string | number | boolean;\nexport type DataRow = [\n /** index */\n number,\n /** render index */\n number,\n /** isLeaf */\n boolean,\n /** isExpanded */\n boolean,\n /** depth */\n number,\n /** child count */\n number,\n /** key */\n string,\n /** selected */\n number,\n /** data values */\n ...DataItem[]
|
|
1
|
+
{"version":3,"file":"DataWindow.js","sources":["../../../../../../packages/vuu-utils/src/DataWindow.ts"],"sourcesContent":["import { WindowRange } from \"./range-utils\";\nimport { metadataKeys } from \"./column-utils\";\n\nexport type DataItem = string | number | boolean;\nexport type DataRow = [\n /** index */\n number,\n /** render index */\n number,\n /** isLeaf */\n boolean,\n /** isExpanded */\n boolean,\n /** depth */\n number,\n /** child count */\n number,\n /** key */\n string,\n /** selected */\n number,\n /** data values */\n ...DataItem[],\n];\nexport type RangeLike = { from: number; to: number };\n\nconst { KEY } = metadataKeys;\n\n// const log = (message: string) =>\n// console.log(`%c[DataWindow] ${message}`, \"color: purple;font-weight: bold;\");\nexport class DataWindow {\n private range: WindowRange;\n public data: DataRow[];\n public rowCount = 0;\n constructor({ from, to }: RangeLike) {\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(to - from);\n // window.dataWindow = this.data;\n // log(`constructor initial range ${from} - ${to}`);\n }\n\n setRowCount = (rowCount: number) => {\n // log(`rowCount => ${rowCount}`);\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n this.rowCount = rowCount;\n };\n\n // return true if existing row was updated\n add(data: DataRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n const isUpdate = this.data[internalIndex] !== undefined;\n this.data[internalIndex] = data;\n return isUpdate;\n } else {\n return false;\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index) && index <= this.rowCount;\n }\n\n setRange(from: number, to: number) {\n // log(`setRange ${from} ${to}`);\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(to - from);\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n hasData(from: number, to: number) {\n const offset = this.range.from;\n const start = from - offset;\n const end = Math.min(to - offset - 1, this.rowCount - 1);\n return this.data[start] !== undefined && this.data[end] !== undefined;\n }\n\n getData(from: number, to: number): DataRow[] {\n const { from: clientFrom } = this.range;\n const startOffset = Math.max(0, from - clientFrom);\n const endOffset = Math.min(to - clientFrom, this.rowCount ?? to);\n return this.data.slice(startOffset, endOffset);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import { EventEmitter } from '../event-emitter.js';
|
|
2
1
|
import { getTypedValue } from '../form-utils.js';
|
|
3
|
-
import {
|
|
4
|
-
import { isValidTimeString, Time, asTimeString, toCalendarDate } from '../date/date-utils.js';
|
|
5
|
-
import '../date/dateTimePattern.js';
|
|
6
|
-
import '@internationalized/date';
|
|
7
|
-
import { isTypeDescriptor, isDateTimeDataValue, toColumnDescriptor, isTimeDataValue } from '../column-utils.js';
|
|
2
|
+
import { isTypeDescriptor } from '../column-utils.js';
|
|
8
3
|
|
|
9
4
|
var __typeError = (msg) => {
|
|
10
5
|
throw TypeError(msg);
|
|
@@ -12,7 +7,7 @@ var __typeError = (msg) => {
|
|
|
12
7
|
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
13
8
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
14
9
|
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);
|
|
15
|
-
var _filters
|
|
10
|
+
var _filters;
|
|
16
11
|
const singleValueFilterOps = /* @__PURE__ */ new Set([
|
|
17
12
|
"=",
|
|
18
13
|
"!=",
|
|
@@ -148,9 +143,6 @@ class FilterAggregator {
|
|
|
148
143
|
add(column, value) {
|
|
149
144
|
const { serverDataType = "string", type } = column;
|
|
150
145
|
const dataType = isTypeDescriptor(type) ? type.name : type ?? serverDataType;
|
|
151
|
-
console.log(
|
|
152
|
-
`FilterAggregator add ${column.name} ${serverDataType} ${JSON.stringify(type)} ${JSON.stringify(value)}`
|
|
153
|
-
);
|
|
154
146
|
if (Array.isArray(value)) {
|
|
155
147
|
const value1 = getTypedValue(value[0].toString(), dataType);
|
|
156
148
|
const value2 = getTypedValue(value[1].toString(), dataType);
|
|
@@ -191,7 +183,7 @@ class FilterAggregator {
|
|
|
191
183
|
return __privateGet(this, _filters).get(name);
|
|
192
184
|
}
|
|
193
185
|
/**
|
|
194
|
-
* Remove filter for this
|
|
186
|
+
* Remove filter for this column. Return false if no filter found, otw true
|
|
195
187
|
*/
|
|
196
188
|
remove(column) {
|
|
197
189
|
if (__privateGet(this, _filters).has(column.name)) {
|
|
@@ -217,150 +209,38 @@ class FilterAggregator {
|
|
|
217
209
|
}
|
|
218
210
|
}
|
|
219
211
|
_filters = new WeakMap();
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
return new Date(value).getTime();
|
|
225
|
-
}
|
|
226
|
-
return value;
|
|
227
|
-
};
|
|
228
|
-
const convertValueToUIFormat = (column, value) => {
|
|
229
|
-
if (isTimeDataValue(column)) {
|
|
230
|
-
return asTimeString(value, false);
|
|
231
|
-
} else if (isDateTimeDataValue(column)) {
|
|
232
|
-
return toCalendarDate(new Date(value)).toString();
|
|
233
|
-
} else {
|
|
234
|
-
return value;
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
const buildBetweenQueryString = (column, range) => {
|
|
238
|
-
const lowerRange = range[0] !== void 0 && range[0].length > 0 ? `${column.name} > ${convertValueToServerFormat(column, range[0])}` : void 0;
|
|
239
|
-
const upperRange = range[1] !== void 0 && range[1].length > 0 ? `${column.name} < ${convertValueToServerFormat(column, range[1])}` : void 0;
|
|
240
|
-
if (lowerRange === void 0) return lowerRange;
|
|
241
|
-
if (upperRange === void 0) return lowerRange;
|
|
242
|
-
return `${lowerRange} and ${upperRange}`;
|
|
243
|
-
};
|
|
244
|
-
const buildColumnFilterString = (column, op, value) => {
|
|
245
|
-
if (Array.isArray(value)) {
|
|
246
|
-
return buildBetweenQueryString(column, value);
|
|
247
|
-
}
|
|
248
|
-
return typeof value === "string" && !isValidTimeString(value) ? `${column.name} ${op} "${value}"` : `${column.name} ${op} ${convertValueToServerFormat(column, value)}`;
|
|
212
|
+
const betweenFiltersAreEqual = (f1, f2) => {
|
|
213
|
+
const [from1, to1] = f1.filters;
|
|
214
|
+
const [from2, to2] = f2.filters;
|
|
215
|
+
return filtersAreEqual(from1, from2) && filtersAreEqual(to1, to2);
|
|
249
216
|
};
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
__privateAdd(this, _values, /* @__PURE__ */ new Map());
|
|
256
|
-
this.filter = query;
|
|
257
|
-
this.loadColumnDescriptors(columnDescriptors);
|
|
258
|
-
}
|
|
259
|
-
loadColumnDescriptors(columnDescriptors) {
|
|
260
|
-
columnDescriptors.forEach((descriptor) => {
|
|
261
|
-
__privateGet(this, _columns).set(descriptor.name, descriptor);
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
addFilter(column, op, value) {
|
|
265
|
-
if (!__privateGet(this, _columns).has(column.name)) {
|
|
266
|
-
__privateGet(this, _columns).set(column.name, column);
|
|
267
|
-
}
|
|
268
|
-
const { serverDataType = "string" } = column;
|
|
269
|
-
const typedValue = Array.isArray(value) ? value : getTypedValue(
|
|
270
|
-
value.toString(),
|
|
271
|
-
serverDataType,
|
|
272
|
-
true
|
|
217
|
+
const singleValueFilterClausesAreEqual = (f1, f2) => f1.column === f2.column && f1.op === f2.op && f1.value === f2.value;
|
|
218
|
+
const findEqualFilter = (filters) => (filter) => {
|
|
219
|
+
if (isBetweenFilter(filter)) {
|
|
220
|
+
const target = filters.find(
|
|
221
|
+
(f) => isBetweenFilter(f) && betweenFiltersAreEqual(f, filter)
|
|
273
222
|
);
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
});
|
|
280
|
-
this.emit("onChange", this.filter);
|
|
281
|
-
}
|
|
282
|
-
removeFilter(column) {
|
|
283
|
-
if (__privateGet(this, _columns).has(column.name)) {
|
|
284
|
-
__privateGet(this, _columns).delete(column.name);
|
|
285
|
-
__privateGet(this, _filters2).delete(column.name);
|
|
286
|
-
__privateGet(this, _values).delete(column.name);
|
|
287
|
-
this.emit("onChange", this.filter);
|
|
288
|
-
return true;
|
|
289
|
-
} else {
|
|
290
|
-
this.emit("onChange", this.filter);
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
resetFilters() {
|
|
295
|
-
__privateGet(this, _columns).clear();
|
|
296
|
-
__privateGet(this, _filters2).clear();
|
|
297
|
-
__privateGet(this, _values).clear();
|
|
298
|
-
this.emit("onChange", this.filter);
|
|
299
|
-
}
|
|
300
|
-
get columnValues() {
|
|
301
|
-
return __privateGet(this, _values);
|
|
302
|
-
}
|
|
303
|
-
get filter() {
|
|
304
|
-
const { size } = __privateGet(this, _filters2);
|
|
305
|
-
if (size === 0) {
|
|
306
|
-
return { filter: "" };
|
|
307
|
-
} else {
|
|
308
|
-
const result = Array.from(__privateGet(this, _filters2).entries()).map(([column, descriptor]) => {
|
|
309
|
-
const columnDescriptor = __privateGet(this, _columns).get(column);
|
|
310
|
-
if (columnDescriptor)
|
|
311
|
-
return buildColumnFilterString(
|
|
312
|
-
columnDescriptor,
|
|
313
|
-
descriptor.op,
|
|
314
|
-
descriptor.filterValue
|
|
315
|
-
);
|
|
316
|
-
}).filter((value) => value !== void 0);
|
|
317
|
-
return {
|
|
318
|
-
filter: result.join(result.length > 1 ? " and " : "")
|
|
319
|
-
};
|
|
223
|
+
return target !== void 0;
|
|
224
|
+
} else {
|
|
225
|
+
const target = filters.find((f) => f.column === filter.column);
|
|
226
|
+
if (target) {
|
|
227
|
+
return target.op === filter.op && target.value === filter.value;
|
|
320
228
|
}
|
|
321
229
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
__privateGet(this, _columns).set(f2.column, defaultColumnDescriptor);
|
|
333
|
-
}
|
|
334
|
-
const columnDescriptor = __privateGet(this, _columns).get(f2.column) || defaultColumnDescriptor;
|
|
335
|
-
const existing = __privateGet(this, _filters2).get(f2.column);
|
|
336
|
-
if (isSingleValueFilter(f2)) {
|
|
337
|
-
const v = existing ? [
|
|
338
|
-
existing.filterValue,
|
|
339
|
-
convertValueToUIFormat(columnDescriptor, f2.value)
|
|
340
|
-
] : convertValueToUIFormat(
|
|
341
|
-
columnDescriptor,
|
|
342
|
-
f2.value
|
|
343
|
-
);
|
|
344
|
-
__privateGet(this, _values).set(f2.column, v);
|
|
345
|
-
__privateGet(this, _filters2).set(f2.column, {
|
|
346
|
-
column: columnDescriptor,
|
|
347
|
-
op: f2.op,
|
|
348
|
-
filterValue: v
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
};
|
|
353
|
-
if (isMultiClauseFilter(f)) {
|
|
354
|
-
f.filters.forEach((f2) => addToStore(f2));
|
|
355
|
-
} else if (isFilterClause(f)) {
|
|
356
|
-
addToStore(f);
|
|
357
|
-
}
|
|
230
|
+
return false;
|
|
231
|
+
};
|
|
232
|
+
const filtersAreEqual = (f1, f2) => {
|
|
233
|
+
if (isSingleValueFilter(f1) && isSingleValueFilter(f2)) {
|
|
234
|
+
return singleValueFilterClausesAreEqual(f1, f2);
|
|
235
|
+
} else if (isBetweenFilter(f1) && isBetweenFilter(f2)) {
|
|
236
|
+
return betweenFiltersAreEqual(f1, f2);
|
|
237
|
+
} else if (isAndFilter(f1) && isAndFilter(f2)) {
|
|
238
|
+
if (f1.filters.length === f2.filters.length) {
|
|
239
|
+
return f1.filters.every(findEqualFilter(f2.filters));
|
|
358
240
|
}
|
|
359
241
|
}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
_filters2 = new WeakMap();
|
|
363
|
-
_values = new WeakMap();
|
|
242
|
+
return false;
|
|
243
|
+
};
|
|
364
244
|
|
|
365
|
-
export {
|
|
245
|
+
export { FilterAggregator, applyFilterToColumns, extractFilterForColumn, filtersAreEqual, getColumnValueFromFilter, isAndFilter, isBetweenFilter, isCompleteFilter, isFilterClause, isFilteredColumn, isInFilter, isMultiClauseFilter, isMultiValueFilter, isNamedFilter, isOrFilter, isSingleValueFilter, isValidFilterClauseOp, stripFilterFromColumns };
|
|
366
246
|
//# sourceMappingURL=filter-utils.js.map
|
|
@@ -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 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","f"],"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 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 { getTypedValue } from \"../form-utils\";\nimport { isTypeDescriptor } 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 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 column. 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\ntype BetweenFilter = MultiClauseFilter<\"and\", SingleValueFilterClause>;\ntype ChildFilterClause = SingleValueFilterClause | BetweenFilter;\n\nconst betweenFiltersAreEqual = (f1: BetweenFilter, f2: BetweenFilter) => {\n const [from1, to1] = f1.filters;\n const [from2, to2] = f2.filters;\n return filtersAreEqual(from1, from2) && filtersAreEqual(to1, to2);\n};\n\nconst singleValueFilterClausesAreEqual = (\n f1: SingleValueFilterClause,\n f2: SingleValueFilterClause,\n) => f1.column === f2.column && f1.op === f2.op && f1.value === f2.value;\n\nconst findEqualFilter =\n (filters: ChildFilterClause[]) => (filter: ChildFilterClause) => {\n if (isBetweenFilter(filter)) {\n const target = filters.find(\n (f) => isBetweenFilter(f) && betweenFiltersAreEqual(f, filter),\n );\n return target !== undefined;\n } else {\n // A FilterContainerFilter only has one filter clause per column\n const target = filters.find((f) => f.column === filter.column);\n if (target) {\n return target.op === filter.op && target.value === filter.value;\n }\n }\n return false;\n };\n\nexport const filtersAreEqual = (\n f1: FilterContainerFilter,\n f2: FilterContainerFilter,\n): boolean => {\n if (isSingleValueFilter(f1) && isSingleValueFilter(f2)) {\n return singleValueFilterClausesAreEqual(f1, f2);\n } else if (isBetweenFilter(f1) && isBetweenFilter(f2)) {\n return betweenFiltersAreEqual(f1, f2);\n } else if (isAndFilter(f1) && isAndFilter(f2)) {\n if (f1.filters.length === f2.filters.length) {\n return f1.filters.every(findEqualFilter(f2.filters));\n }\n }\n\n return false;\n};\n"],"names":["filter"],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export { dateTimePattern, defaultPatternsByType, fallbackDateTimePattern } from
|
|
|
21
21
|
export { formatDate, getDateFormatter } from './date/formatter.js';
|
|
22
22
|
export { dateTimeLabelByType, isDatePattern, isDateTimePattern, isTimePattern, supportedDateTimePatterns } from './date/types.js';
|
|
23
23
|
export { RangeMonitor } from './debug-utils.js';
|
|
24
|
-
export {
|
|
24
|
+
export { FilterAggregator, applyFilterToColumns, extractFilterForColumn, filtersAreEqual, getColumnValueFromFilter, isAndFilter, isBetweenFilter, isCompleteFilter, isFilterClause, isFilteredColumn, isInFilter, isMultiClauseFilter, isMultiValueFilter, isNamedFilter, isOrFilter, isSingleValueFilter, isValidFilterClauseOp, stripFilterFromColumns } from './filters/filter-utils.js';
|
|
25
25
|
export { dateFilterAsQuery, filterAsQuery, removeColumnFromFilter } from './filters/filterAsQuery.js';
|
|
26
26
|
export { createEl, dispatchCustomEvent, dispatchKeyboardEvent, dispatchMouseEvent, focusFirstFocusableElement, getClosest, getClosestIndexItem, getElementByDataIndex, getElementDataIndex, getFocusableElement, getScrollbarSize, hasOpenOptionList, isDateInput, isInputElement, isSelectableElement, queryClosest } from './html-utils.js';
|
|
27
27
|
export { EventEmitter } from './event-emitter.js';
|
|
@@ -39,7 +39,6 @@ export { KeySet } from './keyset.js';
|
|
|
39
39
|
export { getSelectedOption } from './list-utils.js';
|
|
40
40
|
export { getAllLocalEntity, getLocalEntity, saveLocalEntity } from './local-storage-utils.js';
|
|
41
41
|
export { getLoggingConfigForWorker, logUnhandledMessage, logger } from './logging-utils.js';
|
|
42
|
-
export { hasShowNotificationAction, isGroupMenuItemDescriptor, isOpenBulkEditResponse } from './menu-utils.js';
|
|
43
42
|
export { isModule } from './module-utils.js';
|
|
44
43
|
export { MovingWindow } from './moving-window.js';
|
|
45
44
|
export { uuid } from './nanoid/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-layout-types.js","sources":["../../../../../../packages/vuu-utils/src/shell-layout-types.ts"],"sourcesContent":["/**\n * The Vuu Shell creates the outermost application layout. This includes some\n * 'special' identifiers that can be targetted by layout commands to effect or\n * react to layout changes.\n */\nexport const VuuShellLocation = {\n ContextPanel: \"context-panel\",\n MultiWorkspaceContainer: \"vuu-multi-workspace-container\",\n SidePanel: \"vuu-side-panel\",\n SideToolbar: \"vuu-side-toolbar\",\n Workspace: \"vuu-workspace\",\n WorkspaceContainer: \"vuu-workspace-container\",\n} as const;\n\nexport type VuuShellLocation
|
|
1
|
+
{"version":3,"file":"shell-layout-types.js","sources":["../../../../../../packages/vuu-utils/src/shell-layout-types.ts"],"sourcesContent":["import { ValueOf } from \"./ts-utils\";\n\n/**\n * The Vuu Shell creates the outermost application layout. This includes some\n * 'special' identifiers that can be targetted by layout commands to effect or\n * react to layout changes.\n */\nexport const VuuShellLocation = {\n ContextPanel: \"context-panel\",\n MultiWorkspaceContainer: \"vuu-multi-workspace-container\",\n SidePanel: \"vuu-side-panel\",\n SideToolbar: \"vuu-side-toolbar\",\n Workspace: \"vuu-workspace\",\n WorkspaceContainer: \"vuu-workspace-container\",\n} as const;\n\nexport type VuuShellLocation = ValueOf<typeof VuuShellLocation>;\n"],"names":[],"mappings":"AAOO,MAAM,gBAAmB,GAAA;AAAA,EAC9B,YAAc,EAAA,eAAA;AAAA,EACd,uBAAyB,EAAA,+BAAA;AAAA,EACzB,SAAW,EAAA,gBAAA;AAAA,EACX,WAAa,EAAA,kBAAA;AAAA,EACb,SAAW,EAAA,eAAA;AAAA,EACX,kBAAoB,EAAA;AACtB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-utils.js","sources":["../../../../../../packages/vuu-utils/src/ts-utils.ts"],"sourcesContent":["import { JSXElementConstructor, ReactElement } from \"react\";\nimport { LayoutJSON } from \"./json-types\";\n\nexport function isNotNullOrUndefined<T>(\n value: T | undefined | null,\n): value is NonNullable<T> {\n return value !== undefined && value !== null;\n}\n\nexport const isObject = (o: unknown): o is object =>\n typeof o === \"object\" && o !== null;\n\nexport type OptionalProperty<T, K extends keyof T> = Omit<T, K> &\n Partial<Pick<T, K>>;\n\n/**\n * test whether a given react element implements a custom toJSON\n * serialisation (static) method.\n */\ntype JsonEnabledJSXElementConstructor<P> = JSXElementConstructor<P> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON: (el: ReactElement) => LayoutJSON<any>;\n};\n\ninterface ReactElementWithJSON<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n P = any,\n T extends // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JsonEnabledJSXElementConstructor<any> = JsonEnabledJSXElementConstructor<any>,\n> {\n type: T;\n props: P;\n key: string | null;\n}\nexport const elementImplementsJSONSerialization = (\n element: ReactElement,\n): element is ReactElementWithJSON =>\n typeof (element.type as JsonEnabledJSXElementConstructor<unknown>).toJSON ===\n \"function\";\n"],"names":[],"mappings":"AAGO,SAAS,qBACd,KACyB,EAAA;AACzB,EAAO,OAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA;AAC1C;AAEO,MAAM,WAAW,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,YAAY,CAAM,KAAA;
|
|
1
|
+
{"version":3,"file":"ts-utils.js","sources":["../../../../../../packages/vuu-utils/src/ts-utils.ts"],"sourcesContent":["import { JSXElementConstructor, ReactElement } from \"react\";\nimport { LayoutJSON } from \"./json-types\";\n\nexport function isNotNullOrUndefined<T>(\n value: T | undefined | null,\n): value is NonNullable<T> {\n return value !== undefined && value !== null;\n}\n\nexport const isObject = (o: unknown): o is object =>\n typeof o === \"object\" && o !== null;\n\nexport type OptionalProperty<T, K extends keyof T> = Omit<T, K> &\n Partial<Pick<T, K>>;\n\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * test whether a given react element implements a custom toJSON\n * serialisation (static) method.\n */\ntype JsonEnabledJSXElementConstructor<P> = JSXElementConstructor<P> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON: (el: ReactElement) => LayoutJSON<any>;\n};\n\ninterface ReactElementWithJSON<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n P = any,\n T extends // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JsonEnabledJSXElementConstructor<any> = JsonEnabledJSXElementConstructor<any>,\n> {\n type: T;\n props: P;\n key: string | null;\n}\nexport const elementImplementsJSONSerialization = (\n element: ReactElement,\n): element is ReactElementWithJSON =>\n typeof (element.type as JsonEnabledJSXElementConstructor<unknown>).toJSON ===\n \"function\";\n"],"names":[],"mappings":"AAGO,SAAS,qBACd,KACyB,EAAA;AACzB,EAAO,OAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA;AAC1C;AAEO,MAAM,WAAW,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,YAAY,CAAM,KAAA;AA0B1B,MAAM,qCAAqC,CAChD,OAAA,KAEA,OAAQ,OAAA,CAAQ,KAAmD,MACnE,KAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.47",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"types": "types/index.d.ts",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-data-types": "0.13.
|
|
8
|
-
"@vuu-ui/vuu-table-types": "0.13.
|
|
9
|
-
"@vuu-ui/vuu-filter-types": "0.13.
|
|
10
|
-
"@vuu-ui/vuu-protocol-types": "0.13.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "0.13.47",
|
|
8
|
+
"@vuu-ui/vuu-table-types": "0.13.47",
|
|
9
|
+
"@vuu-ui/vuu-filter-types": "0.13.47",
|
|
10
|
+
"@vuu-ui/vuu-protocol-types": "0.13.47"
|
|
11
11
|
},
|
|
12
12
|
"peerDependencies": {
|
|
13
13
|
"@internationalized/date": "^3.0.0",
|
|
14
|
-
"@vuu-ui/vuu-filter-parser": "0.13.
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.13.47",
|
|
15
15
|
"clsx": "^2.0.0",
|
|
16
16
|
"react": "^19.1.0",
|
|
17
17
|
"react-dom": "^19.1.0"
|
package/types/DataWindow.d.ts
CHANGED
|
@@ -35,5 +35,5 @@ export declare class DataWindow {
|
|
|
35
35
|
isWithinRange(index: number): boolean;
|
|
36
36
|
setRange(from: number, to: number): void;
|
|
37
37
|
hasData(from: number, to: number): boolean;
|
|
38
|
-
getData(from: number, to: number):
|
|
38
|
+
getData(from: number, to: number): DataRow[];
|
|
39
39
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import type { DataSourceFilter } from "@vuu-ui/vuu-data-types";
|
|
2
2
|
import { ColumnFilterOp, ColumnFilterValue, Filter, FilterClauseOp, FilterContainerFilter, FilterWithPartialClause, MultiClauseFilter, MultiValueFilterClause, SingleValueFilterClause } from "@vuu-ui/vuu-filter-types";
|
|
3
3
|
import { ColumnDescriptor, RuntimeColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
4
|
-
import { EventEmitter } from "../event-emitter";
|
|
5
|
-
import { VuuFilter } from "@vuu-ui/vuu-protocol-types";
|
|
6
4
|
export declare const isValidFilterClauseOp: (op?: string) => op is FilterClauseOp;
|
|
7
5
|
export declare const isNamedFilter: (f?: Filter) => boolean;
|
|
8
6
|
export declare const isSingleValueFilter: (f?: Partial<Filter>) => f is SingleValueFilterClause;
|
|
@@ -42,7 +40,7 @@ export declare const stripFilterFromColumns: (columns: RuntimeColumnDescriptor[]
|
|
|
42
40
|
sorted?: import("@vuu-ui/vuu-table-types").ColumnSort;
|
|
43
41
|
valueFormatter: import("@vuu-ui/vuu-table-types").ValueFormatter;
|
|
44
42
|
width: number;
|
|
45
|
-
aggregate?: import("
|
|
43
|
+
aggregate?: import("packages/vuu-protocol-types").VuuAggType;
|
|
46
44
|
allowColumnHeaderMenu?: false;
|
|
47
45
|
colHeaderContentRenderer?: string;
|
|
48
46
|
colHeaderLabelRenderer?: string;
|
|
@@ -56,7 +54,7 @@ export declare const stripFilterFromColumns: (columns: RuntimeColumnDescriptor[]
|
|
|
56
54
|
editable?: boolean;
|
|
57
55
|
editableBulk?: import("@vuu-ui/vuu-data-types").BulkEdit;
|
|
58
56
|
name: string;
|
|
59
|
-
serverDataType?: import("
|
|
57
|
+
serverDataType?: import("packages/vuu-protocol-types").VuuColumnDataType;
|
|
60
58
|
type?: import("@vuu-ui/vuu-data-types").DataValueType;
|
|
61
59
|
}[];
|
|
62
60
|
export declare const extractFilterForColumn: (filter: Filter | undefined, columnName: string) => Filter | undefined;
|
|
@@ -76,23 +74,9 @@ export declare class FilterAggregator {
|
|
|
76
74
|
has({ name }: ColumnDescriptor): boolean;
|
|
77
75
|
get({ name }: ColumnDescriptor): FilterContainerFilter | undefined;
|
|
78
76
|
/**
|
|
79
|
-
* Remove filter for this
|
|
77
|
+
* Remove filter for this column. Return false if no filter found, otw true
|
|
80
78
|
*/
|
|
81
79
|
remove(column: ColumnDescriptor): boolean;
|
|
82
80
|
get filter(): FilterContainerFilter | undefined;
|
|
83
81
|
}
|
|
84
|
-
export declare const
|
|
85
|
-
export type ColumnFilterStoreEvents = {
|
|
86
|
-
onChange: (filter: VuuFilter) => void;
|
|
87
|
-
};
|
|
88
|
-
export declare class ColumnFilterStore extends EventEmitter<ColumnFilterStoreEvents> {
|
|
89
|
-
#private;
|
|
90
|
-
constructor(query?: VuuFilter, columnDescriptors?: ColumnDescriptor[]);
|
|
91
|
-
private loadColumnDescriptors;
|
|
92
|
-
addFilter(column: ColumnDescriptor, op: ColumnFilterOp, value: ColumnFilterValue): void;
|
|
93
|
-
removeFilter(column: ColumnDescriptor): boolean;
|
|
94
|
-
resetFilters(): void;
|
|
95
|
-
get columnValues(): Map<string, ColumnFilterValue>;
|
|
96
|
-
get filter(): VuuFilter;
|
|
97
|
-
set filter(query: VuuFilter);
|
|
98
|
-
}
|
|
82
|
+
export declare const filtersAreEqual: (f1: FilterContainerFilter, f2: FilterContainerFilter) => boolean;
|
|
@@ -4,7 +4,7 @@ export type ValueFormatters = {
|
|
|
4
4
|
};
|
|
5
5
|
export declare const defaultValueFormatter: (value: unknown) => string;
|
|
6
6
|
export declare const numericFormatter: ({ align, type, }: Partial<ColumnDescriptor>) => (value: unknown) => string;
|
|
7
|
-
export declare const getValueFormatter: (column: ColumnDescriptor, serverDataType?: import("
|
|
7
|
+
export declare const getValueFormatter: (column: ColumnDescriptor, serverDataType?: import("packages/vuu-protocol-types").VuuColumnDataType | undefined) => ValueFormatter;
|
|
8
8
|
/**
|
|
9
9
|
* Lowercases a string and returns as Lowercase typescript type
|
|
10
10
|
*
|
package/types/index.d.ts
CHANGED
|
@@ -40,7 +40,6 @@ export * from "./layout-types";
|
|
|
40
40
|
export * from "./list-utils";
|
|
41
41
|
export * from "./local-storage-utils";
|
|
42
42
|
export * from "./logging-utils";
|
|
43
|
-
export * from "./menu-utils";
|
|
44
43
|
export * from "./module-utils";
|
|
45
44
|
export * from "./moving-window";
|
|
46
45
|
export * from "./nanoid";
|
package/types/json-types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NamedFilter } from "@vuu-ui/vuu-filter-types";
|
|
2
2
|
import { CSSProperties, ReactElement } from "react";
|
|
3
|
-
|
|
3
|
+
import { ValueOf } from "./ts-utils";
|
|
4
4
|
export interface ApplicationSettings {
|
|
5
5
|
leftNav?: {
|
|
6
6
|
activeTabIndex: number;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ValueOf } from "./ts-utils";
|
|
1
2
|
/**
|
|
2
3
|
* The Vuu Shell creates the outermost application layout. This includes some
|
|
3
4
|
* 'special' identifiers that can be targetted by layout commands to effect or
|
|
@@ -11,4 +12,4 @@ export declare const VuuShellLocation: {
|
|
|
11
12
|
readonly Workspace: "vuu-workspace";
|
|
12
13
|
readonly WorkspaceContainer: "vuu-workspace-container";
|
|
13
14
|
};
|
|
14
|
-
export type VuuShellLocation =
|
|
15
|
+
export type VuuShellLocation = ValueOf<typeof VuuShellLocation>;
|
package/types/ts-utils.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { LayoutJSON } from "./json-types";
|
|
|
3
3
|
export declare function isNotNullOrUndefined<T>(value: T | undefined | null): value is NonNullable<T>;
|
|
4
4
|
export declare const isObject: (o: unknown) => o is object;
|
|
5
5
|
export type OptionalProperty<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
6
|
+
export type ValueOf<T> = T[keyof T];
|
|
6
7
|
/**
|
|
7
8
|
* test whether a given react element implements a custom toJSON
|
|
8
9
|
* serialisation (static) method.
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const isGroupMenuItemDescriptor = (menuItem) => menuItem !== void 0 && "children" in menuItem;
|
|
4
|
-
const isOpenBulkEditResponse = (rpcResponse) => rpcResponse.rpcName === "VP_BULK_EDIT_BEGIN_RPC";
|
|
5
|
-
const hasShowNotificationAction = (res) => res.action?.type === "SHOW_NOTIFICATION_ACTION";
|
|
6
|
-
|
|
7
|
-
exports.hasShowNotificationAction = hasShowNotificationAction;
|
|
8
|
-
exports.isGroupMenuItemDescriptor = isGroupMenuItemDescriptor;
|
|
9
|
-
exports.isOpenBulkEditResponse = isOpenBulkEditResponse;
|
|
10
|
-
//# sourceMappingURL=menu-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-utils.js","sources":["../../../../../../packages/vuu-utils/src/menu-utils.ts"],"sourcesContent":["import {\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ShowNotificationAction,\n VuuRpcResponse,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n} from \"@vuu-ui/vuu-context-menu\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor,\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport const isOpenBulkEditResponse = (\n rpcResponse: Partial<VuuRpcResponse>,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n (rpcResponse as MenuRpcResponse).rpcName === \"VP_BULK_EDIT_BEGIN_RPC\";\n\nexport const hasShowNotificationAction = (\n res: Partial<VuuRpcResponse>,\n): res is MenuRpcResponse<ShowNotificationAction> =>\n (res as MenuRpcResponse).action?.type === \"SHOW_NOTIFICATION_ACTION\";\n"],"names":[],"mappings":";;AAaO,MAAM,yBAA4B,GAAA,CACvC,QAEA,KAAA,QAAA,KAAa,UAAa,UAAc,IAAA;AAEnC,MAAM,sBAAyB,GAAA,CACpC,WAEC,KAAA,WAAA,CAAgC,OAAY,KAAA;AAExC,MAAM,yBAA4B,GAAA,CACvC,GAEC,KAAA,GAAA,CAAwB,QAAQ,IAAS,KAAA;;;;;;"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
const isGroupMenuItemDescriptor = (menuItem) => menuItem !== void 0 && "children" in menuItem;
|
|
2
|
-
const isOpenBulkEditResponse = (rpcResponse) => rpcResponse.rpcName === "VP_BULK_EDIT_BEGIN_RPC";
|
|
3
|
-
const hasShowNotificationAction = (res) => res.action?.type === "SHOW_NOTIFICATION_ACTION";
|
|
4
|
-
|
|
5
|
-
export { hasShowNotificationAction, isGroupMenuItemDescriptor, isOpenBulkEditResponse };
|
|
6
|
-
//# sourceMappingURL=menu-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"menu-utils.js","sources":["../../../../../../packages/vuu-utils/src/menu-utils.ts"],"sourcesContent":["import {\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ShowNotificationAction,\n VuuRpcResponse,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ContextMenuGroupItemDescriptor,\n ContextMenuItemDescriptor,\n} from \"@vuu-ui/vuu-context-menu\";\n\nexport const isGroupMenuItemDescriptor = (\n menuItem?: ContextMenuItemDescriptor,\n): menuItem is ContextMenuGroupItemDescriptor =>\n menuItem !== undefined && \"children\" in menuItem;\n\nexport const isOpenBulkEditResponse = (\n rpcResponse: Partial<VuuRpcResponse>,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n (rpcResponse as MenuRpcResponse).rpcName === \"VP_BULK_EDIT_BEGIN_RPC\";\n\nexport const hasShowNotificationAction = (\n res: Partial<VuuRpcResponse>,\n): res is MenuRpcResponse<ShowNotificationAction> =>\n (res as MenuRpcResponse).action?.type === \"SHOW_NOTIFICATION_ACTION\";\n"],"names":[],"mappings":"AAaO,MAAM,yBAA4B,GAAA,CACvC,QAEA,KAAA,QAAA,KAAa,UAAa,UAAc,IAAA;AAEnC,MAAM,sBAAyB,GAAA,CACpC,WAEC,KAAA,WAAA,CAAgC,OAAY,KAAA;AAExC,MAAM,yBAA4B,GAAA,CACvC,GAEC,KAAA,GAAA,CAAwB,QAAQ,IAAS,KAAA;;;;"}
|
package/types/menu-utils.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { MenuRpcResponse, OpenDialogActionWithSchema } from "@vuu-ui/vuu-data-types";
|
|
2
|
-
import { ShowNotificationAction, VuuRpcResponse } from "@vuu-ui/vuu-protocol-types";
|
|
3
|
-
import { ContextMenuGroupItemDescriptor, ContextMenuItemDescriptor } from "@vuu-ui/vuu-context-menu";
|
|
4
|
-
export declare const isGroupMenuItemDescriptor: (menuItem?: ContextMenuItemDescriptor) => menuItem is ContextMenuGroupItemDescriptor;
|
|
5
|
-
export declare const isOpenBulkEditResponse: (rpcResponse: Partial<VuuRpcResponse>) => rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema>;
|
|
6
|
-
export declare const hasShowNotificationAction: (res: Partial<VuuRpcResponse>) => res is MenuRpcResponse<ShowNotificationAction>;
|