@svgrid/enterprise 2.6.1 → 2.6.2

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.
Files changed (43) hide show
  1. package/dist/ExpressionEditorHarness.svelte +47 -0
  2. package/dist/ExpressionEditorHarness.svelte.d.ts +15 -0
  3. package/dist/SvAdvancedFilter.svelte +208 -0
  4. package/dist/SvAdvancedFilter.svelte.d.ts +37 -0
  5. package/dist/SvExpressionEditor.svelte +251 -123
  6. package/dist/SvGridEditPanel.svelte +1157 -1157
  7. package/dist/advanced-filter/expr-columns-from-grid.d.ts +30 -0
  8. package/dist/advanced-filter/expr-columns-from-grid.js +44 -0
  9. package/dist/advanced-filter-enable.d.ts +5 -0
  10. package/dist/advanced-filter-enable.js +35 -0
  11. package/dist/cdn/svgrid-enterprise.svelte-external.js +8274 -7706
  12. package/dist/designer/assets/GridMenus-Bjr19Tz_.js +7 -0
  13. package/dist/designer/assets/{SvListBox-BVzVfCG3.js → SvListBox-BB8rt4aP.js} +1 -1
  14. package/dist/designer/assets/{index-CKdwDseq.js → index-xjfKckuH.js} +43 -43
  15. package/dist/designer/assets/{js-scroller.svelte-tHanKJx0.js → js-scroller.svelte-CGkUUXwV.js} +2 -2
  16. package/dist/designer/assets/src-BT3LjWJL.css +1 -0
  17. package/dist/designer/assets/src-DDhAK0WP.js +2893 -0
  18. package/dist/designer/index.html +5 -5
  19. package/dist/expressions/builder-tree.d.ts +62 -0
  20. package/dist/expressions/builder-tree.js +133 -0
  21. package/dist/expressions/compile.d.ts +14 -0
  22. package/dist/expressions/compile.js +286 -0
  23. package/dist/expressions/expression-columns.d.ts +1 -11
  24. package/dist/expressions/expression-columns.js +40 -11
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.js +4 -0
  27. package/dist/install.js +2 -0
  28. package/dist/node/studio.js +61 -13
  29. package/dist/sources/rest.js +25 -0
  30. package/dist/sources/supabase.js +49 -3
  31. package/dist/studio/emit-project.js +2125 -2125
  32. package/dist/studio/ui-components.generated.js +33 -0
  33. package/dist/sveltekit/in-memory.js +96 -3
  34. package/dist/sveltekit/query-plan.d.ts +32 -1
  35. package/dist/sveltekit/query-plan.js +88 -1
  36. package/dist/sveltekit/sql.d.ts +20 -0
  37. package/dist/sveltekit/sql.js +26 -0
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +3 -3
  41. package/dist/designer/assets/GridMenus-CW-rnHS9.js +0 -7
  42. package/dist/designer/assets/src-DCKhP5Xy.css +0 -1
  43. package/dist/designer/assets/src-DLsSdh3J.js +0 -2893
@@ -6667,6 +6667,20 @@ export const GENERATED_UI_SURFACE = {
6667
6667
  "type": "boolean",
6668
6668
  "group": "common"
6669
6669
  },
6670
+ {
6671
+ "key": "groupBy",
6672
+ "label": "Group By",
6673
+ "type": "json",
6674
+ "description": "Group the rows by these column ids, outermost first - `['region', 'country']` rolls country up inside region. ```svelte <SvGrid {data} {columns} {features} groupBy={['department']} /> ``` The prop seeds the group-by list and re-applies whenever it changes, so it works both as initial state and as a controlled value. The column menu and `api.setGroupBy()` write the same state; a change from either survives until this prop's own value changes. Ignored when `treeData` is set - a row cannot be both a hierarchy node and bucketed under a group banner.",
6675
+ "group": "common"
6676
+ },
6677
+ {
6678
+ "key": "expanded",
6679
+ "label": "Expanded",
6680
+ "type": "json",
6681
+ "description": "Which group / tree rows are expanded, keyed by row id. Expansion is owned by the engine by default; pass this prop to hoist it (saved views, \"expand everything on load\", persisted UI state). Like `groupBy` it seeds the state and re-applies whenever it changes. Group row ids are built from the grouping path, not the display label: `group_department_Engineering`, and one level deeper `group_department_Engineering_role_Senior`. Tree rows key off the engine's row id instead (set `getRowId` to make that your own id). Prefer capturing the map from `onExpandedChange` over hand-building these keys.",
6682
+ "group": "common"
6683
+ },
6670
6684
  {
6671
6685
  "key": "groupFooters",
6672
6686
  "label": "Group Footers",
@@ -7069,6 +7083,13 @@ export const GENERATED_UI_SURFACE = {
7069
7083
  "description": "The sort state to start in - `{ id, desc }` entries. Use with `externalSort` when the initial ordering is decided server-side (e.g. a URL `?sort=` param read in a SvelteKit `load`), so the header sort indicators match the already- sorted data on first render. Applied once at mount; user sorting takes over.",
7070
7084
  "group": "common"
7071
7085
  },
7086
+ {
7087
+ "key": "initialAdvancedFilter",
7088
+ "label": "Initial Advanced Filter",
7089
+ "type": "json",
7090
+ "description": "The advanced-filter expression to start in (Pro). Applied once at mount; change it afterwards through `api.setAdvancedFilter()`. Filtering only happens once `@svgrid/enterprise`'s `enableAdvancedFilter()` has registered a compiler - without it the expression is stored and reported but no rows are removed, so the free grid degrades to a no-op rather than to a wrong row set.",
7091
+ "group": "common"
7092
+ },
7072
7093
  {
7073
7094
  "key": "externalFilter",
7074
7095
  "label": "External Filter",
@@ -7219,6 +7240,12 @@ export const GENERATED_UI_SURFACE = {
7219
7240
  "prop": "onPivotModeChange",
7220
7241
  "description": "Fired when the in-grid Pivot toggle flips `pivotMode`."
7221
7242
  },
7243
+ {
7244
+ "key": "expandedChange",
7245
+ "label": "Expanded Change",
7246
+ "prop": "onExpandedChange",
7247
+ "description": "Fired whenever the expanded set changes - chevron clicks, `api.setRowExpanded()`, `expandAllGroups()` / `collapseAllGroups()`. Receives the full next map, so it can be written straight back into `expanded` for a controlled setup."
7248
+ },
7222
7249
  {
7223
7250
  "key": "paginationChange",
7224
7251
  "label": "Pagination Change",
@@ -7249,6 +7276,12 @@ export const GENERATED_UI_SURFACE = {
7249
7276
  "prop": "onSortingChange",
7250
7277
  "description": "Fires whenever the sort clauses change. Receives the new array of `{ id, desc }` entries. Pair with `externalSort={true}` when the consumer wants to own the row ordering."
7251
7278
  },
7279
+ {
7280
+ "key": "advancedFilterChange",
7281
+ "label": "Advanced Filter Change",
7282
+ "prop": "onAdvancedFilterChange",
7283
+ "description": "Fires whenever the advanced-filter expression changes, whatever changed it: `api.setAdvancedFilter()`, `clearAllFilters()`, or the toolbar's clear control. The panel that authors the expression is mounted by you, outside the grid, so it cannot see a change the grid made on its own. Without this, clearing from the toolbar leaves that panel showing a filter the grid is no longer applying. Feed this back into the panel's `expression` prop to keep them agreeing."
7284
+ },
7252
7285
  {
7253
7286
  "key": "filtersChange",
7254
7287
  "label": "Filters Change",
@@ -1,5 +1,6 @@
1
1
  import { resolveIdField } from '../schema';
2
2
  import { planQuery } from './query-plan';
3
+ import { compilePredicate } from '../expressions/compile';
3
4
  import { aggregateRows } from '../sources/aggregate';
4
5
  function asString(v) {
5
6
  return v == null ? '' : String(v);
@@ -43,6 +44,39 @@ function matches(row, plan) {
43
44
  }
44
45
  return plan.where.every((p) => matchesPredicate(row, p));
45
46
  }
47
+ /**
48
+ * Reduce one already-bucketed group to a single aggregate value.
49
+ *
50
+ * Semantics deliberately mirror the SQL `planToSql` emits, so the in-memory
51
+ * source and a real database agree:
52
+ * - `count` is COUNT(*): rows in the group, including null-valued ones.
53
+ * - the rest ignore non-numeric / null values, and yield null for an empty
54
+ * numeric set (SQL returns NULL for SUM/AVG/MIN/MAX over no rows).
55
+ */
56
+ function aggregate(rows, field, fn) {
57
+ if (fn === 'count')
58
+ return rows.length;
59
+ const nums = [];
60
+ for (const row of rows) {
61
+ const n = Number(row[field]);
62
+ if (Number.isFinite(n))
63
+ nums.push(n);
64
+ }
65
+ if (nums.length === 0)
66
+ return null;
67
+ switch (fn) {
68
+ case 'sum':
69
+ return nums.reduce((s, n) => s + n, 0);
70
+ case 'avg':
71
+ return nums.reduce((s, n) => s + n, 0) / nums.length;
72
+ case 'min':
73
+ return Math.min(...nums);
74
+ case 'max':
75
+ return Math.max(...nums);
76
+ default:
77
+ return null;
78
+ }
79
+ }
46
80
  function sortRows(rows, orderBy) {
47
81
  if (orderBy.length === 0)
48
82
  return rows;
@@ -71,10 +105,69 @@ export function createInMemoryDataSource(initial, schema) {
71
105
  return {
72
106
  async getRows(request) {
73
107
  const plan = planQuery(schema, request);
74
- const filtered = sortRows(store.filter((r) => matches(r, plan)), plan.orderBy);
108
+ let filtered = store.filter((r) => matches(r, plan));
109
+ // Advanced filter. `planQuery` only admits an expression whose columns
110
+ // are all on the schema, so reaching here means it is safe to run. If it
111
+ // was rejected, or fails to compile, we must NOT acknowledge it - the
112
+ // grid then tells the user the filter did not run rather than showing a
113
+ // superset that looks filtered.
114
+ let appliedExpression = false;
115
+ if (plan.expression) {
116
+ const predicate = compilePredicate(plan.expression, {
117
+ getValue: (row, columnId) => row[columnId],
118
+ rows: filtered,
119
+ });
120
+ if (predicate) {
121
+ filtered = filtered.filter(predicate);
122
+ appliedExpression = true;
123
+ }
124
+ }
125
+ // Grouped request: return one row per distinct key at this level, each
126
+ // carrying the requested aggregates. The chosen path is already in
127
+ // `plan.where`, so `filtered` is exactly this group's slice of the data.
128
+ // Reference behaviour for what a SQL backend does with `planToSql`'s
129
+ // `select` / `groupByText` / `countText`.
130
+ if (plan.groupBy) {
131
+ const groupField = plan.groupBy;
132
+ const buckets = new Map();
133
+ for (const row of filtered) {
134
+ const key = asString(row[groupField]);
135
+ const bucket = buckets.get(key);
136
+ if (bucket)
137
+ bucket.push(row);
138
+ else
139
+ buckets.set(key, [row]);
140
+ }
141
+ const groups = [...buckets.entries()].map(([key, rows]) => {
142
+ const out = { [groupField]: key };
143
+ for (const agg of plan.aggregations ?? []) {
144
+ out[agg.field] = aggregate(rows, agg.field, agg.fn);
145
+ }
146
+ return out;
147
+ });
148
+ // Sort by the group key unless the request sorted on a column we
149
+ // actually produced (the key or an aggregate).
150
+ const produced = new Set([
151
+ groupField,
152
+ ...(plan.aggregations ?? []).map((a) => a.field),
153
+ ]);
154
+ const groupOrder = plan.orderBy.filter((o) => produced.has(o.field));
155
+ const sorted = groupOrder.length
156
+ ? sortRows(groups, groupOrder)
157
+ : sortRows(groups, [{ field: groupField, desc: false }]);
158
+ return {
159
+ rows: sorted.slice(plan.offset, plan.offset + plan.limit),
160
+ // The count is DISTINCT GROUPS, not underlying rows - the grid sizes
161
+ // its scrollbar and paging from this.
162
+ rowCount: sorted.length,
163
+ appliedExpression,
164
+ };
165
+ }
166
+ const sortedLeaves = sortRows(filtered, plan.orderBy);
75
167
  return {
76
- rows: filtered.slice(plan.offset, plan.offset + plan.limit),
77
- rowCount: filtered.length,
168
+ rows: sortedLeaves.slice(plan.offset, plan.offset + plan.limit),
169
+ rowCount: sortedLeaves.length,
170
+ appliedExpression,
78
171
  };
79
172
  },
80
173
  async createRow(input) {
@@ -10,7 +10,7 @@
10
10
  * Unknown column names in the request are dropped, so a client cannot smuggle
11
11
  * arbitrary identifiers through to SQL.
12
12
  */
13
- import type { RowData, ServerRequest } from '@svgrid/grid';
13
+ import type { GridPredicateExpr, RowData, ServerRequest } from '@svgrid/grid';
14
14
  import type { EntityFieldType, EntitySchema } from '../schema';
15
15
  /** Normalized predicate operators (a stable superset of the grid's filter operators). */
16
16
  export type PlanOp = 'eq' | 'contains' | 'startsWith' | 'gt' | 'lt' | 'between' | 'isBlank' | 'in';
@@ -24,6 +24,11 @@ export type PlanPredicate = {
24
24
  /** Operands for `in` (set / facet filter). */
25
25
  values?: unknown[];
26
26
  };
27
+ /** An aggregate to compute per group. */
28
+ export type PlanAggregate = {
29
+ field: string;
30
+ fn: 'sum' | 'avg' | 'min' | 'max' | 'count';
31
+ };
27
32
  export type QueryPlan = {
28
33
  /** AND-combined column predicates. */
29
34
  where: PlanPredicate[];
@@ -38,6 +43,32 @@ export type QueryPlan = {
38
43
  }>;
39
44
  limit: number;
40
45
  offset: number;
46
+ /**
47
+ * The column to GROUP BY for this request, or null for a flat / leaf query.
48
+ *
49
+ * Server-side grouping is one level at a time: the grid asks for the distinct
50
+ * keys at the current level, and expanding a group is another request with
51
+ * that key appended to `groupKeys`. The path already chosen arrives as
52
+ * ordinary equality predicates in `where`, so a backend only ever has to
53
+ * handle "filter, then group by one column".
54
+ *
55
+ * Optional so a hand-built plan (and every plan written before server-side
56
+ * grouping existed) stays valid; `planQuery` always sets it.
57
+ */
58
+ groupBy?: string | null;
59
+ /** Aggregates to compute alongside `groupBy`. Empty/absent for a leaf query. */
60
+ aggregations?: PlanAggregate[];
61
+ /**
62
+ * The advanced-filter expression, present ONLY when every column it
63
+ * references is on the schema.
64
+ *
65
+ * Rejected whole rather than in part. Dropping one clause of an AND makes the
66
+ * result broader, which for a filter means showing rows the user excluded -
67
+ * so a half-understood expression is worse than an ignored one. When this is
68
+ * absent but the request carried an expression, the backend must not
69
+ * acknowledge it (see `ServerResult.appliedExpression`).
70
+ */
71
+ expression?: GridPredicateExpr;
41
72
  };
42
73
  /** Coerce a raw string request value to the field's runtime type for correct comparisons. */
43
74
  export declare function coerce(type: EntityFieldType, raw: unknown): unknown;
@@ -72,5 +72,92 @@ export function planQuery(schema, request) {
72
72
  const orderBy = (request.sortModel ?? [])
73
73
  .filter((s) => fields.has(s.id))
74
74
  .map((s) => ({ field: s.id, desc: !!s.desc }));
75
- return { where, search, orderBy, limit: request.pageSize, offset: request.startRow };
75
+ // ---- Server-side grouping ---------------------------------------------
76
+ // Same whitelist rule as the filters above: only schema fields reach the
77
+ // plan, so a client cannot group by or aggregate an arbitrary identifier.
78
+ const groupCols = (request.groupBy ?? []).filter((f) => fields.has(f));
79
+ const groupKeys = request.groupKeys ?? [];
80
+ // The already-chosen path becomes plain equality predicates, so the backend
81
+ // only ever sees "filter, then group by one column".
82
+ for (let i = 0; i < groupKeys.length && i < groupCols.length; i += 1) {
83
+ const field = groupCols[i];
84
+ const def = fields.get(field);
85
+ where.push({ field, op: 'eq', value: coerce(def.type, groupKeys[i]) });
86
+ }
87
+ // Above the innermost level the grid wants GROUP rows; at or below it, leaves.
88
+ const groupBy = groupKeys.length < groupCols.length ? (groupCols[groupKeys.length] ?? null) : null;
89
+ const aggregations = groupBy
90
+ ? (request.aggregations ?? [])
91
+ .filter((a) => fields.has(a.col))
92
+ .map((a) => ({ field: a.col, fn: a.fn }))
93
+ : [];
94
+ // ---- Advanced filter ---------------------------------------------------
95
+ // Same whitelist, stricter consequence: if ANY referenced column is off the
96
+ // schema the whole expression is dropped. Keeping the understood parts would
97
+ // silently widen the result set.
98
+ const expression = admitExpression(request.filterModel?.expression, fields);
99
+ return {
100
+ where,
101
+ search,
102
+ orderBy,
103
+ limit: request.pageSize,
104
+ offset: request.startRow,
105
+ groupBy,
106
+ aggregations,
107
+ ...(expression ? { expression } : {}),
108
+ };
109
+ }
110
+ /** Every column id an expression reads, so it can be whitelisted as a unit. */
111
+ function expressionColumns(expr, out = new Set()) {
112
+ const scalar = (s) => {
113
+ switch (s.kind) {
114
+ case 'col':
115
+ out.add(s.id);
116
+ break;
117
+ case 'agg':
118
+ out.add(s.column);
119
+ break;
120
+ case 'neg':
121
+ scalar(s.expr);
122
+ break;
123
+ case 'bin':
124
+ scalar(s.left);
125
+ scalar(s.right);
126
+ break;
127
+ case 'func':
128
+ s.args.forEach(scalar);
129
+ break;
130
+ default:
131
+ break;
132
+ }
133
+ };
134
+ switch (expr.kind) {
135
+ case 'and':
136
+ case 'or':
137
+ expr.parts.forEach((p) => expressionColumns(p, out));
138
+ break;
139
+ case 'not':
140
+ expressionColumns(expr.expr, out);
141
+ break;
142
+ case 'cmp':
143
+ out.add(expr.column);
144
+ break;
145
+ case 'scalarCmp':
146
+ scalar(expr.left);
147
+ scalar(expr.right);
148
+ break;
149
+ default:
150
+ break;
151
+ }
152
+ return out;
153
+ }
154
+ /** Return the expression only when every column it touches is on the schema. */
155
+ function admitExpression(expr, fields) {
156
+ if (!expr)
157
+ return undefined;
158
+ for (const col of expressionColumns(expr)) {
159
+ if (!fields.has(col))
160
+ return undefined;
161
+ }
162
+ return expr;
76
163
  }
@@ -44,5 +44,25 @@ export type SqlPlan = {
44
44
  params: unknown[];
45
45
  limit: number;
46
46
  offset: number;
47
+ /**
48
+ * SELECT list for a GROUPED request: the group column plus one aliased
49
+ * aggregate per requested column, e.g.
50
+ * `"region", SUM("amount") AS "amount"`.
51
+ *
52
+ * Empty string for a flat/leaf query - select your own columns then.
53
+ * The aggregate is aliased back to the SOURCE column name because that is
54
+ * where the grid reads it from on the group row.
55
+ */
56
+ select: string;
57
+ /** GROUP BY body without the keyword, e.g. `"region"`. Empty when flat. */
58
+ groupBy: string;
59
+ /** GROUP BY body with the leading `GROUP BY ` keyword, or `''`. */
60
+ groupByText: string;
61
+ /**
62
+ * COUNT expression for the total, which differs between the two modes:
63
+ * grouped requests need the number of DISTINCT groups, not of rows, or the
64
+ * grid's scrollbar and paging will be sized from the wrong number.
65
+ */
66
+ countText: string;
47
67
  };
48
68
  export declare function planToSql(plan: QueryPlan, dialect?: SqlDialect): SqlPlan;
@@ -33,6 +33,28 @@ export function planToSql(plan, dialect = {}) {
33
33
  }
34
34
  const where = clauses.join(' AND ');
35
35
  const orderBy = plan.orderBy.map((o) => `${id(o.field)} ${o.desc ? 'DESC' : 'ASC'}`).join(', ');
36
+ // ---- Grouping ----------------------------------------------------------
37
+ // `plan.groupBy` is a single column: the grid asks one level at a time and
38
+ // sends the chosen path as ordinary predicates, so there is never a
39
+ // multi-column GROUP BY to emit here.
40
+ const groupBy = plan.groupBy ? id(plan.groupBy) : '';
41
+ let select = '';
42
+ if (plan.groupBy) {
43
+ const parts = [id(plan.groupBy)];
44
+ for (const agg of plan.aggregations ?? []) {
45
+ // COUNT(*) rather than COUNT(col) so the tally counts rows in the group
46
+ // rather than non-null values of one column.
47
+ const expr = agg.fn === 'count' ? 'COUNT(*)' : `${agg.fn.toUpperCase()}(${id(agg.field)})`;
48
+ // Aliased back to the source column name: that is the key the grid reads
49
+ // the aggregate from on the group row.
50
+ parts.push(`${expr} AS ${id(agg.field)}`);
51
+ }
52
+ select = parts.join(', ');
53
+ }
54
+ // A grouped total is the number of distinct keys, not of underlying rows.
55
+ const countText = plan.groupBy
56
+ ? `COUNT(DISTINCT ${id(plan.groupBy)})`
57
+ : 'COUNT(*)';
36
58
  return {
37
59
  where,
38
60
  whereText: where ? `WHERE ${where}` : '',
@@ -41,6 +63,10 @@ export function planToSql(plan, dialect = {}) {
41
63
  params,
42
64
  limit: plan.limit,
43
65
  offset: plan.offset,
66
+ select,
67
+ groupBy,
68
+ groupByText: groupBy ? `GROUP BY ${groupBy}` : '',
69
+ countText,
44
70
  };
45
71
  }
46
72
  function predicateSql(pred, ctx) {
package/dist/version.d.ts CHANGED
@@ -10,4 +10,4 @@
10
10
  *
11
11
  * `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
12
12
  */
13
- export declare const SVGRID_VERSION = "2.6.0";
13
+ export declare const SVGRID_VERSION = "2.6.2";
package/dist/version.js CHANGED
@@ -10,4 +10,4 @@
10
10
  *
11
11
  * `version.test.ts` asserts this matches `package.json`, so the two cannot drift.
12
12
  */
13
- export const SVGRID_VERSION = '2.6.0';
13
+ export const SVGRID_VERSION = '2.6.2';
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "type": "commercial",
5
5
  "url": "https://svgrid.com/pricing"
6
6
  },
7
- "version": "2.6.1",
7
+ "version": "2.6.2",
8
8
  "description": "Enterprise feature pack for SvGrid: Excel (xlsx), PDF, CSV, TSV and HTML export, Excel/CSV/JSON import, pivot tables with a drag-and-drop designer, paginated print, Kanban board and scheduler views. Requires a paid license key.",
9
9
  "license": "SEE LICENSE IN LICENSE",
10
10
  "author": "jQWidgets <sales@jqwidgets.com>",
@@ -65,7 +65,7 @@
65
65
  "jszip": "^3.10.0",
66
66
  "pdfmake": "^0.2.0",
67
67
  "svelte": "^5.0.0",
68
- "@svgrid/grid": "^2.6.1"
68
+ "@svgrid/grid": "^2.6.4"
69
69
  },
70
70
  "peerDependenciesMeta": {
71
71
  "jszip": {
@@ -83,7 +83,7 @@
83
83
  "svelte": "^5.55.5",
84
84
  "typescript": "6.0.3",
85
85
  "vite": "^8.2.1",
86
- "@svgrid/grid": "^2.6.1"
86
+ "@svgrid/grid": "^2.6.4"
87
87
  },
88
88
  "repository": {
89
89
  "type": "git",
@@ -1,7 +0,0 @@
1
- import{$ as e,D as t,H as n,I as r,K as i,L as a,M as o,P as s,R as c,U as l,W as u,X as d,Z as f,_t as p,at as m,b as h,bt as g,c as _,dt as v,et as y,f as b,g as x,it as S,k as C,m as w,mt as T,p as E,pt as D,r as O,rt as k,v as ee,vt as A,x as j,y as M}from"./disclose-version-CIm4S9xS.js";import{O as N,h as P,m as F}from"./js-scroller.svelte-tHanKJx0.js";import{n as te}from"./dismissable-2EZKoens.js";import{t as I}from"./SvListBox-BVzVfCG3.js";var ne=c(`<option> </option>`),re=c(`<input class="sv-grid-menu-condition-value" placeholder="To"/>`),ie=c(`<option> </option>`),ae=c(`<input class="sv-grid-menu-condition-value" placeholder="To"/>`),oe=c(`<input class="sv-grid-menu-condition-value"/> <!>`,1),se=c(`<div class="sv-grid-menu-join" role="radiogroup" aria-label="Combine conditions"><button type="button">AND</button> <button type="button">OR</button> <button type="button" class="sv-grid-menu-join-x" title="Remove second condition" aria-label="Remove second condition">×</button></div> <select class="sv-grid-menu-operator-select" aria-label="Second filter condition"></select> <!>`,1),ce=c(`<button type="button" class="sv-grid-menu-add-cond">+ Add condition</button>`),le=c(`<input class="sv-grid-menu-condition-value"/> <!> <!>`,1),ue=c(`<div class="sv-grid-facet-empty">No values</div>`),de=c(`<div class="sv-grid-facet-note"> </div>`),fe=c(`<div class="sv-grid-menu-filter"><div class="sv-grid-menu-filter-head"><span class="sv-grid-header-icon"><!></span> Filter
2
- condition</div> <select class="sv-grid-menu-operator-select" aria-label="Filter condition"></select> <!> <div class="sv-grid-menu-sep"></div> <div class="sv-grid-menu-filter-head">Values</div> <input class="sv-grid-menu-search" placeholder="Search values..."/> <label class="sv-grid-facet sv-grid-facet-all"><input type="checkbox"/> <span class="sv-grid-facet-label">(Select all)</span></label> <!> <!> <div class="sv-grid-menu-actions"><button type="button" class="sv-grid-menu-btn">Clear filter</button> <button type="button" class="sv-grid-menu-btn sv-grid-menu-btn-primary">Done</button></div></div>`),pe=c(`<div role="tooltip"> </div>`),me=c(`<div class="sv-grid-menu-backdrop" role="presentation"></div>`),L=c(`<button type="button" role="tab">Filter</button>`),R=c(`<div class="sv-grid-menu-tabs" role="tablist"><button type="button" role="tab">General</button> <!> <button type="button" role="tab">Columns</button></div>`),z=c(`<div class="sv-grid-menu-filter-head">Visible columns</div> <!>`,1),he=c(`<button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Sort
3
- ascending</button> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Sort
4
- descending</button> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Remove sort</button>`,1),ge=c(`<div class="sv-grid-menu-sep"></div> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Pin to left</button> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Pin to right</button> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Unpin column</button>`,1),_e=c(`<div class="sv-grid-menu-sep"></div> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Group
5
- by this column</button> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Remove grouping</button>`,1),B=c(`<button type="button" role="menuitem" aria-haspopup="menu"><span class="sv-grid-header-icon"><!></span> Choose columns <span class="sv-grid-header-icon sv-grid-menu-item-chevron"><!></span></button>`),ve=c(`<!> <!> <div class="sv-grid-menu-sep"></div> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Autosize
6
- this column</button> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Autosize
7
- all columns</button> <!> <div class="sv-grid-menu-sep"></div> <!> <button type="button" class="sv-grid-menu-item" role="menuitem"><span class="sv-grid-header-icon"><!></span> Reset columns</button>`,1),ye=c(`<div class="sv-grid-menu sv-grid-column-menu" role="menu"><!> <!></div>`),V=c(`<div class="sv-grid-menu sv-grid-filter-menu" role="menu"><!></div>`),be=c(`<div class="sv-grid-menu sv-grid-choose-columns-menu" role="menu"><div class="sv-grid-menu-filter-head">Visible columns</div> <!></div>`),xe=c(`<button type="button" class="sv-grid-menu-item" role="menuitemradio"><span class="sv-grid-header-icon"><!></span> </button>`),Se=c(`<div class="sv-grid-menu sv-grid-operator-menu" role="menu"></div>`),Ce=c(`<div class="sv-grid-facet-empty">No values</div>`),we=c(`<div class="sv-grid-menu sv-grid-in-suggest"><!></div>`),Te=c(`<div class="sv-grid-menu-sep"></div>`),Ee=c(`<button type="button" class="sv-grid-menu-item" role="menuitem"> </button>`),De=c(`<div class="sv-grid-menu-backdrop" role="presentation"></div> <div class="sv-grid-menu sv-grid-context-menu" role="menu"></div>`,1),Oe=c(`<div class="sv-grid-menu-backdrop" role="presentation"></div> <div class="sv-grid-menu sv-grid-comment-editor" role="dialog" aria-label="Edit comment"><textarea class="sv-grid-comment-textarea" rows="3" placeholder="Add a comment…"></textarea> <div class="sv-grid-comment-actions"><button type="button" class="sv-grid-comment-remove">Remove</button> <span class="sv-grid-comment-spacer"></span> <button type="button" class="sv-grid-comment-cancel">Cancel</button> <button type="button" class="sv-grid-comment-save">Save</button></div></div>`,1),ke=c(`<!> <!> <!> <!> <!> <!> <!> <!> <!>`,1);function Ae(n,c){T(c,!0);let Ae=(e,n=g)=>{let a=v(()=>i(X).find(e=>e.id===n())),f=v(()=>i(qe)(i(a))),h=v(()=>i(U)[n()]?.operator??i(Z)(i(a))),y=v(()=>N(i(a)?.columnDef.editorType??`text`));var T=fe(),D=k(T),O=k(D),P=k(O);t(P,()=>c.icon,()=>`filter`),A(O),p(),A(D);var F=m(D,2);C(F,21,()=>i(f),e=>e.value,(e,t)=>{var n=ne(),o=k(n,!0);A(n);var c={};d(e=>{s(o,e),c!==(c=i(t).value)&&(n.value=(n.__value=i(t).value)??``)},[()=>i(Je)(i(t),i(a))]),r(e,n)}),A(F);var te;ee(F);var pe=m(F,2),me=e=>{let t=v(()=>i(h)===`in`||i(h)===`notIn`),c=v(()=>i(U)[n()]);var p=le(),g=S(p);b(g);var _=m(g,2),w=e=>{var t=re();b(t),d(()=>{E(t,`type`,i(y)),x(t,i(U)[n()]?.valueTo??``)}),l(`input`,t,e=>i(Ke)(n(),e.currentTarget.value)),r(e,t)};o(_,e=>{i(h)===`between`&&e(w)});var T=m(_,2),D=e=>{let t=v(()=>i(c).operator2??i(Z)(i(a)));var u=se(),p=S(u),h=k(p);let g;var _=m(h,2);let w;var T=m(_,2);A(p);var D=m(p,2);C(D,21,()=>i(f),e=>e.value,(e,t)=>{var n=ie(),o=k(n,!0);A(n);var c={};d(e=>{s(o,e),c!==(c=i(t).value)&&(n.value=(n.__value=i(t).value)??``)},[()=>i(Je)(i(t),i(a))]),r(e,n)}),A(D);var O;ee(D);var N=m(D,2),P=e=>{var a=oe(),s=S(a);b(s);var u=m(s,2),f=e=>{var t=ae();b(t),d(()=>{E(t,`type`,i(y)),x(t,i(c).valueTo2??``)}),l(`input`,t,e=>Q(n(),{valueTo2:e.currentTarget.value})),r(e,t)};o(u,e=>{i(t)===`between`&&e(f)}),d(()=>{E(s,`type`,i(y)),x(s,i(c).value2??``),E(s,`placeholder`,i(t)===`between`?`From`:`Filter value...`)}),l(`input`,s,e=>Q(n(),{value2:e.currentTarget.value})),r(e,a)};o(N,e=>{i(t)!==`isBlank`&&e(P)}),d(()=>{g=j(h,1,``,null,g,{"is-on":(i(c).join??`AND`)===`AND`}),w=j(_,1,``,null,w,{"is-on":i(c).join===`OR`}),O!==(O=i(t))&&(D.value=(D.__value=i(t))??``,M(D,i(t)))}),l(`click`,h,()=>Q(n(),{join:`AND`})),l(`click`,_,()=>Q(n(),{join:`OR`})),l(`click`,T,()=>Q(n(),{operator2:void 0,value2:void 0,valueTo2:void 0,join:void 0})),l(`change`,D,e=>Q(n(),{operator2:e.currentTarget.value})),r(e,u)},O=e=>{var t=ce();l(`click`,t,()=>Q(n(),{operator2:i(Z)(i(a)),value2:``,join:`AND`})),r(e,t)};o(T,e=>{i(c)?.operator2?e(D):e(O,-1)}),d(()=>{E(g,`type`,i(h)===`regex`?`text`:i(y)),x(g,i(U)[n()]?.value??``),E(g,`placeholder`,i(h)===`between`?`From`:i(t)?`value, value...`:i(h)===`regex`?`Pattern...`:`Filter value...`)}),u(`focus`,g,function(...e){(i(t)?e=>yt(e.currentTarget,n()):void 0)?.apply(this,e)}),u(`blur`,g,function(...e){(i(t)?()=>i(ht)():void 0)?.apply(this,e)}),l(`input`,g,e=>{let r=e.currentTarget;i(Ge)(n(),r.value),i(t)&&bt(r,n())}),r(e,p)};o(pe,e=>{i(h)!==`isBlank`&&i(h)!==`isNotBlank`&&e(me)});var L=m(pe,6);b(L);var R=m(L,2),z=k(R);b(z),p(2),A(R);var he=m(R,2),ge=e=>{{let t=v(()=>i(lt).length>vt);I(e,{block:!0,checkbox:!0,multiple:!0,get virtual(){return i(t)},rows:7,rowHeight:24,size:`sm`,ariaLabel:`Filter values`,get options(){return i(lt)},get value(){return i(ut)},onChange:e=>i(dt)(n(),e)})}},_e=e=>{var t=ue();r(e,t)};o(he,e=>{i(lt).length?e(ge):e(_e,-1)});var B=m(he,2),ve=e=>{var t=de(),n=k(t);A(t),d(()=>s(n,`Showing ${i(ct).length??``} of ${i(st).length??``}`)),r(e,t)};o(B,e=>{i(st).length>i(ct).length&&e(ve)});var ye=m(B,2),V=k(ye),be=m(V,2);A(ye),A(T),d((e,t)=>{te!==(te=i(h))&&(F.value=(F.__value=i(h))??``,M(F,i(h))),w(z,e),V.disabled=t},[()=>i(gt)(n()),()=>!i(Qe)(n())]),l(`change`,F,e=>i(We)(n(),e.currentTarget.value)),_(L,()=>H().columnMenuSearch,e=>H().columnMenuSearch=e),l(`change`,z,()=>i(_t)(n())),l(`click`,V,()=>i(wt)(n())),l(`click`,be,function(...e){i($)?.apply(this,e)}),r(e,T)},H=O(c,`ctrl`,7),je=v(()=>H().groupingControlsEnabled),U=v(()=>H().filterMenuValues),W=v(()=>H().tooltip),G=v(()=>H().columnMenuFor),Me=v(()=>H().columnMenuPos),K=v(()=>H().filterMenuFor),Ne=v(()=>H().filterMenuPos),q=v(()=>H().operatorMenuFor),Pe=v(()=>H().operatorMenuPos),J=v(()=>H().chooseColumnsPos),Fe=v(()=>H().showColumnFiltersEffective),Y=v(()=>H().props.columnMenuTabs===!0),Ie=v(()=>H().grid),X=v(()=>H().allColumns),Le=v(()=>H().isColumnPinned),Re=v(()=>H().pinColumnLeft),ze=v(()=>H().pinColumnRight),Be=v(()=>H().unpinColumn),Ve=v(()=>H().sortDirectionByColumn),He=v(()=>H().groupingColumns),Ue=v(()=>H().columnVirtualizationEnabled),We=v(()=>H().updateFilterOperator),Ge=v(()=>H().updateFilterMenuValue),Ke=v(()=>H().updateFilterMenuValueTo),qe=v(()=>H().operatorsForColumn),Z=v(()=>H().defaultOperatorFor),Je=v(()=>H().operatorLabelFor),Ye=v(()=>H().filterRowValues),Xe=v(()=>H().inSuggestFor),Ze=v(()=>H().inSuggestPos);function Q(e,t){let n=i(X).find(t=>t.id===e),r=H().filterMenuValues[e]??{operator:i(Z)(n),value:``};H().filterMenuValues={...H().filterMenuValues,[e]:{...r,...t}}}let Qe=v(()=>H().isColumnFiltered),$=v(()=>H().closeMenus);f(()=>{if(!(i(G)||i(K)||i(q)||i(J)))return;let e=()=>i($)(),t=te(()=>Array.from(document.querySelectorAll(`.sv-grid-menu`)),e);return window.addEventListener(`resize`,e),()=>{t(),window.removeEventListener(`resize`,e)}});let $e=v(()=>H().autosizeColumn),et=v(()=>H().autosizeAllColumns),tt=v(()=>H().resetColumns),nt=v(()=>H().openChooseColumns),rt=v(()=>H().sortColumnFromMenu),it=v(()=>H().clearColumnSort),at=v(()=>H().groupByColumnFromMenu),ot=v(()=>H().clearGroupingFromMenu),st=v(()=>H().columnMenuFacetValues),ct=v(()=>H().columnMenuVisibleFacets),lt=v(()=>H().columnMenuFacetOptions),ut=v(()=>H().columnMenuSelectedFacets),dt=v(()=>H().setFacetSelection),ft=v(()=>H().setFilterTokens),pt=v(()=>H().inSuggestOptions),mt=v(()=>H().openInSuggest),ht=v(()=>H().closeInSuggest),gt=v(()=>H().isAllFacetsChecked),_t=v(()=>H().toggleAllFacets),vt=40;function yt(e,t){i(mt)(e,t),H().inSuggestQuery=P(e.value)}function bt(e,t){H().inSuggestQuery=P(e.value),H().inSuggestFor!==t&&i(mt)(e,t)}function xt(e){return e.map(e=>({value:e.id,label:typeof e.columnDef.header==`string`?e.columnDef.header:e.id}))}function St(e){let t=new Set;for(let n of e)H().hiddenColumns[n.id]||t.add(n.id);return t}function Ct(e,t){let n={...H().hiddenColumns};for(let r of e)t.has(r.id)?delete n[r.id]:n[r.id]=!0;H().hiddenColumns=n}let wt=v(()=>H().clearColumnFilter),Tt=v(()=>H().contextMenuFor),Et=v(()=>H().contextMenuPos),Dt=v(()=>H().contextMenuItems),Ot=v(()=>H().closeContextMenu),kt=v(()=>H().commentEditFor),At=v(()=>H().saveComment),jt=v(()=>H().removeComment),Mt=v(()=>H().closeCommentEditor);var Nt=ke(),Pt=S(Nt),Ft=e=>{var t=pe();let n;var a=k(t,!0);A(t),d(()=>{n=j(t,1,`sv-grid-tooltip`,null,n,{"sv-grid-tooltip-above":!i(W).below}),h(t,`left: ${i(W).x}px; top: ${i(W).y}px; ${i(W).below?``:`transform: translateY(-100%);`}`),s(a,i(W).text)}),r(e,t)};o(Pt,e=>{i(W)&&e(Ft)});var It=m(Pt,2),Lt=e=>{var t=me();l(`click`,t,function(...e){i($)?.apply(this,e)}),r(e,t)};o(It,e=>{(i(G)||i(K)||i(q)||i(J))&&e(Lt)});var Rt=m(It,2),zt=e=>{let n=v(()=>i(G)),a=v(()=>i(X).find(e=>e.id===i(n))),s=v(()=>i(a)?.getCanSort?.()??!1),u=v(()=>i(a)?.columnDef.field!=null&&i(a)?.columnDef.filterable!==!1),f=v(()=>H().columnMenuTab);var g=ye(),_=k(g),y=e=>{var t=R(),n=k(t);let a;var s=m(n,2),c=e=>{var t=L();let n;d(()=>{n=j(t,1,`sv-grid-menu-tab`,null,n,{"is-active":i(f)===`filter`}),E(t,`aria-selected`,i(f)===`filter`)}),l(`click`,t,()=>H().columnMenuTab=`filter`),r(e,t)};o(s,e=>{i(u)&&i(Fe)&&e(c)});var p=m(s,2);let h;A(t),d(()=>{a=j(n,1,`sv-grid-menu-tab`,null,a,{"is-active":i(f)===`general`}),E(n,`aria-selected`,i(f)===`general`),h=j(p,1,`sv-grid-menu-tab`,null,h,{"is-active":i(f)===`columns`}),E(p,`aria-selected`,i(f)===`columns`)}),l(`click`,n,()=>H().columnMenuTab=`general`),l(`click`,p,()=>H().columnMenuTab=`columns`),r(e,t)};o(_,e=>{i(Y)&&e(y)});var b=m(_,2),x=e=>{Ae(e,()=>i(n))},C=e=>{let t=v(()=>i(Ie).getAllColumns());var n=z(),a=m(S(n),2);{let e=v(()=>i(t).length>40),n=v(()=>xt(i(t))),r=v(()=>St(i(t)));I(a,{block:!0,checkbox:!0,multiple:!0,get virtual(){return i(e)},rows:9,rowHeight:24,size:`sm`,ariaLabel:`Visible columns`,get options(){return i(n)},get value(){return i(r)},onChange:e=>Ct(i(t),e)})}r(e,n)},w=e=>{var a=ve(),u=S(a),f=e=>{var a=he(),o=S(a),s=k(o),u=k(s);t(u,()=>c.icon,()=>`sort-asc`),A(s),p(),A(o);var f=m(o,2),h=k(f),g=k(h);t(g,()=>c.icon,()=>`sort-desc`),A(h),p(),A(f);var _=m(f,2),v=k(_),y=k(v);t(y,()=>c.icon,()=>`x`),A(v),p(),A(_),d(()=>_.disabled=!i(Ve)[i(n)]),l(`click`,o,()=>i(rt)(i(n),!1)),l(`click`,f,()=>i(rt)(i(n),!0)),l(`click`,_,()=>i(it)(i(n))),r(e,a)};o(u,e=>{i(s)&&e(f)});var h=m(u,2),g=e=>{let a=v(()=>i(Le)(i(n)));var o=ge(),s=m(S(o),2),u=k(s),f=k(u);t(f,()=>c.icon,()=>`op-startsWith`),A(u),p(),A(s);var h=m(s,2),g=k(h),_=k(g);t(_,()=>c.icon,()=>`op-greaterThan`),A(g),p(),A(h);var y=m(h,2),b=k(y),x=k(b);t(x,()=>c.icon,()=>`x`),A(b),p(),A(y),d(()=>{s.disabled=i(a)===`left`,h.disabled=i(a)===`right`,y.disabled=!i(a)}),l(`click`,s,()=>i(Re)(i(n))),l(`click`,h,()=>i(ze)(i(n))),l(`click`,y,()=>i(Be)(i(n))),r(e,o)};o(h,e=>{i(Ue)||e(g)});var _=m(h,4),y=k(_),b=k(y);t(b,()=>c.icon,()=>`autosize`),A(y),p(),A(_);var x=m(_,2),C=k(x),w=k(C);t(w,()=>c.icon,()=>`autosize`),A(C),p(),A(x);var T=m(x,2),D=e=>{var a=_e(),o=m(S(a),2),s=k(o),u=k(s);t(u,()=>c.icon,()=>`group`),A(s),p(),A(o);var f=m(o,2),h=k(f),g=k(h);t(g,()=>c.icon,()=>`x`),A(h),p(),A(f),d((e,t)=>{o.disabled=e,f.disabled=t},[()=>i(He).includes(i(n)),()=>!i(He).includes(i(n))]),l(`click`,o,()=>i(at)(i(n))),l(`click`,f,()=>i(ot)(i(n))),r(e,a)};o(T,e=>{i(je)&&e(D)});var O=m(T,4),ee=e=>{var n=B();let a;var o=k(n),s=k(o);t(s,()=>c.icon,()=>`columns`),A(o);var u=m(o,2),f=k(u);t(f,()=>c.icon,()=>`chevron-down`),A(u),A(n),d(()=>{a=j(n,1,`sv-grid-menu-item`,null,a,{"is-open":i(J)!==null}),E(n,`aria-expanded`,i(J)!==null)}),l(`click`,n,e=>i(nt)(e)),r(e,n)};o(O,e=>{i(Y)||e(ee)});var M=m(O,2),N=k(M),P=k(N);t(P,()=>c.icon,()=>`reset`),A(N),p(),A(M),l(`click`,_,()=>{i($e)(i(n)),i($)()}),l(`click`,x,()=>{i(et)(),i($)()}),l(`click`,M,()=>{i(tt)(),i($)()}),r(e,a)};o(b,e=>{i(Y)&&i(f)===`filter`&&i(u)&&i(Fe)?e(x):i(Y)&&i(f)===`columns`?e(C,1):e(w,-1)}),A(g),d(()=>h(g,`left: ${i(Me).x}px; top: ${i(Me).y}px; max-height: calc(100vh - ${i(Me).y}px - 12px);`)),r(e,g)};o(Rt,e=>{i(G)&&e(zt)});var Bt=m(Rt,2),Vt=e=>{var t=V(),n=k(t);Ae(n,()=>i(K)),A(t),d(()=>h(t,`left: ${i(Ne).x}px; top: ${i(Ne).y}px; max-height: calc(100vh - ${i(Ne).y}px - 12px);`)),r(e,t)};o(Bt,e=>{i(K)&&i(Fe)&&e(Vt)});var Ht=m(Bt,2),Ut=e=>{let t=v(()=>i(Ie).getAllColumns());var n=be(),a=m(k(n),2);{let e=v(()=>i(t).length>40),n=v(()=>xt(i(t))),r=v(()=>St(i(t)));I(a,{block:!0,checkbox:!0,multiple:!0,get virtual(){return i(e)},rows:11,rowHeight:24,size:`sm`,ariaLabel:`Visible columns`,get options(){return i(n)},get value(){return i(r)},onChange:e=>Ct(i(t),e)})}A(n),d(()=>h(n,`left: ${i(J).x}px; top: ${i(J).y}px;`)),r(e,n)};o(Ht,e=>{i(J)&&e(Ut)});var Wt=m(Ht,2),Gt=e=>{let n=v(()=>i(q)),a=v(()=>i(X).find(e=>e.id===i(n))),o=v(()=>i(qe)(i(a))),u=v(()=>i(U)[i(n)]?.operator??i(Z)(i(a)));var f=Se();C(f,21,()=>i(o),e=>e.value,(e,o)=>{var f=xe(),p=k(f),h=k(p);t(h,()=>c.icon,()=>i(o).iconName),A(p);var g=m(p);A(f),d(e=>{E(f,`aria-checked`,i(u)===i(o).value),s(g,` ${e??``}`)},[()=>i(Je)(i(o),i(a))]),l(`click`,f,()=>{i(We)(i(n),i(o).value),i($)()}),r(e,f)}),A(f),d(()=>h(f,`left: ${i(Pe).x}px; top: ${i(Pe).y}px;`)),r(e,f)};o(Wt,e=>{i(q)&&e(Gt)});var Kt=m(Wt,2),qt=e=>{let t=v(()=>i(Xe)),n=v(()=>new Set(F(i(Ye)[i(t)]??``)));var a=we(),s=k(a),c=e=>{{let r=v(()=>i(pt).length>40);I(e,{block:!0,checkbox:!0,multiple:!0,get virtual(){return i(r)},rows:8,rowHeight:26,size:`sm`,ariaLabel:`Filter values`,get options(){return i(pt)},get value(){return i(n)},onChange:e=>{let n=new Set(e),r=P(i(Ye)[i(t)]??``);r&&n.delete(r),i(ft)(i(t),[...n]),H().inSuggestQuery=``}})}},u=e=>{var t=Ce();r(e,t)};o(s,e=>{i(pt).length?e(c):e(u,-1)}),A(a),d(()=>h(a,`left: ${i(Ze).x}px; top: ${i(Ze).y}px;`)),l(`mousedown`,a,e=>e.preventDefault()),r(e,a)};o(Kt,e=>{i(Xe)&&e(qt)});var Jt=m(Kt,2),Yt=e=>{var t=De(),n=S(t),c=m(n,2);C(c,21,()=>i(Dt)(),e=>e.key,(e,t)=>{var n=a(),c=S(n),u=e=>{var t=Te();r(e,t)},f=e=>{var n=Ee(),a=k(n,!0);A(n),d(()=>{n.disabled=i(t).disabled,s(a,i(t).label)}),l(`click`,n,()=>{i(t).run?.(),i(Ot)()}),r(e,n)};o(c,e=>{i(t).separator?e(u):e(f,-1)}),r(e,n)}),A(c),d(()=>h(c,`left: ${i(Et).x}px; top: ${i(Et).y}px;`)),l(`contextmenu`,n,e=>{e.preventDefault(),i(Ot)()}),l(`click`,n,function(...e){i(Ot)?.apply(this,e)}),r(e,t)};o(Jt,e=>{i(Tt)&&e(Yt)});var Xt=m(Jt,2),Zt=t=>{var n=Oe(),a=S(n),o=m(a,2),s=k(o);y(s),e(s,!0);var c=m(s,2),u=k(c),f=m(u,4),p=m(f,2);A(c),A(o),d(()=>h(o,`left: ${i(kt).x}px; top: ${i(kt).y}px;`)),l(`click`,a,function(...e){i(Mt)?.apply(this,e)}),l(`keydown`,s,e=>{e.stopPropagation(),e.key===`Escape`&&(e.preventDefault(),i(Mt)()),e.key===`Enter`&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),i(At)())}),_(s,()=>H().commentDraft,e=>H().commentDraft=e),l(`click`,u,function(...e){i(jt)?.apply(this,e)}),l(`click`,f,function(...e){i(Mt)?.apply(this,e)}),l(`click`,p,function(...e){i(At)?.apply(this,e)}),r(t,n)};o(Xt,e=>{i(kt)&&e(Zt)}),r(n,Nt),D()}n([`change`,`input`,`click`,`mousedown`,`contextmenu`,`keydown`]);export{Ae as default};