@vuu-ui/vuu-filters 0.7.3 → 0.7.4-debug

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