@platforma-sdk/ui-vue 1.79.27 → 1.80.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 (56) hide show
  1. package/.turbo/turbo-build.log +19 -19
  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 +38 -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.map +1 -1
  9. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +124 -113
  10. package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
  11. package/dist/components/PlAdvancedFilter/types.d.ts +1 -1
  12. package/dist/components/PlAdvancedFilter/types.d.ts.map +1 -1
  13. package/dist/components/PlAdvancedFilter/utils.d.ts +1 -1
  14. package/dist/components/PlAdvancedFilter/utils.d.ts.map +1 -1
  15. package/dist/components/PlAdvancedFilter/utils.js.map +1 -1
  16. package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
  17. package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
  18. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
  19. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +125 -121
  20. package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
  21. package/dist/components/PlAgDataTable/compositions/useFilterableColumns.d.ts +4 -4
  22. package/dist/components/PlAgDataTable/sources/row-number.d.ts.map +1 -1
  23. package/dist/components/PlAgDataTable/sources/row-number.js +1 -1
  24. package/dist/components/PlAgDataTable/sources/row-number.js.map +1 -1
  25. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +40 -4
  26. package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
  27. package/dist/components/PlAgDataTable/sources/table-source-v2.js +91 -56
  28. package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
  29. package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
  30. package/dist/components/PlAgDataTable/sources/table-state-v2.js +65 -64
  31. package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
  32. package/dist/components/PlAgDataTable/sources/value-rendering.d.ts +3 -3
  33. package/dist/components/PlAgDataTable/sources/value-rendering.d.ts.map +1 -1
  34. package/dist/components/PlAgDataTable/sources/value-rendering.js +12 -12
  35. package/dist/components/PlAgDataTable/sources/value-rendering.js.map +1 -1
  36. package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js.map +1 -1
  37. package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
  38. package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
  39. package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
  40. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +42 -45
  41. package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
  42. package/dist/internal/service_factories.d.ts +4 -3
  43. package/dist/internal/service_factories.d.ts.map +1 -1
  44. package/dist/internal/service_factories.js +6 -4
  45. package/dist/internal/service_factories.js.map +1 -1
  46. package/package.json +7 -6
  47. package/src/components/PlAdvancedFilter/FilterEditor.vue +39 -10
  48. package/src/components/PlAdvancedFilter/types.ts +3 -2
  49. package/src/components/PlAdvancedFilter/utils.ts +1 -1
  50. package/src/components/PlAgDataTable/PlAgDataTableV2.vue +21 -5
  51. package/src/components/PlAgDataTable/sources/row-number.ts +1 -0
  52. package/src/components/PlAgDataTable/sources/table-source-v2.ts +132 -31
  53. package/src/components/PlAgDataTable/sources/table-state-v2.ts +6 -7
  54. package/src/components/PlAgDataTable/sources/value-rendering.ts +7 -7
  55. package/src/components/PlTableFilters/PlTableFiltersV2.vue +9 -13
  56. package/src/internal/service_factories.ts +2 -0
@@ -2,11 +2,11 @@ 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, mergeFilterForTypeChange as s } from "./utils.js";
4
4
  import { Fragment as c, computed as l, createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createVNode as m, defineComponent as h, normalizeClass as g, openBlock as _, renderList as v, toDisplayString as y, unref as b } from "vue";
5
- import { isFilteredPColumn as x, parseColumnId as S, stringifyColumnId as C } from "@platforma-sdk/model";
6
- import { isNil as w } from "es-toolkit";
7
- 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";
5
+ import { canonicalizeJson as x, isFilteredPColumn as S, parseColumnId as C, stringifyColumnId as w } from "@platforma-sdk/model";
6
+ import { isNil as T } from "es-toolkit";
7
+ import { PlAutocomplete as E, PlAutocompleteMulti as D, PlDropdown as O, PlIcon16 as k, PlNumberField as A, PlTextField as j, PlToggleSwitch as M, Slider as N } from "@milaboratories/uikit";
8
8
  //#region src/components/PlAdvancedFilter/FilterEditor.vue?vue&type=script&setup=true&lang.ts
9
- var N = ["title"], P = /* @__PURE__ */ h({
9
+ var P = ["title"], F = /* @__PURE__ */ h({
10
10
  __name: "FilterEditor",
11
11
  props: {
12
12
  filter: {},
@@ -21,65 +21,73 @@ var N = ["title"], P = /* @__PURE__ */ h({
21
21
  onChangeOperand: { type: Function }
22
22
  },
23
23
  setup(h) {
24
- let P = h;
25
- function F(e, t) {
26
- P.onUpdateFilter({
27
- ...P.filter,
24
+ let F = h;
25
+ function I(e, t) {
26
+ F.onUpdateFilter({
27
+ ...F.filter,
28
28
  [e]: t
29
29
  });
30
30
  }
31
- async function I(e, t, n, r) {
32
- return P.getSuggestOptions({
31
+ async function L(e, t, n, r) {
32
+ return F.getSuggestOptions({
33
33
  columnId: e,
34
34
  axisIdx: r,
35
35
  searchType: t,
36
36
  searchStr: n
37
37
  });
38
38
  }
39
- async function L(e, t, n, r) {
40
- if (t === "label" && typeof n == "string") return I(e, t, n, r);
41
- if (t === "value" && Array.isArray(n)) return (await Promise.all(n.map((n) => I(e, t, n, r)))).map((e) => e[0]);
39
+ async function R(e, t, n, r) {
40
+ if (t === "label" && typeof n == "string") return L(e, t, n, r);
41
+ if (t === "value" && Array.isArray(n)) return (await Promise.all(n.map((n) => L(e, t, n, r)))).map((e) => e[0]);
42
42
  throw Error("Invalid arguments combination");
43
43
  }
44
- function R(e) {
45
- w(e) || P.onUpdateFilter(s(P.filter, e));
44
+ function z(e) {
45
+ T(e) || F.onUpdateFilter(s(F.filter, e));
46
46
  }
47
- function z(n) {
47
+ function B(n) {
48
48
  if (!n) return;
49
- let a = P.columnOptions.find((e) => e.id === H(n));
49
+ let a = F.columnOptions.find((e) => K(e.id, W(n)));
50
50
  if (!a) return;
51
- let o = r(P.filter.type), s = i(a?.spec);
52
- o.supportedFor(s) ? P.onUpdateFilter({
53
- ...P.filter,
51
+ let o = r(F.filter.type), s = i(a?.spec);
52
+ o.supportedFor(s) ? F.onUpdateFilter({
53
+ ...F.filter,
54
54
  column: n
55
- }) : P.onUpdateFilter({
55
+ }) : F.onUpdateFilter({
56
56
  ...e[t],
57
57
  column: n
58
58
  });
59
59
  }
60
- let B = l(() => P.columnOptions.find((e) => e.id === H(P.filter.column)) === void 0), V = l(() => {
61
- let e = P.columnOptions.map((e) => ({
60
+ let V = l(() => F.columnOptions.find((e) => K(e.id, W(F.filter.column))) === void 0), H = l(() => {
61
+ let e = F.columnOptions.map((e) => ({
62
62
  value: e.id,
63
63
  label: e.label ?? e
64
64
  }));
65
- return B.value && e.unshift({
66
- value: P.filter.column,
65
+ return V.value && e.unshift({
66
+ value: F.filter.column,
67
67
  label: "Inconsistent value"
68
68
  }), e;
69
69
  });
70
- function H(e) {
70
+ function U(e) {
71
+ return typeof e == "object" && !!e;
72
+ }
73
+ function W(e) {
74
+ if (U(e)) return e;
71
75
  try {
72
- let t = S(e);
73
- return x(t) ? C(t.source) : e;
76
+ let t = C(e);
77
+ return S(t) ? w(t.source) : e;
74
78
  } catch {
75
79
  return e;
76
80
  }
77
81
  }
78
- function U(e) {
79
- let t = H(e), n = (P.columnOptions.find((e) => e.id === t)?.axesToBeFixed ?? []).reduce((e, t) => (e[t.idx] = void 0, e), {});
82
+ function G(e) {
83
+ let t = W(e), n = (F.columnOptions.find((e) => K(e.id, t))?.axesToBeFixed ?? []).reduce((e, t) => (e[t.idx] = void 0, e), {});
84
+ if (U(e)) return {
85
+ source: e,
86
+ axisFiltersByIndex: n
87
+ };
80
88
  try {
81
- let r = S(e);
82
- if (x(r)) return {
89
+ let r = C(e);
90
+ if (S(r)) return {
83
91
  source: t,
84
92
  axisFiltersByIndex: r.axisFilters.reduce((e, t) => (e[t[0]] = t[1], e), n)
85
93
  };
@@ -94,46 +102,49 @@ var N = ["title"], P = /* @__PURE__ */ h({
94
102
  axisFiltersByIndex: n
95
103
  };
96
104
  }
97
- function W(e) {
98
- return Object.keys(e.axisFiltersByIndex).length === 0 ? e.source : C({
99
- source: S(e.source),
105
+ function K(e, t) {
106
+ return e === t ? !0 : typeof e == "object" && typeof t == "object" && e !== null && t !== null ? x(e) === x(t) : !1;
107
+ }
108
+ function q(e) {
109
+ return Object.keys(e.axisFiltersByIndex).length === 0 || U(e.source) ? e.source : w({
110
+ source: C(e.source),
100
111
  axisFilters: Object.entries(e.axisFiltersByIndex).map(([e, t]) => [Number(e), t])
101
112
  });
102
113
  }
103
- let G = l({
104
- get: () => U(P.filter.column),
114
+ let J = l({
115
+ get: () => G(F.filter.column),
105
116
  set: (e) => {
106
- P.onUpdateFilter({
107
- ...P.filter,
108
- column: W(e)
117
+ F.onUpdateFilter({
118
+ ...F.filter,
119
+ column: q(e)
109
120
  });
110
121
  }
111
122
  });
112
- function K(e, t) {
113
- G.value = {
114
- ...G.value,
123
+ function Y(e, t) {
124
+ J.value = {
125
+ ...J.value,
115
126
  axisFiltersByIndex: {
116
- ...G.value.axisFiltersByIndex,
127
+ ...J.value.axisFiltersByIndex,
117
128
  [e]: t
118
129
  }
119
130
  };
120
131
  }
121
- let q = l(() => P.columnOptions.find((e) => e.id === G.value.source)), J = l(() => q.value?.spec ? i(q.value.spec) : null), Y = l(() => J.value?.valueType), X = l(() => !!q.value?.error || B.value), Z = l(() => P.supportedFilters.filter((e) => P.filter.type === e || (J.value ? r(e).supportedFor(J.value) : !0)).map((e) => ({
132
+ let X = l(() => F.columnOptions.find((e) => K(e.id, J.value.source))), Z = l(() => X.value?.spec ? i(X.value.spec) : null), Q = l(() => Z.value?.valueType), $ = l(() => !!X.value?.error || V.value), ee = l(() => F.supportedFilters.filter((e) => F.filter.type === e || (Z.value ? r(e).supportedFor(Z.value) : !0)).map((e) => ({
122
133
  value: e,
123
134
  label: r(e).label
124
- }))), Q = l(() => P.filter.type === "patternFuzzyContainSubsequence" ? q.value?.alphabet === "nucleotide" ? [{
135
+ }))), te = l(() => F.filter.type === "patternFuzzyContainSubsequence" ? X.value?.alphabet === "nucleotide" ? [{
125
136
  label: "N",
126
137
  value: "N"
127
- }] : q.value?.alphabet === "aminoacid" ? [{
138
+ }] : X.value?.alphabet === "aminoacid" ? [{
128
139
  label: "X",
129
140
  value: "X"
130
- }] : [...new Set(P.filter.value.split(""))].sort().map((e) => ({
141
+ }] : [...new Set(F.filter.value.split(""))].sort().map((e) => ({
131
142
  value: e,
132
143
  label: e
133
- })) : []), $ = l(() => {
134
- if (P.filter.type !== "patternMatchesRegularExpression") return !1;
144
+ })) : []), ne = l(() => {
145
+ if (F.filter.type !== "patternMatchesRegularExpression") return !1;
135
146
  try {
136
- return new RegExp(P.filter.value), !1;
147
+ return new RegExp(F.filter.value), !1;
137
148
  } catch {
138
149
  return !0;
139
150
  }
@@ -144,53 +155,53 @@ var N = ["title"], P = /* @__PURE__ */ h({
144
155
  class: g([
145
156
  e.$style.top,
146
157
  e.$style.columnChip,
147
- { [e.$style.error]: X.value }
158
+ { [e.$style.error]: $.value }
148
159
  ])
149
160
  }, [
150
- p("div", { class: g([e.$style.typeIcon, { [e.$style.error]: X.value }]) }, [X.value ? (_(), u(b(O), {
161
+ p("div", { class: g([e.$style.typeIcon, { [e.$style.error]: $.value }]) }, [$.value ? (_(), u(b(k), {
151
162
  key: 0,
152
163
  name: "warning"
153
- })) : (_(), u(b(O), {
164
+ })) : (_(), u(b(k), {
154
165
  key: 1,
155
- name: Y.value === "String" || Y.value === void 0 ? "cell-type-txt" : "cell-type-num"
166
+ name: Q.value === "String" || Q.value === void 0 ? "cell-type-txt" : "cell-type-num"
156
167
  }, null, 8, ["name"]))], 2),
157
168
  p("div", {
158
169
  class: g(e.$style.titleWrapper),
159
- title: q.value?.label ?? ""
160
- }, [p("div", { class: g(e.$style.title) }, y(B.value ? "Inconsistent value" : q.value?.label ?? P.filter.column), 3)], 10, N),
170
+ title: X.value?.label ?? ""
171
+ }, [p("div", { class: g(e.$style.title) }, y(V.value ? "Inconsistent value" : X.value?.label ?? F.filter.column), 3)], 10, P),
161
172
  p("div", {
162
173
  class: g(e.$style.closeIcon),
163
- onClick: t[0] ||= (e) => h.onDelete(P.filter.column)
164
- }, [m(b(O), { name: "close" })], 2)
174
+ onClick: t[0] ||= (e) => h.onDelete(F.filter.column)
175
+ }, [m(b(k), { name: "close" })], 2)
165
176
  ], 2)) : (_(), f("div", {
166
177
  key: 1,
167
178
  class: g(e.$style.top)
168
- }, [m(b(D), {
169
- "model-value": G.value.source,
170
- errorStatus: X.value,
171
- options: V.value,
179
+ }, [m(b(O), {
180
+ "model-value": J.value.source,
181
+ errorStatus: $.value,
182
+ options: H.value,
172
183
  style: { width: "100%" },
173
184
  "group-position": "top-left",
174
- "onUpdate:modelValue": z
185
+ "onUpdate:modelValue": B
175
186
  }, null, 8, [
176
187
  "model-value",
177
188
  "errorStatus",
178
189
  "options"
179
190
  ]), p("div", {
180
191
  class: g(e.$style.closeButton),
181
- onClick: t[1] ||= (e) => h.onDelete(P.filter.column)
182
- }, [m(b(O), { name: "close" })], 2)], 2)),
183
- q.value?.axesToBeFixed?.length ? (_(), f("div", {
192
+ onClick: t[1] ||= (e) => h.onDelete(F.filter.column)
193
+ }, [m(b(k), { name: "close" })], 2)], 2)),
194
+ X.value?.axesToBeFixed?.length ? (_(), f("div", {
184
195
  key: 2,
185
196
  class: g(e.$style.fixedAxesBlock)
186
- }, [(_(!0), f(c, null, v(q.value?.axesToBeFixed, (e) => (_(), u(b(T), {
197
+ }, [(_(!0), f(c, null, v(X.value?.axesToBeFixed, (e) => (_(), u(b(E), {
187
198
  key: e.idx,
188
- "model-value": G.value.axisFiltersByIndex[e.idx],
199
+ "model-value": J.value.axisFiltersByIndex[e.idx],
189
200
  label: e.label,
190
- "options-search": (t, n) => I(G.value.source, n, t, e.idx),
191
- disabled: B.value,
201
+ "options-search": (t, n) => L(J.value.source, n, t, e.idx),
202
+ disabled: V.value,
192
203
  clearable: !0,
193
- "onUpdate:modelValue": (t) => K(e.idx, t)
204
+ "onUpdate:modelValue": (t) => Y(e.idx, t)
194
205
  }, null, 8, [
195
206
  "model-value",
196
207
  "label",
@@ -198,88 +209,88 @@ var N = ["title"], P = /* @__PURE__ */ h({
198
209
  "disabled",
199
210
  "onUpdate:modelValue"
200
211
  ]))), 128))], 2)) : d("", !0),
201
- p("div", { class: g(P.filter.type === "isNA" || P.filter.type === "isNotNA" ? e.$style.bottom : e.$style.middle) }, [m(b(D), {
202
- "model-value": P.filter.type,
203
- options: Z.value,
204
- "group-position": P.filter.type === "isNA" || P.filter.type === "isNotNA" ? "bottom" : "middle",
205
- "onUpdate:modelValue": R
212
+ p("div", { class: g(F.filter.type === "isNA" || F.filter.type === "isNotNA" ? e.$style.bottom : e.$style.middle) }, [m(b(O), {
213
+ "model-value": F.filter.type,
214
+ options: ee.value,
215
+ "group-position": F.filter.type === "isNA" || F.filter.type === "isNotNA" ? "bottom" : "middle",
216
+ "onUpdate:modelValue": z
206
217
  }, null, 8, [
207
218
  "model-value",
208
219
  "options",
209
220
  "group-position"
210
221
  ])], 2),
211
- P.filter.type === "patternFuzzyContainSubsequence" ? (_(), f(c, { key: 3 }, [p("div", { class: g(e.$style.middle) }, [m(b(A), {
212
- "model-value": P.filter.value,
222
+ F.filter.type === "patternFuzzyContainSubsequence" ? (_(), f(c, { key: 3 }, [p("div", { class: g(e.$style.middle) }, [m(b(j), {
223
+ "model-value": F.filter.value,
213
224
  placeholder: "Substring",
214
225
  "group-position": "middle",
215
- "onUpdate:modelValue": t[2] ||= (e) => F("value", e)
216
- }, null, 8, ["model-value"])], 2), p("div", { class: g(e.$style.innerSection) }, [m(b(M), {
217
- "model-value": P.filter.maxEdits,
226
+ "onUpdate:modelValue": t[2] ||= (e) => I("value", e)
227
+ }, null, 8, ["model-value"])], 2), p("div", { class: g(e.$style.innerSection) }, [m(b(N), {
228
+ "model-value": F.filter.maxEdits,
218
229
  max: 5,
219
230
  breakpoints: "",
220
231
  label: "Maximum number of substitutions and indels",
221
- "onUpdate:modelValue": t[3] ||= (e) => F("maxEdits", e)
222
- }, null, 8, ["model-value"]), m(b(j), {
223
- "model-value": P.filter.substitutionsOnly,
232
+ "onUpdate:modelValue": t[3] ||= (e) => I("maxEdits", e)
233
+ }, null, 8, ["model-value"]), m(b(M), {
234
+ "model-value": F.filter.substitutionsOnly,
224
235
  label: "Substitutions only",
225
- "onUpdate:modelValue": t[4] ||= (e) => F("substitutionsOnly", e)
236
+ "onUpdate:modelValue": t[4] ||= (e) => I("substitutionsOnly", e)
226
237
  }, null, 8, ["model-value"])], 2)], 64)) : d("", !0),
227
238
  p("div", { class: g(e.$style.bottom) }, [
228
- P.filter.type === "patternEquals" || P.filter.type === "patternNotEquals" ? (_(), u(b(T), {
239
+ F.filter.type === "patternEquals" || F.filter.type === "patternNotEquals" ? (_(), u(b(E), {
229
240
  key: 0,
230
- "model-value": P.filter.value,
231
- "options-search": (e, t) => I(G.value.source, t, e),
241
+ "model-value": F.filter.value,
242
+ "options-search": (e, t) => L(J.value.source, t, e),
232
243
  clearable: !0,
233
244
  "group-position": "bottom",
234
- "onUpdate:modelValue": t[5] ||= (e) => F("value", e)
245
+ "onUpdate:modelValue": t[5] ||= (e) => I("value", e)
235
246
  }, null, 8, ["model-value", "options-search"])) : d("", !0),
236
- P.filter.type === "inSet" || P.filter.type === "notInSet" ? (_(), u(b(E), {
247
+ F.filter.type === "inSet" || F.filter.type === "notInSet" ? (_(), u(b(D), {
237
248
  key: 1,
238
- "model-value": P.filter.value,
239
- "options-search": (e, t) => L(G.value.source, t, e),
240
- disabled: B.value,
249
+ "model-value": F.filter.value,
250
+ "options-search": (e, t) => R(J.value.source, t, e),
251
+ disabled: V.value,
241
252
  "group-position": "bottom",
242
- "onUpdate:modelValue": t[6] ||= (e) => F("value", e)
253
+ "onUpdate:modelValue": t[6] ||= (e) => I("value", e)
243
254
  }, null, 8, [
244
255
  "model-value",
245
256
  "options-search",
246
257
  "disabled"
247
258
  ])) : d("", !0),
248
- b(a)(P.filter) ? (_(), u(b(k), {
259
+ b(a)(F.filter) ? (_(), u(b(A), {
249
260
  key: 2,
250
- "model-value": P.filter.x,
261
+ "model-value": F.filter.x,
251
262
  "group-position": "bottom",
252
- "onUpdate:modelValue": t[7] ||= (e) => F("x", e)
263
+ "onUpdate:modelValue": t[7] ||= (e) => I("x", e)
253
264
  }, null, 8, ["model-value"])) : d("", !0),
254
- b(o)(P.filter) ? (_(), u(b(k), {
265
+ b(o)(F.filter) ? (_(), u(b(A), {
255
266
  key: 3,
256
- "model-value": P.filter.n,
267
+ "model-value": F.filter.n,
257
268
  "group-position": "bottom",
258
- "onUpdate:modelValue": t[8] ||= (e) => F("n", e)
269
+ "onUpdate:modelValue": t[8] ||= (e) => I("n", e)
259
270
  }, null, 8, ["model-value"])) : d("", !0),
260
- P.filter.type === "patternContainSubsequence" || P.filter.type === "patternNotContainSubsequence" ? (_(), u(b(A), {
271
+ F.filter.type === "patternContainSubsequence" || F.filter.type === "patternNotContainSubsequence" ? (_(), u(b(j), {
261
272
  key: 4,
262
- "model-value": P.filter.value,
273
+ "model-value": F.filter.value,
263
274
  placeholder: "Substring",
264
275
  "group-position": "bottom",
265
- "onUpdate:modelValue": t[9] ||= (e) => F("value", e)
276
+ "onUpdate:modelValue": t[9] ||= (e) => I("value", e)
266
277
  }, null, 8, ["model-value"])) : d("", !0),
267
- P.filter.type === "patternMatchesRegularExpression" ? (_(), u(b(A), {
278
+ F.filter.type === "patternMatchesRegularExpression" ? (_(), u(b(j), {
268
279
  key: 5,
269
- "model-value": P.filter.value,
270
- error: $.value ? "Regular expression is not valid" : void 0,
280
+ "model-value": F.filter.value,
281
+ error: ne.value ? "Regular expression is not valid" : void 0,
271
282
  placeholder: "Regular expression",
272
283
  "group-position": "bottom",
273
- "onUpdate:modelValue": t[10] ||= (e) => F("value", e)
284
+ "onUpdate:modelValue": t[10] ||= (e) => I("value", e)
274
285
  }, null, 8, ["model-value", "error"])) : d("", !0),
275
- P.filter.type === "patternFuzzyContainSubsequence" ? (_(), u(b(D), {
286
+ F.filter.type === "patternFuzzyContainSubsequence" ? (_(), u(b(O), {
276
287
  key: 6,
277
- "model-value": P.filter.wildcard,
288
+ "model-value": F.filter.wildcard,
278
289
  clearable: "",
279
290
  placeholder: "Wildcard value",
280
- options: Q.value,
291
+ options: te.value,
281
292
  "group-position": "bottom",
282
- "onUpdate:modelValue": t[11] ||= (e) => F("wildcard", e)
293
+ "onUpdate:modelValue": t[11] ||= (e) => I("wildcard", e)
283
294
  }, null, 8, ["model-value", "options"])) : d("", !0)
284
295
  ], 2)
285
296
  ], 2), m(n, {
@@ -294,6 +305,6 @@ var N = ["title"], P = /* @__PURE__ */ h({
294
305
  }
295
306
  });
296
307
  //#endregion
297
- export { P as default };
308
+ export { F as default };
298
309
 
299
310
  //# 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 {\n getFilterInfo,\n getNormalizedSpec,\n isNumericFilter,\n isPositionFilter,\n mergeFilterForTypeChange,\n} from \"./utils\";\nimport { isNil } from \"es-toolkit\";\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 if (isNil(newType)) return;\n props.onUpdateFilter(mergeFilterForTypeChange(props.filter, newType));\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=\"changeFilterType\"\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":"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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 PTableColumnId,\n SUniversalPColumnId,\n} from \"@platforma-sdk/model\";\nimport {\n canonicalizeJson,\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 {\n getFilterInfo,\n getNormalizedSpec,\n isNumericFilter,\n isPositionFilter,\n mergeFilterForTypeChange,\n} from \"./utils\";\nimport { isNil } from \"es-toolkit\";\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 if (isNil(newType)) return;\n props.onUpdateFilter(mergeFilterForTypeChange(props.filter, newType));\n}\n\nfunction changeSourceId(newSourceId?: PlAdvancedFilterColumnId) {\n if (!newSourceId) {\n return;\n }\n const newSourceInfo = props.columnOptions.find((v) =>\n columnIdEquals(v.id, getSourceId(newSourceId)),\n );\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((op) =>\n columnIdEquals(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 isPTableColumnIdObject(c: PlAdvancedFilterColumnId): c is PTableColumnId {\n return typeof c === \"object\" && c !== null;\n}\n\nfunction getSourceId(column: PlAdvancedFilterColumnId): PlAdvancedFilterColumnId {\n // PTableColumnId object form: no axisFilters embedded, return as-is.\n if (isPTableColumnIdObject(column)) return column;\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) => columnIdEquals(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 // PTableColumnId object form has no axis filters baked in.\n if (isPTableColumnIdObject(column)) {\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n }\n try {\n const parsedColumnId = parseColumnId(column as SUniversalPColumnId);\n if (isFilteredPColumn(parsedColumnId)) {\n return {\n source: sourceId,\n axisFiltersByIndex: (parsedColumnId.axisFilters as AxisFilterByIdx[]).reduce(\n (res, item) => {\n res[item[0]] = item[1];\n return res;\n },\n axesToBeFixed,\n ),\n };\n }\n } catch {\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n }\n return { source: column, axisFiltersByIndex: axesToBeFixed };\n}\n\n/** Identity comparison for PlAdvancedFilterColumnId values — handles both string\n * and object (PTableColumnId) variants. */\nfunction columnIdEquals(a: PlAdvancedFilterColumnId, b: PlAdvancedFilterColumnId): boolean {\n if (a === b) return true;\n if (typeof a === \"object\" && typeof b === \"object\" && a !== null && b !== null) {\n return canonicalizeJson(a) === canonicalizeJson(b);\n }\n return false;\n}\n\nfunction stringifyColumn(value: ColumnAsSourceAndFixedAxes): PlAdvancedFilterColumnId {\n if (Object.keys(value.axisFiltersByIndex).length === 0) {\n return value.source;\n }\n // PTableColumnId object form can't carry axisFilters — return as-is.\n if (isPTableColumnIdObject(value.source)) return value.source;\n return stringifyColumnId({\n source: parseColumnId(value.source as SUniversalPColumnId) as unknown 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) => columnIdEquals(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=\"changeFilterType\"\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":"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"}
@@ -2,7 +2,7 @@ import { AxisId, AxisSpec, CanonicalizedJson, FilterSpec, FilterSpecLeaf, PColum
2
2
  import { SUPPORTED_FILTER_TYPES } from './constants';
3
3
  import { PartialBy, RequiredBy } from '@milaboratories/helpers';
4
4
  export type Operand = "or" | "and";
5
- export type PlAdvancedFilterColumnId = SUniversalPColumnId | CanonicalizedJson<AxisId> | CanonicalizedJson<PTableColumnId>;
5
+ export type PlAdvancedFilterColumnId = SUniversalPColumnId | CanonicalizedJson<AxisId> | PTableColumnId;
6
6
  export type RequiredMeta = {
7
7
  id: number;
8
8
  isExpanded?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/PlAdvancedFilter/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/PlAdvancedFilter/types.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ValueType, AxisSpec, PColumnSpec } from '@platforma-sdk/model';
2
2
  import { NodeFilter, EditableFilter, PlAdvancedFilterColumnId, SupportedFilterTypes } from './types';
3
3
  export declare function getNewId(): number;
4
- export declare function createNewGroup(selectedSourceId: string): NodeFilter;
4
+ export declare function createNewGroup(selectedSourceId: PlAdvancedFilterColumnId): NodeFilter;
5
5
  export type NormalizedSpecData = {
6
6
  valueType: ValueType;
7
7
  annotations: PColumnSpec["annotations"];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/PlAdvancedFilter/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,SAAS,EACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,QAAQ,WAEvB;AAED,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM,GAAG,UAAU,CAcnE;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;CAC7C,CAAC;AACF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAOlF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAQzE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAMxE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,IAAI,OAAO,CACxE,cAAc,EACd;IACE,IAAI,EACA,OAAO,GACP,UAAU,GACV,UAAU,GACV,iBAAiB,GACjB,aAAa,GACb,oBAAoB,CAAC;CAC1B,CACF,CASA;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,GACrB,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAEjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,IAAI,OAAO,CACvE,cAAc,EACd;IACE,IAAI,EACA,eAAe,GACf,kBAAkB,GAClB,2BAA2B,GAC3B,8BAA8B,GAC9B,iCAAiC,GACjC,gCAAgC,CAAC;CACtC,CACF,CASA;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC;CACrD,CAEA;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,wBAAwB,CAY3E;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAehB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/PlAdvancedFilter/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,SAAS,EACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,QAAQ,WAEvB;AAED,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,wBAAwB,GAAG,UAAU,CAcrF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;CAC7C,CAAC;AACF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAOlF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAQzE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAMxE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,IAAI,OAAO,CACxE,cAAc,EACd;IACE,IAAI,EACA,OAAO,GACP,UAAU,GACV,UAAU,GACV,iBAAiB,GACjB,aAAa,GACb,oBAAoB,CAAC;CAC1B,CACF,CASA;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,GACrB,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAEjE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,IAAI,OAAO,CACvE,cAAc,EACd;IACE,IAAI,EACA,eAAe,GACf,kBAAkB,GAClB,2BAA2B,GAC3B,8BAA8B,GAC9B,iCAAiC,GACjC,gCAAgC,CAAC;CACtC,CACF,CASA;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC;CACrD,CAEA;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,wBAAwB,CAY3E;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAehB"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../src/components/PlAdvancedFilter/utils.ts"],"sourcesContent":["import { filterUiMetadata } from \"@milaboratories/uikit\";\nimport type {\n AnchoredPColumnId,\n AxisId,\n CanonicalizedJson,\n FilteredPColumnId,\n ValueType,\n} from \"@platforma-sdk/model\";\nimport {\n getTypeFromPColumnOrAxisSpec,\n isAnchoredPColumnId,\n isAxisId,\n isFilteredPColumn,\n parseJson,\n type AxisSpec,\n type PColumnSpec,\n type SUniversalPColumnId,\n} from \"@platforma-sdk/model\";\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS } from \"./constants\";\nimport type { NodeFilter } from \"./types\";\nimport {\n type CommonFilter,\n type EditableFilter,\n type PlAdvancedFilterColumnId,\n type SupportedFilterTypes,\n} from \"./types\";\n\nexport function getNewId() {\n return Date.now();\n}\n\nexport function createNewGroup(selectedSourceId: string): NodeFilter {\n return {\n id: getNewId(),\n isExpanded: true,\n type: \"and\",\n filters: [\n {\n id: getNewId(),\n isExpanded: true,\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: selectedSourceId as SUniversalPColumnId,\n } as CommonFilter,\n ],\n };\n}\n\nexport type NormalizedSpecData = {\n valueType: ValueType;\n annotations: PColumnSpec[\"annotations\"];\n domain: PColumnSpec[\"domain\"];\n contextDomain: PColumnSpec[\"contextDomain\"];\n};\nexport function getNormalizedSpec(spec: PColumnSpec | AxisSpec): NormalizedSpecData {\n return {\n valueType: getTypeFromPColumnOrAxisSpec(spec),\n annotations: spec.annotations,\n domain: spec.domain,\n contextDomain: spec.contextDomain,\n };\n}\n\nexport function isNumericValueType(spec?: PColumnSpec | AxisSpec): boolean {\n if (!spec) {\n return false;\n }\n const valueType = getNormalizedSpec(spec).valueType;\n return (\n valueType === \"Int\" || valueType === \"Long\" || valueType === \"Float\" || valueType === \"Double\"\n );\n}\n\nexport function isStringValueType(spec?: PColumnSpec | AxisSpec): boolean {\n if (!spec) {\n return false;\n }\n const valueType = getNormalizedSpec(spec).valueType;\n return valueType === \"String\";\n}\n\nexport function isNumericFilter(filter: EditableFilter): filter is Extract<\n EditableFilter,\n {\n type:\n | \"equal\"\n | \"notEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\";\n }\n> {\n return (\n filter.type === \"equal\" ||\n filter.type === \"notEqual\" ||\n filter.type === \"lessThan\" ||\n filter.type === \"lessThanOrEqual\" ||\n filter.type === \"greaterThan\" ||\n filter.type === \"greaterThanOrEqual\"\n );\n}\n\nexport function isPositionFilter(\n filter: EditableFilter,\n): filter is Extract<EditableFilter, { type: \"topN\" | \"bottomN\" }> {\n return filter.type === \"topN\" || filter.type === \"bottomN\";\n}\n\nexport function isStringFilter(filter: EditableFilter): filter is Extract<\n EditableFilter,\n {\n type:\n | \"patternEquals\"\n | \"patternNotEquals\"\n | \"patternContainSubsequence\"\n | \"patternNotContainSubsequence\"\n | \"patternMatchesRegularExpression\"\n | \"patternFuzzyContainSubsequence\";\n }\n> {\n return (\n filter.type === \"patternEquals\" ||\n filter.type === \"patternNotEquals\" ||\n filter.type === \"patternContainSubsequence\" ||\n filter.type === \"patternNotContainSubsequence\" ||\n filter.type === \"patternMatchesRegularExpression\" ||\n filter.type === \"patternFuzzyContainSubsequence\"\n );\n}\n\nexport function getFilterInfo(filterType: SupportedFilterTypes): {\n label: string;\n supportedFor: (spec: NormalizedSpecData) => boolean;\n} {\n return filterUiMetadata[filterType as keyof typeof filterUiMetadata];\n}\n\nexport function isValidColumnId(id: unknown): id is PlAdvancedFilterColumnId {\n if (typeof id !== \"string\") {\n return false;\n }\n try {\n const parsedId = parseJson<FilteredPColumnId | AnchoredPColumnId | AxisId>(\n id as CanonicalizedJson<FilteredPColumnId | AnchoredPColumnId | AxisId>,\n );\n return isFilteredPColumn(parsedId) || isAnchoredPColumnId(parsedId) || isAxisId(parsedId);\n } catch {\n return false;\n }\n}\n\nexport function mergeFilterForTypeChange(\n oldFilter: EditableFilter,\n newType: SupportedFilterTypes,\n): EditableFilter {\n const oldDefault = DEFAULT_FILTERS[oldFilter.type] as Record<string, unknown>;\n const newDefault = DEFAULT_FILTERS[newType];\n\n const stripped = { ...oldFilter } as Record<string, unknown>;\n for (const key of Object.keys(oldDefault)) {\n if (key === \"type\" || key === \"column\") continue;\n delete stripped[key];\n }\n\n return {\n ...newDefault,\n ...stripped,\n type: newType,\n } as EditableFilter;\n}\n"],"mappings":";;;;AA2BA,SAAgB,IAAW;AACzB,QAAO,KAAK,KAAK;;AAGnB,SAAgB,EAAe,GAAsC;AACnE,QAAO;EACL,IAAI,GAAU;EACd,YAAY;EACZ,MAAM;EACN,SAAS,CACP;GACE,IAAI,GAAU;GACd,YAAY;GACZ,GAAG,EAAgB;GACnB,QAAQ;GACT,CACF;EACF;;AASH,SAAgB,EAAkB,GAAkD;AAClF,QAAO;EACL,WAAW,EAA6B,EAAK;EAC7C,aAAa,EAAK;EAClB,QAAQ,EAAK;EACb,eAAe,EAAK;EACrB;;AAGH,SAAgB,EAAmB,GAAwC;AACzE,KAAI,CAAC,EACH,QAAO;CAET,IAAM,IAAY,EAAkB,EAAK,CAAC;AAC1C,QACE,MAAc,SAAS,MAAc,UAAU,MAAc,WAAW,MAAc;;AAI1F,SAAgB,EAAkB,GAAwC;AAKxE,QAJK,IAGa,EAAkB,EAAK,CAAC,cACrB,WAHZ;;AAMX,SAAgB,EAAgB,GAW9B;AACA,QACE,EAAO,SAAS,WAChB,EAAO,SAAS,cAChB,EAAO,SAAS,cAChB,EAAO,SAAS,qBAChB,EAAO,SAAS,iBAChB,EAAO,SAAS;;AAIpB,SAAgB,EACd,GACiE;AACjE,QAAO,EAAO,SAAS,UAAU,EAAO,SAAS;;AAyBnD,SAAgB,EAAc,GAG5B;AACA,QAAO,EAAiB;;AAG1B,SAAgB,EAAgB,GAA6C;AAC3E,KAAI,OAAO,KAAO,SAChB,QAAO;AAET,KAAI;EACF,IAAM,IAAW,EACf,EACD;AACD,SAAO,EAAkB,EAAS,IAAI,EAAoB,EAAS,IAAI,EAAS,EAAS;SACnF;AACN,SAAO;;;AAIX,SAAgB,EACd,GACA,GACgB;CAChB,IAAM,IAAa,EAAgB,EAAU,OACvC,IAAa,EAAgB,IAE7B,IAAW,EAAE,GAAG,GAAW;AACjC,MAAK,IAAM,KAAO,OAAO,KAAK,EAAW,CACnC,OAAQ,UAAU,MAAQ,YAC9B,OAAO,EAAS;AAGlB,QAAO;EACL,GAAG;EACH,GAAG;EACH,MAAM;EACP"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../src/components/PlAdvancedFilter/utils.ts"],"sourcesContent":["import { filterUiMetadata } from \"@milaboratories/uikit\";\nimport type {\n AnchoredPColumnId,\n AxisId,\n CanonicalizedJson,\n FilteredPColumnId,\n ValueType,\n} from \"@platforma-sdk/model\";\nimport {\n getTypeFromPColumnOrAxisSpec,\n isAnchoredPColumnId,\n isAxisId,\n isFilteredPColumn,\n parseJson,\n type AxisSpec,\n type PColumnSpec,\n type SUniversalPColumnId,\n} from \"@platforma-sdk/model\";\nimport { DEFAULT_FILTER_TYPE, DEFAULT_FILTERS } from \"./constants\";\nimport type { NodeFilter } from \"./types\";\nimport {\n type CommonFilter,\n type EditableFilter,\n type PlAdvancedFilterColumnId,\n type SupportedFilterTypes,\n} from \"./types\";\n\nexport function getNewId() {\n return Date.now();\n}\n\nexport function createNewGroup(selectedSourceId: PlAdvancedFilterColumnId): NodeFilter {\n return {\n id: getNewId(),\n isExpanded: true,\n type: \"and\",\n filters: [\n {\n id: getNewId(),\n isExpanded: true,\n ...DEFAULT_FILTERS[DEFAULT_FILTER_TYPE],\n column: selectedSourceId as SUniversalPColumnId,\n } as CommonFilter,\n ],\n };\n}\n\nexport type NormalizedSpecData = {\n valueType: ValueType;\n annotations: PColumnSpec[\"annotations\"];\n domain: PColumnSpec[\"domain\"];\n contextDomain: PColumnSpec[\"contextDomain\"];\n};\nexport function getNormalizedSpec(spec: PColumnSpec | AxisSpec): NormalizedSpecData {\n return {\n valueType: getTypeFromPColumnOrAxisSpec(spec),\n annotations: spec.annotations,\n domain: spec.domain,\n contextDomain: spec.contextDomain,\n };\n}\n\nexport function isNumericValueType(spec?: PColumnSpec | AxisSpec): boolean {\n if (!spec) {\n return false;\n }\n const valueType = getNormalizedSpec(spec).valueType;\n return (\n valueType === \"Int\" || valueType === \"Long\" || valueType === \"Float\" || valueType === \"Double\"\n );\n}\n\nexport function isStringValueType(spec?: PColumnSpec | AxisSpec): boolean {\n if (!spec) {\n return false;\n }\n const valueType = getNormalizedSpec(spec).valueType;\n return valueType === \"String\";\n}\n\nexport function isNumericFilter(filter: EditableFilter): filter is Extract<\n EditableFilter,\n {\n type:\n | \"equal\"\n | \"notEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\";\n }\n> {\n return (\n filter.type === \"equal\" ||\n filter.type === \"notEqual\" ||\n filter.type === \"lessThan\" ||\n filter.type === \"lessThanOrEqual\" ||\n filter.type === \"greaterThan\" ||\n filter.type === \"greaterThanOrEqual\"\n );\n}\n\nexport function isPositionFilter(\n filter: EditableFilter,\n): filter is Extract<EditableFilter, { type: \"topN\" | \"bottomN\" }> {\n return filter.type === \"topN\" || filter.type === \"bottomN\";\n}\n\nexport function isStringFilter(filter: EditableFilter): filter is Extract<\n EditableFilter,\n {\n type:\n | \"patternEquals\"\n | \"patternNotEquals\"\n | \"patternContainSubsequence\"\n | \"patternNotContainSubsequence\"\n | \"patternMatchesRegularExpression\"\n | \"patternFuzzyContainSubsequence\";\n }\n> {\n return (\n filter.type === \"patternEquals\" ||\n filter.type === \"patternNotEquals\" ||\n filter.type === \"patternContainSubsequence\" ||\n filter.type === \"patternNotContainSubsequence\" ||\n filter.type === \"patternMatchesRegularExpression\" ||\n filter.type === \"patternFuzzyContainSubsequence\"\n );\n}\n\nexport function getFilterInfo(filterType: SupportedFilterTypes): {\n label: string;\n supportedFor: (spec: NormalizedSpecData) => boolean;\n} {\n return filterUiMetadata[filterType as keyof typeof filterUiMetadata];\n}\n\nexport function isValidColumnId(id: unknown): id is PlAdvancedFilterColumnId {\n if (typeof id !== \"string\") {\n return false;\n }\n try {\n const parsedId = parseJson<FilteredPColumnId | AnchoredPColumnId | AxisId>(\n id as CanonicalizedJson<FilteredPColumnId | AnchoredPColumnId | AxisId>,\n );\n return isFilteredPColumn(parsedId) || isAnchoredPColumnId(parsedId) || isAxisId(parsedId);\n } catch {\n return false;\n }\n}\n\nexport function mergeFilterForTypeChange(\n oldFilter: EditableFilter,\n newType: SupportedFilterTypes,\n): EditableFilter {\n const oldDefault = DEFAULT_FILTERS[oldFilter.type] as Record<string, unknown>;\n const newDefault = DEFAULT_FILTERS[newType];\n\n const stripped = { ...oldFilter } as Record<string, unknown>;\n for (const key of Object.keys(oldDefault)) {\n if (key === \"type\" || key === \"column\") continue;\n delete stripped[key];\n }\n\n return {\n ...newDefault,\n ...stripped,\n type: newType,\n } as EditableFilter;\n}\n"],"mappings":";;;;AA2BA,SAAgB,IAAW;AACzB,QAAO,KAAK,KAAK;;AAGnB,SAAgB,EAAe,GAAwD;AACrF,QAAO;EACL,IAAI,GAAU;EACd,YAAY;EACZ,MAAM;EACN,SAAS,CACP;GACE,IAAI,GAAU;GACd,YAAY;GACZ,GAAG,EAAgB;GACnB,QAAQ;GACT,CACF;EACF;;AASH,SAAgB,EAAkB,GAAkD;AAClF,QAAO;EACL,WAAW,EAA6B,EAAK;EAC7C,aAAa,EAAK;EAClB,QAAQ,EAAK;EACb,eAAe,EAAK;EACrB;;AAGH,SAAgB,EAAmB,GAAwC;AACzE,KAAI,CAAC,EACH,QAAO;CAET,IAAM,IAAY,EAAkB,EAAK,CAAC;AAC1C,QACE,MAAc,SAAS,MAAc,UAAU,MAAc,WAAW,MAAc;;AAI1F,SAAgB,EAAkB,GAAwC;AAKxE,QAJK,IAGa,EAAkB,EAAK,CAAC,cACrB,WAHZ;;AAMX,SAAgB,EAAgB,GAW9B;AACA,QACE,EAAO,SAAS,WAChB,EAAO,SAAS,cAChB,EAAO,SAAS,cAChB,EAAO,SAAS,qBAChB,EAAO,SAAS,iBAChB,EAAO,SAAS;;AAIpB,SAAgB,EACd,GACiE;AACjE,QAAO,EAAO,SAAS,UAAU,EAAO,SAAS;;AAyBnD,SAAgB,EAAc,GAG5B;AACA,QAAO,EAAiB;;AAG1B,SAAgB,EAAgB,GAA6C;AAC3E,KAAI,OAAO,KAAO,SAChB,QAAO;AAET,KAAI;EACF,IAAM,IAAW,EACf,EACD;AACD,SAAO,EAAkB,EAAS,IAAI,EAAoB,EAAS,IAAI,EAAS,EAAS;SACnF;AACN,SAAO;;;AAIX,SAAgB,EACd,GACA,GACgB;CAChB,IAAM,IAAa,EAAgB,EAAU,OACvC,IAAa,EAAgB,IAE7B,IAAW,EAAE,GAAG,GAAW;AACjC,MAAK,IAAM,KAAO,OAAO,KAAK,EAAW,CACnC,OAAQ,UAAU,MAAQ,YAC9B,OAAO,EAAS;AAGlB,QAAO;EACL,GAAG;EACH,GAAG;EACH,MAAM;EACP"}