@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.
- package/.turbo/turbo-build.log +19 -19
- package/.turbo/turbo-formatter$colon$check.log +2 -2
- package/.turbo/turbo-linter$colon$check.log +2 -2
- package/.turbo/turbo-types$colon$check.log +1 -1
- package/CHANGELOG.md +38 -0
- package/dist/components/PlAdvancedFilter/FilterEditor.js.map +1 -1
- package/dist/components/PlAdvancedFilter/FilterEditor.style.js.map +1 -1
- package/dist/components/PlAdvancedFilter/FilterEditor.vue.d.ts.map +1 -1
- package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js +124 -113
- package/dist/components/PlAdvancedFilter/FilterEditor.vue2.js.map +1 -1
- package/dist/components/PlAdvancedFilter/types.d.ts +1 -1
- package/dist/components/PlAdvancedFilter/types.d.ts.map +1 -1
- package/dist/components/PlAdvancedFilter/utils.d.ts +1 -1
- package/dist/components/PlAdvancedFilter/utils.d.ts.map +1 -1
- package/dist/components/PlAdvancedFilter/utils.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.style.js.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +125 -121
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js.map +1 -1
- package/dist/components/PlAgDataTable/compositions/useFilterableColumns.d.ts +4 -4
- package/dist/components/PlAgDataTable/sources/row-number.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/row-number.js +1 -1
- package/dist/components/PlAgDataTable/sources/row-number.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts +40 -4
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.js +91 -56
- package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-state-v2.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-state-v2.js +65 -64
- package/dist/components/PlAgDataTable/sources/table-state-v2.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/value-rendering.d.ts +3 -3
- package/dist/components/PlAgDataTable/sources/value-rendering.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/value-rendering.js +12 -12
- package/dist/components/PlAgDataTable/sources/value-rendering.js.map +1 -1
- package/dist/components/PlAnnotations/components/PlAnnotations.vue2.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.style.js.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue.d.ts.map +1 -1
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js +42 -45
- package/dist/components/PlTableFilters/PlTableFiltersV2.vue2.js.map +1 -1
- package/dist/internal/service_factories.d.ts +4 -3
- package/dist/internal/service_factories.d.ts.map +1 -1
- package/dist/internal/service_factories.js +6 -4
- package/dist/internal/service_factories.js.map +1 -1
- package/package.json +7 -6
- package/src/components/PlAdvancedFilter/FilterEditor.vue +39 -10
- package/src/components/PlAdvancedFilter/types.ts +3 -2
- package/src/components/PlAdvancedFilter/utils.ts +1 -1
- package/src/components/PlAgDataTable/PlAgDataTableV2.vue +21 -5
- package/src/components/PlAgDataTable/sources/row-number.ts +1 -0
- package/src/components/PlAgDataTable/sources/table-source-v2.ts +132 -31
- package/src/components/PlAgDataTable/sources/table-state-v2.ts +6 -7
- package/src/components/PlAgDataTable/sources/value-rendering.ts +7 -7
- package/src/components/PlTableFilters/PlTableFiltersV2.vue +9 -13
- 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 {
|
|
6
|
-
import { isNil as
|
|
7
|
-
import { PlAutocomplete as
|
|
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
|
|
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
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
...
|
|
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
|
|
32
|
-
return
|
|
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
|
|
40
|
-
if (t === "label" && typeof n == "string") return
|
|
41
|
-
if (t === "value" && Array.isArray(n)) return (await Promise.all(n.map((n) =>
|
|
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
|
|
45
|
-
|
|
44
|
+
function z(e) {
|
|
45
|
+
T(e) || F.onUpdateFilter(s(F.filter, e));
|
|
46
46
|
}
|
|
47
|
-
function
|
|
47
|
+
function B(n) {
|
|
48
48
|
if (!n) return;
|
|
49
|
-
let a =
|
|
49
|
+
let a = F.columnOptions.find((e) => K(e.id, W(n)));
|
|
50
50
|
if (!a) return;
|
|
51
|
-
let o = r(
|
|
52
|
-
o.supportedFor(s) ?
|
|
53
|
-
...
|
|
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
|
-
}) :
|
|
55
|
+
}) : F.onUpdateFilter({
|
|
56
56
|
...e[t],
|
|
57
57
|
column: n
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
|
-
let
|
|
61
|
-
let 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
|
|
66
|
-
value:
|
|
65
|
+
return V.value && e.unshift({
|
|
66
|
+
value: F.filter.column,
|
|
67
67
|
label: "Inconsistent value"
|
|
68
68
|
}), e;
|
|
69
69
|
});
|
|
70
|
-
function
|
|
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 =
|
|
73
|
-
return
|
|
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
|
|
79
|
-
let t =
|
|
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 =
|
|
82
|
-
if (
|
|
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
|
|
98
|
-
return
|
|
99
|
-
|
|
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
|
|
104
|
-
get: () =>
|
|
114
|
+
let J = l({
|
|
115
|
+
get: () => G(F.filter.column),
|
|
105
116
|
set: (e) => {
|
|
106
|
-
|
|
107
|
-
...
|
|
108
|
-
column:
|
|
117
|
+
F.onUpdateFilter({
|
|
118
|
+
...F.filter,
|
|
119
|
+
column: q(e)
|
|
109
120
|
});
|
|
110
121
|
}
|
|
111
122
|
});
|
|
112
|
-
function
|
|
113
|
-
|
|
114
|
-
...
|
|
123
|
+
function Y(e, t) {
|
|
124
|
+
J.value = {
|
|
125
|
+
...J.value,
|
|
115
126
|
axisFiltersByIndex: {
|
|
116
|
-
...
|
|
127
|
+
...J.value.axisFiltersByIndex,
|
|
117
128
|
[e]: t
|
|
118
129
|
}
|
|
119
130
|
};
|
|
120
131
|
}
|
|
121
|
-
let
|
|
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
|
-
}))),
|
|
135
|
+
}))), te = l(() => F.filter.type === "patternFuzzyContainSubsequence" ? X.value?.alphabet === "nucleotide" ? [{
|
|
125
136
|
label: "N",
|
|
126
137
|
value: "N"
|
|
127
|
-
}] :
|
|
138
|
+
}] : X.value?.alphabet === "aminoacid" ? [{
|
|
128
139
|
label: "X",
|
|
129
140
|
value: "X"
|
|
130
|
-
}] : [...new Set(
|
|
141
|
+
}] : [...new Set(F.filter.value.split(""))].sort().map((e) => ({
|
|
131
142
|
value: e,
|
|
132
143
|
label: e
|
|
133
|
-
})) : []),
|
|
134
|
-
if (
|
|
144
|
+
})) : []), ne = l(() => {
|
|
145
|
+
if (F.filter.type !== "patternMatchesRegularExpression") return !1;
|
|
135
146
|
try {
|
|
136
|
-
return new RegExp(
|
|
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]:
|
|
158
|
+
{ [e.$style.error]: $.value }
|
|
148
159
|
])
|
|
149
160
|
}, [
|
|
150
|
-
p("div", { class: g([e.$style.typeIcon, { [e.$style.error]:
|
|
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(
|
|
164
|
+
})) : (_(), u(b(k), {
|
|
154
165
|
key: 1,
|
|
155
|
-
name:
|
|
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:
|
|
160
|
-
}, [p("div", { class: g(e.$style.title) }, y(
|
|
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(
|
|
164
|
-
}, [m(b(
|
|
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(
|
|
169
|
-
"model-value":
|
|
170
|
-
errorStatus:
|
|
171
|
-
options:
|
|
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":
|
|
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(
|
|
182
|
-
}, [m(b(
|
|
183
|
-
|
|
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(
|
|
197
|
+
}, [(_(!0), f(c, null, v(X.value?.axesToBeFixed, (e) => (_(), u(b(E), {
|
|
187
198
|
key: e.idx,
|
|
188
|
-
"model-value":
|
|
199
|
+
"model-value": J.value.axisFiltersByIndex[e.idx],
|
|
189
200
|
label: e.label,
|
|
190
|
-
"options-search": (t, n) =>
|
|
191
|
-
disabled:
|
|
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) =>
|
|
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(
|
|
202
|
-
"model-value":
|
|
203
|
-
options:
|
|
204
|
-
"group-position":
|
|
205
|
-
"onUpdate:modelValue":
|
|
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
|
-
|
|
212
|
-
"model-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) =>
|
|
216
|
-
}, null, 8, ["model-value"])], 2), p("div", { class: g(e.$style.innerSection) }, [m(b(
|
|
217
|
-
"model-value":
|
|
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) =>
|
|
222
|
-
}, null, 8, ["model-value"]), m(b(
|
|
223
|
-
"model-value":
|
|
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) =>
|
|
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
|
-
|
|
239
|
+
F.filter.type === "patternEquals" || F.filter.type === "patternNotEquals" ? (_(), u(b(E), {
|
|
229
240
|
key: 0,
|
|
230
|
-
"model-value":
|
|
231
|
-
"options-search": (e, t) =>
|
|
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) =>
|
|
245
|
+
"onUpdate:modelValue": t[5] ||= (e) => I("value", e)
|
|
235
246
|
}, null, 8, ["model-value", "options-search"])) : d("", !0),
|
|
236
|
-
|
|
247
|
+
F.filter.type === "inSet" || F.filter.type === "notInSet" ? (_(), u(b(D), {
|
|
237
248
|
key: 1,
|
|
238
|
-
"model-value":
|
|
239
|
-
"options-search": (e, t) =>
|
|
240
|
-
disabled:
|
|
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) =>
|
|
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)(
|
|
259
|
+
b(a)(F.filter) ? (_(), u(b(A), {
|
|
249
260
|
key: 2,
|
|
250
|
-
"model-value":
|
|
261
|
+
"model-value": F.filter.x,
|
|
251
262
|
"group-position": "bottom",
|
|
252
|
-
"onUpdate:modelValue": t[7] ||= (e) =>
|
|
263
|
+
"onUpdate:modelValue": t[7] ||= (e) => I("x", e)
|
|
253
264
|
}, null, 8, ["model-value"])) : d("", !0),
|
|
254
|
-
b(o)(
|
|
265
|
+
b(o)(F.filter) ? (_(), u(b(A), {
|
|
255
266
|
key: 3,
|
|
256
|
-
"model-value":
|
|
267
|
+
"model-value": F.filter.n,
|
|
257
268
|
"group-position": "bottom",
|
|
258
|
-
"onUpdate:modelValue": t[8] ||= (e) =>
|
|
269
|
+
"onUpdate:modelValue": t[8] ||= (e) => I("n", e)
|
|
259
270
|
}, null, 8, ["model-value"])) : d("", !0),
|
|
260
|
-
|
|
271
|
+
F.filter.type === "patternContainSubsequence" || F.filter.type === "patternNotContainSubsequence" ? (_(), u(b(j), {
|
|
261
272
|
key: 4,
|
|
262
|
-
"model-value":
|
|
273
|
+
"model-value": F.filter.value,
|
|
263
274
|
placeholder: "Substring",
|
|
264
275
|
"group-position": "bottom",
|
|
265
|
-
"onUpdate:modelValue": t[9] ||= (e) =>
|
|
276
|
+
"onUpdate:modelValue": t[9] ||= (e) => I("value", e)
|
|
266
277
|
}, null, 8, ["model-value"])) : d("", !0),
|
|
267
|
-
|
|
278
|
+
F.filter.type === "patternMatchesRegularExpression" ? (_(), u(b(j), {
|
|
268
279
|
key: 5,
|
|
269
|
-
"model-value":
|
|
270
|
-
error:
|
|
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) =>
|
|
284
|
+
"onUpdate:modelValue": t[10] ||= (e) => I("value", e)
|
|
274
285
|
}, null, 8, ["model-value", "error"])) : d("", !0),
|
|
275
|
-
|
|
286
|
+
F.filter.type === "patternFuzzyContainSubsequence" ? (_(), u(b(O), {
|
|
276
287
|
key: 6,
|
|
277
|
-
"model-value":
|
|
288
|
+
"model-value": F.filter.wildcard,
|
|
278
289
|
clearable: "",
|
|
279
290
|
placeholder: "Wildcard value",
|
|
280
|
-
options:
|
|
291
|
+
options: te.value,
|
|
281
292
|
"group-position": "bottom",
|
|
282
|
-
"onUpdate:modelValue": t[11] ||= (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 {
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;EAuCA,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,GAAkC;AACtD,KAAM,EAAQ,IAClB,EAAM,eAAe,EAAyB,EAAM,QAAQ,EAAQ,CAAC;;EAGvE,SAAS,EAAe,GAAwC;AAC9D,OAAI,CAAC,EACH;GAEF,IAAM,IAAgB,EAAM,cAAc,MAAM,MAC9C,EAAe,EAAE,IAAI,EAAY,EAAY,CAAC,CAC/C;AACD,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,MAAM,MAC/C,EAAe,EAAG,IAAI,EAAY,EAAM,OAAO,OAAO,CAAC,CACxD,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,EAAuB,GAAkD;AAChF,UAAO,OAAO,KAAM,cAAY;;EAGlC,SAAS,EAAY,GAA4D;AAE/E,OAAI,EAAuB,EAAO,CAAE,QAAO;AAC3C,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,EAAe,EAAG,IAAI,EAAS,CAAC,EACjD,iBAAiB,EAAE,EAAE,QACjD,GAAK,OACJ,EAAI,EAAK,OAAO,KAAA,GACT,IAET,EAAE,CACH;AAED,OAAI,EAAuB,EAAO,CAChC,QAAO;IAAE,QAAQ;IAAQ,oBAAoB;IAAe;AAE9D,OAAI;IACF,IAAM,IAAiB,EAAc,EAA8B;AACnE,QAAI,EAAkB,EAAe,CACnC,QAAO;KACL,QAAQ;KACR,oBAAqB,EAAe,YAAkC,QACnE,GAAK,OACJ,EAAI,EAAK,MAAM,EAAK,IACb,IAET,EACD;KACF;WAEG;AACN,WAAO;KAAE,QAAQ;KAAQ,oBAAoB;KAAe;;AAE9D,UAAO;IAAE,QAAQ;IAAQ,oBAAoB;IAAe;;EAK9D,SAAS,EAAe,GAA6B,GAAsC;AAKzF,UAJI,MAAM,IAAU,KAChB,OAAO,KAAM,YAAY,OAAO,KAAM,YAAY,MAAM,QAAQ,MAAM,OACjE,EAAiB,EAAE,KAAK,EAAiB,EAAE,GAE7C;;EAGT,SAAS,EAAgB,GAA6D;AAMpF,UALI,OAAO,KAAK,EAAM,mBAAmB,CAAC,WAAW,KAIjD,EAAuB,EAAM,OAAO,GAAS,EAAM,SAChD,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,EAAe,EAAG,IAAI,EAA2B,MAAM,OAAO,CAAC,CACjG,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,KAAqB,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,KAAkB,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,KAAqB,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,GAAA;IACT,kBAA2B,EAAM,OAAO,SAAI,UAAe,EAAM,OAAO,SAAI,YAAA,WAAA;IAG5E,uBAAoB;;;;;;GAKT,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,QAAG,MAAM,EAAgB,SAAU,EAAC;;IAGjD,EAAM,OAAO,SAAI,qCAAA,GAAA,EADzB,EAOE,EAAA,EAAA,EAAA;;KALC,eAAa,EAAM,OAAO;KAC1B,OAAO,GAAA,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,GAAA;KACV,kBAAe;KACd,uBAAkB,AAAA,EAAA,SAAG,MAAM,EAAgB,YAAa,EAAC;;;SAIhE,EAAgF,GAAA;GAAhE,QAAQ,EAAA;GAAU,UAAU,EAAA;GAAS,UAAQ,EAAA"}
|
|
@@ -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> |
|
|
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":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,WAAW,EACX,cAAc,EACd,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC;
|
|
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:
|
|
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,
|
|
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:
|
|
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"}
|