@platforma-sdk/ui-vue 1.64.0 → 1.65.0

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 (63) hide show
  1. package/.turbo/turbo-build.log +24 -24
  2. package/.turbo/turbo-formatter$colon$check.log +2 -2
  3. package/.turbo/turbo-linter$colon$check.log +2 -2
  4. package/.turbo/turbo-types$colon$check.log +1 -1
  5. package/CHANGELOG.md +12 -0
  6. package/dist/components/PlAdvancedFilter/FilterEditor.js.map +1 -1
  7. package/dist/components/PlAdvancedFilter/FilterEditor.style.js.map +1 -1
  8. package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts +3 -8
  9. package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts.map +1 -1
  10. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +164 -151
  11. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
  12. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.js.map +1 -1
  13. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js +8 -7
  14. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.style.js.map +1 -1
  15. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.css +1 -1
  16. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts +24 -8
  17. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts.map +1 -1
  18. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +176 -110
  19. package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -1
  20. package/dist/components/PlAdvancedFilter/types.d.ts +2 -0
  21. package/dist/components/PlAdvancedFilter/types.d.ts.map +1 -1
  22. package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
  23. package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
  24. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
  25. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +116 -109
  26. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  27. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +6 -5
  28. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  29. package/dist/components/PlAgDataTable/sources/table-source-v2.js +26 -26
  30. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  31. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts +6 -3
  32. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
  33. package/dist/components/PlAgDataTable/sources/table-state-v2.js +182 -97
  34. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  35. package/dist/components/PlAnnotations/components/FilterSidebar.js.map +1 -1
  36. package/dist/components/PlAnnotations/components/FilterSidebar.style.js.map +1 -1
  37. package/dist/components/PlAnnotations/components/FilterSidebar.vue.d.ts.map +1 -1
  38. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +7 -4
  39. package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js.map +1 -1
  40. package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
  41. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js +5 -1
  42. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
  43. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.css +1 -1
  44. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts +7 -9
  45. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
  46. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +73 -42
  47. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +2 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/util/helpers/dist/functions.js.map +1 -1
  52. package/dist/lib/util/helpers/dist/objects.js +4 -1
  53. package/dist/lib/util/helpers/dist/objects.js.map +1 -1
  54. package/package.json +7 -6
  55. package/src/components/PlAdvancedFilter/FilterEditor.vue +99 -55
  56. package/src/components/PlAdvancedFilter/PlAdvancedFilter.vue +163 -95
  57. package/src/components/PlAdvancedFilter/types.ts +6 -1
  58. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +24 -6
  59. package/src/components/PlAgDataTable/sources/table-source-v2.ts +11 -9
  60. package/src/components/PlAgDataTable/sources/table-state-v2.ts +249 -64
  61. package/src/components/PlAnnotations/components/FilterSidebar.vue +3 -2
  62. package/src/components/PlTableFilters/PlTableFiltersV2.vue +75 -21
  63. package/src/index.ts +4 -0
@@ -1,13 +1,14 @@
1
1
  import { DEFAULT_FILTERS as e, DEFAULT_FILTER_TYPE as t } from "./constants.js";
2
2
  import n from "./OperandButton.js";
3
3
  import { getFilterInfo as r, getNormalizedSpec as i, isNumericFilter as a, isPositionFilter as o } from "./utils.js";
4
- import { Fragment as s, computed as c, createBlock as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createVNode as p, defineComponent as m, mergeModels as h, normalizeClass as g, openBlock as _, renderList as v, toDisplayString as y, unref as b, useModel as x } from "vue";
5
- import { isFilteredPColumn as S, parseColumnId as C, stringifyColumnId as w } from "@platforma-sdk/model";
6
- import { PlAutocomplete as T, PlAutocompleteMulti as E, PlDropdown as D, PlIcon16 as O, PlNumberField as k, PlTextField as A, PlToggleSwitch as j, Slider as M } from "@milaboratories/uikit";
4
+ import { Fragment as s, computed as c, createBlock as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createVNode as p, defineComponent as m, normalizeClass as h, openBlock as g, renderList as _, toDisplayString as v, unref as y } from "vue";
5
+ import { isFilteredPColumn as b, parseColumnId as x, stringifyColumnId as S } from "@platforma-sdk/model";
6
+ import { PlAutocomplete as C, PlAutocompleteMulti as w, PlDropdown as T, PlIcon16 as E, PlNumberField as D, PlTextField as O, PlToggleSwitch as k, Slider as A } from "@milaboratories/uikit";
7
7
  //#region src/components/PlAdvancedFilter/FilterEditor.vue?vue&type=script&setup=true&lang.ts
8
- var N = ["title"], P = /* @__PURE__ */ m({
8
+ var j = ["title"], M = /* @__PURE__ */ m({
9
9
  __name: "FilterEditor",
10
- props: /* @__PURE__ */ h({
10
+ props: {
11
+ filter: {},
11
12
  isLast: { type: Boolean },
12
13
  operand: {},
13
14
  enableDnd: { type: Boolean },
@@ -15,64 +16,73 @@ var N = ["title"], P = /* @__PURE__ */ m({
15
16
  supportedFilters: {},
16
17
  getSuggestOptions: { type: Function },
17
18
  onDelete: { type: Function },
19
+ onUpdateFilter: { type: Function },
18
20
  onChangeOperand: { type: Function }
19
- }, {
20
- filter: { required: !0 },
21
- filterModifiers: {}
22
- }),
23
- emits: ["update:filter"],
21
+ },
24
22
  setup(m) {
25
- let h = x(m, "filter"), P = m;
26
- async function F(e, t, n, r) {
27
- return P.getSuggestOptions({
23
+ let M = m;
24
+ function N(e, t) {
25
+ M.onUpdateFilter({
26
+ ...M.filter,
27
+ [e]: t
28
+ });
29
+ }
30
+ async function P(e, t, n, r) {
31
+ return M.getSuggestOptions({
28
32
  columnId: e,
29
33
  axisIdx: r,
30
34
  searchType: t,
31
35
  searchStr: n
32
36
  });
33
37
  }
34
- async function I(e, t, n, r) {
35
- if (t === "label" && typeof n == "string") return F(e, t, n, r);
36
- if (t === "value" && Array.isArray(n)) return (await Promise.all(n.map((n) => F(e, t, n, r)))).map((e) => e[0]);
38
+ async function F(e, t, n, r) {
39
+ if (t === "label" && typeof n == "string") return P(e, t, n, r);
40
+ if (t === "value" && Array.isArray(n)) return (await Promise.all(n.map((n) => P(e, t, n, r)))).map((e) => e[0]);
37
41
  throw Error("Invalid arguments combination");
38
42
  }
39
- function L() {
40
- let t = e[h.value.type];
41
- h.value = Object.entries(t).reduce((e, [t, n]) => (e[t] = h.value[t] ?? n, e), {});
43
+ function I(t) {
44
+ let n = e[t];
45
+ M.onUpdateFilter(Object.entries(n).reduce((e, [t, n]) => (e[t] = M.filter[t] ?? n, e), {
46
+ ...M.filter,
47
+ type: t
48
+ }));
42
49
  }
43
- function R(n) {
50
+ function L(n) {
44
51
  if (!n) return;
45
- let a = P.columnOptions.find((e) => e.id === V(n));
52
+ let a = M.columnOptions.find((e) => e.id === B(n));
46
53
  if (!a) return;
47
- let o = r(h.value.type), s = i(a?.spec);
48
- o.supportedFor(s) ? h.value.column = n : h.value = {
54
+ let o = r(M.filter.type), s = i(a?.spec);
55
+ o.supportedFor(s) ? M.onUpdateFilter({
56
+ ...M.filter,
57
+ column: n
58
+ }) : M.onUpdateFilter({
49
59
  ...e[t],
50
60
  column: n
51
- };
61
+ });
52
62
  }
53
- let z = c(() => P.columnOptions.find((e) => e.id === V(h.value.column)) === void 0), B = c(() => {
54
- let e = P.columnOptions.map((e) => ({
63
+ let R = c(() => M.columnOptions.find((e) => e.id === B(M.filter.column)) === void 0), z = c(() => {
64
+ let e = M.columnOptions.map((e) => ({
55
65
  value: e.id,
56
66
  label: e.label ?? e
57
67
  }));
58
- return z.value && e.unshift({
59
- value: h.value.column,
68
+ return R.value && e.unshift({
69
+ value: M.filter.column,
60
70
  label: "Inconsistent value"
61
71
  }), e;
62
72
  });
63
- function V(e) {
73
+ function B(e) {
64
74
  try {
65
- let t = C(e);
66
- return S(t) ? w(t.source) : e;
75
+ let t = x(e);
76
+ return b(t) ? S(t.source) : e;
67
77
  } catch {
68
78
  return e;
69
79
  }
70
80
  }
71
- function H(e) {
72
- let t = V(e), n = (P.columnOptions.find((e) => e.id === t)?.axesToBeFixed ?? []).reduce((e, t) => (e[t.idx] = void 0, e), {});
81
+ function V(e) {
82
+ let t = B(e), n = (M.columnOptions.find((e) => e.id === t)?.axesToBeFixed ?? []).reduce((e, t) => (e[t.idx] = void 0, e), {});
73
83
  try {
74
- let r = C(e);
75
- if (S(r)) return {
84
+ let r = x(e);
85
+ if (b(r)) return {
76
86
  source: t,
77
87
  axisFiltersByIndex: r.axisFilters.reduce((e, t) => (e[t[0]] = t[1], e), n)
78
88
  };
@@ -87,203 +97,206 @@ var N = ["title"], P = /* @__PURE__ */ m({
87
97
  axisFiltersByIndex: n
88
98
  };
89
99
  }
90
- function U(e) {
91
- return Object.keys(e.axisFiltersByIndex).length === 0 ? e.source : w({
92
- source: C(e.source),
100
+ function H(e) {
101
+ return Object.keys(e.axisFiltersByIndex).length === 0 ? e.source : S({
102
+ source: x(e.source),
93
103
  axisFilters: Object.entries(e.axisFiltersByIndex).map(([e, t]) => [Number(e), t])
94
104
  });
95
105
  }
96
- let W = c({
97
- get: () => H(h.value.column),
106
+ let U = c({
107
+ get: () => V(M.filter.column),
98
108
  set: (e) => {
99
- h.value.column = U(e);
109
+ M.onUpdateFilter({
110
+ ...M.filter,
111
+ column: H(e)
112
+ });
100
113
  }
101
114
  });
102
- function G(e, t) {
103
- W.value = {
104
- ...W.value,
115
+ function W(e, t) {
116
+ U.value = {
117
+ ...U.value,
105
118
  axisFiltersByIndex: {
106
- ...W.value.axisFiltersByIndex,
119
+ ...U.value.axisFiltersByIndex,
107
120
  [e]: t
108
121
  }
109
122
  };
110
123
  }
111
- let K = c(() => P.columnOptions.find((e) => e.id === W.value.source)), q = c(() => K.value?.spec ? i(K.value.spec) : null), J = c(() => q.value?.valueType), Y = c(() => !!K.value?.error || z.value), X = c(() => P.supportedFilters.filter((e) => h.value.type === e || (q.value ? r(e).supportedFor(q.value) : !0)).map((e) => ({
124
+ let G = c(() => M.columnOptions.find((e) => e.id === U.value.source)), K = c(() => G.value?.spec ? i(G.value.spec) : null), q = c(() => K.value?.valueType), J = c(() => !!G.value?.error || R.value), Y = c(() => M.supportedFilters.filter((e) => M.filter.type === e || (K.value ? r(e).supportedFor(K.value) : !0)).map((e) => ({
112
125
  value: e,
113
126
  label: r(e).label
114
- }))), Z = c(() => h.value.type === "patternFuzzyContainSubsequence" ? K.value?.alphabet === "nucleotide" ? [{
127
+ }))), X = c(() => M.filter.type === "patternFuzzyContainSubsequence" ? G.value?.alphabet === "nucleotide" ? [{
115
128
  label: "N",
116
129
  value: "N"
117
- }] : K.value?.alphabet === "aminoacid" ? [{
130
+ }] : G.value?.alphabet === "aminoacid" ? [{
118
131
  label: "X",
119
132
  value: "X"
120
- }] : [...new Set(h.value.value.split(""))].sort().map((e) => ({
133
+ }] : [...new Set(M.filter.value.split(""))].sort().map((e) => ({
121
134
  value: e,
122
135
  label: e
123
- })) : []), Q = c(() => {
124
- if (h.value.type !== "patternMatchesRegularExpression") return !1;
136
+ })) : []), Z = c(() => {
137
+ if (M.filter.type !== "patternMatchesRegularExpression") return !1;
125
138
  try {
126
- return new RegExp(h.value.value), !1;
139
+ return new RegExp(M.filter.value), !1;
127
140
  } catch {
128
141
  return !0;
129
142
  }
130
143
  });
131
- return (e, t) => (_(), d(s, null, [f("div", { class: g(e.$style.filterWrapper) }, [
132
- m.enableDnd ? (_(), d("div", {
144
+ return (e, t) => (g(), d(s, null, [f("div", { class: h(e.$style.filterWrapper) }, [
145
+ m.enableDnd ? (g(), d("div", {
133
146
  key: 0,
134
- class: g([
147
+ class: h([
135
148
  e.$style.top,
136
149
  e.$style.columnChip,
137
- { [e.$style.error]: Y.value }
150
+ { [e.$style.error]: J.value }
138
151
  ])
139
152
  }, [
140
- f("div", { class: g([e.$style.typeIcon, { [e.$style.error]: Y.value }]) }, [Y.value ? (_(), l(b(O), {
153
+ f("div", { class: h([e.$style.typeIcon, { [e.$style.error]: J.value }]) }, [J.value ? (g(), l(y(E), {
141
154
  key: 0,
142
155
  name: "warning"
143
- })) : (_(), l(b(O), {
156
+ })) : (g(), l(y(E), {
144
157
  key: 1,
145
- name: J.value === "String" || J.value === void 0 ? "cell-type-txt" : "cell-type-num"
158
+ name: q.value === "String" || q.value === void 0 ? "cell-type-txt" : "cell-type-num"
146
159
  }, null, 8, ["name"]))], 2),
147
160
  f("div", {
148
- class: g(e.$style.titleWrapper),
149
- title: K.value?.label ?? ""
150
- }, [f("div", { class: g(e.$style.title) }, y(z.value ? "Inconsistent value" : K.value?.label ?? h.value.column), 3)], 10, N),
161
+ class: h(e.$style.titleWrapper),
162
+ title: G.value?.label ?? ""
163
+ }, [f("div", { class: h(e.$style.title) }, v(R.value ? "Inconsistent value" : G.value?.label ?? M.filter.column), 3)], 10, j),
151
164
  f("div", {
152
- class: g(e.$style.closeIcon),
153
- onClick: t[0] ||= (e) => m.onDelete(h.value.column)
154
- }, [p(b(O), { name: "close" })], 2)
155
- ], 2)) : (_(), d("div", {
165
+ class: h(e.$style.closeIcon),
166
+ onClick: t[0] ||= (e) => m.onDelete(M.filter.column)
167
+ }, [p(y(E), { name: "close" })], 2)
168
+ ], 2)) : (g(), d("div", {
156
169
  key: 1,
157
- class: g(e.$style.top)
158
- }, [p(b(D), {
159
- modelValue: W.value.source,
160
- "onUpdate:modelValue": [t[1] ||= (e) => W.value.source = e, R],
161
- errorStatus: Y.value,
162
- options: B.value,
170
+ class: h(e.$style.top)
171
+ }, [p(y(T), {
172
+ "model-value": U.value.source,
173
+ errorStatus: J.value,
174
+ options: z.value,
163
175
  style: { width: "100%" },
164
- "group-position": "top-left"
176
+ "group-position": "top-left",
177
+ "onUpdate:modelValue": L
165
178
  }, null, 8, [
166
- "modelValue",
179
+ "model-value",
167
180
  "errorStatus",
168
181
  "options"
169
182
  ]), f("div", {
170
- class: g(e.$style.closeButton),
171
- onClick: t[2] ||= (e) => m.onDelete(h.value.column)
172
- }, [p(b(O), { name: "close" })], 2)], 2)),
173
- K.value?.axesToBeFixed?.length ? (_(), d("div", {
183
+ class: h(e.$style.closeButton),
184
+ onClick: t[1] ||= (e) => m.onDelete(M.filter.column)
185
+ }, [p(y(E), { name: "close" })], 2)], 2)),
186
+ G.value?.axesToBeFixed?.length ? (g(), d("div", {
174
187
  key: 2,
175
- class: g(e.$style.fixedAxesBlock)
176
- }, [(_(!0), d(s, null, v(K.value?.axesToBeFixed, (e) => (_(), l(b(T), {
188
+ class: h(e.$style.fixedAxesBlock)
189
+ }, [(g(!0), d(s, null, _(G.value?.axesToBeFixed, (e) => (g(), l(y(C), {
177
190
  key: e.idx,
178
- modelValue: W.value.axisFiltersByIndex[e.idx],
179
- "onUpdate:modelValue": [(t) => W.value.axisFiltersByIndex[e.idx] = t, (t) => G(e.idx, t)],
191
+ "model-value": U.value.axisFiltersByIndex[e.idx],
180
192
  label: e.label,
181
- "options-search": (t, n) => F(W.value.source, n, t, e.idx),
182
- disabled: z.value,
183
- clearable: !0
193
+ "options-search": (t, n) => P(U.value.source, n, t, e.idx),
194
+ disabled: R.value,
195
+ clearable: !0,
196
+ "onUpdate:modelValue": (t) => W(e.idx, t)
184
197
  }, null, 8, [
185
- "modelValue",
186
- "onUpdate:modelValue",
198
+ "model-value",
187
199
  "label",
188
200
  "options-search",
189
- "disabled"
201
+ "disabled",
202
+ "onUpdate:modelValue"
190
203
  ]))), 128))], 2)) : u("", !0),
191
- f("div", { class: g(h.value.type === "isNA" || h.value.type === "isNotNA" ? e.$style.bottom : e.$style.middle) }, [p(b(D), {
192
- modelValue: h.value.type,
193
- "onUpdate:modelValue": [t[3] ||= (e) => h.value.type = e, L],
194
- options: X.value,
195
- "group-position": h.value.type === "isNA" || h.value.type === "isNotNA" ? "bottom" : "middle"
204
+ f("div", { class: h(M.filter.type === "isNA" || M.filter.type === "isNotNA" ? e.$style.bottom : e.$style.middle) }, [p(y(T), {
205
+ "model-value": M.filter.type,
206
+ options: Y.value,
207
+ "group-position": M.filter.type === "isNA" || M.filter.type === "isNotNA" ? "bottom" : "middle",
208
+ "onUpdate:modelValue": t[2] ||= (e) => I(e)
196
209
  }, null, 8, [
197
- "modelValue",
210
+ "model-value",
198
211
  "options",
199
212
  "group-position"
200
213
  ])], 2),
201
- h.value.type === "patternFuzzyContainSubsequence" ? (_(), d(s, { key: 3 }, [f("div", { class: g(e.$style.middle) }, [p(b(A), {
202
- modelValue: h.value.value,
203
- "onUpdate:modelValue": t[4] ||= (e) => h.value.value = e,
214
+ M.filter.type === "patternFuzzyContainSubsequence" ? (g(), d(s, { key: 3 }, [f("div", { class: h(e.$style.middle) }, [p(y(O), {
215
+ "model-value": M.filter.value,
204
216
  placeholder: "Substring",
205
- "group-position": "middle"
206
- }, null, 8, ["modelValue"])], 2), f("div", { class: g(e.$style.innerSection) }, [p(b(M), {
207
- modelValue: h.value.maxEdits,
208
- "onUpdate:modelValue": t[5] ||= (e) => h.value.maxEdits = e,
217
+ "group-position": "middle",
218
+ "onUpdate:modelValue": t[3] ||= (e) => N("value", e)
219
+ }, null, 8, ["model-value"])], 2), f("div", { class: h(e.$style.innerSection) }, [p(y(A), {
220
+ "model-value": M.filter.maxEdits,
209
221
  max: 5,
210
222
  breakpoints: "",
211
- label: "Maximum number of substitutions and indels"
212
- }, null, 8, ["modelValue"]), p(b(j), {
213
- modelValue: h.value.substitutionsOnly,
214
- "onUpdate:modelValue": t[6] ||= (e) => h.value.substitutionsOnly = e,
215
- label: "Substitutions only"
216
- }, null, 8, ["modelValue"])], 2)], 64)) : u("", !0),
217
- f("div", { class: g(e.$style.bottom) }, [
218
- h.value.type === "patternEquals" || h.value.type === "patternNotEquals" ? (_(), l(b(T), {
223
+ label: "Maximum number of substitutions and indels",
224
+ "onUpdate:modelValue": t[4] ||= (e) => N("maxEdits", e)
225
+ }, null, 8, ["model-value"]), p(y(k), {
226
+ "model-value": M.filter.substitutionsOnly,
227
+ label: "Substitutions only",
228
+ "onUpdate:modelValue": t[5] ||= (e) => N("substitutionsOnly", e)
229
+ }, null, 8, ["model-value"])], 2)], 64)) : u("", !0),
230
+ f("div", { class: h(e.$style.bottom) }, [
231
+ M.filter.type === "patternEquals" || M.filter.type === "patternNotEquals" ? (g(), l(y(C), {
219
232
  key: 0,
220
- modelValue: h.value.value,
221
- "onUpdate:modelValue": t[7] ||= (e) => h.value.value = e,
222
- "options-search": (e, t) => F(W.value.source, t, e),
233
+ "model-value": M.filter.value,
234
+ "options-search": (e, t) => P(U.value.source, t, e),
223
235
  clearable: !0,
224
- "group-position": "bottom"
225
- }, null, 8, ["modelValue", "options-search"])) : u("", !0),
226
- h.value.type === "inSet" || h.value.type === "notInSet" ? (_(), l(b(E), {
236
+ "group-position": "bottom",
237
+ "onUpdate:modelValue": t[6] ||= (e) => N("value", e)
238
+ }, null, 8, ["model-value", "options-search"])) : u("", !0),
239
+ M.filter.type === "inSet" || M.filter.type === "notInSet" ? (g(), l(y(w), {
227
240
  key: 1,
228
- modelValue: h.value.value,
229
- "onUpdate:modelValue": t[8] ||= (e) => h.value.value = e,
230
- "options-search": (e, t) => I(W.value.source, t, e),
231
- disabled: z.value,
232
- "group-position": "bottom"
241
+ "model-value": M.filter.value,
242
+ "options-search": (e, t) => F(U.value.source, t, e),
243
+ disabled: R.value,
244
+ "group-position": "bottom",
245
+ "onUpdate:modelValue": t[7] ||= (e) => N("value", e)
233
246
  }, null, 8, [
234
- "modelValue",
247
+ "model-value",
235
248
  "options-search",
236
249
  "disabled"
237
250
  ])) : u("", !0),
238
- b(a)(h.value) ? (_(), l(b(k), {
251
+ y(a)(M.filter) ? (g(), l(y(D), {
239
252
  key: 2,
240
- modelValue: h.value.x,
241
- "onUpdate:modelValue": t[9] ||= (e) => h.value.x = e,
242
- "group-position": "bottom"
243
- }, null, 8, ["modelValue"])) : u("", !0),
244
- b(o)(h.value) ? (_(), l(b(k), {
253
+ "model-value": M.filter.x,
254
+ "group-position": "bottom",
255
+ "onUpdate:modelValue": t[8] ||= (e) => N("x", e)
256
+ }, null, 8, ["model-value"])) : u("", !0),
257
+ y(o)(M.filter) ? (g(), l(y(D), {
245
258
  key: 3,
246
- modelValue: h.value.n,
247
- "onUpdate:modelValue": t[10] ||= (e) => h.value.n = e,
248
- "group-position": "bottom"
249
- }, null, 8, ["modelValue"])) : u("", !0),
250
- h.value.type === "patternContainSubsequence" || h.value.type === "patternNotContainSubsequence" ? (_(), l(b(A), {
259
+ "model-value": M.filter.n,
260
+ "group-position": "bottom",
261
+ "onUpdate:modelValue": t[9] ||= (e) => N("n", e)
262
+ }, null, 8, ["model-value"])) : u("", !0),
263
+ M.filter.type === "patternContainSubsequence" || M.filter.type === "patternNotContainSubsequence" ? (g(), l(y(O), {
251
264
  key: 4,
252
- modelValue: h.value.value,
253
- "onUpdate:modelValue": t[11] ||= (e) => h.value.value = e,
265
+ "model-value": M.filter.value,
254
266
  placeholder: "Substring",
255
- "group-position": "bottom"
256
- }, null, 8, ["modelValue"])) : u("", !0),
257
- h.value.type === "patternMatchesRegularExpression" ? (_(), l(b(A), {
267
+ "group-position": "bottom",
268
+ "onUpdate:modelValue": t[10] ||= (e) => N("value", e)
269
+ }, null, 8, ["model-value"])) : u("", !0),
270
+ M.filter.type === "patternMatchesRegularExpression" ? (g(), l(y(O), {
258
271
  key: 5,
259
- modelValue: h.value.value,
260
- "onUpdate:modelValue": t[12] ||= (e) => h.value.value = e,
261
- error: Q.value ? "Regular expression is not valid" : void 0,
272
+ "model-value": M.filter.value,
273
+ error: Z.value ? "Regular expression is not valid" : void 0,
262
274
  placeholder: "Regular expression",
263
- "group-position": "bottom"
264
- }, null, 8, ["modelValue", "error"])) : u("", !0),
265
- h.value.type === "patternFuzzyContainSubsequence" ? (_(), l(b(D), {
275
+ "group-position": "bottom",
276
+ "onUpdate:modelValue": t[11] ||= (e) => N("value", e)
277
+ }, null, 8, ["model-value", "error"])) : u("", !0),
278
+ M.filter.type === "patternFuzzyContainSubsequence" ? (g(), l(y(T), {
266
279
  key: 6,
267
- modelValue: h.value.wildcard,
268
- "onUpdate:modelValue": t[13] ||= (e) => h.value.wildcard = e,
280
+ "model-value": M.filter.wildcard,
269
281
  clearable: "",
270
282
  placeholder: "Wildcard value",
271
- options: Z.value,
272
- "group-position": "bottom"
273
- }, null, 8, ["modelValue", "options"])) : u("", !0)
283
+ options: X.value,
284
+ "group-position": "bottom",
285
+ "onUpdate:modelValue": t[12] ||= (e) => N("wildcard", e)
286
+ }, null, 8, ["model-value", "options"])) : u("", !0)
274
287
  ], 2)
275
288
  ], 2), p(n, {
276
289
  active: m.operand,
277
290
  disabled: m.isLast,
278
- "on-select": m.onChangeOperand
291
+ onSelect: m.onChangeOperand
279
292
  }, null, 8, [
280
293
  "active",
281
294
  "disabled",
282
- "on-select"
295
+ "onSelect"
283
296
  ])], 64));
284
297
  }
285
298
  });
286
299
  //#endregion
287
- export { P as default };
300
+ export { M as default };
288
301
 
289
302
  //# sourceMappingURL=FilterEditor.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterEditor.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlAdvancedFilter/FilterEditor.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport {\n PlAutocomplete,\n PlAutocompleteMulti,\n PlDropdown,\n PlIcon16,\n PlNumberField,\n PlTextField,\n PlToggleSwitch,\n Slider,\n} from \"@milaboratories/uikit\";\nimport type {\n AnchoredPColumnId,\n AxisFilterByIdx,\n AxisFilterValue,\n SUniversalPColumnId,\n} from \"@platforma-sdk/model\";\nimport {\n isFilteredPColumn,\n parseColumnId,\n stringifyColumnId,\n type ListOptionBase,\n} from \"@platforma-sdk/model\";\nimport { computed } from \"vue\";\nimport type { SUPPORTED_FILTER_TYPES } from \"./constants\";\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS } from \"./constants\";\nimport OperandButton from \"./OperandButton.vue\";\nimport type { EditableFilter, Operand, PlAdvancedFilterColumnId, SourceOptionInfo } from \"./types\";\nimport { getFilterInfo, getNormalizedSpec, isNumericFilter, isPositionFilter } from \"./utils\";\n\nconst filter = defineModel<EditableFilter>(\"filter\", { required: true });\n\nconst props = defineProps<{\n isLast: boolean;\n operand: Operand;\n enableDnd: boolean;\n columnOptions: SourceOptionInfo[];\n supportedFilters: typeof SUPPORTED_FILTER_TYPES;\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchType: \"value\" | \"label\";\n searchStr: string;\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n onDelete: (columnId: PlAdvancedFilterColumnId) => void;\n onChangeOperand: (op: Operand) => void;\n}>();\n\nasync function getSuggestOptionsFn(\n id: PlAdvancedFilterColumnId,\n type: \"value\" | \"label\",\n str: string,\n axisIdx?: number,\n): Promise<ListOptionBase<string>[]> {\n return props.getSuggestOptions({\n columnId: id,\n axisIdx,\n searchType: type,\n searchStr: str,\n }) as Promise<ListOptionBase<string>[]>;\n}\n\nasync function getMultiSuggestOptionsFn(\n id: PlAdvancedFilterColumnId,\n type: \"value\" | \"label\",\n str: string | string[],\n axisIdx?: number,\n): Promise<ListOptionBase<string>[]> {\n if (type === \"label\" && typeof str === \"string\") {\n return getSuggestOptionsFn(id, type, str, axisIdx);\n }\n if (type === \"value\" && Array.isArray(str)) {\n const results = await Promise.all(str.map((s) => getSuggestOptionsFn(id, type, s, axisIdx)));\n return results.map((x) => x[0]);\n }\n throw new Error(\"Invalid arguments combination\");\n}\n\ntype Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][];\nfunction changeFilterType() {\n const defaultFilter = DEFAULT_FILTERS[filter.value.type];\n\n filter.value = (Object.entries(defaultFilter) as Entries<EditableFilter>).reduce(\n (res, [key, val]) => {\n res[key] = filter.value[key] ?? val;\n return res;\n },\n {} as Record<keyof EditableFilter, EditableFilter[keyof EditableFilter]>,\n ) as EditableFilter;\n}\n\nfunction changeSourceId(newSourceId?: PlAdvancedFilterColumnId) {\n if (!newSourceId) {\n return;\n }\n const newSourceInfo = props.columnOptions.find((v) => v.id === getSourceId(newSourceId));\n if (!newSourceInfo) {\n return;\n }\n const filterInfo = getFilterInfo(filter.value.type);\n const newSourceSpec = getNormalizedSpec(newSourceInfo?.spec);\n if (filterInfo.supportedFor(newSourceSpec)) {\n // don't do anything except update source id\n filter.value.column = newSourceId;\n } else {\n // reset to default filter which fits to any column\n filter.value = {\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: newSourceId,\n };\n }\n}\n\nconst inconsistentSourceSelected = computed(() => {\n const selectedOption = props.columnOptions.find(\n (op) => op.id === getSourceId(filter.value.column),\n );\n return selectedOption === undefined;\n});\nconst sourceOptions = computed(() => {\n const options = props.columnOptions.map((v) => ({ value: v.id, label: v.label ?? v }));\n if (inconsistentSourceSelected.value) {\n options.unshift({ value: filter.value.column, label: \"Inconsistent value\" });\n }\n return options;\n});\n\nfunction getSourceId(column: PlAdvancedFilterColumnId): PlAdvancedFilterColumnId {\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return stringifyColumnId(parsedColumnId.source);\n } else {\n return column;\n }\n } catch {\n return column;\n }\n}\n\n// similar to FilteredPColumnId but source is stringified and axis filters can be undefined\ntype ColumnAsSourceAndFixedAxes = {\n source: PlAdvancedFilterColumnId;\n axisFiltersByIndex: Record<number, AxisFilterValue | undefined>;\n};\nfunction getColumnAsSourceAndFixedAxes(\n column: PlAdvancedFilterColumnId,\n): ColumnAsSourceAndFixedAxes {\n const sourceId = getSourceId(column);\n const option = props.columnOptions.find((op) => op.id === sourceId);\n const axesToBeFixed = (option?.axesToBeFixed ?? []).reduce(\n (res, item) => {\n res[item.idx] = undefined;\n return res;\n },\n {} as Record<number, AxisFilterValue | undefined>,\n );\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return {\n source: sourceId,\n axisFiltersByIndex: parsedColumnId.axisFilters.reduce((res, item) => {\n res[item[0]] = item[1];\n return res;\n }, axesToBeFixed),\n };\n }\n } catch {\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n }\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n}\n\nfunction stringifyColumn(value: ColumnAsSourceAndFixedAxes): PlAdvancedFilterColumnId {\n if (Object.keys(value.axisFiltersByIndex).length === 0) {\n return value.source;\n }\n return stringifyColumnId({\n source: parseColumnId(value.source as SUniversalPColumnId) as AnchoredPColumnId,\n axisFilters: Object.entries(value.axisFiltersByIndex).map(\n ([idx, value]) => [Number(idx), value] as AxisFilterByIdx,\n ),\n });\n}\n\nconst columnAsSourceAndFixedAxes = computed({\n get: () => {\n return getColumnAsSourceAndFixedAxes(filter.value.column);\n },\n set: (value) => {\n filter.value.column = stringifyColumn(value);\n },\n});\nfunction updateAxisFilterValue(idx: number, value: AxisFilterValue | undefined) {\n columnAsSourceAndFixedAxes.value = {\n ...columnAsSourceAndFixedAxes.value,\n axisFiltersByIndex: { ...columnAsSourceAndFixedAxes.value.axisFiltersByIndex, [idx]: value },\n };\n}\n\nconst currentOption = computed(() =>\n props.columnOptions.find((op) => op.id === columnAsSourceAndFixedAxes.value.source),\n);\nconst currentSpec = computed(() =>\n currentOption.value?.spec ? getNormalizedSpec(currentOption.value.spec) : null,\n);\nconst currentType = computed(() => currentSpec.value?.valueType);\nconst currentError = computed(\n () => Boolean(currentOption.value?.error) || inconsistentSourceSelected.value,\n);\n\nconst filterTypesOptions = computed(() =>\n props.supportedFilters\n .filter(\n (v) =>\n filter.value.type === v ||\n (currentSpec.value ? getFilterInfo(v).supportedFor(currentSpec.value) : true),\n )\n .map((v) => ({ value: v, label: getFilterInfo(v).label })),\n);\n\nconst wildcardOptions = computed(() => {\n if (filter.value.type !== \"patternFuzzyContainSubsequence\") {\n return [];\n }\n if (currentOption.value?.alphabet === \"nucleotide\") {\n return [{ label: \"N\", value: \"N\" }];\n }\n if (currentOption.value?.alphabet === \"aminoacid\") {\n return [{ label: \"X\", value: \"X\" }];\n }\n return [...new Set(filter.value.value.split(\"\"))].sort().map((v) => ({ value: v, label: v }));\n});\n\nconst stringMatchesError = computed(() => {\n if (filter.value.type !== \"patternMatchesRegularExpression\") {\n return false;\n }\n try {\n new RegExp(filter.value.value);\n return false;\n } catch {\n return true;\n }\n});\n</script>\n<template>\n <div :class=\"$style.filterWrapper\">\n <!-- top element - column selector / column label - for all filter types-->\n <div\n v-if=\"enableDnd\"\n :class=\"[$style.top, $style.columnChip, { [$style.error]: currentError }]\"\n >\n <div :class=\"[$style.typeIcon, { [$style.error]: currentError }]\">\n <PlIcon16 v-if=\"currentError\" name=\"warning\" />\n <PlIcon16\n v-else\n :name=\"\n currentType === 'String' || currentType === undefined\n ? 'cell-type-txt'\n : 'cell-type-num'\n \"\n />\n </div>\n <div :class=\"$style.titleWrapper\" :title=\"currentOption?.label ?? ''\">\n <div :class=\"$style.title\">\n {{\n inconsistentSourceSelected\n ? \"Inconsistent value\"\n : (currentOption?.label ?? filter.column)\n }}\n </div>\n </div>\n <div :class=\"$style.closeIcon\" @click=\"onDelete(filter.column)\">\n <PlIcon16 name=\"close\" />\n </div>\n </div>\n <div v-else :class=\"$style.top\">\n <PlDropdown\n v-model=\"columnAsSourceAndFixedAxes.source\"\n :errorStatus=\"currentError\"\n :options=\"sourceOptions\"\n :style=\"{ width: '100%' }\"\n group-position=\"top-left\"\n @update:model-value=\"changeSourceId\"\n />\n <div :class=\"$style.closeButton\" @click=\"onDelete(filter.column)\">\n <PlIcon16 name=\"close\" />\n </div>\n </div>\n\n <div v-if=\"currentOption?.axesToBeFixed?.length\" :class=\"$style.fixedAxesBlock\">\n <template v-for=\"value in currentOption?.axesToBeFixed\" :key=\"value.idx\">\n <PlAutocomplete\n v-model=\"columnAsSourceAndFixedAxes.axisFiltersByIndex[value.idx]\"\n :label=\"value.label\"\n :options-search=\"\n (str, type) =>\n getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str, value.idx)\n \"\n :disabled=\"inconsistentSourceSelected\"\n :clearable=\"true\"\n @update:model-value=\"(v) => updateAxisFilterValue(value.idx, v)\"\n />\n </template>\n </div>\n\n <!-- middle - filter type selector - for all filter types -->\n <div\n :class=\"filter.type === 'isNA' || filter.type === 'isNotNA' ? $style.bottom : $style.middle\"\n >\n <PlDropdown\n v-model=\"filter.type\"\n :options=\"filterTypesOptions\"\n :group-position=\"filter.type === 'isNA' || filter.type === 'isNotNA' ? 'bottom' : 'middle'\"\n @update:model-value=\"changeFilterType\"\n />\n </div>\n\n <!-- middle - for fuzzy contains filter -->\n <template v-if=\"filter.type === 'patternFuzzyContainSubsequence'\">\n <div :class=\"$style.middle\">\n <PlTextField v-model=\"filter.value\" placeholder=\"Substring\" group-position=\"middle\" />\n </div>\n <div :class=\"$style.innerSection\">\n <Slider\n v-model=\"filter.maxEdits\"\n :max=\"5\"\n breakpoints\n label=\"Maximum number of substitutions and indels\"\n />\n <PlToggleSwitch v-model=\"filter.substitutionsOnly\" label=\"Substitutions only\" />\n </div>\n </template>\n\n <!-- bottom element - individual settings for every filter type -->\n <div :class=\"$style.bottom\">\n <PlAutocomplete\n v-if=\"filter.type === 'patternEquals' || filter.type === 'patternNotEquals'\"\n v-model=\"filter.value\"\n :options-search=\"\n (str, type) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str)\n \"\n :clearable=\"true\"\n group-position=\"bottom\"\n />\n <PlAutocompleteMulti\n v-if=\"filter.type === 'inSet' || filter.type === 'notInSet'\"\n v-model=\"filter.value\"\n :options-search=\"\n (str, type) => getMultiSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str)\n \"\n :disabled=\"inconsistentSourceSelected\"\n group-position=\"bottom\"\n />\n <PlNumberField v-if=\"isNumericFilter(filter)\" v-model=\"filter.x\" group-position=\"bottom\" />\n <PlNumberField v-if=\"isPositionFilter(filter)\" v-model=\"filter.n\" group-position=\"bottom\" />\n <PlTextField\n v-if=\"\n filter.type === 'patternContainSubsequence' ||\n filter.type === 'patternNotContainSubsequence'\n \"\n v-model=\"filter.value\"\n placeholder=\"Substring\"\n group-position=\"bottom\"\n />\n <PlTextField\n v-if=\"filter.type === 'patternMatchesRegularExpression'\"\n v-model=\"filter.value\"\n :error=\"stringMatchesError ? 'Regular expression is not valid' : undefined\"\n placeholder=\"Regular expression\"\n group-position=\"bottom\"\n />\n <PlDropdown\n v-if=\"filter.type === 'patternFuzzyContainSubsequence'\"\n v-model=\"filter.wildcard\"\n clearable\n placeholder=\"Wildcard value\"\n :options=\"wildcardOptions\"\n group-position=\"bottom\"\n />\n </div>\n </div>\n <OperandButton :active=\"operand\" :disabled=\"isLast\" :on-select=\"onChangeOperand\" />\n</template>\n\n<style module>\n.filterWrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n cursor: default;\n}\n\n.typeIcon {\n display: inline-flex;\n margin-right: 8px;\n}\n\n.typeIcon.error {\n --icon-color: var(--txt-error);\n}\n\n.closeIcon {\n display: inline-flex;\n margin-left: 12px;\n cursor: pointer;\n}\n\n.titleWrapper {\n flex-grow: 1;\n overflow: hidden;\n}\n.title {\n overflow: hidden;\n color: var(--txt-01);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.columnChip {\n width: 100%;\n display: flex;\n padding: 10px 12px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--txt-01);\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n\n &.error {\n border-color: var(--txt-error);\n }\n}\n\n.innerSection {\n border: 1px solid var(--txt-01);\n border-top: none;\n padding: 16px 12px;\n}\n\n.closeButton {\n border: 1px solid var(--txt-01);\n border-top-right-radius: 6px;\n border-left: none;\n width: 40px;\n height: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n cursor: pointer;\n}\n\n.top {\n position: relative;\n display: flex;\n width: 100%;\n z-index: 1;\n background: #fff;\n}\n\n.fixedAxesBlock {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n gap: 12px;\n border-left: 1px solid var(--txt-01);\n border-right: 1px solid var(--txt-01);\n}\n\n.fixedAxesBlock > * {\n background: #fff;\n}\n\n.middle,\n.bottom {\n position: relative;\n margin-top: -1px;\n background: #fff;\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"FilterEditor.vue_vue_type_script_setup_true_lang.js","names":["$style"],"sources":["../../../src/components/PlAdvancedFilter/FilterEditor.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport {\n PlAutocomplete,\n PlAutocompleteMulti,\n PlDropdown,\n PlIcon16,\n PlNumberField,\n PlTextField,\n PlToggleSwitch,\n Slider,\n} from \"@milaboratories/uikit\";\nimport type {\n AnchoredPColumnId,\n AxisFilterByIdx,\n AxisFilterValue,\n SUniversalPColumnId,\n} from \"@platforma-sdk/model\";\nimport {\n isFilteredPColumn,\n parseColumnId,\n stringifyColumnId,\n type ListOptionBase,\n} from \"@platforma-sdk/model\";\nimport { computed } from \"vue\";\nimport type { SUPPORTED_FILTER_TYPES } from \"./constants\";\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS } from \"./constants\";\nimport OperandButton from \"./OperandButton.vue\";\nimport type { EditableFilter, Operand, PlAdvancedFilterColumnId, SourceOptionInfo } from \"./types\";\nimport { getFilterInfo, getNormalizedSpec, isNumericFilter, isPositionFilter } from \"./utils\";\nimport { Entries } from \"@milaboratories/helpers\";\n\nconst props = defineProps<{\n filter: EditableFilter;\n isLast: boolean;\n operand: Operand;\n enableDnd: boolean;\n columnOptions: SourceOptionInfo[];\n supportedFilters: typeof SUPPORTED_FILTER_TYPES;\n getSuggestOptions: (params: {\n columnId: PlAdvancedFilterColumnId;\n axisIdx?: number;\n searchType: \"value\" | \"label\";\n searchStr: string;\n }) => ListOptionBase<string | number>[] | Promise<ListOptionBase<string | number>[]>;\n onDelete: (columnId: PlAdvancedFilterColumnId) => void;\n onUpdateFilter: (filter: EditableFilter) => void;\n onChangeOperand: (op: Operand) => void;\n}>();\n\ntype AllKeys<U> = U extends unknown ? keyof U : never;\ntype ValueOf<U, K extends string> = U extends unknown ? (K extends keyof U ? U[K] : never) : never;\n\nfunction updateFilterProp<K extends AllKeys<EditableFilter> & string>(\n key: K,\n v: ValueOf<EditableFilter, K>,\n) {\n props.onUpdateFilter({ ...props.filter, [key]: v } as EditableFilter);\n}\n\nasync function getSuggestOptionsFn(\n id: PlAdvancedFilterColumnId,\n type: \"value\" | \"label\",\n str: string,\n axisIdx?: number,\n): Promise<ListOptionBase<string>[]> {\n return props.getSuggestOptions({\n columnId: id,\n axisIdx,\n searchType: type,\n searchStr: str,\n }) as Promise<ListOptionBase<string>[]>;\n}\n\nasync function getMultiSuggestOptionsFn(\n id: PlAdvancedFilterColumnId,\n type: \"value\" | \"label\",\n str: string | string[],\n axisIdx?: number,\n): Promise<ListOptionBase<string>[]> {\n if (type === \"label\" && typeof str === \"string\") {\n return getSuggestOptionsFn(id, type, str, axisIdx);\n }\n if (type === \"value\" && Array.isArray(str)) {\n const results = await Promise.all(str.map((s) => getSuggestOptionsFn(id, type, s, axisIdx)));\n return results.map((x) => x[0]);\n }\n throw new Error(\"Invalid arguments combination\");\n}\n\nfunction changeFilterType(newType: EditableFilter[\"type\"]) {\n const defaultFilter = DEFAULT_FILTERS[newType];\n\n props.onUpdateFilter(\n (Object.entries(defaultFilter) as Entries<EditableFilter>).reduce(\n (res, [key, val]) => {\n res[key] = props.filter[key] ?? val;\n return res;\n },\n { ...props.filter, type: newType } as Record<\n keyof EditableFilter,\n EditableFilter[keyof EditableFilter]\n >,\n ) as EditableFilter,\n );\n}\n\nfunction changeSourceId(newSourceId?: PlAdvancedFilterColumnId) {\n if (!newSourceId) {\n return;\n }\n const newSourceInfo = props.columnOptions.find((v) => v.id === getSourceId(newSourceId));\n if (!newSourceInfo) {\n return;\n }\n const filterInfo = getFilterInfo(props.filter.type);\n const newSourceSpec = getNormalizedSpec(newSourceInfo?.spec);\n if (filterInfo.supportedFor(newSourceSpec)) {\n props.onUpdateFilter({ ...props.filter, column: newSourceId });\n } else {\n props.onUpdateFilter({\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: newSourceId,\n });\n }\n}\n\nconst inconsistentSourceSelected = computed(() => {\n const selectedOption = props.columnOptions.find(\n (op) => op.id === getSourceId(props.filter.column),\n );\n return selectedOption === undefined;\n});\nconst sourceOptions = computed(() => {\n const options = props.columnOptions.map((v) => ({ value: v.id, label: v.label ?? v }));\n if (inconsistentSourceSelected.value) {\n options.unshift({ value: props.filter.column, label: \"Inconsistent value\" });\n }\n return options;\n});\n\nfunction getSourceId(column: PlAdvancedFilterColumnId): PlAdvancedFilterColumnId {\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return stringifyColumnId(parsedColumnId.source);\n } else {\n return column;\n }\n } catch {\n return column;\n }\n}\n\n// similar to FilteredPColumnId but source is stringified and axis filters can be undefined\ntype ColumnAsSourceAndFixedAxes = {\n source: PlAdvancedFilterColumnId;\n axisFiltersByIndex: Record<number, AxisFilterValue | undefined>;\n};\nfunction getColumnAsSourceAndFixedAxes(\n column: PlAdvancedFilterColumnId,\n): ColumnAsSourceAndFixedAxes {\n const sourceId = getSourceId(column);\n const option = props.columnOptions.find((op) => op.id === sourceId);\n const axesToBeFixed = (option?.axesToBeFixed ?? []).reduce(\n (res, item) => {\n res[item.idx] = undefined;\n return res;\n },\n {} as Record<number, AxisFilterValue | undefined>,\n );\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return {\n source: sourceId,\n axisFiltersByIndex: parsedColumnId.axisFilters.reduce((res, item) => {\n res[item[0]] = item[1];\n return res;\n }, axesToBeFixed),\n };\n }\n } catch {\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n }\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n}\n\nfunction stringifyColumn(value: ColumnAsSourceAndFixedAxes): PlAdvancedFilterColumnId {\n if (Object.keys(value.axisFiltersByIndex).length === 0) {\n return value.source;\n }\n return stringifyColumnId({\n source: parseColumnId(value.source as SUniversalPColumnId) as AnchoredPColumnId,\n axisFilters: Object.entries(value.axisFiltersByIndex).map(\n ([idx, value]) => [Number(idx), value] as AxisFilterByIdx,\n ),\n });\n}\n\nconst columnAsSourceAndFixedAxes = computed({\n get: () => {\n return getColumnAsSourceAndFixedAxes(props.filter.column);\n },\n set: (value) => {\n props.onUpdateFilter({ ...props.filter, column: stringifyColumn(value) });\n },\n});\nfunction updateAxisFilterValue(idx: number, value: AxisFilterValue | undefined) {\n columnAsSourceAndFixedAxes.value = {\n ...columnAsSourceAndFixedAxes.value,\n axisFiltersByIndex: { ...columnAsSourceAndFixedAxes.value.axisFiltersByIndex, [idx]: value },\n };\n}\n\nconst currentOption = computed(() =>\n props.columnOptions.find((op) => op.id === columnAsSourceAndFixedAxes.value.source),\n);\nconst currentSpec = computed(() =>\n currentOption.value?.spec ? getNormalizedSpec(currentOption.value.spec) : null,\n);\nconst currentType = computed(() => currentSpec.value?.valueType);\nconst currentError = computed(\n () => Boolean(currentOption.value?.error) || inconsistentSourceSelected.value,\n);\n\nconst filterTypesOptions = computed(() =>\n props.supportedFilters\n .filter(\n (v) =>\n props.filter.type === v ||\n (currentSpec.value ? getFilterInfo(v).supportedFor(currentSpec.value) : true),\n )\n .map((v) => ({ value: v, label: getFilterInfo(v).label })),\n);\n\nconst wildcardOptions = computed(() => {\n if (props.filter.type !== \"patternFuzzyContainSubsequence\") {\n return [];\n }\n if (currentOption.value?.alphabet === \"nucleotide\") {\n return [{ label: \"N\", value: \"N\" }];\n }\n if (currentOption.value?.alphabet === \"aminoacid\") {\n return [{ label: \"X\", value: \"X\" }];\n }\n return [...new Set(props.filter.value.split(\"\"))].sort().map((v) => ({ value: v, label: v }));\n});\n\nconst stringMatchesError = computed(() => {\n if (props.filter.type !== \"patternMatchesRegularExpression\") {\n return false;\n }\n try {\n new RegExp(props.filter.value);\n return false;\n } catch {\n return true;\n }\n});\n</script>\n<template>\n <div :class=\"$style.filterWrapper\">\n <!-- top element - column selector / column label - for all filter types-->\n <div\n v-if=\"enableDnd\"\n :class=\"[$style.top, $style.columnChip, { [$style.error]: currentError }]\"\n >\n <div :class=\"[$style.typeIcon, { [$style.error]: currentError }]\">\n <PlIcon16 v-if=\"currentError\" name=\"warning\" />\n <PlIcon16\n v-else\n :name=\"\n currentType === 'String' || currentType === undefined\n ? 'cell-type-txt'\n : 'cell-type-num'\n \"\n />\n </div>\n <div :class=\"$style.titleWrapper\" :title=\"currentOption?.label ?? ''\">\n <div :class=\"$style.title\">\n {{\n inconsistentSourceSelected\n ? \"Inconsistent value\"\n : (currentOption?.label ?? props.filter.column)\n }}\n </div>\n </div>\n <div :class=\"$style.closeIcon\" @click=\"onDelete(props.filter.column)\">\n <PlIcon16 name=\"close\" />\n </div>\n </div>\n <div v-else :class=\"$style.top\">\n <PlDropdown\n :model-value=\"columnAsSourceAndFixedAxes.source\"\n :errorStatus=\"currentError\"\n :options=\"sourceOptions\"\n :style=\"{ width: '100%' }\"\n group-position=\"top-left\"\n @update:model-value=\"changeSourceId\"\n />\n <div :class=\"$style.closeButton\" @click=\"onDelete(props.filter.column)\">\n <PlIcon16 name=\"close\" />\n </div>\n </div>\n\n <div v-if=\"currentOption?.axesToBeFixed?.length\" :class=\"$style.fixedAxesBlock\">\n <template v-for=\"value in currentOption?.axesToBeFixed\" :key=\"value.idx\">\n <PlAutocomplete\n :model-value=\"columnAsSourceAndFixedAxes.axisFiltersByIndex[value.idx]\"\n :label=\"value.label\"\n :options-search=\"\n (str, type) =>\n getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str, value.idx)\n \"\n :disabled=\"inconsistentSourceSelected\"\n :clearable=\"true\"\n @update:model-value=\"(v) => updateAxisFilterValue(value.idx, v)\"\n />\n </template>\n </div>\n\n <!-- middle - filter type selector - for all filter types -->\n <div\n :class=\"\n props.filter.type === 'isNA' || props.filter.type === 'isNotNA'\n ? $style.bottom\n : $style.middle\n \"\n >\n <PlDropdown\n :model-value=\"props.filter.type\"\n :options=\"filterTypesOptions\"\n :group-position=\"\n props.filter.type === 'isNA' || props.filter.type === 'isNotNA' ? 'bottom' : 'middle'\n \"\n @update:model-value=\"(v) => changeFilterType(v!)\"\n />\n </div>\n\n <!-- middle - for fuzzy contains filter -->\n <template v-if=\"props.filter.type === 'patternFuzzyContainSubsequence'\">\n <div :class=\"$style.middle\">\n <PlTextField\n :model-value=\"props.filter.value\"\n placeholder=\"Substring\"\n group-position=\"middle\"\n @update:model-value=\"(v) => updateFilterProp('value', v)\"\n />\n </div>\n <div :class=\"$style.innerSection\">\n <Slider\n :model-value=\"props.filter.maxEdits\"\n :max=\"5\"\n breakpoints\n label=\"Maximum number of substitutions and indels\"\n @update:model-value=\"(v) => updateFilterProp('maxEdits', v)\"\n />\n <PlToggleSwitch\n :model-value=\"props.filter.substitutionsOnly\"\n label=\"Substitutions only\"\n @update:model-value=\"(v) => updateFilterProp('substitutionsOnly', v)\"\n />\n </div>\n </template>\n\n <!-- bottom element - individual settings for every filter type -->\n <div :class=\"$style.bottom\">\n <PlAutocomplete\n v-if=\"props.filter.type === 'patternEquals' || props.filter.type === 'patternNotEquals'\"\n :model-value=\"props.filter.value\"\n :options-search=\"\n (str, type) => getSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str)\n \"\n :clearable=\"true\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('value', v)\"\n />\n <PlAutocompleteMulti\n v-if=\"props.filter.type === 'inSet' || props.filter.type === 'notInSet'\"\n :model-value=\"props.filter.value\"\n :options-search=\"\n (str, type) => getMultiSuggestOptionsFn(columnAsSourceAndFixedAxes.source, type, str)\n \"\n :disabled=\"inconsistentSourceSelected\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('value', v)\"\n />\n <PlNumberField\n v-if=\"isNumericFilter(props.filter)\"\n :model-value=\"props.filter.x\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('x', v)\"\n />\n <PlNumberField\n v-if=\"isPositionFilter(props.filter)\"\n :model-value=\"props.filter.n\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('n', v)\"\n />\n <PlTextField\n v-if=\"\n props.filter.type === 'patternContainSubsequence' ||\n props.filter.type === 'patternNotContainSubsequence'\n \"\n :model-value=\"props.filter.value\"\n placeholder=\"Substring\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('value', v)\"\n />\n <PlTextField\n v-if=\"props.filter.type === 'patternMatchesRegularExpression'\"\n :model-value=\"props.filter.value\"\n :error=\"stringMatchesError ? 'Regular expression is not valid' : undefined\"\n placeholder=\"Regular expression\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('value', v)\"\n />\n <PlDropdown\n v-if=\"props.filter.type === 'patternFuzzyContainSubsequence'\"\n :model-value=\"props.filter.wildcard\"\n clearable\n placeholder=\"Wildcard value\"\n :options=\"wildcardOptions\"\n group-position=\"bottom\"\n @update:model-value=\"(v) => updateFilterProp('wildcard', v)\"\n />\n </div>\n </div>\n <OperandButton :active=\"operand\" :disabled=\"isLast\" @select=\"onChangeOperand\" />\n</template>\n\n<style module>\n.filterWrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n cursor: default;\n}\n\n.typeIcon {\n display: inline-flex;\n margin-right: 8px;\n}\n\n.typeIcon.error {\n --icon-color: var(--txt-error);\n}\n\n.closeIcon {\n display: inline-flex;\n margin-left: 12px;\n cursor: pointer;\n}\n\n.titleWrapper {\n flex-grow: 1;\n overflow: hidden;\n}\n.title {\n overflow: hidden;\n color: var(--txt-01);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n}\n\n.columnChip {\n width: 100%;\n display: flex;\n padding: 10px 12px;\n align-items: center;\n border-radius: 6px;\n border: 1px solid var(--txt-01);\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n\n &.error {\n border-color: var(--txt-error);\n }\n}\n\n.innerSection {\n border: 1px solid var(--txt-01);\n border-top: none;\n padding: 16px 12px;\n}\n\n.closeButton {\n border: 1px solid var(--txt-01);\n border-top-right-radius: 6px;\n border-left: none;\n width: 40px;\n height: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n cursor: pointer;\n}\n\n.top {\n position: relative;\n display: flex;\n width: 100%;\n z-index: 1;\n background: #fff;\n}\n\n.fixedAxesBlock {\n position: relative;\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n gap: 12px;\n border-left: 1px solid var(--txt-01);\n border-right: 1px solid var(--txt-01);\n}\n\n.fixedAxesBlock > * {\n background: #fff;\n}\n\n.middle,\n.bottom {\n position: relative;\n margin-top: -1px;\n background: #fff;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EA+BA,IAAM,IAAQ;EAqBd,SAAS,EACP,GACA,GACA;AACA,KAAM,eAAe;IAAE,GAAG,EAAM;KAAS,IAAM;IAAG,CAAmB;;EAGvE,eAAe,EACb,GACA,GACA,GACA,GACmC;AACnC,UAAO,EAAM,kBAAkB;IAC7B,UAAU;IACV;IACA,YAAY;IACZ,WAAW;IACZ,CAAC;;EAGJ,eAAe,EACb,GACA,GACA,GACA,GACmC;AACnC,OAAI,MAAS,WAAW,OAAO,KAAQ,SACrC,QAAO,EAAoB,GAAI,GAAM,GAAK,EAAQ;AAEpD,OAAI,MAAS,WAAW,MAAM,QAAQ,EAAI,CAExC,SADgB,MAAM,QAAQ,IAAI,EAAI,KAAK,MAAM,EAAoB,GAAI,GAAM,GAAG,EAAQ,CAAC,CAAC,EAC7E,KAAK,MAAM,EAAE,GAAG;AAEjC,SAAU,MAAM,gCAAgC;;EAGlD,SAAS,EAAiB,GAAiC;GACzD,IAAM,IAAgB,EAAgB;AAEtC,KAAM,eACH,OAAO,QAAQ,EAAc,CAA6B,QACxD,GAAK,CAAC,GAAK,QACV,EAAI,KAAO,EAAM,OAAO,MAAQ,GACzB,IAET;IAAE,GAAG,EAAM;IAAQ,MAAM;IAAS,CAInC,CACF;;EAGH,SAAS,EAAe,GAAwC;AAC9D,OAAI,CAAC,EACH;GAEF,IAAM,IAAgB,EAAM,cAAc,MAAM,MAAM,EAAE,OAAO,EAAY,EAAY,CAAC;AACxF,OAAI,CAAC,EACH;GAEF,IAAM,IAAa,EAAc,EAAM,OAAO,KAAK,EAC7C,IAAgB,EAAkB,GAAe,KAAK;AAC5D,GAAI,EAAW,aAAa,EAAc,GACxC,EAAM,eAAe;IAAE,GAAG,EAAM;IAAQ,QAAQ;IAAa,CAAC,GAE9D,EAAM,eAAe;IACnB,GAAG,EAAgB;IACnB,QAAQ;IACT,CAAC;;EAIN,IAAM,IAA6B,QACV,EAAM,cAAc,MACxC,MAAO,EAAG,OAAO,EAAY,EAAM,OAAO,OAAO,CACnD,KACyB,KAAA,EAC1B,EACI,IAAgB,QAAe;GACnC,IAAM,IAAU,EAAM,cAAc,KAAK,OAAO;IAAE,OAAO,EAAE;IAAI,OAAO,EAAE,SAAS;IAAG,EAAE;AAItF,UAHI,EAA2B,SAC7B,EAAQ,QAAQ;IAAE,OAAO,EAAM,OAAO;IAAQ,OAAO;IAAsB,CAAC,EAEvE;IACP;EAEF,SAAS,EAAY,GAA4D;AAC/E,OAAI;IACF,IAAM,IAAiB,EAAc,EAA8B;AAIjE,WAHE,EAAkB,EAAe,GAC5B,EAAkB,EAAe,OAAO,GAExC;WAEH;AACN,WAAO;;;EASX,SAAS,EACP,GAC4B;GAC5B,IAAM,IAAW,EAAY,EAAO,EAE9B,KADS,EAAM,cAAc,MAAM,MAAO,EAAG,OAAO,EAAS,EACpC,iBAAiB,EAAE,EAAE,QACjD,GAAK,OACJ,EAAI,EAAK,OAAO,KAAA,GACT,IAET,EAAE,CACH;AACD,OAAI;IACF,IAAM,IAAiB,EAAc,EAA8B;AACnE,QAAI,EAAkB,EAAe,CACnC,QAAO;KACL,QAAQ;KACR,oBAAoB,EAAe,YAAY,QAAQ,GAAK,OAC1D,EAAI,EAAK,MAAM,EAAK,IACb,IACN,EAAc;KAClB;WAEG;AACN,WAAO;KAAE,QAAQ;KAAQ,oBAAoB;KAAe;;AAE9D,UAAO;IAAE,QAAQ;IAAQ,oBAAoB;IAAe;;EAG9D,SAAS,EAAgB,GAA6D;AAIpF,UAHI,OAAO,KAAK,EAAM,mBAAmB,CAAC,WAAW,IAC5C,EAAM,SAER,EAAkB;IACvB,QAAQ,EAAc,EAAM,OAA8B;IAC1D,aAAa,OAAO,QAAQ,EAAM,mBAAmB,CAAC,KACnD,CAAC,GAAK,OAAW,CAAC,OAAO,EAAI,EAAE,EAAM,CACvC;IACF,CAAC;;EAGJ,IAAM,IAA6B,EAAS;GAC1C,WACS,EAA8B,EAAM,OAAO,OAAO;GAE3D,MAAM,MAAU;AACd,MAAM,eAAe;KAAE,GAAG,EAAM;KAAQ,QAAQ,EAAgB,EAAM;KAAE,CAAC;;GAE5E,CAAC;EACF,SAAS,EAAsB,GAAa,GAAoC;AAC9E,KAA2B,QAAQ;IACjC,GAAG,EAA2B;IAC9B,oBAAoB;KAAE,GAAG,EAA2B,MAAM;MAAqB,IAAM;KAAO;IAC7F;;EAGH,IAAM,IAAgB,QACpB,EAAM,cAAc,MAAM,MAAO,EAAG,OAAO,EAA2B,MAAM,OAAO,CACpF,EACK,IAAc,QAClB,EAAc,OAAO,OAAO,EAAkB,EAAc,MAAM,KAAK,GAAG,KAC3E,EACK,IAAc,QAAe,EAAY,OAAO,UAAU,EAC1D,IAAe,QACb,EAAQ,EAAc,OAAO,SAAU,EAA2B,MACzE,EAEK,IAAqB,QACzB,EAAM,iBACH,QACE,MACC,EAAM,OAAO,SAAS,MACrB,EAAY,QAAQ,EAAc,EAAE,CAAC,aAAa,EAAY,MAAM,GAAG,IAC5E,CACC,KAAK,OAAO;GAAE,OAAO;GAAG,OAAO,EAAc,EAAE,CAAC;GAAO,EAAE,CAC7D,EAEK,IAAkB,QAClB,EAAM,OAAO,SAAS,mCAGtB,EAAc,OAAO,aAAa,eAC7B,CAAC;GAAE,OAAO;GAAK,OAAO;GAAK,CAAC,GAEjC,EAAc,OAAO,aAAa,cAC7B,CAAC;GAAE,OAAO;GAAK,OAAO;GAAK,CAAC,GAE9B,CAAC,GAAG,IAAI,IAAI,EAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,OAAO;GAAE,OAAO;GAAG,OAAO;GAAG,EAAE,GARpF,EAAE,CASX,EAEI,IAAqB,QAAe;AACxC,OAAI,EAAM,OAAO,SAAS,kCACxB,QAAO;AAET,OAAI;AAEF,WADA,IAAI,OAAO,EAAM,OAAO,MAAM,EACvB;WACD;AACN,WAAO;;IAET;qCAGA,EAsKM,OAAA,EAtKA,OAAK,EAAEA,EAAAA,OAAO,cAAa,EAAA,EAAA;GAGvB,EAAA,aAAA,GAAA,EADR,EA2BM,OAAA;;IAzBH,OAAK,EAAA;KAAGA,EAAAA,OAAO;KAAKA,EAAAA,OAAO;KAAU,GAAKA,EAAAA,OAAO,QAAQ,EAAA,OAAY;KAAA,CAAA;;IAEtE,EAUM,OAAA,EAVA,OAAK,EAAA,CAAGA,EAAAA,OAAO,UAAQ,GAAKA,EAAAA,OAAO,QAAQ,EAAA,OAAY,CAAA,CAAA,EAAA,EAAA,CAC3C,EAAA,SAAA,GAAA,EAAhB,EAA+C,EAAA,EAAA,EAAA;;KAAjB,MAAK;gBACnC,EAOE,EAAA,EAAA,EAAA;;KALC,MAAmB,EAAA,UAAW,YAAiB,EAAA,UAAgB,KAAA,IAAA,kBAAA;;IAOpE,EAQM,OAAA;KARA,OAAK,EAAEA,EAAAA,OAAO,aAAY;KAAG,OAAO,EAAA,OAAe,SAAK;QAC5D,EAMM,OAAA,EANA,OAAK,EAAEA,EAAAA,OAAO,MAAK,EAAA,EAAA,EAErB,EAAA,QAAA,uBAAiF,EAAA,OAAe,SAAS,EAAM,OAAO,OAAM,EAAA,EAAA,CAAA,EAAA,IAAA,EAAA;IAMlI,EAEM,OAAA;KAFA,OAAK,EAAEA,EAAAA,OAAO,UAAS;KAAG,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,SAAS,EAAM,OAAO,OAAM;QACjE,EAAyB,EAAA,EAAA,EAAA,EAAf,MAAK,SAAO,CAAA,CAAA,EAAA,EAAA;kBAG1B,EAYM,OAAA;;IAZO,OAAK,EAAEA,EAAAA,OAAO,IAAG;OAC5B,EAOE,EAAA,EAAA,EAAA;IANC,eAAa,EAAA,MAA2B;IACxC,aAAa,EAAA;IACb,SAAS,EAAA;IACT,OAAO,EAAA,OAAA,QAAiB;IACzB,kBAAe;IACd,uBAAoB;;;;;OAEvB,EAEM,OAAA;IAFA,OAAK,EAAEA,EAAAA,OAAO,YAAW;IAAG,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,SAAS,EAAM,OAAO,OAAM;OACnE,EAAyB,EAAA,EAAA,EAAA,EAAf,MAAK,SAAO,CAAA,CAAA,EAAA,EAAA,CAAA,EAAA,EAAA;GAIf,EAAA,OAAe,eAAe,UAAA,GAAA,EAAzC,EAcM,OAAA;;IAd4C,OAAK,EAAEA,EAAAA,OAAO,eAAc;eAC5E,EAYW,GAAA,MAAA,EAZe,EAAA,OAAe,gBAAxB,YACf,EAUE,EAAA,EAAA,EAAA;SAX0D,EAAM;IAE/D,eAAa,EAAA,MAA2B,mBAAmB,EAAM;IACjE,OAAO,EAAM;IACb,mBAA8B,GAAK,MAAuB,EAAoB,EAAA,MAA2B,QAAQ,GAAM,GAAK,EAAM,IAAG;IAIrI,UAAU,EAAA;IACV,WAAW;IACX,wBAAqB,MAAM,EAAsB,EAAM,KAAK,EAAC;;;;;;;;GAMpE,EAeM,OAAA,EAdH,OAAK,EAAW,EAAM,OAAO,SAAI,UAAe,EAAM,OAAO,SAAI,YAA2BA,EAAAA,OAAO,SAAmBA,EAAAA,OAAO,OAAA,EAAA,EAAA,CAM9H,EAOE,EAAA,EAAA,EAAA;IANC,eAAa,EAAM,OAAO;IAC1B,SAAS,EAAA;IACT,kBAA2B,EAAM,OAAO,SAAI,UAAe,EAAM,OAAO,SAAI,YAAA,WAAA;IAG5E,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAiB,EAAC;;;;;;GAKlC,EAAM,OAAO,SAAI,oCAAA,GAAA,EAAjC,EAuBW,GAAA,EAAA,KAAA,GAAA,EAAA,CAtBT,EAOM,OAAA,EAPA,OAAK,EAAEA,EAAAA,OAAO,OAAM,EAAA,EAAA,CACxB,EAKE,EAAA,EAAA,EAAA;IAJC,eAAa,EAAM,OAAO;IAC3B,aAAY;IACZ,kBAAe;IACd,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,SAAU,EAAC;sCAG3D,EAaM,OAAA,EAbA,OAAK,EAAEA,EAAAA,OAAO,aAAY,EAAA,EAAA,CAC9B,EAME,EAAA,EAAA,EAAA;IALC,eAAa,EAAM,OAAO;IAC1B,KAAK;IACN,aAAA;IACA,OAAM;IACL,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,YAAa,EAAC;iCAE5D,EAIE,EAAA,EAAA,EAAA;IAHC,eAAa,EAAM,OAAO;IAC3B,OAAM;IACL,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,qBAAsB,EAAC;;GAMzE,EA4DM,OAAA,EA5DA,OAAK,EAAEA,EAAAA,OAAO,OAAM,EAAA,EAAA;IAEhB,EAAM,OAAO,SAAI,mBAAwB,EAAM,OAAO,SAAI,sBAAA,GAAA,EADlE,EASE,EAAA,EAAA,EAAA;;KAPC,eAAa,EAAM,OAAO;KAC1B,mBAA4B,GAAK,MAAS,EAAoB,EAAA,MAA2B,QAAQ,GAAM,EAAG;KAG1G,WAAW;KACZ,kBAAe;KACd,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,SAAU,EAAC;;IAGjD,EAAM,OAAO,SAAI,WAAgB,EAAM,OAAO,SAAI,cAAA,GAAA,EAD1D,EASE,EAAA,EAAA,EAAA;;KAPC,eAAa,EAAM,OAAO;KAC1B,mBAA4B,GAAK,MAAS,EAAyB,EAAA,MAA2B,QAAQ,GAAM,EAAG;KAG/G,UAAU,EAAA;KACX,kBAAe;KACd,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,SAAU,EAAC;;;;;;IAGjD,EAAA,EAAe,CAAC,EAAM,OAAM,IAAA,GAAA,EADpC,EAKE,EAAA,EAAA,EAAA;;KAHC,eAAa,EAAM,OAAO;KAC3B,kBAAe;KACd,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,KAAM,EAAC;;IAG7C,EAAA,EAAgB,CAAC,EAAM,OAAM,IAAA,GAAA,EADrC,EAKE,EAAA,EAAA,EAAA;;KAHC,eAAa,EAAM,OAAO;KAC3B,kBAAe;KACd,uBAAkB,AAAA,EAAA,QAAG,MAAM,EAAgB,KAAM,EAAC;;IAGlC,EAAM,OAAO,SAAI,+BAA8C,EAAM,OAAO,SAAI,kCAAA,GAAA,EADnG,EASE,EAAA,EAAA,EAAA;;KAJC,eAAa,EAAM,OAAO;KAC3B,aAAY;KACZ,kBAAe;KACd,uBAAkB,AAAA,EAAA,SAAG,MAAM,EAAgB,SAAU,EAAC;;IAGjD,EAAM,OAAO,SAAI,qCAAA,GAAA,EADzB,EAOE,EAAA,EAAA,EAAA;;KALC,eAAa,EAAM,OAAO;KAC1B,OAAO,EAAA,QAAkB,oCAAuC,KAAA;KACjE,aAAY;KACZ,kBAAe;KACd,uBAAkB,AAAA,EAAA,SAAG,MAAM,EAAgB,SAAU,EAAC;;IAGjD,EAAM,OAAO,SAAI,oCAAA,GAAA,EADzB,EAQE,EAAA,EAAA,EAAA;;KANC,eAAa,EAAM,OAAO;KAC3B,WAAA;KACA,aAAY;KACX,SAAS,EAAA;KACV,kBAAe;KACd,uBAAkB,AAAA,EAAA,SAAG,MAAM,EAAgB,YAAa,EAAC;;;SAIhE,EAAgF,GAAA;GAAhE,QAAQ,EAAA;GAAU,UAAU,EAAA;GAAS,UAAQ,EAAA"}