@vuu-ui/vuu-filters 0.7.5-debug → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/index.js CHANGED
@@ -1,2082 +1,34 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __commonJS = (cb, mod) => function __require() {
8
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
- var __accessCheck = (obj, member, msg) => {
27
- if (!member.has(obj))
28
- throw TypeError("Cannot " + msg);
29
- };
30
- var __privateGet = (obj, member, getter) => {
31
- __accessCheck(obj, member, "read from private field");
32
- return getter ? getter.call(obj) : member.get(obj);
33
- };
34
- var __privateAdd = (obj, member, value) => {
35
- if (member.has(obj))
36
- throw TypeError("Cannot add the same private member more than once");
37
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
38
- };
39
- var __privateSet = (obj, member, value, setter) => {
40
- __accessCheck(obj, member, "write to private field");
41
- setter ? setter.call(obj, value) : member.set(obj, value);
42
- return value;
43
- };
44
-
45
- // ../../node_modules/classnames/index.js
46
- var require_classnames = __commonJS({
47
- "../../node_modules/classnames/index.js"(exports, module) {
48
- (function() {
49
- "use strict";
50
- var hasOwn = {}.hasOwnProperty;
51
- var nativeCodeString = "[native code]";
52
- function classNames() {
53
- var classes = [];
54
- for (var i = 0; i < arguments.length; i++) {
55
- var arg = arguments[i];
56
- if (!arg)
57
- continue;
58
- var argType = typeof arg;
59
- if (argType === "string" || argType === "number") {
60
- classes.push(arg);
61
- } else if (Array.isArray(arg)) {
62
- if (arg.length) {
63
- var inner = classNames.apply(null, arg);
64
- if (inner) {
65
- classes.push(inner);
66
- }
67
- }
68
- } else if (argType === "object") {
69
- if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes("[native code]")) {
70
- classes.push(arg.toString());
71
- continue;
72
- }
73
- for (var key in arg) {
74
- if (hasOwn.call(arg, key) && arg[key]) {
75
- classes.push(key);
76
- }
77
- }
78
- }
79
- }
80
- return classes.join(" ");
81
- }
82
- if (typeof module !== "undefined" && module.exports) {
83
- classNames.default = classNames;
84
- module.exports = classNames;
85
- } else if (typeof define === "function" && typeof define.amd === "object" && define.amd) {
86
- define("classnames", [], function() {
87
- return classNames;
88
- });
89
- } else {
90
- window.classNames = classNames;
91
- }
92
- })();
93
- }
94
- });
95
-
96
- // src/column-filter/ColumnFilter.tsx
97
- import {
98
- Dropdown,
99
- Toolbar,
100
- ToolbarButton,
101
- ToolbarField as ToolbarField2
102
- } from "@heswell/salt-lab";
103
- import { Text } from "@salt-ds/core";
104
-
105
- // ../../node_modules/@salt-ds/icons/dist-es/packages/icons/src/icon/Icon.js
106
- import { jsx } from "react/jsx-runtime";
107
- import { forwardRef } from "react";
108
-
109
- // ../../node_modules/clsx/dist/clsx.m.js
110
- function r(e) {
111
- var t, f, n = "";
112
- if ("string" == typeof e || "number" == typeof e)
113
- n += e;
114
- else if ("object" == typeof e)
115
- if (Array.isArray(e))
116
- for (t = 0; t < e.length; t++)
117
- e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
118
- else
119
- for (t in e)
120
- e[t] && (n && (n += " "), n += t);
121
- return n;
122
- }
123
- function clsx() {
124
- for (var e, t, f = 0, n = ""; f < arguments.length; )
125
- (e = arguments[f++]) && (t = r(e)) && (n && (n += " "), n += t);
126
- return n;
1
+ var mo=Object.create;var fe=Object.defineProperty;var fo=Object.getOwnPropertyDescriptor;var go=Object.getOwnPropertyNames;var xo=Object.getPrototypeOf,Io=Object.prototype.hasOwnProperty;var So=(e,o)=>()=>(o||e((o={exports:{}}).exports,o),o.exports);var Fo=(e,o,r,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of go(o))!Io.call(e,n)&&n!==r&&fe(e,n,{get:()=>o[n],enumerable:!(t=fo(o,n))||t.enumerable});return e};var ge=(e,o,r)=>(r=e!=null?mo(xo(e)):{},Fo(o||!e||!e.__esModule?fe(r,"default",{value:e,enumerable:!0}):r,e));var xe=(e,o,r)=>{if(!o.has(e))throw TypeError("Cannot "+r)};var O=(e,o,r)=>(xe(e,o,"read from private field"),r?r.call(e):o.get(e)),Ie=(e,o,r)=>{if(o.has(e))throw TypeError("Cannot add the same private member more than once");o instanceof WeakSet?o.add(e):o.set(e,r)},J=(e,o,r,t)=>(xe(e,o,"write to private field"),t?t.call(e,r):o.set(e,r),r);var ae=So((bn,z)=>{(function(){"use strict";var e={}.hasOwnProperty,o="[native code]";function r(){for(var t=[],n=0;n<arguments.length;n++){var i=arguments[n];if(i){var s=typeof i;if(s==="string"||s==="number")t.push(i);else if(Array.isArray(i)){if(i.length){var p=r.apply(null,i);p&&t.push(p)}}else if(s==="object"){if(i.toString!==Object.prototype.toString&&!i.toString.toString().includes("[native code]")){t.push(i.toString());continue}for(var f in i)e.call(i,f)&&i[f]&&t.push(f)}}}return t.join(" ")}typeof z<"u"&&z.exports?(r.default=r,z.exports=r):typeof define=="function"&&typeof define.amd=="object"&&define.amd?define("classnames",[],function(){return r}):window.classNames=r})()});import{Dropdown as Ko,Toolbar as Jo,ToolbarButton as er,ToolbarField as $}from"@heswell/salt-lab";import{Text as or}from"@salt-ds/core";import{jsx as Ce}from"react/jsx-runtime";import{forwardRef as Co}from"react";function Se(e){var o,r,t="";if(typeof e=="string"||typeof e=="number")t+=e;else if(typeof e=="object")if(Array.isArray(e))for(o=0;o<e.length;o++)e[o]&&(r=Se(e[o]))&&(t&&(t+=" "),t+=r);else for(o in e)e[o]&&(t&&(t+=" "),t+=o);return t}function Fe(){for(var e,o,r=0,t="";r<arguments.length;)(e=arguments[r++])&&(o=Se(e))&&(t&&(t+=" "),t+=o);return t}function he(e,o){o===void 0&&(o={});var r=o.insertAt;if(!(!e||typeof document>"u")){var t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",r==="top"&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}}var ho=`/* Style applied to the root element */
2
+ .saltIcon {
3
+ --icon-color: var(--saltIcon-color, var(--salt-text-secondary-foreground));
4
+ --icon-size-multiplier: var(--saltIcon-size-multiplier, 1);
5
+ --icon-base-size: var(--salt-size-icon-base, 12px);
6
+ /**
7
+ * Icon size will be the multiplier (an integer from the size prop) * the base size (set by the theme per density)
8
+ * Icons should never be smaller than 12px for readability so we've added a max() to enforce this
9
+ */
10
+ --icon-size: max(calc(var(--icon-base-size) * var(--icon-size-multiplier)), 12px);
127
11
  }
128
12
 
129
- // ../../node_modules/@salt-ds/icons/dist-es/node_modules/style-inject/dist/style-inject.es.js
130
- function styleInject(css, ref) {
131
- if (ref === void 0)
132
- ref = {};
133
- var insertAt = ref.insertAt;
134
- if (!css || typeof document === "undefined") {
135
- return;
136
- }
137
- var head = document.head || document.getElementsByTagName("head")[0];
138
- var style = document.createElement("style");
139
- style.type = "text/css";
140
- if (insertAt === "top") {
141
- if (head.firstChild) {
142
- head.insertBefore(style, head.firstChild);
143
- } else {
144
- head.appendChild(style);
145
- }
146
- } else {
147
- head.appendChild(style);
148
- }
149
- if (style.styleSheet) {
150
- style.styleSheet.cssText = css;
151
- } else {
152
- style.appendChild(document.createTextNode(css));
153
- }
13
+ .saltIcon {
14
+ fill: var(--saltIcon-color, var(--icon-color));
15
+ display: inline-block;
16
+ margin: var(--saltIcon-margin, 0);
17
+ position: relative;
18
+ width: var(--icon-size);
19
+ height: var(--icon-size);
20
+ min-width: var(--icon-size);
21
+ min-height: var(--icon-size);
154
22
  }
155
23
 
156
- // ../../node_modules/@salt-ds/icons/dist-es/packages/icons/src/icon/Icon.css.js
157
- var css_248z = "/* Style applied to the root element */\n.saltIcon {\n --icon-color: var(--saltIcon-color, var(--salt-text-secondary-foreground));\n --icon-size-multiplier: var(--saltIcon-size-multiplier, 1);\n --icon-base-size: var(--salt-size-icon-base, 12px);\n /**\n * Icon size will be the multiplier (an integer from the size prop) * the base size (set by the theme per density)\n * Icons should never be smaller than 12px for readability so we've added a max() to enforce this\n */\n --icon-size: max(calc(var(--icon-base-size) * var(--icon-size-multiplier)), 12px);\n}\n\n.saltIcon {\n fill: var(--saltIcon-color, var(--icon-color));\n display: inline-block;\n margin: var(--saltIcon-margin, 0);\n position: relative;\n width: var(--icon-size);\n height: var(--icon-size);\n min-width: var(--icon-size);\n min-height: var(--icon-size);\n}\n\n.saltIcon:hover {\n --icon-color: var(--saltIcon-color-hover, var(--salt-text-secondary-foreground));\n}\n\n.saltIcon:active {\n --icon-color: var(--saltIcon-color-active, var(--salt-text-secondary-foreground));\n}\n";
158
- styleInject(css_248z);
159
-
160
- // ../../node_modules/@salt-ds/icons/dist-es/packages/icons/src/icon/Icon.js
161
- var makePrefixer = (prefix) => (...names) => [prefix, ...names].join("-");
162
- var withBaseName = makePrefixer("saltIcon");
163
- var DEFAULT_ICON_SIZE = 1;
164
- var Icon = forwardRef(function Icon2({ children, className, size = DEFAULT_ICON_SIZE, style: styleProp, ...rest }, ref) {
165
- const style = {
166
- ...styleProp,
167
- "--saltIcon-size-multiplier": `${size}`
168
- };
169
- return /* @__PURE__ */ jsx("svg", {
170
- className: clsx(withBaseName(), className),
171
- style,
172
- role: "img",
173
- ...rest,
174
- ref,
175
- children: /* @__PURE__ */ jsx("g", {
176
- "aria-hidden": true,
177
- children
178
- })
179
- });
180
- });
181
-
182
- // ../../node_modules/@salt-ds/icons/dist-es/packages/icons/src/components/Delete.js
183
- import { jsxs, jsx as jsx2 } from "react/jsx-runtime";
184
- import { forwardRef as forwardRef2 } from "react";
185
- var DeleteIcon = forwardRef2(
186
- function DeleteIcon2(props, ref) {
187
- return /* @__PURE__ */ jsxs(Icon, {
188
- "data-testid": "DeleteIcon",
189
- "aria-label": "delete",
190
- viewBox: "0 0 12 12",
191
- ref,
192
- ...props,
193
- children: [
194
- /* @__PURE__ */ jsx2("path", {
195
- d: "M5 4v6H4V4h1Zm2 0v6H6V4h1Z"
196
- }),
197
- /* @__PURE__ */ jsx2("path", {
198
- fillRule: "evenodd",
199
- d: "M4 0a1 1 0 0 0-1 1v1H0v1h1v7a2 2 0 0 0 2 2h5.25A1.75 1.75 0 0 0 10 10.25V3h1V2H8V1a1 1 0 0 0-1-1H4Zm5 3H2v7a1 1 0 0 0 1 1h5.25a.75.75 0 0 0 .75-.75V3ZM7 2H4v-.5a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5V2Z",
200
- clipRule: "evenodd"
201
- })
202
- ]
203
- });
204
- }
205
- );
206
-
207
- // src/column-filter/RangeFilter.tsx
208
- import { Input, ToolbarField } from "@heswell/salt-lab";
209
-
210
- // src/filter-utils.ts
211
- import { extractFilterForColumn, partition } from "@vuu-ui/vuu-utils";
212
-
213
- // src/filterTypes.ts
214
- var singleValueFilterOps = /* @__PURE__ */ new Set([
215
- "=",
216
- "!=",
217
- ">",
218
- ">=",
219
- "<",
220
- "<=",
221
- "starts",
222
- "ends"
223
- ]);
224
- var isNamedFilter = (f) => f !== void 0 && f.name !== void 0;
225
- var isSingleValueFilter = (f) => f !== void 0 && singleValueFilterOps.has(f.op);
226
- var isFilterClause = (f) => f !== void 0 && (isSingleValueFilter(f) || isMultiValueFilter(f));
227
- var isMultiValueFilter = (f) => f !== void 0 && f.op === "in";
228
- var isInFilter = (f) => f.op === "in";
229
- var isAndFilter = (f) => f.op === "and";
230
- var isOrFilter = (f) => f.op === "or";
231
- function isMultiClauseFilter(f) {
232
- return f !== void 0 && (f.op === "and" || f.op === "or");
24
+ .saltIcon:hover {
25
+ --icon-color: var(--saltIcon-color-hover, var(--salt-text-secondary-foreground));
233
26
  }
234
27
 
235
- // src/filter-utils.ts
236
- var AND = "and";
237
- var EQUALS = "=";
238
- var GREATER_THAN = ">";
239
- var LESS_THAN = "<";
240
- var OR = "or";
241
- var STARTS_WITH = "starts";
242
- var ENDS_WITH = "ends";
243
- var IN = "in";
244
- var filterClauses = (filter, clauses = []) => {
245
- if (filter) {
246
- if (isMultiClauseFilter(filter)) {
247
- filter.filters.forEach((f) => clauses.push(...filterClauses(f)));
248
- } else {
249
- clauses.push(filter);
250
- }
251
- }
252
- return clauses;
253
- };
254
- var DEFAULT_ADD_FILTER_OPTS = {
255
- combineWith: "and"
256
- };
257
- var addFilter = (existingFilter, filter, { combineWith = AND } = DEFAULT_ADD_FILTER_OPTS) => {
258
- var _a;
259
- if (includesNoValues(filter)) {
260
- if (isMultiClauseFilter(filter)) {
261
- } else {
262
- existingFilter = removeFilterForColumn(existingFilter, {
263
- name: filter.column
264
- });
265
- }
266
- } else if (includesAllValues(filter)) {
267
- if (isMultiClauseFilter(filter)) {
268
- }
269
- return removeFilterForColumn(existingFilter, { name: (_a = filter.column) != null ? _a : "" });
270
- }
271
- if (!existingFilter) {
272
- return filter;
273
- }
274
- if (!filter) {
275
- return existingFilter;
276
- }
277
- if (existingFilter.op === AND && filter.op === AND) {
278
- return {
279
- op: AND,
280
- filters: combine(existingFilter.filters, filter.filters)
281
- };
282
- }
283
- if (existingFilter.op === AND) {
284
- const filters = replaceOrInsert(existingFilter.filters, filter);
285
- return filters.length > 1 ? { op: AND, filters } : filters[0];
286
- }
287
- if (filter.op === AND) {
288
- return { op: AND, filters: filter.filters.concat(existingFilter) };
289
- }
290
- if (filterEquals(existingFilter, filter, true)) {
291
- return filter;
292
- }
293
- if (canMerge(existingFilter, filter)) {
294
- return merge(existingFilter, filter);
295
- }
296
- return { op: combineWith, filters: [existingFilter, filter] };
297
- };
298
- var includesNoValues = (filter) => {
299
- if (!filter) {
300
- return false;
301
- }
302
- if (isInFilter(filter) && filter.values.length === 0) {
303
- return true;
304
- }
305
- return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));
306
- };
307
- var filterValue = (value) => typeof value === "string" ? `"${value}"` : value;
308
- var filterAsQuery = (f) => {
309
- if (isMultiClauseFilter(f)) {
310
- return f.filters.map((filter) => filterAsQuery(filter)).join(` ${f.op} `);
311
- } else if (isMultiValueFilter(f)) {
312
- return `${f.column} ${f.op} [${f.values.join(",")}]`;
313
- } else {
314
- return `${f.column} ${f.op} ${filterValue(f.value)}`;
315
- }
316
- };
317
- var includesAllValues = (filter) => {
318
- if (!filter) {
319
- return false;
320
- }
321
- if (filter.op === STARTS_WITH && filter.value === "") {
322
- return true;
323
- }
324
- return filter.op === STARTS_WITH && filter.value === "";
325
- };
326
- var replaceOrInsert = (filters, filter) => {
327
- return filters.concat(filter);
328
- };
329
- var merge = (f1, f2) => {
330
- if (includesNoValues(f2)) {
331
- return f2;
332
- }
333
- if (isInFilter(f1) && isInFilter(f2)) {
334
- return {
335
- ...f1,
336
- values: [
337
- ...f1.values,
338
- ...f2.values.filter(
339
- (v) => !f1.values.includes(v)
340
- )
341
- ]
342
- };
343
- } else if (isInFilter(f1) && f2.op === EQUALS) {
344
- return {
345
- ...f1,
346
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
347
- // @ts-ignore
348
- values: f1.values.concat([f2.value])
349
- };
350
- } else if (f1.op === EQUALS && f2.op === EQUALS) {
351
- return {
352
- column: f1.column,
353
- op: IN,
354
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
355
- // @ts-ignore
356
- values: [f1.value, f2.value]
357
- };
358
- }
359
- return f2;
360
- };
361
- var combine = (existingFilters, replacementFilters) => {
362
- const equivalentType = ({ op: t1 }, { op: t2 }) => {
363
- return t1 === t2 || t1[0] === t2[0];
364
- };
365
- const replaces = (existingFilter, replacementFilter) => {
366
- return existingFilter.column === replacementFilter.column && equivalentType(existingFilter, replacementFilter);
367
- };
368
- const stillApplicable = (existingFilter) => replacementFilters.some(
369
- (replacementFilter) => replaces(existingFilter, replacementFilter)
370
- ) === false;
371
- return existingFilters.filter(stillApplicable).concat(replacementFilters);
372
- };
373
- var removeColumnFromFilter = (column, filter) => {
374
- if (isMultiClauseFilter(filter)) {
375
- const [clause1, clause2] = filter.filters;
376
- if (clause1.column === column.name) {
377
- return [clause2, filterAsQuery(clause2)];
378
- }
379
- if (clause2.column === column.name) {
380
- return [clause1, filterAsQuery(clause1)];
381
- }
382
- }
383
- return [void 0, ""];
384
- };
385
- var removeFilter = (sourceFilter, filterToRemove) => {
386
- if (filterEquals(sourceFilter, filterToRemove, true)) {
387
- return null;
388
- }
389
- if (sourceFilter.op !== AND) {
390
- throw Error(
391
- `removeFilter cannot remove ${JSON.stringify(
392
- filterToRemove
393
- )} from ${JSON.stringify(sourceFilter)}`
394
- );
395
- }
396
- const filters = sourceFilter.filters.filter(
397
- (f) => !filterEquals(f, filterToRemove)
398
- );
399
- return filters.length > 0 ? { type: AND, filters } : null;
400
- };
401
- var splitFilterOnColumn = (filter, columnName) => {
402
- if (!filter) {
403
- return [null, null];
404
- }
405
- if (filter.column === columnName) {
406
- return [filter, null];
407
- }
408
- if (filter.op !== AND) {
409
- return [null, filter];
410
- }
411
- const [[columnFilter = null], filters] = partition(
412
- filter.filters,
413
- (f) => f.column === columnName
414
- );
415
- return filters.length === 1 ? [columnFilter, filters[0]] : [columnFilter, { op: AND, filters }];
416
- };
417
- var overrideColName = (filter, column) => {
418
- if (isMultiClauseFilter(filter)) {
419
- return {
420
- op: filter.op,
421
- filters: filter.filters.map((f) => overrideColName(f, column))
422
- };
423
- }
424
- return { ...filter, column };
425
- };
426
- var filterIncludesColumn = (filter, column) => {
427
- if (!filter) {
428
- return false;
429
- }
430
- const { op, column: filterColName } = filter;
431
- switch (op) {
432
- case AND:
433
- case OR:
434
- return filter.filters != null && filter.filters.some((f) => filterIncludesColumn(f, column));
435
- default:
436
- return filterColName === column.name;
437
- }
438
- };
439
- var removeFilterForColumn = (sourceFilter, column) => {
440
- const colName = column.name;
441
- if (!sourceFilter) {
442
- return void 0;
443
- }
444
- if (sourceFilter.column === colName) {
445
- return void 0;
446
- }
447
- if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {
448
- const { op } = sourceFilter;
449
- const filters = sourceFilter.filters;
450
- const otherColFilters = filters.filter((f) => f.column !== colName);
451
- switch (otherColFilters.length) {
452
- case 0:
453
- return void 0;
454
- case 1:
455
- return otherColFilters[0];
456
- default:
457
- return { op, filters: otherColFilters };
458
- }
459
- }
460
- return sourceFilter;
461
- };
462
- var canMerge = (f1, f2) => f1.column === f2.column && (f1.op === "=" || f1.op === "in") && (f2.op === "=" || f2.op === "in");
463
- var sameValues = (arr1, arr2) => {
464
- if (arr1 === arr2) {
465
- return true;
466
- }
467
- if (arr1.length === arr2.length) {
468
- const a = arr1.slice().sort();
469
- const b = arr2.slice().sort();
470
- return a.join("|") === b.join("|");
471
- }
472
- return false;
473
- };
474
- var filterEquals = (f1, f2, strict = false) => {
475
- if (!strict) {
476
- return true;
477
- }
478
- if (f1 && f2 && canMerge(f1, f2)) {
479
- return f1.op === f2.op && (isSingleValueFilter(f1) && isSingleValueFilter(f2) && f1.value === f2.value || isMultiValueFilter(f1) && isMultiValueFilter(f2) && sameValues(f1.values, f2.values));
480
- }
481
- return false;
482
- };
483
- var updateFilter = (filter, newFilter, mode) => {
484
- if (filter && newFilter) {
485
- if (mode === "replace") {
486
- return newFilter;
487
- }
488
- if (filter.op === "and") {
489
- return {
490
- ...filter,
491
- filters: filter.filters.concat(newFilter)
492
- };
493
- }
494
- const { column: columnName } = newFilter;
495
- if (columnName) {
496
- const existingClause = newFilter.column ? extractFilterForColumn(filter, columnName) : void 0;
497
- if (existingClause && columnName) {
498
- const result = removeFilterForColumn(filter, { name: columnName });
499
- return updateFilter(result, newFilter, "add");
500
- }
501
- }
502
- return {
503
- op: "and",
504
- filters: [filter, newFilter]
505
- };
506
- }
507
- if (newFilter) {
508
- return newFilter;
509
- }
510
- return filter;
511
- };
512
-
513
- // src/column-filter/utils.ts
514
- var isStartsWithValue = (value) => /\.\.\.$/.test(value);
515
- var getTypeaheadFilter = (column, filterValues, isStartsWithFilter) => {
516
- if (filterValues.length === 0) {
517
- return void 0;
518
- }
519
- if (isStartsWithFilter) {
520
- const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);
521
- return {
522
- column,
523
- op: "starts",
524
- value: `"${startsWith}"`
525
- };
526
- }
527
- return {
528
- column,
529
- op: "in",
530
- values: filterValues.map((value) => `"${value}"`)
531
- };
532
- };
533
- var getRangeFilter = (column, startValue, endValue) => {
534
- const startFilter = startValue === void 0 ? void 0 : { column, op: ">", value: startValue - 1 };
535
- const endFilter = endValue === void 0 ? void 0 : { column, op: "<", value: endValue + 1 };
536
- if (endFilter === void 0)
537
- return startFilter;
538
- return addFilter(startFilter, endFilter, { combineWith: "and" });
539
- };
540
-
541
- // src/column-filter/RangeFilter.tsx
542
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
543
- var RangeFilter = ({
544
- defaultTypeaheadParams,
545
- filterValues,
546
- onChange
547
- }) => {
548
- var _a, _b;
549
- const columnName = defaultTypeaheadParams[1];
550
- const startChangeHandler = (e) => {
551
- const value = parseFloat(e.target.value);
552
- const newRange = {
553
- start: isNaN(value) ? void 0 : value,
554
- end: filterValues == null ? void 0 : filterValues.end
555
- };
556
- const filter = getRangeFilter(columnName, newRange.start, newRange.end);
557
- onChange(newRange, filter);
558
- };
559
- const endChangeHandler = (e) => {
560
- const value = parseFloat(e.target.value);
561
- const newRange = {
562
- start: filterValues == null ? void 0 : filterValues.start,
563
- end: isNaN(value) ? void 0 : value
564
- };
565
- const filter = getRangeFilter(columnName, newRange.start, newRange.end);
566
- onChange(newRange, filter);
567
- };
568
- return /* @__PURE__ */ jsxs2("div", { style: { display: "flex", flexDirection: "row" }, children: [
569
- /* @__PURE__ */ jsx3(ToolbarField, { label: "From", children: /* @__PURE__ */ jsx3(
570
- Input,
571
- {
572
- onChange: startChangeHandler,
573
- value: ((_a = filterValues == null ? void 0 : filterValues.start) == null ? void 0 : _a.toString()) || "",
574
- type: "number"
575
- }
576
- ) }),
577
- /* @__PURE__ */ jsx3(ToolbarField, { label: "To", children: /* @__PURE__ */ jsx3(
578
- Input,
579
- {
580
- onChange: endChangeHandler,
581
- value: ((_b = filterValues == null ? void 0 : filterValues.end) == null ? void 0 : _b.toString()) || "",
582
- type: "number"
583
- }
584
- ) })
585
- ] });
586
- };
587
-
588
- // src/column-filter/TypeaheadFilter.tsx
589
- import { useCallback, useEffect, useState } from "react";
590
- import { useTypeaheadSuggestions } from "@vuu-ui/vuu-data";
591
- import { ComboBoxDeprecated } from "@heswell/salt-lab";
592
- import { jsx as jsx4 } from "react/jsx-runtime";
593
- var TypeaheadFilter = ({
594
- defaultTypeaheadParams,
595
- filterValues = [],
596
- onChange: onFilterChange
597
- }) => {
598
- const [tableName, columnName] = defaultTypeaheadParams;
599
- const [searchValue, setSearchValue] = useState("");
600
- const [typeaheadValues, setTypeaheadValues] = useState([]);
601
- const getSuggestions = useTypeaheadSuggestions();
602
- useEffect(() => {
603
- const params = searchValue ? [tableName, columnName, searchValue] : defaultTypeaheadParams;
604
- let isSubscribed = true;
605
- getSuggestions(params).then((options) => {
606
- if (!isSubscribed) {
607
- return;
608
- }
609
- if (isStartsWithValue(filterValues[0])) {
610
- options.unshift(filterValues[0]);
611
- }
612
- if (searchValue) {
613
- options.unshift(`${searchValue}...`);
614
- }
615
- options.concat(filterValues);
616
- setTypeaheadValues(options);
617
- });
618
- return () => {
619
- isSubscribed = false;
620
- };
621
- }, [
622
- filterValues,
623
- searchValue,
624
- columnName,
625
- tableName,
626
- getSuggestions,
627
- defaultTypeaheadParams
628
- ]);
629
- const onInputChange = useCallback(
630
- (evt) => {
631
- const value = evt.target.value;
632
- setSearchValue(value);
633
- },
634
- []
635
- );
636
- const onSelectionChange = useCallback(
637
- (_evt, selected) => {
638
- setSearchValue("");
639
- if (selected === null)
640
- return;
641
- if (selected.some(isStartsWithValue)) {
642
- selected = selected.filter(isStartsWithValue).slice(-1);
643
- }
644
- const filter = getTypeaheadFilter(
645
- columnName,
646
- selected,
647
- isStartsWithValue(selected[0])
648
- );
649
- onFilterChange(selected, filter);
650
- },
651
- [columnName, onFilterChange]
652
- );
653
- return /* @__PURE__ */ jsx4(
654
- ComboBoxDeprecated,
655
- {
656
- multiSelect: true,
657
- onInputChange,
658
- onChange: onSelectionChange,
659
- source: typeaheadValues,
660
- style: { minWidth: 200 },
661
- inputValue: searchValue,
662
- selectedItem: filterValues
663
- },
664
- columnName
665
- );
666
- };
667
-
668
- // src/column-filter/ColumnListItem.tsx
669
- import { memo } from "react";
670
- import {
671
- Highlighter,
672
- ListItem
673
- } from "@heswell/salt-lab";
674
- import { jsx as jsx5 } from "react/jsx-runtime";
675
- var ColumnListItem = (props) => {
676
- return /* @__PURE__ */ jsx5(MemoColumnItem, { ...props });
677
- };
678
- var MemoColumnItem = memo(function MemoizedItem({
679
- item,
680
- itemTextHighlightPattern,
681
- ...restProps
682
- }) {
683
- return /* @__PURE__ */ jsx5(ListItem, { ...restProps, children: /* @__PURE__ */ jsx5("span", { style: { marginLeft: 10 }, children: /* @__PURE__ */ jsx5(
684
- Highlighter,
685
- {
686
- matchPattern: itemTextHighlightPattern,
687
- text: item == null ? void 0 : item.name
688
- }
689
- ) }) });
690
- });
691
-
692
- // src/column-filter/useColumnFilterStore.ts
693
- import { useCallback as useCallback2, useState as useState2 } from "react";
694
- var addOrReplace = (array, newValue, key) => array.filter((oldValue) => oldValue[key] !== newValue[key]).concat(newValue);
695
- var useColumnFilterStore = (onFilterSubmit) => {
696
- var _a, _b;
697
- const [selectedColumnName, setSelectedColumnName] = useState2("");
698
- const [savedFilters, setSavedFilters] = useState2([]);
699
- const [rangeValues, setRangeValues] = useState2([]);
700
- const [typeaheadValues, setTypeaheadValues] = useState2([]);
701
- const clear = () => {
702
- setSelectedColumnName("");
703
- setRangeValues([]);
704
- setTypeaheadValues([]);
705
- setSavedFilters([]);
706
- onFilterSubmit("");
707
- };
708
- const updateFilters = useCallback2(
709
- (newFilter) => {
710
- const newSavedFilters = addOrReplace(
711
- savedFilters,
712
- { column: selectedColumnName, filter: newFilter },
713
- "column"
714
- );
715
- setSavedFilters(newSavedFilters);
716
- const combinedFilter = newSavedFilters.map((x) => x.filter).reduce((prev, filter) => {
717
- if (filter === void 0)
718
- return prev;
719
- return addFilter(prev, filter, { combineWith: AND });
720
- }, void 0);
721
- const query = combinedFilter === void 0 ? "" : filterAsQuery(combinedFilter);
722
- onFilterSubmit(query, combinedFilter);
723
- },
724
- [selectedColumnName, onFilterSubmit, savedFilters]
725
- );
726
- const onTypeaheadChange = useCallback2(
727
- (newValues, newFilter) => {
728
- setTypeaheadValues(
729
- addOrReplace(
730
- typeaheadValues,
731
- { column: selectedColumnName, value: newValues },
732
- "column"
733
- )
734
- );
735
- updateFilters(newFilter);
736
- },
737
- [selectedColumnName, typeaheadValues, updateFilters]
738
- );
739
- const onRangeChange = useCallback2(
740
- (newValues, newFilter) => {
741
- setRangeValues(
742
- addOrReplace(
743
- rangeValues,
744
- { column: selectedColumnName, value: newValues },
745
- "column"
746
- )
747
- );
748
- updateFilters(newFilter);
749
- },
750
- [selectedColumnName, rangeValues, updateFilters]
751
- );
752
- const onSelectedColumnChange = useCallback2(
753
- (column) => setSelectedColumnName((column == null ? void 0 : column.name) || ""),
754
- []
755
- );
756
- const rangeValue = (_a = rangeValues.filter(
757
- (v) => v.column === selectedColumnName
758
- )[0]) == null ? void 0 : _a.value;
759
- const typeaheadValue = (_b = typeaheadValues.filter(
760
- (v) => v.column === selectedColumnName
761
- )[0]) == null ? void 0 : _b.value;
762
- return {
763
- clear,
764
- selectedColumnName,
765
- rangeValue,
766
- typeaheadValue,
767
- onSelectedColumnChange,
768
- onRangeChange,
769
- onTypeaheadChange
770
- };
771
- };
772
-
773
- // src/column-filter/ColumnFilter.tsx
774
- import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
775
- var ColumnFilter = ({
776
- className,
777
- table,
778
- columns,
779
- onFilterSubmit,
780
- ...htmlAttributes
781
- }) => {
782
- const {
783
- clear,
784
- onTypeaheadChange,
785
- onRangeChange,
786
- onSelectedColumnChange,
787
- selectedColumnName,
788
- rangeValue,
789
- typeaheadValue
790
- } = useColumnFilterStore(onFilterSubmit);
791
- const getFilterComponent = () => {
792
- var _a;
793
- const defaultTypeaheadParams = [table, selectedColumnName];
794
- const selectedColumnType = (_a = columns.find(
795
- (column) => column.name === selectedColumnName
796
- )) == null ? void 0 : _a.serverDataType;
797
- switch (selectedColumnType) {
798
- case "string":
799
- case "char":
800
- return /* @__PURE__ */ jsx6(
801
- ToolbarField2,
802
- {
803
- label: "Start typing to select a filter",
804
- labelPlacement: "top",
805
- children: /* @__PURE__ */ jsx6(
806
- TypeaheadFilter,
807
- {
808
- defaultTypeaheadParams,
809
- filterValues: typeaheadValue,
810
- onChange: onTypeaheadChange
811
- }
812
- )
813
- }
814
- );
815
- case "int":
816
- case "long":
817
- case "double":
818
- return /* @__PURE__ */ jsx6(ToolbarField2, { label: "Select a range", labelPlacement: "top", children: /* @__PURE__ */ jsx6(
819
- RangeFilter,
820
- {
821
- defaultTypeaheadParams,
822
- filterValues: rangeValue,
823
- onChange: onRangeChange
824
- }
825
- ) });
826
- default:
827
- return /* @__PURE__ */ jsx6(ToolbarField2, { children: /* @__PURE__ */ jsx6(Text, { children: "Data type unsupported" }) });
828
- }
829
- };
830
- return /* @__PURE__ */ jsxs3(
831
- Toolbar,
832
- {
833
- ...htmlAttributes,
834
- style: { alignItems: "center", height: "36px" },
835
- children: [
836
- /* @__PURE__ */ jsx6(
837
- ToolbarField2,
838
- {
839
- label: "Select a column to filter",
840
- labelPlacement: "top",
841
- style: { width: 180 },
842
- children: /* @__PURE__ */ jsx6(
843
- Dropdown,
844
- {
845
- source: columns,
846
- ListItem: ColumnListItem,
847
- itemToString: (column) => column.name,
848
- onSelectionChange: (_evt, column) => onSelectedColumnChange(column)
849
- }
850
- )
851
- }
852
- ),
853
- selectedColumnName && getFilterComponent(),
854
- /* @__PURE__ */ jsx6(ToolbarButton, { onClick: clear, children: /* @__PURE__ */ jsx6(DeleteIcon, {}) })
855
- ]
856
- }
857
- );
858
- };
859
-
860
- // src/filter-input/FilterInput.tsx
861
- import { Button } from "@salt-ds/core";
862
-
863
- // src/filter-input/useCodeMirrorEditor.ts
864
- var import_classnames = __toESM(require_classnames(), 1);
865
- import {
866
- autocompletion,
867
- defaultKeymap,
868
- EditorState as EditorState2,
869
- EditorView as EditorView2,
870
- ensureSyntaxTree,
871
- keymap,
872
- minimalSetup,
873
- startCompletion
874
- } from "@vuu-ui/vuu-codemirror";
875
- import { useEffect as useEffect2, useMemo, useRef } from "react";
876
-
877
- // src/filter-input/filter-language-parser/FilterLanguage.ts
878
- import {
879
- LanguageSupport,
880
- LRLanguage,
881
- styleTags,
882
- tags as tag
883
- } from "@vuu-ui/vuu-codemirror";
884
-
885
- // src/filter-input/filter-language-parser/generated/filter-parser.js
886
- import { LRParser } from "@vuu-ui/vuu-codemirror";
887
- var parser = LRParser.deserialize({
888
- version: 14,
889
- states: "%QOVQPOOOOQO'#C_'#C_O_QQO'#C^OOQO'#DO'#DOOvQQO'#C|OOQO'#DR'#DROVQPO'#CuOOQO'#C}'#C}QOQPOOOOQO'#C`'#C`O!UQQO,58xO!dQPO,59VOVQPO,59]OVQPO,59_O!iQPO,59hO!nQQO,59aOOQO'#DQ'#DQOOQO1G.d1G.dO!UQQO1G.qO!yQQO1G.wOOQO1G.y1G.yOOQO'#Cw'#CwOOQO1G/S1G/SOOQO1G.{1G.{O#[QPO'#CnO#dQPO7+$]O!UQQO'#CxO#iQPO,59YOOQO<<Gw<<GwOOQO,59d,59dOOQO-E6v-E6v",
890
- stateData: "#q~OoOS~OsPOvUO~OTXOUXOVXOWXOXXOYXO`ZO~Of[Oh]Oj^OmpX~OZ`O[`O]`O^`O~OabO~OseO~Of[Oh]OwgO~Oh]Ofeijeimeiwei~OcjOdbX~OdlO~OcjOdba~O",
891
- goto: "#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj",
892
- nodeNames: "\u26A0 Filter ColumnValueExpression Column Operator Eq NotEq Gt Lt Starts Ends Number String True False ColumnSetExpression In LBrack Values Comma RBrack AndExpression And OrExpression Or ParenthesizedExpression As FilterName",
893
- maxTerm: 39,
894
- skippedNodes: [0],
895
- repeatNodeCount: 1,
896
- tokenData: "6p~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$j|}$o!O!P$t!Q![%S!^!_%_!_!`%d!`!a%i!c!}%n!}#O&V#P#Q&[#R#S%n#T#U&a#U#X%n#X#Y(w#Y#Z+]#Z#]%n#]#^.]#^#c%n#c#d/e#d#g%n#g#h0m#h#i4[#i#o%n~#USo~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOU~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_O[~~$bP;=`<%l#m~$jOv~~$oOw~~$tOc~~$wP!Q![$z~%PPZ~!Q![$z~%XQZ~!O!P$t!Q![%S~%dOW~~%iOT~~%nOV~P%sUsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n~&[Oa~~&aOd~R&fYsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c'U#c#g%n#g#h(^#h#o%nR'ZWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X's#X#o%nR'zUfQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(eUjQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c)f#c#o%nR)kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X*T#X#o%nR*YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h*r#h#o%nR*yUYQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR+bVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U+w#U#o%nR+|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#`%n#`#a,f#a#o%nR,kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h-T#h#o%nR-YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y-r#Y#o%nR-yU^QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR.bWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c.z#c#o%nR/RU`QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR/jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g0S#g#o%nR0ZUhQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR0rWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i1[#i#o%nR1aVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U1v#U#o%nR1{WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g2e#g#o%nR2jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i3S#i#o%nR3XWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h3q#h#o%nR3xUXQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR4aWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g4y#g#o%nR5OWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#i%n#i#j5h#j#o%nR5mWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y6V#Y#o%nR6^U]QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n",
897
- tokenizers: [0, 1],
898
- topRules: { "Filter": [0, 1] },
899
- tokenPrec: 0
900
- });
901
-
902
- // src/filter-input/filter-language-parser/FilterLanguage.ts
903
- var filterLanguage = LRLanguage.define({
904
- name: "VuuFilterQuery",
905
- parser: parser.configure({
906
- props: [
907
- styleTags({
908
- Identifier: tag.variableName,
909
- String: tag.string,
910
- Or: tag.emphasis,
911
- Operator: tag.operator
912
- })
913
- ]
914
- })
915
- });
916
- var filterLanguageSupport = () => {
917
- return new LanguageSupport(filterLanguage);
918
- };
919
-
920
- // src/filter-input/filter-language-parser/FilterTreeWalker.ts
921
- import {
922
- isMultiClauseFilter as isMultiClauseFilter2,
923
- isMultiValueFilter as isMultiValueFilter2,
924
- isSingleValueFilter as isSingleValueFilter2
925
- } from "@vuu-ui/vuu-utils";
926
- var _filter;
927
- var FilterExpression = class {
928
- constructor() {
929
- __privateAdd(this, _filter, void 0);
930
- }
931
- setFilterCombinatorOp(op, filter = __privateGet(this, _filter)) {
932
- if (isMultiClauseFilter2(filter) && filter.op === op) {
933
- return;
934
- } else {
935
- __privateSet(this, _filter, {
936
- op,
937
- filters: [__privateGet(this, _filter)]
938
- });
939
- }
940
- }
941
- add(filter) {
942
- if (__privateGet(this, _filter) === void 0) {
943
- __privateSet(this, _filter, filter);
944
- } else if (isMultiClauseFilter2(__privateGet(this, _filter))) {
945
- __privateGet(this, _filter).filters.push(filter);
946
- } else {
947
- throw Error(`Invalid filter passed to FilterExpression`);
948
- }
949
- }
950
- setColumn(column, filter = __privateGet(this, _filter)) {
951
- if (isMultiClauseFilter2(filter)) {
952
- const target = filter.filters.at(-1);
953
- if (target) {
954
- this.setColumn(column, target);
955
- }
956
- } else if (filter) {
957
- filter.column = column;
958
- }
959
- }
960
- setOp(value, filter = __privateGet(this, _filter)) {
961
- if (isMultiClauseFilter2(filter)) {
962
- const target = filter.filters.at(-1);
963
- if (target) {
964
- this.setOp(value, target);
965
- }
966
- } else if (filter) {
967
- filter.op = value;
968
- }
969
- }
970
- setValue(value, filter = __privateGet(this, _filter)) {
971
- var _a;
972
- if (isMultiClauseFilter2(filter)) {
973
- const target = filter.filters.at(-1);
974
- if (target) {
975
- this.setValue(value, target);
976
- }
977
- } else if (isMultiValueFilter2(filter)) {
978
- (_a = filter.values) != null ? _a : filter.values = [];
979
- filter.values.push(value);
980
- } else if (isSingleValueFilter2(filter)) {
981
- filter.value = value;
982
- }
983
- }
984
- toJSON(filter = __privateGet(this, _filter)) {
985
- if (this.name) {
986
- return {
987
- ...filter,
988
- name: this.name
989
- };
990
- } else {
991
- return filter;
992
- }
993
- }
994
- };
995
- _filter = new WeakMap();
996
- var walkTree = (tree, source) => {
997
- const filterExpression = new FilterExpression();
998
- const cursor = tree.cursor();
999
- do {
1000
- const { name, from, to } = cursor;
1001
- switch (name) {
1002
- case "ColumnValueExpression":
1003
- filterExpression.add({});
1004
- break;
1005
- case "ColumnSetExpression":
1006
- filterExpression.add({ op: "in" });
1007
- break;
1008
- case "Or":
1009
- case "And":
1010
- filterExpression.setFilterCombinatorOp(source.substring(from, to));
1011
- break;
1012
- case "Column":
1013
- filterExpression.setColumn(source.substring(from, to));
1014
- break;
1015
- case "Operator":
1016
- filterExpression.setOp(source.substring(from, to));
1017
- break;
1018
- case "String":
1019
- filterExpression.setValue(source.substring(from + 1, to - 1));
1020
- break;
1021
- case "Number":
1022
- filterExpression.setValue(parseFloat(source.substring(from, to)));
1023
- break;
1024
- case "True":
1025
- filterExpression.setValue(true);
1026
- break;
1027
- case "False":
1028
- filterExpression.setValue(false);
1029
- break;
1030
- case "FilterName":
1031
- filterExpression.name = source.substring(from, to);
1032
- break;
1033
- default:
1034
- }
1035
- } while (cursor.next());
1036
- return filterExpression.toJSON();
1037
- };
1038
-
1039
- // src/filter-input/filter-language-parser/FilterParser.ts
1040
- var strictParser = parser.configure({ strict: true });
1041
- var parseFilter = (filterQuery) => {
1042
- const parseTree = strictParser.parse(filterQuery);
1043
- const filter = walkTree(parseTree, filterQuery);
1044
- return filter;
1045
- };
1046
-
1047
- // src/filter-input/highlighting.ts
1048
- import {
1049
- HighlightStyle,
1050
- syntaxHighlighting,
1051
- tags
1052
- } from "@vuu-ui/vuu-codemirror";
1053
- var myHighlightStyle = HighlightStyle.define([
1054
- { tag: tags.variableName, color: "var(--vuuFilterEditor-variableColor)" },
1055
- { tag: tags.comment, color: "green", fontStyle: "italic" }
1056
- ]);
1057
- var vuuHighlighting = syntaxHighlighting(myHighlightStyle);
1058
-
1059
- // src/filter-input/theme.ts
1060
- import { EditorView } from "@vuu-ui/vuu-codemirror";
1061
- var vuuTheme = EditorView.theme(
1062
- {
1063
- "&": {
1064
- color: "var(--vuuFilterEditor-color)",
1065
- backgroundColor: "var(--vuuFilterEditor-background)",
1066
- fontSize: "var(--vuuFilterEditor-fontSize)"
1067
- },
1068
- ".cm-content": {
1069
- caretColor: "var(--vuuFilterEditor-cursorColor)",
1070
- padding: 0
1071
- },
1072
- ".cm-line": {
1073
- lineHeight: "var(--vuuFilterEditor-lineHeight)"
1074
- },
1075
- "&.cm-focused .cm-cursor": {
1076
- borderLeftColor: "var(--vuuFilterEditor-cursorColor)"
1077
- },
1078
- "&.cm-focused .cm-selectionBackground, ::selection": {
1079
- backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
1080
- },
1081
- ".cm-selectionBackground, ::selection": {
1082
- backgroundColor: "var(--vuuFilterEditor-selectionBackground)"
1083
- },
1084
- ".cm-scroller": {
1085
- fontFamily: "var(--vuuFilterEditor-fontFamily)"
1086
- },
1087
- ".cm-tooltip": {
1088
- background: "var(--vuuFilterEditor-tooltipBackground)",
1089
- border: "var(--vuuFilterEditor-tooltipBorder)",
1090
- boxShadow: "var(--vuuFilterEditor-tooltipElevation)",
1091
- "&.cm-tooltip-autocomplete > ul": {
1092
- fontFamily: "var(--vuuFilterEditor-fontFamily)",
1093
- fontSize: "var(--vuuFilterEditor-fontSize)",
1094
- maxHeight: "240px"
1095
- },
1096
- "&.cm-tooltip-autocomplete > ul > li": {
1097
- alignItems: "center",
1098
- display: "flex",
1099
- height: "var(--vuuFilterEditor-suggestion-height)",
1100
- padding: "0 3px",
1101
- lineHeight: "var(--vuuFilterEditor-suggestion-height)"
1102
- },
1103
- "&.cm-tooltip-autocomplete li[aria-selected]": {
1104
- background: "var(--vuuFilterEditor-suggestion-selectedBackground)",
1105
- color: "var(--vuuFilterEditor-suggestion-selectedColor)"
1106
- }
1107
- },
1108
- ".cm-completionIcon": {
1109
- height: "18px",
1110
- flex: "0 0 16px"
1111
- },
1112
- ".cm-completionLabel": {
1113
- flex: "1 1 auto"
1114
- },
1115
- ".cm-completionIcon-filter": {
1116
- position: "relative",
1117
- "&:after": {
1118
- background: "var(--salt-text-secondary-foreground)",
1119
- content: "''",
1120
- "-webkit-mask": "var(--svg-filter) center center/13px 13px",
1121
- "-webkit-mask-repeat": "no-repeat",
1122
- position: "absolute",
1123
- height: "18px",
1124
- left: "0px",
1125
- top: "0px",
1126
- width: "16px"
1127
- }
1128
- }
1129
- },
1130
- { dark: false }
1131
- );
1132
-
1133
- // src/filter-input/useFilterAutoComplete.ts
1134
- import {
1135
- getNodeByName,
1136
- getValue,
1137
- syntaxTree
1138
- } from "@vuu-ui/vuu-codemirror";
1139
- import { useCallback as useCallback3 } from "react";
1140
- var getOperator = (node, state) => {
1141
- let maybeColumnNode = node.prevSibling || node.parent;
1142
- while (maybeColumnNode && !["Column", "Operator", "In"].includes(maybeColumnNode.name)) {
1143
- maybeColumnNode = maybeColumnNode.prevSibling || maybeColumnNode.parent;
1144
- }
1145
- if ((maybeColumnNode == null ? void 0 : maybeColumnNode.name) === "In" || (maybeColumnNode == null ? void 0 : maybeColumnNode.name) === "Operator") {
1146
- return getValue(maybeColumnNode, state);
1147
- } else {
1148
- return void 0;
1149
- }
1150
- };
1151
- var getPartialOperator = (maybeOperatorNode, state, columnName) => {
1152
- const value = getValue(maybeOperatorNode, state);
1153
- if (columnName === void 0 || value === columnName) {
1154
- return;
1155
- }
1156
- if (["contains", "ends", "starts"].some(
1157
- (val) => val.startsWith(value.toLowerCase())
1158
- )) {
1159
- return value;
1160
- } else {
1161
- return void 0;
1162
- }
1163
- };
1164
- var getClauseOperator = (node, state) => {
1165
- let maybeTargetNode = node.prevSibling || node.parent || node.lastChild;
1166
- while (maybeTargetNode && maybeTargetNode.name === "\u26A0")
1167
- maybeTargetNode = maybeTargetNode.prevSibling;
1168
- if (maybeTargetNode && ["As", "Or", "And"].includes(maybeTargetNode.name)) {
1169
- return getValue(maybeTargetNode, state);
1170
- } else {
1171
- return void 0;
1172
- }
1173
- };
1174
- var getFilterName = (node, state) => {
1175
- if (node.name === "FilterName") {
1176
- return getValue(node, state);
1177
- } else {
1178
- let maybeTargetNode = node.prevSibling || node.parent || node.lastChild;
1179
- while (maybeTargetNode && maybeTargetNode.name !== "FilterName")
1180
- maybeTargetNode = maybeTargetNode.prevSibling;
1181
- if (maybeTargetNode && maybeTargetNode.name === "FilterName") {
1182
- return getValue(node, state);
1183
- }
1184
- }
1185
- };
1186
- var getColumnName = (node, state) => {
1187
- const prevNode = node.prevSibling;
1188
- if ((prevNode == null ? void 0 : prevNode.name) === "Column") {
1189
- return getValue(prevNode, state);
1190
- } else if ((prevNode == null ? void 0 : prevNode.name) === "Operator") {
1191
- return getColumnName(prevNode, state);
1192
- }
1193
- };
1194
- var getSetValues = (node, state) => {
1195
- let maybeTargetNode = node.lastChild;
1196
- const values = [];
1197
- while (maybeTargetNode && maybeTargetNode.name !== "In") {
1198
- const value = getValue(maybeTargetNode, state);
1199
- if (value) {
1200
- values.push(value);
1201
- } else {
1202
- break;
1203
- }
1204
- maybeTargetNode = maybeTargetNode.prevSibling;
1205
- }
1206
- return values;
1207
- };
1208
- var useAutoComplete = (suggestionProvider, onSubmit, existingFilter) => {
1209
- const makeSuggestions = useCallback3(
1210
- async (context, suggestionType, optionalArgs = {}) => {
1211
- const { startsWith = "" } = optionalArgs;
1212
- const options = await suggestionProvider.getSuggestions(
1213
- suggestionType,
1214
- optionalArgs
1215
- );
1216
- return { from: context.pos - startsWith.length, options };
1217
- },
1218
- [suggestionProvider]
1219
- );
1220
- return useCallback3(
1221
- async (context) => {
1222
- var _a, _b;
1223
- const { state, pos } = context;
1224
- const word = (_a = context.matchBefore(/\w*/)) != null ? _a : {
1225
- from: 0,
1226
- to: 0,
1227
- text: void 0
1228
- };
1229
- const tree = syntaxTree(state);
1230
- const nodeBefore = tree.resolveInner(pos, -1);
1231
- console.log({ nodeBeforeName: nodeBefore.name });
1232
- switch (nodeBefore.name) {
1233
- case "Filter":
1234
- if (context.pos === 0) {
1235
- return makeSuggestions(context, "column");
1236
- } else {
1237
- const clauseOperator = getClauseOperator(nodeBefore, state);
1238
- if (clauseOperator === "as") {
1239
- return makeSuggestions(context, "name");
1240
- } else {
1241
- const filterName = getFilterName(nodeBefore, state);
1242
- return makeSuggestions(context, "save", {
1243
- onSubmit: onSubmit.current,
1244
- existingFilter,
1245
- filterName
1246
- });
1247
- }
1248
- }
1249
- case "String":
1250
- {
1251
- const operator = getOperator(nodeBefore, state);
1252
- const columnName = getColumnName(nodeBefore, state);
1253
- const { from, to } = nodeBefore;
1254
- if (to - from === 2 && context.pos === from + 1) {
1255
- if (columnName && operator) {
1256
- return makeSuggestions(context, "columnValue", {
1257
- columnName,
1258
- operator,
1259
- quoted: true,
1260
- startsWith: word.text
1261
- });
1262
- }
1263
- } else {
1264
- console.log(
1265
- `we have a string, column is ${columnName} ${from} ${to}`
1266
- );
1267
- }
1268
- }
1269
- break;
1270
- case "As":
1271
- return makeSuggestions(context, "name");
1272
- case "FilterName":
1273
- return makeSuggestions(context, "save", {
1274
- onSubmit: onSubmit.current,
1275
- existingFilter,
1276
- filterName: getFilterName(nodeBefore, state)
1277
- });
1278
- case "Column": {
1279
- const columnName = getValue(nodeBefore, state);
1280
- const isPartialMatch = await suggestionProvider.isPartialMatch(
1281
- "column",
1282
- void 0,
1283
- columnName
1284
- );
1285
- if (isPartialMatch) {
1286
- return makeSuggestions(context, "column", {
1287
- startsWith: columnName
1288
- });
1289
- } else {
1290
- return makeSuggestions(context, "operator", { columnName });
1291
- }
1292
- }
1293
- case "\u26A0": {
1294
- const columnName = getNodeByName(nodeBefore, state);
1295
- const operator = getOperator(nodeBefore, state);
1296
- const partialOperator = operator ? void 0 : getPartialOperator(nodeBefore, state, columnName);
1297
- if (partialOperator) {
1298
- return makeSuggestions(context, "operator", {
1299
- columnName,
1300
- startsWith: partialOperator
1301
- });
1302
- } else {
1303
- return makeSuggestions(context, "columnValue", {
1304
- columnName,
1305
- operator,
1306
- startsWith: word.text
1307
- });
1308
- }
1309
- }
1310
- case "Identifier":
1311
- {
1312
- const clauseOperator = getClauseOperator(nodeBefore, state);
1313
- if (clauseOperator === "as") {
1314
- return {
1315
- from: context.pos,
1316
- options: [
1317
- {
1318
- label: "press ENTER to apply filter and save",
1319
- apply: () => onSubmit.current(),
1320
- boost: 5
1321
- }
1322
- ]
1323
- };
1324
- }
1325
- }
1326
- break;
1327
- case "ColumnSetExpression":
1328
- case "Values": {
1329
- const columnName = getNodeByName(nodeBefore, state);
1330
- const selection = getSetValues(nodeBefore, state);
1331
- return makeSuggestions(context, "columnValue", {
1332
- columnName,
1333
- selection
1334
- });
1335
- }
1336
- case "Comma":
1337
- case "LBrack": {
1338
- const columnName = getNodeByName(nodeBefore, state);
1339
- return makeSuggestions(context, "columnValue", { columnName });
1340
- }
1341
- case "ColumnValueExpression":
1342
- {
1343
- const lastToken = (_b = nodeBefore.lastChild) == null ? void 0 : _b.prevSibling;
1344
- if ((lastToken == null ? void 0 : lastToken.name) === "Column") {
1345
- return makeSuggestions(context, "operator", {
1346
- columnName: getNodeByName(nodeBefore, state)
1347
- });
1348
- } else if ((lastToken == null ? void 0 : lastToken.name) === "Operator") {
1349
- return makeSuggestions(context, "columnValue", {
1350
- columnName: getNodeByName(lastToken, state),
1351
- operator: getValue(lastToken, state)
1352
- });
1353
- }
1354
- }
1355
- break;
1356
- case "In": {
1357
- return {
1358
- from: context.pos,
1359
- options: [{ label: "[", apply: " [", type: "text" }]
1360
- };
1361
- }
1362
- case "Eq": {
1363
- return makeSuggestions(context, "columnValue", {
1364
- columnName: getNodeByName(nodeBefore, state)
1365
- });
1366
- }
1367
- case "AndExpression":
1368
- case "OrExpression": {
1369
- return makeSuggestions(context, "column");
1370
- }
1371
- default:
1372
- }
1373
- },
1374
- [existingFilter, makeSuggestions, onSubmit, suggestionProvider]
1375
- );
1376
- };
1377
-
1378
- // src/filter-input/useCodeMirrorEditor.ts
1379
- var getView = (ref) => {
1380
- if (ref.current == void 0) {
1381
- throw Error("EditorView not defined");
1382
- }
1383
- return ref.current;
1384
- };
1385
- var getOptionClass = (completion) => {
1386
- return (0, import_classnames.default)("vuuSuggestion", {
1387
- vuuIllustration: completion.isIllustration
1388
- });
1389
- };
1390
- var stripName = (filterQuery) => {
1391
- const pos = filterQuery.lastIndexOf(" as ");
1392
- if (pos !== -1) {
1393
- return filterQuery.slice(0, pos);
1394
- } else {
1395
- return filterQuery;
1396
- }
1397
- };
1398
- var noop = () => console.log("noooop");
1399
- var useCodeMirrorEditor = ({
1400
- existingFilter,
1401
- onSubmitFilter,
1402
- suggestionProvider
1403
- }) => {
1404
- const editorRef = useRef(null);
1405
- const onSubmit = useRef(noop);
1406
- const viewRef = useRef();
1407
- const completionFn = useAutoComplete(
1408
- suggestionProvider,
1409
- onSubmit,
1410
- existingFilter
1411
- );
1412
- const [createState, clearInput] = useMemo(() => {
1413
- const parseFilter2 = () => {
1414
- const view = getView(viewRef);
1415
- const source = view.state.doc.toString();
1416
- const tree = ensureSyntaxTree(view.state, view.state.doc.length, 5e3);
1417
- if (tree) {
1418
- const filter = walkTree(tree, source);
1419
- return [filter, stripName(source), filter.name];
1420
- } else {
1421
- return [void 0, "", void 0];
1422
- }
1423
- };
1424
- const clearInput2 = () => {
1425
- getView(viewRef).setState(createState2());
1426
- };
1427
- const submitFilterAndClearInput = (mode) => {
1428
- const [filter, filterQuery, filterName] = parseFilter2();
1429
- onSubmitFilter == null ? void 0 : onSubmitFilter(filter, filterQuery, mode, filterName);
1430
- clearInput2();
1431
- };
1432
- const submitFilter = (key) => {
1433
- return keymap.of([
1434
- {
1435
- key,
1436
- run() {
1437
- submitFilterAndClearInput();
1438
- return true;
1439
- }
1440
- }
1441
- ]);
1442
- };
1443
- const showSuggestions = (key) => {
1444
- return keymap.of([
1445
- {
1446
- key,
1447
- run() {
1448
- startCompletion(getView(viewRef));
1449
- return true;
1450
- }
1451
- }
1452
- ]);
1453
- };
1454
- const createState2 = () => EditorState2.create({
1455
- doc: "",
1456
- extensions: [
1457
- minimalSetup,
1458
- autocompletion({
1459
- override: [completionFn],
1460
- optionClass: getOptionClass
1461
- }),
1462
- filterLanguageSupport(),
1463
- keymap.of(defaultKeymap),
1464
- submitFilter("Ctrl-Enter"),
1465
- showSuggestions("ArrowDown"),
1466
- EditorView2.updateListener.of((v) => {
1467
- const view = getView(viewRef);
1468
- if (v.docChanged) {
1469
- startCompletion(view);
1470
- }
1471
- }),
1472
- EditorState2.transactionFilter.of(
1473
- (tr) => tr.newDoc.lines > 1 ? [] : tr
1474
- ),
1475
- vuuTheme,
1476
- vuuHighlighting
1477
- ]
1478
- });
1479
- onSubmit.current = (mode) => {
1480
- submitFilterAndClearInput(mode);
1481
- setTimeout(() => {
1482
- getView(viewRef).focus();
1483
- }, 100);
1484
- };
1485
- return [createState2, clearInput2];
1486
- }, [completionFn, onSubmitFilter]);
1487
- useEffect2(() => {
1488
- if (!editorRef.current) {
1489
- throw Error("editor not in dom");
1490
- }
1491
- viewRef.current = new EditorView2({
1492
- state: createState(),
1493
- parent: editorRef.current
1494
- });
1495
- return () => {
1496
- var _a;
1497
- (_a = viewRef.current) == null ? void 0 : _a.destroy();
1498
- };
1499
- }, [completionFn, createState]);
1500
- return { editorRef, clearInput };
1501
- };
1502
-
1503
- // src/filter-input/FilterInput.tsx
1504
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1505
- var classBase = "vuuFilterInput";
1506
- var FilterInput = ({
1507
- existingFilter,
1508
- iconName = "filter",
1509
- namedFilters,
1510
- onSubmitFilter,
1511
- suggestionProvider,
1512
- ...props
1513
- }) => {
1514
- const { editorRef, clearInput } = useCodeMirrorEditor({
1515
- existingFilter,
1516
- onSubmitFilter,
1517
- suggestionProvider
1518
- });
1519
- return /* @__PURE__ */ jsxs4("div", { ...props, className: classBase, children: [
1520
- /* @__PURE__ */ jsx7(
1521
- Button,
1522
- {
1523
- className: `${classBase}-FilterButton`,
1524
- "data-icon": iconName,
1525
- tabIndex: -1
1526
- }
1527
- ),
1528
- /* @__PURE__ */ jsx7("div", { className: `${classBase}-Editor`, ref: editorRef }),
1529
- /* @__PURE__ */ jsx7(
1530
- Button,
1531
- {
1532
- className: `${classBase}-ClearButton`,
1533
- "data-icon": "close-circle",
1534
- onClick: clearInput
1535
- }
1536
- )
1537
- ] });
1538
- };
1539
-
1540
- // src/filter-input/useFilterSuggestionProvider.ts
1541
- import {
1542
- asNameSuggestion,
1543
- booleanJoinSuggestions,
1544
- getNamePrompt,
1545
- numericOperators,
1546
- stringOperators,
1547
- toSuggestions
1548
- } from "@vuu-ui/vuu-codemirror";
1549
- import {
1550
- getTypeaheadParams,
1551
- useTypeaheadSuggestions as useTypeaheadSuggestions2
1552
- } from "@vuu-ui/vuu-data";
1553
- import { useCallback as useCallback4, useRef as useRef2 } from "react";
1554
-
1555
- // src/filter-input/filterInfo.ts
1556
- import { createEl } from "@vuu-ui/vuu-utils";
1557
- var filterInfo = (filterName, filterQuery) => {
1558
- const rootElement = createEl("div", "vuuFunctionDoc");
1559
- const headingElement = createEl("div", "function-heading");
1560
- const nameElement = createEl("span", "function-name", filterName);
1561
- headingElement.appendChild(nameElement);
1562
- const child2 = createEl("p", void 0, filterQuery);
1563
- rootElement.appendChild(headingElement);
1564
- rootElement.appendChild(child2);
1565
- return rootElement;
1566
- };
1567
-
1568
- // src/filter-input/useFilterSuggestionProvider.ts
1569
- var NO_NAMED_FILTERS = [];
1570
- var NONE = {};
1571
- var saveAsTab = (onSubmit) => [
1572
- {
1573
- label: "Press ENTER to create TAB",
1574
- apply: () => onSubmit("tab"),
1575
- boost: 6
1576
- }
1577
- ];
1578
- var makeSaveOrExtendSuggestions = (onSubmit, existingFilter, withJoinSuggestions = true) => {
1579
- const result = existingFilter ? [
1580
- {
1581
- label: "REPLACE existing filter",
1582
- apply: () => onSubmit("replace"),
1583
- boost: 8
1584
- },
1585
- {
1586
- label: "AND existing filter",
1587
- apply: () => onSubmit("and"),
1588
- boost: 7
1589
- },
1590
- {
1591
- label: "OR existing filter",
1592
- apply: () => onSubmit("or"),
1593
- boost: 7
1594
- }
1595
- ] : [
1596
- {
1597
- label: "Press ENTER to submit",
1598
- apply: () => onSubmit(),
1599
- boost: 6
1600
- }
1601
- ];
1602
- return withJoinSuggestions ? result.concat(booleanJoinSuggestions).concat(asNameSuggestion) : result;
1603
- };
1604
- var promptToSaveOrExtend = (onSubmit, existingFilter) => makeSaveOrExtendSuggestions(onSubmit, existingFilter, true);
1605
- var promptToSave = (onSubmit) => makeSaveOrExtendSuggestions(onSubmit, void 0);
1606
- var getSaveSuggestions = ({
1607
- existingFilter,
1608
- filterName,
1609
- onSubmit,
1610
- saveOptions
1611
- }) => {
1612
- const includeTabSuggestion = filterName && saveOptions.allowSaveAsTab;
1613
- const result = existingFilter ? promptToSaveOrExtend(onSubmit, existingFilter) : promptToSave(onSubmit);
1614
- if (includeTabSuggestion) {
1615
- return result.concat(saveAsTab(onSubmit));
1616
- } else {
1617
- return result;
1618
- }
1619
- };
1620
- var suggestColumns = (columns) => columns.map((column) => ({
1621
- boost: 5,
1622
- label: column.name
1623
- }));
1624
- var suggestNamedFilters = (namedFilters) => namedFilters ? Array.from(namedFilters.entries()).map(([filterName, filterQuery]) => ({
1625
- info: () => filterInfo(filterName, filterQuery),
1626
- label: filterName,
1627
- type: "filter"
1628
- })) : NO_NAMED_FILTERS;
1629
- var doneCommand = {
1630
- label: "Done",
1631
- apply: "] ",
1632
- type: "keyword",
1633
- boost: 10
1634
- };
1635
- var withApplySpace = (suggestions, startsWith = "") => suggestions.filter((sugg) => startsWith === "" || sugg.label.startsWith(startsWith)).map((suggestion) => ({
1636
- ...suggestion,
1637
- apply: suggestion.label + " "
1638
- }));
1639
- var defaultSaveOptions = {
1640
- allowReplace: true
1641
- };
1642
- var useFilterSuggestionProvider = ({
1643
- columns,
1644
- namedFilters,
1645
- saveOptions = defaultSaveOptions,
1646
- table,
1647
- typeaheadHook: useTypeahead = useTypeaheadSuggestions2
1648
- }) => {
1649
- const latestSuggestionsRef = useRef2();
1650
- const getTypeaheadSuggestions = useTypeahead();
1651
- const getSuggestions = useCallback4(
1652
- async (suggestionType, options = NONE) => {
1653
- const {
1654
- columnName,
1655
- existingFilter,
1656
- filterName,
1657
- operator,
1658
- quoted: autoQuoted,
1659
- onSubmit,
1660
- startsWith,
1661
- selection
1662
- } = options;
1663
- switch (suggestionType) {
1664
- case "operator":
1665
- {
1666
- const column = columns.find((col) => col.name === columnName);
1667
- if (column) {
1668
- switch (column.serverDataType) {
1669
- case "string":
1670
- case "char":
1671
- return withApplySpace(stringOperators, startsWith);
1672
- case "int":
1673
- case "long":
1674
- case "double":
1675
- return withApplySpace(numericOperators);
1676
- }
1677
- } else {
1678
- console.warn(`'${columnName}' does not match any column name`);
1679
- }
1680
- }
1681
- break;
1682
- case "column": {
1683
- const columnSuggestions = await suggestColumns(columns);
1684
- const filterSuggestions = await suggestNamedFilters(namedFilters);
1685
- return (latestSuggestionsRef.current = withApplySpace(columnSuggestions)).concat(
1686
- withApplySpace(filterSuggestions)
1687
- );
1688
- }
1689
- case "columnValue":
1690
- {
1691
- if (columnName) {
1692
- const column = columns.find((col) => col.name === columnName);
1693
- if (!column) {
1694
- throw Error(
1695
- `useFilterSUggestionProvider no column ${columnName}`
1696
- );
1697
- }
1698
- const prefix = Array.isArray(selection) ? selection.length === 0 ? "[" : "," : "";
1699
- const params = getTypeaheadParams(
1700
- table,
1701
- columnName,
1702
- startsWith
1703
- );
1704
- const suggestions = await getTypeaheadSuggestions(params);
1705
- const isIllustration = operator === "starts";
1706
- latestSuggestionsRef.current = toSuggestions(suggestions, {
1707
- moveCursorToEnd: autoQuoted,
1708
- quoted: (column == null ? void 0 : column.serverDataType) === "string" && !autoQuoted,
1709
- suffix: autoQuoted ? "" : " ",
1710
- prefix: isIllustration ? startsWith : prefix,
1711
- isIllustration
1712
- });
1713
- if (Array.isArray(selection) && (selection == null ? void 0 : selection.length) > 1) {
1714
- return [doneCommand, ...latestSuggestionsRef.current];
1715
- }
1716
- return latestSuggestionsRef.current;
1717
- }
1718
- }
1719
- break;
1720
- case "save": {
1721
- if (typeof onSubmit !== "function") {
1722
- throw Error(
1723
- "useFilterSuggestionProvider, onSubmit must be supplied for 'save' suggestions"
1724
- );
1725
- }
1726
- return await getSaveSuggestions({
1727
- existingFilter,
1728
- filterName,
1729
- onSubmit,
1730
- saveOptions
1731
- });
1732
- }
1733
- case "name":
1734
- return await getNamePrompt("filter");
1735
- default:
1736
- }
1737
- return [];
1738
- },
1739
- [columns, getTypeaheadSuggestions, namedFilters, saveOptions, table]
1740
- );
1741
- const isPartialMatch = useCallback4(
1742
- async (valueType, columnName, pattern) => {
1743
- const suggestions = (
1744
- // latestSuggestions && latestSuggestions.length > 0
1745
- // ? latestSuggestions
1746
- await getSuggestions(valueType, { columnName })
1747
- );
1748
- if (pattern && suggestions) {
1749
- for (const option of suggestions) {
1750
- if (option.label === pattern) {
1751
- return false;
1752
- } else if (option.label.startsWith(pattern)) {
1753
- return true;
1754
- }
1755
- }
1756
- }
1757
- return false;
1758
- },
1759
- [getSuggestions]
1760
- );
1761
- return {
1762
- getSuggestions,
1763
- isPartialMatch
1764
- };
1765
- };
1766
-
1767
- // src/filter-toolbar/FilterToolbar.tsx
1768
- var import_classnames2 = __toESM(require_classnames(), 1);
1769
- import { Toolbar as Toolbar2 } from "@heswell/salt-lab";
1770
-
1771
- // src/filter-toolbar/useFilterToolbar.tsx
1772
- import { ToggleButton, ToolbarField as ToolbarField3 } from "@heswell/salt-lab";
1773
-
1774
- // src/filter-toolbar/FilterDropdown.tsx
1775
- import { Dropdown as Dropdown2 } from "@heswell/salt-lab";
1776
- import { useCallback as useCallback5, useState as useState3 } from "react";
1777
- import { jsx as jsx8 } from "react/jsx-runtime";
1778
- var isString = (s) => typeof s === "string";
1779
- var stripQuotes = (selected) => {
1780
- if (isString(selected)) {
1781
- if (selected.startsWith('"') && selected.endsWith('"')) {
1782
- return selected.slice(1, -1);
1783
- } else {
1784
- return selected;
1785
- }
1786
- } else {
1787
- return selected.map(stripQuotes);
1788
- }
1789
- };
1790
- var FilterDropdown = ({
1791
- column,
1792
- selected: selectedProp,
1793
- suggestionProvider,
1794
- ...props
1795
- }) => {
1796
- const selected = selectedProp != null ? stripQuotes(selectedProp) : void 0;
1797
- const initialValues = Array.isArray(selected) ? selected : selected != null ? [selected] : [];
1798
- const [values, setValues] = useState3(initialValues);
1799
- console.log({ initialValues });
1800
- const handleOpenChange = useCallback5(
1801
- async (isOpen) => {
1802
- if (isOpen) {
1803
- const values2 = await suggestionProvider.getSuggestions("columnValue", {
1804
- columnName: column
1805
- });
1806
- console.log({ values: values2 });
1807
- setValues(values2.map((suggestion) => suggestion.label));
1808
- }
1809
- },
1810
- [column, suggestionProvider]
1811
- );
1812
- return /* @__PURE__ */ jsx8(
1813
- Dropdown2,
1814
- {
1815
- ...props,
1816
- onOpenChange: handleOpenChange,
1817
- selected,
1818
- source: values
1819
- }
1820
- );
1821
- };
1822
-
1823
- // src/filter-toolbar/FilterDropdownMultiSelect.tsx
1824
- import { Dropdown as Dropdown3 } from "@heswell/salt-lab";
1825
- import { useCallback as useCallback6, useState as useState4 } from "react";
1826
- import { jsx as jsx9 } from "react/jsx-runtime";
1827
- var isString2 = (s) => typeof s === "string";
1828
- var stripQuotes2 = (selected) => {
1829
- if (selected === void 0) {
1830
- return void 0;
1831
- } else if (isString2(selected)) {
1832
- if (selected.startsWith('"') && selected.endsWith('"')) {
1833
- return selected.slice(1, -1);
1834
- } else {
1835
- return selected;
1836
- }
1837
- } else {
1838
- return selected.map(stripQuotes2);
1839
- }
1840
- };
1841
- var FilterDropdownMultiSelect = ({
1842
- column,
1843
- selected: selectedProp,
1844
- suggestionProvider,
1845
- ...props
1846
- }) => {
1847
- const selected = stripQuotes2(selectedProp);
1848
- const initialValues = Array.isArray(selected) ? selected : selected != null ? [selected] : [];
1849
- const [values, setValues] = useState4(initialValues);
1850
- const handleOpenChange = useCallback6(
1851
- async (isOpen) => {
1852
- if (isOpen) {
1853
- const values2 = await suggestionProvider.getSuggestions("columnValue", {
1854
- columnName: column
1855
- });
1856
- console.log({ values: values2 });
1857
- setValues(values2.map((suggestion) => suggestion.label));
1858
- }
1859
- },
1860
- [column, suggestionProvider]
1861
- );
1862
- return /* @__PURE__ */ jsx9(
1863
- Dropdown3,
1864
- {
1865
- ...props,
1866
- onOpenChange: handleOpenChange,
1867
- selected,
1868
- selectionStrategy: "multiple",
1869
- source: values
1870
- }
1871
- );
1872
- };
1873
-
1874
- // src/filter-toolbar/useFilterToolbar.tsx
1875
- import { jsx as jsx10 } from "react/jsx-runtime";
1876
- var filterToControl = (filter, suggestionProvider) => {
1877
- if (isNamedFilter(filter)) {
1878
- return /* @__PURE__ */ jsx10(
1879
- ToggleButton,
1880
- {
1881
- className: "vuuToggleButton",
1882
- toggled: true,
1883
- variant: "secondary",
1884
- children: filter.name
1885
- }
1886
- );
1887
- }
1888
- if (isSingleValueFilter(filter)) {
1889
- const { column, value } = filter;
1890
- return /* @__PURE__ */ jsx10(
1891
- ToolbarField3,
1892
- {
1893
- className: "vuuFilterDropdown",
1894
- label: column,
1895
- labelPlacement: "top",
1896
- children: /* @__PURE__ */ jsx10(
1897
- FilterDropdown,
1898
- {
1899
- column,
1900
- selected: value.toString(),
1901
- selectionStrategy: "default",
1902
- source: [value.toString()],
1903
- suggestionProvider,
1904
- style: { width: 100 }
1905
- }
1906
- )
1907
- },
1908
- column
1909
- );
1910
- }
1911
- if (isMultiValueFilter(filter)) {
1912
- const values = filter.values.map((v) => v.toString());
1913
- return /* @__PURE__ */ jsx10(
1914
- ToolbarField3,
1915
- {
1916
- className: "vuuFilterDropdown",
1917
- label: filter.column,
1918
- labelPlacement: "top",
1919
- children: /* @__PURE__ */ jsx10(
1920
- FilterDropdownMultiSelect,
1921
- {
1922
- column: filter.column,
1923
- selected: values,
1924
- source: values,
1925
- suggestionProvider,
1926
- style: { width: 100 }
1927
- }
1928
- )
1929
- },
1930
- filter.column
1931
- );
1932
- }
1933
- return filter.filters.map(
1934
- (filter2) => filterToControl(filter2, suggestionProvider)
1935
- );
1936
- };
1937
- var useFilterToolbar = ({
1938
- filter,
1939
- suggestionProvider
1940
- }) => {
1941
- if (filter) {
1942
- return filterToControl(filter, suggestionProvider);
1943
- }
1944
- return [];
1945
- };
1946
-
1947
- // src/filter-toolbar/FilterToolbar.tsx
1948
- import { jsx as jsx11 } from "react/jsx-runtime";
1949
- var FilterToolbar = ({
1950
- className,
1951
- filter,
1952
- suggestionProvider,
1953
- ...props
1954
- }) => {
1955
- console.log(`FilterToolbar ${JSON.stringify(filter, null, 2)}`);
1956
- const toolbarItems = useFilterToolbar({ filter, suggestionProvider });
1957
- return /* @__PURE__ */ jsx11(Toolbar2, { className: (0, import_classnames2.default)("vuuFilterToolbar", className), ...props, children: toolbarItems });
1958
- };
1959
-
1960
- // src/filter-evaluation-utils.ts
1961
- var filterPredicateMap = /* @__PURE__ */ new Map();
1962
- var filterReject = () => false;
1963
- var getFilterPredicate = (columnMap, filterQuery) => {
1964
- let predicate = filterPredicateMap.get(filterQuery);
1965
- if (predicate) {
1966
- return predicate;
1967
- }
1968
- try {
1969
- const filter = parseFilter(filterQuery);
1970
- predicate = filterPredicate(columnMap, filter);
1971
- filterPredicateMap.set(filterQuery, predicate);
1972
- return predicate;
1973
- } catch (err) {
1974
- console.warn(
1975
- `filter-evaluation-utils, failed to parse filter "${filterQuery}"`
1976
- );
1977
- return filterReject;
1978
- }
1979
- };
1980
- function filterPredicate(columnMap, filter) {
1981
- switch (filter.op) {
1982
- case "in":
1983
- return testInclude(columnMap, filter);
1984
- case "=":
1985
- return testEQ(columnMap, filter);
1986
- case ">":
1987
- return testGT(columnMap, filter);
1988
- case ">=":
1989
- return testGE(columnMap, filter);
1990
- case "<":
1991
- return testLT(columnMap, filter);
1992
- case "<=":
1993
- return testLE(columnMap, filter);
1994
- case "starts":
1995
- return testSW(columnMap, filter);
1996
- case "and":
1997
- return testAND(columnMap, filter);
1998
- case "or":
1999
- return testOR(columnMap, filter);
2000
- default:
2001
- console.log(`unrecognized filter type ${filter.op}`);
2002
- return () => true;
2003
- }
2004
- }
2005
- var testInclude = (columnMap, filter) => {
2006
- return (row) => filter.values.indexOf(row[columnMap[filter.column]]) !== -1;
2007
- };
2008
- var testEQ = (columnMap, filter) => {
2009
- return (row) => row[columnMap[filter.column]] === filter.value;
2010
- };
2011
- var testGT = (columnMap, filter) => {
2012
- return (row) => row[columnMap[filter.column]] > filter.value;
2013
- };
2014
- var testGE = (columnMap, filter) => {
2015
- return (row) => row[columnMap[filter.column]] >= filter.value;
2016
- };
2017
- var testLT = (columnMap, filter) => {
2018
- return (row) => row[columnMap[filter.column]] < filter.value;
2019
- };
2020
- var testLE = (columnMap, filter) => {
2021
- return (row) => row[columnMap[filter.column]] <= filter.value;
2022
- };
2023
- var testSW = (columnMap, filter) => {
2024
- const filterValue2 = filter.value;
2025
- if (typeof filterValue2 !== "string") {
2026
- throw Error("string filter applied to value of wrong type");
2027
- }
2028
- return (row) => {
2029
- const rowValue = row[columnMap[filter.column]];
2030
- if (typeof rowValue !== "string") {
2031
- throw Error("string filter applied to value of wrong type");
2032
- }
2033
- return rowValue.toLowerCase().startsWith(filterValue2.toLowerCase());
2034
- };
2035
- };
2036
- var testAND = (columnMap, filter) => {
2037
- const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
2038
- return (row) => filters.every((fn) => fn(row));
2039
- };
2040
- function testOR(columnMap, filter) {
2041
- const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
2042
- return (row) => filters.some((fn) => fn(row));
28
+ .saltIcon:active {
29
+ --icon-color: var(--saltIcon-color-active, var(--salt-text-secondary-foreground));
2043
30
  }
2044
- export {
2045
- AND,
2046
- ColumnFilter,
2047
- ENDS_WITH,
2048
- EQUALS,
2049
- FilterInput,
2050
- FilterToolbar,
2051
- GREATER_THAN,
2052
- IN,
2053
- LESS_THAN,
2054
- OR,
2055
- STARTS_WITH,
2056
- addFilter,
2057
- filterAsQuery,
2058
- filterClauses,
2059
- filterEquals,
2060
- filterIncludesColumn,
2061
- filterPredicate,
2062
- getFilterPredicate,
2063
- isAndFilter,
2064
- isFilterClause,
2065
- isInFilter,
2066
- isMultiClauseFilter,
2067
- isMultiValueFilter,
2068
- isNamedFilter,
2069
- isOrFilter,
2070
- isSingleValueFilter,
2071
- overrideColName,
2072
- parseFilter,
2073
- removeColumnFromFilter,
2074
- removeFilter,
2075
- splitFilterOnColumn,
2076
- updateFilter,
2077
- useCodeMirrorEditor,
2078
- useFilterSuggestionProvider
2079
- };
31
+ `;he(ho);var Oo=e=>(...o)=>[e,...o].join("-"),vo=Oo("saltIcon"),bo=1,Oe=Co(function({children:o,className:r,size:t=bo,style:n,...i},s){let p={...n,"--saltIcon-size-multiplier":`${t}`};return Ce("svg",{className:Fe(vo(),r),style:p,role:"img",...i,ref:s,children:Ce("g",{"aria-hidden":!0,children:o})})});import{jsxs as yo,jsx as ve}from"react/jsx-runtime";import{forwardRef as Po}from"react";var ee=Po(function(o,r){return yo(Oe,{"data-testid":"DeleteIcon","aria-label":"delete",viewBox:"0 0 12 12",ref:r,...o,children:[ve("path",{d:"M5 4v6H4V4h1Zm2 0v6H6V4h1Z"}),ve("path",{fillRule:"evenodd",d:"M4 0a1 1 0 0 0-1 1v1H0v1h1v7a2 2 0 0 0 2 2h5.25A1.75 1.75 0 0 0 10 10.25V3h1V2H8V1a1 1 0 0 0-1-1H4Zm5 3H2v7a1 1 0 0 0 1 1h5.25a.75.75 0 0 0 .75-.75V3ZM7 2H4v-.5a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5V2Z",clipRule:"evenodd"})]})});import{Input as we,ToolbarField as Ee}from"@heswell/salt-lab";import{extractFilterForColumn as Ro,partition as wo}from"@vuu-ui/vuu-utils";var To=new Set(["=","!=",">",">=","<","<=","starts","ends"]),be=e=>e!==void 0&&e.name!==void 0,w=e=>e!==void 0&&To.has(e.op),Dt=e=>e!==void 0&&(w(e)||P(e)),P=e=>e!==void 0&&e.op==="in",D=e=>e.op==="in",oe=e=>e.op==="and",ye=e=>e.op==="or";function T(e){return e!==void 0&&(e.op==="and"||e.op==="or")}var S="and",re="=",kt=">",Mt="<",Eo="or",Pe="starts",Lt="ends",No="in",Do=(e,o=[])=>(e&&(T(e)?e.filters.forEach(r=>o.push(...Do(r))):o.push(e)),o),Vo={combineWith:"and"},L=(e,o,{combineWith:r=S}=Vo)=>{var t;if(ie(o))T(o)||(e=te(e,{name:o.column}));else if(Ao(o))return T(o),te(e,{name:(t=o.column)!=null?t:""});if(!e)return o;if(!o)return e;if(e.op===S&&o.op===S)return{op:S,filters:Lo(e.filters,o.filters)};if(e.op===S){let n=ko(e.filters,o);return n.length>1?{op:S,filters:n}:n[0]}return o.op===S?{op:S,filters:o.filters.concat(e)}:ne(e,o,!0)?o:Te(e,o)?Mo(e,o):{op:r,filters:[e,o]}},ie=e=>e?D(e)&&e.values.length===0?!0:oe(e)&&e.filters.some(o=>ie(o)):!1,Qo=e=>typeof e=="string"?`"${e}"`:e,V=e=>T(e)?e.filters.map(o=>V(o)).join(` ${e.op} `):P(e)?`${e.column} ${e.op} [${e.values.join(",")}]`:`${e.column} ${e.op} ${Qo(e.value)}`,Ao=e=>e?e.op===Pe&&e.value===""?!0:e.op===Pe&&e.value==="":!1,ko=(e,o)=>e.concat(o),Mo=(e,o)=>ie(o)?o:D(e)&&D(o)?{...e,values:[...e.values,...o.values.filter(r=>!e.values.includes(r))]}:D(e)&&o.op===re?{...e,values:e.values.concat([o.value])}:e.op===re&&o.op===re?{column:e.column,op:No,values:[e.value,o.value]}:o,Lo=(e,o)=>{let r=({op:i},{op:s})=>i===s||i[0]===s[0],t=(i,s)=>i.column===s.column&&r(i,s),n=i=>o.some(s=>t(i,s))===!1;return e.filter(n).concat(o)},Ut=(e,o)=>{if(T(o)){let[r,t]=o.filters;if(r.column===e.name)return[t,V(t)];if(t.column===e.name)return[r,V(r)]}return[void 0,""]},Wt=(e,o)=>{if(ne(e,o,!0))return null;if(e.op!==S)throw Error(`removeFilter cannot remove ${JSON.stringify(o)} from ${JSON.stringify(e)}`);let r=e.filters.filter(t=>!ne(t,o));return r.length>0?{type:S,filters:r}:null},Ht=(e,o)=>{if(!e)return[null,null];if(e.column===o)return[e,null];if(e.op!==S)return[null,e];let[[r=null],t]=wo(e.filters,n=>n.column===o);return t.length===1?[r,t[0]]:[r,{op:S,filters:t}]},Uo=(e,o)=>T(e)?{op:e.op,filters:e.filters.map(r=>Uo(r,o))}:{...e,column:o},Wo=(e,o)=>{if(!e)return!1;let{op:r,column:t}=e;switch(r){case S:case Eo:return e.filters!=null&&e.filters.some(n=>Wo(n,o));default:return t===o.name}},te=(e,o)=>{let r=o.name;if(e&&e.column!==r){if(oe(e)||ye(e)){let{op:t}=e,i=e.filters.filter(s=>s.column!==r);switch(i.length){case 0:return;case 1:return i[0];default:return{op:t,filters:i}}}return e}},Te=(e,o)=>e.column===o.column&&(e.op==="="||e.op==="in")&&(o.op==="="||o.op==="in"),Ho=(e,o)=>{if(e===o)return!0;if(e.length===o.length){let r=e.slice().sort(),t=o.slice().sort();return r.join("|")===t.join("|")}return!1},ne=(e,o,r=!1)=>r?e&&o&&Te(e,o)?e.op===o.op&&(w(e)&&w(o)&&e.value===o.value||P(e)&&P(o)&&Ho(e.values,o.values)):!1:!0,Bo=(e,o,r)=>{if(e&&o){if(r==="replace")return o;if(e.op==="and")return{...e,filters:e.filters.concat(o)};let{column:t}=o;if(t&&(o.column?Ro(e,t):void 0)&&t){let i=te(e,{name:t});return Bo(i,o,"add")}return{op:"and",filters:[e,o]}}return o||e};var Q=e=>/\.\.\.$/.test(e),Re=(e,o,r)=>{if(o.length!==0){if(r){let t=o[0].substring(0,o[0].length-3);return{column:e,op:"starts",value:`"${t}"`}}return{column:e,op:"in",values:o.map(t=>`"${t}"`)}}},se=(e,o,r)=>{let t=o===void 0?void 0:{column:e,op:">",value:o-1},n=r===void 0?void 0:{column:e,op:"<",value:r+1};return n===void 0?t:L(t,n,{combineWith:"and"})};import{jsx as U,jsxs as $o}from"react/jsx-runtime";var Ne=({defaultTypeaheadParams:e,filterValues:o,onChange:r})=>{var s,p;let t=e[1],n=f=>{let l=parseFloat(f.target.value),u={start:isNaN(l)?void 0:l,end:o==null?void 0:o.end},m=se(t,u.start,u.end);r(u,m)},i=f=>{let l=parseFloat(f.target.value),u={start:o==null?void 0:o.start,end:isNaN(l)?void 0:l},m=se(t,u.start,u.end);r(u,m)};return $o("div",{style:{display:"flex",flexDirection:"row"},children:[U(Ee,{label:"From",children:U(we,{onChange:n,value:((s=o==null?void 0:o.start)==null?void 0:s.toString())||"",type:"number"})}),U(Ee,{label:"To",children:U(we,{onChange:i,value:((p=o==null?void 0:o.end)==null?void 0:p.toString())||"",type:"number"})})]})};import{useCallback as De,useEffect as zo,useState as Ve}from"react";import{useTypeaheadSuggestions as Xo}from"@vuu-ui/vuu-data";import{ComboBoxDeprecated as _o}from"@heswell/salt-lab";import{jsx as Go}from"react/jsx-runtime";var Qe=({defaultTypeaheadParams:e,filterValues:o=[],onChange:r})=>{let[t,n]=e,[i,s]=Ve(""),[p,f]=Ve([]),l=Xo();zo(()=>{let a=i?[t,n,i]:e,c=!0;return l(a).then(x=>{c&&(Q(o[0])&&x.unshift(o[0]),i&&x.unshift(`${i}...`),x.concat(o),f(x))}),()=>{c=!1}},[o,i,n,t,l,e]);let u=De(a=>{let c=a.target.value;s(c)},[]),m=De((a,c)=>{if(s(""),c===null)return;c.some(Q)&&(c=c.filter(Q).slice(-1));let x=Re(n,c,Q(c[0]));r(c,x)},[n,r]);return Go(_o,{multiSelect:!0,onInputChange:u,onChange:m,source:p,style:{minWidth:200},inputValue:i,selectedItem:o},n)};import{memo as jo}from"react";import{Highlighter as Zo,ListItem as Yo}from"@heswell/salt-lab";import{jsx as W}from"react/jsx-runtime";var Ae=e=>W(qo,{...e}),qo=jo(function({item:o,itemTextHighlightPattern:r,...t}){return W(Yo,{...t,children:W("span",{style:{marginLeft:10},children:W(Zo,{matchPattern:r,text:o==null?void 0:o.name})})})});import{useCallback as H,useState as B}from"react";var le=(e,o,r)=>e.filter(t=>t[r]!==o[r]).concat(o),ke=e=>{var F,C;let[o,r]=B(""),[t,n]=B([]),[i,s]=B([]),[p,f]=B([]),l=()=>{r(""),s([]),f([]),n([]),e("")},u=H(g=>{let I=le(t,{column:o,filter:g},"column");n(I);let b=I.map(R=>R.filter).reduce((R,N)=>N===void 0?R:L(R,N,{combineWith:S}),void 0),K=b===void 0?"":V(b);e(K,b)},[o,e,t]),m=H((g,I)=>{f(le(p,{column:o,value:g},"column")),u(I)},[o,p,u]),a=H((g,I)=>{s(le(i,{column:o,value:g},"column")),u(I)},[o,i,u]),c=H(g=>r((g==null?void 0:g.name)||""),[]),x=(F=i.filter(g=>g.column===o)[0])==null?void 0:F.value,d=(C=p.filter(g=>g.column===o)[0])==null?void 0:C.value;return{clear:l,selectedColumnName:o,rangeValue:x,typeaheadValue:d,onSelectedColumnChange:c,onRangeChange:a,onTypeaheadChange:m}};import{jsx as v,jsxs as rr}from"react/jsx-runtime";var Fn=({className:e,table:o,columns:r,onFilterSubmit:t,...n})=>{let{clear:i,onTypeaheadChange:s,onRangeChange:p,onSelectedColumnChange:f,selectedColumnName:l,rangeValue:u,typeaheadValue:m}=ke(t);return rr(Jo,{...n,style:{alignItems:"center",height:"36px"},children:[v($,{label:"Select a column to filter",labelPlacement:"top",style:{width:180},children:v(Ko,{source:r,ListItem:Ae,itemToString:c=>c.name,onSelectionChange:(c,x)=>f(x)})}),l&&(()=>{var d;let c=[o,l];switch((d=r.find(F=>F.name===l))==null?void 0:d.serverDataType){case"string":case"char":return v($,{label:"Start typing to select a filter",labelPlacement:"top",children:v(Qe,{defaultTypeaheadParams:c,filterValues:m,onChange:s})});case"int":case"long":case"double":return v($,{label:"Select a range",labelPlacement:"top",children:v(Ne,{defaultTypeaheadParams:c,filterValues:u,onChange:p})});default:return v($,{children:v(or,{children:"Data type unsupported"})})}})(),v(er,{onClick:i,children:v(ee,{})})]})};import{Button as Ke}from"@salt-ds/core";var Ye=ge(ae(),1);import{autocompletion as Sr,defaultKeymap as Fr,EditorState as Ge,EditorView as je,ensureSyntaxTree as hr,keymap as pe,minimalSetup as Cr,startCompletion as Ze}from"@vuu-ui/vuu-codemirror";import{useEffect as Or,useMemo as vr,useRef as ue}from"react";import{LanguageSupport as nr,LRLanguage as ir,styleTags as sr,tags as _}from"@vuu-ui/vuu-codemirror";import{LRParser as tr}from"@vuu-ui/vuu-codemirror";var X=tr.deserialize({version:14,states:"%QOVQPOOOOQO'#C_'#C_O_QQO'#C^OOQO'#DO'#DOOvQQO'#C|OOQO'#DR'#DROVQPO'#CuOOQO'#C}'#C}QOQPOOOOQO'#C`'#C`O!UQQO,58xO!dQPO,59VOVQPO,59]OVQPO,59_O!iQPO,59hO!nQQO,59aOOQO'#DQ'#DQOOQO1G.d1G.dO!UQQO1G.qO!yQQO1G.wOOQO1G.y1G.yOOQO'#Cw'#CwOOQO1G/S1G/SOOQO1G.{1G.{O#[QPO'#CnO#dQPO7+$]O!UQQO'#CxO#iQPO,59YOOQO<<Gw<<GwOOQO,59d,59dOOQO-E6v-E6v",stateData:"#q~OoOS~OsPOvUO~OTXOUXOVXOWXOXXOYXO`ZO~Of[Oh]Oj^OmpX~OZ`O[`O]`O^`O~OabO~OseO~Of[Oh]OwgO~Oh]Ofeijeimeiwei~OcjOdbX~OdlO~OcjOdba~O",goto:"#YvPPw}!TPPPPPPPPPPwPP!WPP!ZP!ZP!aP!g!jPPP!p!s!aP#P!aXROU[]XQOU[]RYQRibXTOU[]XVOU[]Rf^QkhRnkRWOQSOQ_UQc[Rd]QaYQhbRmj",nodeNames:"\u26A0 Filter ColumnValueExpression Column Operator Eq NotEq Gt Lt Starts Ends Number String True False ColumnSetExpression In LBrack Values Comma RBrack AndExpression And OrExpression Or ParenthesizedExpression As FilterName",maxTerm:39,skippedNodes:[0],repeatNodeCount:1,tokenData:"6p~RnXY#PYZ#P]^#Ppq#Pqr#brs#mxy$eyz$j|}$o!O!P$t!Q![%S!^!_%_!_!`%d!`!a%i!c!}%n!}#O&V#P#Q&[#R#S%n#T#U&a#U#X%n#X#Y(w#Y#Z+]#Z#]%n#]#^.]#^#c%n#c#d/e#d#g%n#g#h0m#h#i4[#i#o%n~#USo~XY#PYZ#P]^#Ppq#P~#eP!_!`#h~#mOU~~#pWOX#mZ]#m^r#mrs$Ys#O#m#P;'S#m;'S;=`$_<%lO#m~$_O[~~$bP;=`<%l#m~$jOv~~$oOw~~$tOc~~$wP!Q![$z~%PPZ~!Q![$z~%XQZ~!O!P$t!Q![%S~%dOW~~%iOT~~%nOV~P%sUsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n~&[Oa~~&aOd~R&fYsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c'U#c#g%n#g#h(^#h#o%nR'ZWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X's#X#o%nR'zUfQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(eUjQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR(|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c)f#c#o%nR)kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#W%n#W#X*T#X#o%nR*YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h*r#h#o%nR*yUYQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR+bVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U+w#U#o%nR+|WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#`%n#`#a,f#a#o%nR,kWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h-T#h#o%nR-YWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y-r#Y#o%nR-yU^QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR.bWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#b%n#b#c.z#c#o%nR/RU`QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR/jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g0S#g#o%nR0ZUhQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR0rWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i1[#i#o%nR1aVsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#U1v#U#o%nR1{WsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g2e#g#o%nR2jWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#h%n#h#i3S#i#o%nR3XWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#g%n#g#h3q#h#o%nR3xUXQsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%nR4aWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#f%n#f#g4y#g#o%nR5OWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#i%n#i#j5h#j#o%nR5mWsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#X%n#X#Y6V#Y#o%nR6^U]QsP}!O%n!O!P%n!Q![%n!c!}%n#R#S%n#T#o%n",tokenizers:[0,1],topRules:{Filter:[0,1]},tokenPrec:0});var lr=ir.define({name:"VuuFilterQuery",parser:X.configure({props:[sr({Identifier:_.variableName,String:_.string,Or:_.emphasis,Operator:_.operator})]})}),Me=()=>new nr(lr);import{isMultiClauseFilter as A,isMultiValueFilter as ar,isSingleValueFilter as cr}from"@vuu-ui/vuu-utils";var h,ce=class{constructor(){Ie(this,h,void 0)}setFilterCombinatorOp(o,r=O(this,h)){A(r)&&r.op===o||J(this,h,{op:o,filters:[O(this,h)]})}add(o){if(O(this,h)===void 0)J(this,h,o);else if(A(O(this,h)))O(this,h).filters.push(o);else throw Error("Invalid filter passed to FilterExpression")}setColumn(o,r=O(this,h)){if(A(r)){let t=r.filters.at(-1);t&&this.setColumn(o,t)}else r&&(r.column=o)}setOp(o,r=O(this,h)){if(A(r)){let t=r.filters.at(-1);t&&this.setOp(o,t)}else r&&(r.op=o)}setValue(o,r=O(this,h)){var t;if(A(r)){let n=r.filters.at(-1);n&&this.setValue(o,n)}else ar(r)?((t=r.values)!=null||(r.values=[]),r.values.push(o)):cr(r)&&(r.value=o)}toJSON(o=O(this,h)){return this.name?{...o,name:this.name}:o}};h=new WeakMap;var G=(e,o)=>{let r=new ce,t=e.cursor();do{let{name:n,from:i,to:s}=t;switch(n){case"ColumnValueExpression":r.add({});break;case"ColumnSetExpression":r.add({op:"in"});break;case"Or":case"And":r.setFilterCombinatorOp(o.substring(i,s));break;case"Column":r.setColumn(o.substring(i,s));break;case"Operator":r.setOp(o.substring(i,s));break;case"String":r.setValue(o.substring(i+1,s-1));break;case"Number":r.setValue(parseFloat(o.substring(i,s)));break;case"True":r.setValue(!0);break;case"False":r.setValue(!1);break;case"FilterName":r.name=o.substring(i,s);break;default:}}while(t.next());return r.toJSON()};var pr=X.configure({strict:!0}),j=e=>{let o=pr.parse(e);return G(o,e)};import{HighlightStyle as ur,syntaxHighlighting as mr,tags as Le}from"@vuu-ui/vuu-codemirror";var dr=ur.define([{tag:Le.variableName,color:"var(--vuuFilterEditor-variableColor)"},{tag:Le.comment,color:"green",fontStyle:"italic"}]),Ue=mr(dr);import{EditorView as fr}from"@vuu-ui/vuu-codemirror";var We=fr.theme({"&":{color:"var(--vuuFilterEditor-color)",backgroundColor:"var(--vuuFilterEditor-background)",fontSize:"var(--vuuFilterEditor-fontSize)"},".cm-content":{caretColor:"var(--vuuFilterEditor-cursorColor)",padding:0},".cm-line":{lineHeight:"var(--vuuFilterEditor-lineHeight)"},"&.cm-focused .cm-cursor":{borderLeftColor:"var(--vuuFilterEditor-cursorColor)"},"&.cm-focused .cm-selectionBackground, ::selection":{backgroundColor:"var(--vuuFilterEditor-selectionBackground)"},".cm-selectionBackground, ::selection":{backgroundColor:"var(--vuuFilterEditor-selectionBackground)"},".cm-scroller":{fontFamily:"var(--vuuFilterEditor-fontFamily)"},".cm-tooltip":{background:"var(--vuuFilterEditor-tooltipBackground)",border:"var(--vuuFilterEditor-tooltipBorder)",boxShadow:"var(--vuuFilterEditor-tooltipElevation)","&.cm-tooltip-autocomplete > ul":{fontFamily:"var(--vuuFilterEditor-fontFamily)",fontSize:"var(--vuuFilterEditor-fontSize)",maxHeight:"240px"},"&.cm-tooltip-autocomplete > ul > li":{alignItems:"center",display:"flex",height:"var(--vuuFilterEditor-suggestion-height)",padding:"0 3px",lineHeight:"var(--vuuFilterEditor-suggestion-height)"},"&.cm-tooltip-autocomplete li[aria-selected]":{background:"var(--vuuFilterEditor-suggestion-selectedBackground)",color:"var(--vuuFilterEditor-suggestion-selectedColor)"}},".cm-completionIcon":{height:"18px",flex:"0 0 16px"},".cm-completionLabel":{flex:"1 1 auto"},".cm-completionIcon-filter":{position:"relative","&:after":{background:"var(--salt-text-secondary-foreground)",content:"''","-webkit-mask":"var(--svg-filter) center center/13px 13px","-webkit-mask-repeat":"no-repeat",position:"absolute",height:"18px",left:"0px",top:"0px",width:"16px"}}},{dark:!1});import{getNodeByName as E,getValue as y,syntaxTree as gr}from"@vuu-ui/vuu-codemirror";import{useCallback as He}from"react";var Be=(e,o)=>{let r=e.prevSibling||e.parent;for(;r&&!["Column","Operator","In"].includes(r.name);)r=r.prevSibling||r.parent;if((r==null?void 0:r.name)==="In"||(r==null?void 0:r.name)==="Operator")return y(r,o)},xr=(e,o,r)=>{let t=y(e,o);if(!(r===void 0||t===r)&&["contains","ends","starts"].some(n=>n.startsWith(t.toLowerCase())))return t},$e=(e,o)=>{let r=e.prevSibling||e.parent||e.lastChild;for(;r&&r.name==="\u26A0";)r=r.prevSibling;if(r&&["As","Or","And"].includes(r.name))return y(r,o)},ze=(e,o)=>{if(e.name==="FilterName")return y(e,o);{let r=e.prevSibling||e.parent||e.lastChild;for(;r&&r.name!=="FilterName";)r=r.prevSibling;if(r&&r.name==="FilterName")return y(e,o)}},Xe=(e,o)=>{let r=e.prevSibling;if((r==null?void 0:r.name)==="Column")return y(r,o);if((r==null?void 0:r.name)==="Operator")return Xe(r,o)},Ir=(e,o)=>{let r=e.lastChild,t=[];for(;r&&r.name!=="In";){let n=y(r,o);if(n)t.push(n);else break;r=r.prevSibling}return t};var _e=(e,o,r)=>{let t=He(async(n,i,s={})=>{let{startsWith:p=""}=s,f=await e.getSuggestions(i,s);return{from:n.pos-p.length,options:f}},[e]);return He(async n=>{var u,m;let{state:i,pos:s}=n,p=(u=n.matchBefore(/\w*/))!=null?u:{from:0,to:0,text:void 0},l=gr(i).resolveInner(s,-1);switch(console.log({nodeBeforeName:l.name}),l.name){case"Filter":if(n.pos===0)return t(n,"column");if($e(l,i)==="as")return t(n,"name");{let c=ze(l,i);return t(n,"save",{onSubmit:o.current,existingFilter:r,filterName:c})}case"String":{let a=Be(l,i),c=Xe(l,i),{from:x,to:d}=l;if(d-x===2&&n.pos===x+1){if(c&&a)return t(n,"columnValue",{columnName:c,operator:a,quoted:!0,startsWith:p.text})}else console.log(`we have a string, column is ${c} ${x} ${d}`)}break;case"As":return t(n,"name");case"FilterName":return t(n,"save",{onSubmit:o.current,existingFilter:r,filterName:ze(l,i)});case"Column":{let a=y(l,i);return await e.isPartialMatch("column",void 0,a)?t(n,"column",{startsWith:a}):t(n,"operator",{columnName:a})}case"\u26A0":{let a=E(l,i),c=Be(l,i),x=c?void 0:xr(l,i,a);return x?t(n,"operator",{columnName:a,startsWith:x}):t(n,"columnValue",{columnName:a,operator:c,startsWith:p.text})}case"Identifier":if($e(l,i)==="as")return{from:n.pos,options:[{label:"press ENTER to apply filter and save",apply:()=>o.current(),boost:5}]};break;case"ColumnSetExpression":case"Values":{let a=E(l,i),c=Ir(l,i);return t(n,"columnValue",{columnName:a,selection:c})}case"Comma":case"LBrack":{let a=E(l,i);return t(n,"columnValue",{columnName:a})}case"ColumnValueExpression":{let a=(m=l.lastChild)==null?void 0:m.prevSibling;if((a==null?void 0:a.name)==="Column")return t(n,"operator",{columnName:E(l,i)});if((a==null?void 0:a.name)==="Operator")return t(n,"columnValue",{columnName:E(a,i),operator:y(a,i)})}break;case"In":return{from:n.pos,options:[{label:"[",apply:" [",type:"text"}]};case"Eq":return t(n,"columnValue",{columnName:E(l,i)});case"AndExpression":case"OrExpression":return t(n,"column");default:}},[r,t,o,e])};var k=e=>{if(e.current==null)throw Error("EditorView not defined");return e.current},br=e=>(0,Ye.default)("vuuSuggestion",{vuuIllustration:e.isIllustration}),yr=e=>{let o=e.lastIndexOf(" as ");return o!==-1?e.slice(0,o):e},Pr=()=>console.log("noooop"),qe=({existingFilter:e,onSubmitFilter:o,suggestionProvider:r})=>{let t=ue(null),n=ue(Pr),i=ue(),s=_e(r,n,e),[p,f]=vr(()=>{let l=()=>{let d=k(i),F=d.state.doc.toString(),C=hr(d.state,d.state.doc.length,5e3);if(C){let g=G(C,F);return[g,yr(F),g.name]}else return[void 0,"",void 0]},u=()=>{k(i).setState(x())},m=d=>{let[F,C,g]=l();o==null||o(F,C,d,g),u()},a=d=>pe.of([{key:d,run(){return m(),!0}}]),c=d=>pe.of([{key:d,run(){return Ze(k(i)),!0}}]),x=()=>Ge.create({doc:"",extensions:[Cr,Sr({override:[s],optionClass:br}),Me(),pe.of(Fr),a("Ctrl-Enter"),c("ArrowDown"),je.updateListener.of(d=>{let F=k(i);d.docChanged&&Ze(F)}),Ge.transactionFilter.of(d=>d.newDoc.lines>1?[]:d),We,Ue]});return n.current=d=>{m(d),setTimeout(()=>{k(i).focus()},100)},[x,u]},[s,o]);return Or(()=>{if(!t.current)throw Error("editor not in dom");return i.current=new je({state:p(),parent:t.current}),()=>{var l;(l=i.current)==null||l.destroy()}},[s,p]),{editorRef:t,clearInput:f}};import{jsx as me,jsxs as Tr}from"react/jsx-runtime";var Z="vuuFilterInput",xi=({existingFilter:e,iconName:o="filter",namedFilters:r,onSubmitFilter:t,suggestionProvider:n,...i})=>{let{editorRef:s,clearInput:p}=qe({existingFilter:e,onSubmitFilter:t,suggestionProvider:n});return Tr("div",{...i,className:Z,children:[me(Ke,{className:`${Z}-FilterButton`,"data-icon":o,tabIndex:-1}),me("div",{className:`${Z}-Editor`,ref:s}),me(Ke,{className:`${Z}-ClearButton`,"data-icon":"close-circle",onClick:p})]})};import{asNameSuggestion as Rr,booleanJoinSuggestions as wr,getNamePrompt as Er,numericOperators as Nr,stringOperators as Dr,toSuggestions as Vr}from"@vuu-ui/vuu-codemirror";import{getTypeaheadParams as Qr,useTypeaheadSuggestions as Ar}from"@vuu-ui/vuu-data";import{useCallback as eo,useRef as kr}from"react";import{createEl as Y}from"@vuu-ui/vuu-utils";var Je=(e,o)=>{let r=Y("div","vuuFunctionDoc"),t=Y("div","function-heading"),n=Y("span","function-name",e);t.appendChild(n);let i=Y("p",void 0,o);return r.appendChild(t),r.appendChild(i),r};var Mr=[],Lr={},Ur=e=>[{label:"Press ENTER to create TAB",apply:()=>e("tab"),boost:6}],oo=(e,o,r=!0)=>{let t=o?[{label:"REPLACE existing filter",apply:()=>e("replace"),boost:8},{label:"AND existing filter",apply:()=>e("and"),boost:7},{label:"OR existing filter",apply:()=>e("or"),boost:7}]:[{label:"Press ENTER to submit",apply:()=>e(),boost:6}];return r?t.concat(wr).concat(Rr):t},Wr=(e,o)=>oo(e,o,!0),Hr=e=>oo(e,void 0),Br=({existingFilter:e,filterName:o,onSubmit:r,saveOptions:t})=>{let n=o&&t.allowSaveAsTab,i=e?Wr(r,e):Hr(r);return n?i.concat(Ur(r)):i},$r=e=>e.map(o=>({boost:5,label:o.name})),zr=e=>e?Array.from(e.entries()).map(([o,r])=>({info:()=>Je(o,r),label:o,type:"filter"})):Mr,Xr={label:"Done",apply:"] ",type:"keyword",boost:10},q=(e,o="")=>e.filter(r=>o===""||r.label.startsWith(o)).map(r=>({...r,apply:r.label+" "})),_r={allowReplace:!0},Ti=({columns:e,namedFilters:o,saveOptions:r=_r,table:t,typeaheadHook:n=Ar})=>{let i=kr(),s=n(),p=eo(async(l,u=Lr)=>{let{columnName:m,existingFilter:a,filterName:c,operator:x,quoted:d,onSubmit:F,startsWith:C,selection:g}=u;switch(l){case"operator":{let I=e.find(b=>b.name===m);if(I)switch(I.serverDataType){case"string":case"char":return q(Dr,C);case"int":case"long":case"double":return q(Nr)}else console.warn(`'${m}' does not match any column name`)}break;case"column":{let I=await $r(e),b=await zr(o);return(i.current=q(I)).concat(q(b))}case"columnValue":if(m){let I=e.find(uo=>uo.name===m);if(!I)throw Error(`useFilterSUggestionProvider no column ${m}`);let b=Array.isArray(g)?g.length===0?"[":",":"",K=Qr(t,m,C),R=await s(K),N=x==="starts";return i.current=Vr(R,{moveCursorToEnd:d,quoted:(I==null?void 0:I.serverDataType)==="string"&&!d,suffix:d?"":" ",prefix:N?C:b,isIllustration:N}),Array.isArray(g)&&(g==null?void 0:g.length)>1?[Xr,...i.current]:i.current}break;case"save":{if(typeof F!="function")throw Error("useFilterSuggestionProvider, onSubmit must be supplied for 'save' suggestions");return await Br({existingFilter:a,filterName:c,onSubmit:F,saveOptions:r})}case"name":return await Er("filter");default:}return[]},[e,s,o,r,t]),f=eo(async(l,u,m)=>{let a=await p(l,{columnName:u});if(m&&a)for(let c of a){if(c.label===m)return!1;if(c.label.startsWith(m))return!0}return!1},[p]);return{getSuggestions:p,isPartialMatch:f}};var co=ge(ae(),1);import{Toolbar as nt}from"@heswell/salt-lab";import{ToggleButton as tt,ToolbarField as so}from"@heswell/salt-lab";import{Dropdown as Gr}from"@heswell/salt-lab";import{useCallback as jr,useState as Zr}from"react";import{jsx as qr}from"react/jsx-runtime";var Yr=e=>typeof e=="string",ro=e=>Yr(e)?e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e:e.map(ro),to=({column:e,selected:o,suggestionProvider:r,...t})=>{let n=o!=null?ro(o):void 0,i=Array.isArray(n)?n:n!=null?[n]:[],[s,p]=Zr(i);console.log({initialValues:i});let f=jr(async l=>{if(l){let u=await r.getSuggestions("columnValue",{columnName:e});console.log({values:u}),p(u.map(m=>m.label))}},[e,r]);return qr(Gr,{...t,onOpenChange:f,selected:n,source:s})};import{Dropdown as Kr}from"@heswell/salt-lab";import{useCallback as Jr,useState as et}from"react";import{jsx as rt}from"react/jsx-runtime";var ot=e=>typeof e=="string",no=e=>{if(e!==void 0)return ot(e)?e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e:e.map(no)},io=({column:e,selected:o,suggestionProvider:r,...t})=>{let n=no(o),i=Array.isArray(n)?n:n!=null?[n]:[],[s,p]=et(i),f=Jr(async l=>{if(l){let u=await r.getSuggestions("columnValue",{columnName:e});console.log({values:u}),p(u.map(m=>m.label))}},[e,r]);return rt(Kr,{...t,onOpenChange:f,selected:n,selectionStrategy:"multiple",source:s})};import{jsx as M}from"react/jsx-runtime";var lo=(e,o)=>{if(be(e))return M(tt,{className:"vuuToggleButton",toggled:!0,variant:"secondary",children:e.name});if(w(e)){let{column:r,value:t}=e;return M(so,{className:"vuuFilterDropdown",label:r,labelPlacement:"top",children:M(to,{column:r,selected:t.toString(),selectionStrategy:"default",source:[t.toString()],suggestionProvider:o,style:{width:100}})},r)}if(P(e)){let r=e.values.map(t=>t.toString());return M(so,{className:"vuuFilterDropdown",label:e.column,labelPlacement:"top",children:M(io,{column:e.column,selected:r,source:r,suggestionProvider:o,style:{width:100}})},e.column)}return e.filters.map(r=>lo(r,o))},ao=({filter:e,suggestionProvider:o})=>e?lo(e,o):[];import{jsx as it}from"react/jsx-runtime";var ns=({className:e,filter:o,suggestionProvider:r,...t})=>{console.log(`FilterToolbar ${JSON.stringify(o,null,2)}`);let n=ao({filter:o,suggestionProvider:r});return it(nt,{className:(0,co.default)("vuuFilterToolbar",e),...t,children:n})};var po=new Map,st=()=>!1,ps=(e,o)=>{let r=po.get(o);if(r)return r;try{let t=j(o);return r=de(e,t),po.set(o,r),r}catch{return console.warn(`filter-evaluation-utils, failed to parse filter "${o}"`),st}};function de(e,o){switch(o.op){case"in":return lt(e,o);case"=":return at(e,o);case">":return ct(e,o);case">=":return pt(e,o);case"<":return ut(e,o);case"<=":return mt(e,o);case"starts":return dt(e,o);case"and":return ft(e,o);case"or":return gt(e,o);default:return console.log(`unrecognized filter type ${o.op}`),()=>!0}}var lt=(e,o)=>r=>o.values.indexOf(r[e[o.column]])!==-1,at=(e,o)=>r=>r[e[o.column]]===o.value,ct=(e,o)=>r=>r[e[o.column]]>o.value,pt=(e,o)=>r=>r[e[o.column]]>=o.value,ut=(e,o)=>r=>r[e[o.column]]<o.value,mt=(e,o)=>r=>r[e[o.column]]<=o.value,dt=(e,o)=>{let r=o.value;if(typeof r!="string")throw Error("string filter applied to value of wrong type");return t=>{let n=t[e[o.column]];if(typeof n!="string")throw Error("string filter applied to value of wrong type");return n.toLowerCase().startsWith(r.toLowerCase())}},ft=(e,o)=>{let r=o.filters.map(t=>de(e,t));return t=>r.every(n=>n(t))};function gt(e,o){let r=o.filters.map(t=>de(e,t));return t=>r.some(n=>n(t))}export{S as AND,Fn as ColumnFilter,Lt as ENDS_WITH,re as EQUALS,xi as FilterInput,ns as FilterToolbar,kt as GREATER_THAN,No as IN,Mt as LESS_THAN,Eo as OR,Pe as STARTS_WITH,L as addFilter,V as filterAsQuery,Do as filterClauses,ne as filterEquals,Wo as filterIncludesColumn,de as filterPredicate,ps as getFilterPredicate,oe as isAndFilter,Dt as isFilterClause,D as isInFilter,T as isMultiClauseFilter,P as isMultiValueFilter,be as isNamedFilter,ye as isOrFilter,w as isSingleValueFilter,Uo as overrideColName,j as parseFilter,Ut as removeColumnFromFilter,Wt as removeFilter,Ht as splitFilterOnColumn,Bo as updateFilter,qe as useCodeMirrorEditor,Ti as useFilterSuggestionProvider};
2080
32
  /*! Bundled license information:
2081
33
 
2082
34
  classnames/index.js: