@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.
@@ -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[]\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): any[] {\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
+ {"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, _columns, _filters2, _values;
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 colun. Return false if no filter found, otw true
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 convertValueToServerFormat = (column, value) => {
223
- if (dateUtils.isValidTimeString(value)) {
224
- return dateUtils.Time(value).asDate().getTime();
225
- } else if (columnUtils.isDateTimeDataValue(column)) {
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
- class ColumnFilterStore extends eventEmitter.EventEmitter {
253
- constructor(query = { filter: "" }, columnDescriptors = []) {
254
- super();
255
- __privateAdd(this, _columns, /* @__PURE__ */ new Map());
256
- __privateAdd(this, _filters2, /* @__PURE__ */ new Map());
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
- __privateGet(this, _values).set(column.name, typedValue);
277
- __privateGet(this, _filters2).set(column.name, {
278
- column,
279
- op,
280
- filterValue: typedValue
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
- set filter(query) {
325
- __privateGet(this, _columns).clear();
326
- __privateGet(this, _filters2).clear();
327
- __privateGet(this, _values).clear();
328
- if (query.filter) {
329
- const f = vuuFilterParser.parseFilter(query.filter);
330
- const addToStore = (f2) => {
331
- if (f2.column) {
332
- const defaultColumnDescriptor = columnUtils.toColumnDescriptor(f2.column);
333
- if (!__privateGet(this, _columns).has(f2.column)) {
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
- _columns = new WeakMap();
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 =\n (typeof VuuShellLocation)[keyof typeof VuuShellLocation];\n"],"names":[],"mappings":";;AAKO,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
+ {"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;AAwB1B,MAAM,qCAAqC,CAChD,OAAA,KAEA,OAAQ,OAAA,CAAQ,KAAmD,MACnE,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[]\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): any[] {\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
+ {"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 { parseFilter } from '@vuu-ui/vuu-filter-parser';
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, _columns, _filters2, _values;
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 colun. Return false if no filter found, otw true
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 convertValueToServerFormat = (column, value) => {
221
- if (isValidTimeString(value)) {
222
- return Time(value).asDate().getTime();
223
- } else if (isDateTimeDataValue(column)) {
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
- class ColumnFilterStore extends EventEmitter {
251
- constructor(query = { filter: "" }, columnDescriptors = []) {
252
- super();
253
- __privateAdd(this, _columns, /* @__PURE__ */ new Map());
254
- __privateAdd(this, _filters2, /* @__PURE__ */ new Map());
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
- __privateGet(this, _values).set(column.name, typedValue);
275
- __privateGet(this, _filters2).set(column.name, {
276
- column,
277
- op,
278
- filterValue: typedValue
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
- set filter(query) {
323
- __privateGet(this, _columns).clear();
324
- __privateGet(this, _filters2).clear();
325
- __privateGet(this, _values).clear();
326
- if (query.filter) {
327
- const f = parseFilter(query.filter);
328
- const addToStore = (f2) => {
329
- if (f2.column) {
330
- const defaultColumnDescriptor = toColumnDescriptor(f2.column);
331
- if (!__privateGet(this, _columns).has(f2.column)) {
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
- _columns = new WeakMap();
362
- _filters2 = new WeakMap();
363
- _values = new WeakMap();
242
+ return false;
243
+ };
364
244
 
365
- export { ColumnFilterStore, FilterAggregator, applyFilterToColumns, buildColumnFilterString, extractFilterForColumn, getColumnValueFromFilter, isAndFilter, isBetweenFilter, isCompleteFilter, isFilterClause, isFilteredColumn, isInFilter, isMultiClauseFilter, isMultiValueFilter, isNamedFilter, isOrFilter, isSingleValueFilter, isValidFilterClauseOp, stripFilterFromColumns };
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 { ColumnFilterStore, FilterAggregator, applyFilterToColumns, buildColumnFilterString, extractFilterForColumn, getColumnValueFromFilter, isAndFilter, isBetweenFilter, isCompleteFilter, isFilterClause, isFilteredColumn, isInFilter, isMultiClauseFilter, isMultiValueFilter, isNamedFilter, isOrFilter, isSingleValueFilter, isValidFilterClauseOp, stripFilterFromColumns } from './filters/filter-utils.js';
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 =\n (typeof VuuShellLocation)[keyof typeof VuuShellLocation];\n"],"names":[],"mappings":"AAKO,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
+ {"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;AAwB1B,MAAM,qCAAqC,CAChD,OAAA,KAEA,OAAQ,OAAA,CAAQ,KAAmD,MACnE,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.45",
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.45",
8
- "@vuu-ui/vuu-table-types": "0.13.45",
9
- "@vuu-ui/vuu-filter-types": "0.13.45",
10
- "@vuu-ui/vuu-protocol-types": "0.13.45"
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.45",
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"
@@ -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): any[];
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("@vuu-ui/vuu-protocol-types").VuuAggType;
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("@vuu-ui/vuu-protocol-types").VuuColumnDataType;
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 colun. Return false if no filter found, otw true
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 buildColumnFilterString: (column: ColumnDescriptor, op: ColumnFilterOp, value: ColumnFilterValue) => string | undefined;
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("@vuu-ui/vuu-protocol-types").VuuColumnDataType | undefined) => ValueFormatter;
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";
@@ -1,6 +1,6 @@
1
1
  import { NamedFilter } from "@vuu-ui/vuu-filter-types";
2
2
  import { CSSProperties, ReactElement } from "react";
3
- export type ValueOf<T> = T[keyof T];
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 = (typeof VuuShellLocation)[keyof typeof VuuShellLocation];
15
+ export type VuuShellLocation = ValueOf<typeof VuuShellLocation>;
@@ -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;;;;"}
@@ -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>;