@platforma-sdk/ui-vue 1.42.15 → 1.42.18
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 +29 -28
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +8 -0
- package/dist/components/PlAgDataTable/PlAgDataTableSheets.vue2.js +5 -5
- package/dist/components/PlAgDataTable/PlAgDataTableV2.vue2.js +21 -21
- package/dist/components/PlAgDataTable/sources/table-source-v2.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-source-v2.js +124 -125
- package/dist/components/PlAgDataTable/sources/table-source-v2.js.map +1 -1
- package/dist/components/PlAgDataTable/sources/table-state-v2.js +3 -3
- package/dist/components/PlAgDataTable/sources/value-rendering.d.ts.map +1 -1
- package/dist/components/PlAgDataTable/sources/value-rendering.js +24 -25
- package/dist/components/PlAgDataTable/sources/value-rendering.js.map +1 -1
- package/dist/components/PlAnnotations/components/DynamicForm.vue2.js +12 -12
- package/dist/components/PlAnnotations/components/FilterSidebar.vue2.js +2 -2
- package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue.d.ts.map +1 -1
- package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue.js +21 -20
- package/dist/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/data.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/data.js +170 -185
- package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
- package/dist/components/PlTableFilters/filters-state.js +8 -8
- package/dist/components/PlTableFilters/filters_logic.d.ts.map +1 -1
- package/dist/components/PlTableFilters/filters_logic.js +67 -77
- package/dist/components/PlTableFilters/filters_logic.js.map +1 -1
- package/dist/defineApp.js +20 -20
- package/dist/internal/UpdateSerializer.js +3 -3
- package/dist/lib/model/common/dist/index.js +523 -414
- package/dist/lib/model/common/dist/index.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/DataTable/TableComponent.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlAccordion/{ExpandTransition.vue.js → ExpandTransition.vue2.js} +1 -1
- package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue2.js.map +1 -0
- package/dist/lib/ui/uikit/dist/components/PlAccordion/PlAccordionSection.vue2.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlAutocomplete/PlAutocomplete.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlDropdown/PlDropdown.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlDropdownLegacy/PlDropdownLegacy.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlDropdownMulti/PlDropdownMulti.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlFileDialog/Local.vue.js +6 -6
- package/dist/lib/ui/uikit/dist/components/PlFileInput/PlFileInput.vue.js +28 -28
- package/dist/lib/ui/uikit/dist/components/PlFileInput/PlFileInput.vue.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlLogView/PlLogView.vue.js +89 -63
- package/dist/lib/ui/uikit/dist/components/PlLogView/PlLogView.vue.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlTextArea/PlTextArea.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/components/PlTextField/PlTextField.vue.js +1 -1
- package/dist/lib/ui/uikit/dist/generated/components/svg/images/{SvgRequired.vue.js → SvgRequired.vue2.js} +1 -1
- package/dist/lib/ui/uikit/dist/generated/components/svg/images/SvgRequired.vue2.js.map +1 -0
- package/dist/lib/ui/uikit/dist/helpers/dom.js.map +1 -1
- package/dist/lib/ui/uikit/dist/helpers/downloadContent.js +32 -0
- package/dist/lib/ui/uikit/dist/helpers/downloadContent.js.map +1 -0
- package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js +201 -159
- package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js.map +1 -1
- package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js +521 -517
- package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js.map +1 -1
- package/dist/lib.js +52 -50
- package/dist/lib.js.map +1 -1
- package/dist/sdk/model/dist/index.js +410 -406
- package/dist/sdk/model/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/components/PlAgDataTable/sources/table-source-v2.ts +20 -16
- package/src/components/PlAgDataTable/sources/value-rendering.ts +15 -7
- package/src/components/PlAppErrorNotificationAlert/PlAppErrorNotificationAlert.vue +1 -0
- package/src/components/PlMultiSequenceAlignment/data.ts +12 -12
- package/src/components/PlTableFilters/filters_logic.ts +18 -15
- package/dist/lib/ui/uikit/dist/components/PlAccordion/ExpandTransition.vue.js.map +0 -1
- package/dist/lib/ui/uikit/dist/generated/components/svg/images/SvgRequired.vue.js.map +0 -1
|
@@ -1,279 +1,264 @@
|
|
|
1
1
|
import { isJsonEqual as J } from "../../lib/util/helpers/dist/index.js";
|
|
2
|
-
import { getRawPlatformaInstance as
|
|
3
|
-
import { ref as M, watch as
|
|
4
|
-
import { highlightByChemicalProperties as
|
|
5
|
-
import { parseMarkup as
|
|
6
|
-
import { multiSequenceAlignment as
|
|
7
|
-
import { getResidueCounts as
|
|
8
|
-
import { ensureError as
|
|
9
|
-
const
|
|
10
|
-
an
|
|
11
|
-
), hn = C(
|
|
2
|
+
import { getRawPlatformaInstance as Z, isLabelColumn as N, isLinkerColumn as G, createRowSelectionColumn as H } from "../../sdk/model/dist/index.js";
|
|
3
|
+
import { ref as M, watch as K } from "vue";
|
|
4
|
+
import { highlightByChemicalProperties as Q } from "./chemical-properties.js";
|
|
5
|
+
import { parseMarkup as X, markupAlignedSequence as Y, highlightByMarkup as nn } from "./markup.js";
|
|
6
|
+
import { multiSequenceAlignment as tn } from "./multi-sequence-alignment.js";
|
|
7
|
+
import { getResidueCounts as en } from "./residue-counts.js";
|
|
8
|
+
import { ensureError as rn, readAnnotation as b, canonicalizeJson as v, getAxisId as O, parseJson as S, matchAxisId as an, readAnnotationJson as j, pTableValue as q, Annotation as g } from "../../lib/model/common/dist/index.js";
|
|
9
|
+
const C = () => Z().pFrameDriver, E = 1e3, wn = L(
|
|
12
10
|
on
|
|
13
|
-
),
|
|
14
|
-
rn
|
|
15
|
-
), bn = C(
|
|
11
|
+
), An = L(
|
|
16
12
|
sn
|
|
13
|
+
), bn = L(
|
|
14
|
+
ln
|
|
15
|
+
), vn = L(
|
|
16
|
+
cn
|
|
17
17
|
);
|
|
18
|
-
async function
|
|
19
|
-
pFrame:
|
|
20
|
-
sequenceColumnPredicate:
|
|
18
|
+
async function on({
|
|
19
|
+
pFrame: l,
|
|
20
|
+
sequenceColumnPredicate: r
|
|
21
21
|
}) {
|
|
22
|
-
if (!
|
|
23
|
-
const t = (await
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
29
|
-
}).toArray(), l = t.map(({ value: o }) => o);
|
|
30
|
-
return { options: t, defaults: l };
|
|
22
|
+
if (!l) return;
|
|
23
|
+
const t = (await C().listColumns(l)).values().filter((o) => r(o)).map(({ spec: o, columnId: f }) => ({
|
|
24
|
+
label: b(o, g.Label) ?? "Unlabeled column",
|
|
25
|
+
value: f
|
|
26
|
+
})).toArray(), i = t.map(({ value: o }) => o);
|
|
27
|
+
return { options: t, defaults: i };
|
|
31
28
|
}
|
|
32
|
-
async function
|
|
33
|
-
pFrame:
|
|
34
|
-
sequenceColumnIds:
|
|
29
|
+
async function sn({
|
|
30
|
+
pFrame: l,
|
|
31
|
+
sequenceColumnIds: r
|
|
35
32
|
}) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return d.spec.axesSpec.values().map((a) => [A(E(a)), a]);
|
|
33
|
+
if (!l || !r) return;
|
|
34
|
+
const m = C(), p = await m.listColumns(l), t = /* @__PURE__ */ new Map(), i = new Map(
|
|
35
|
+
r.values().flatMap((e) => {
|
|
36
|
+
const s = p.find(({ columnId: c }) => c === e);
|
|
37
|
+
if (!s)
|
|
38
|
+
throw new Error(`Couldn't find sequence column (ID: \`${e}\`).`);
|
|
39
|
+
return s.spec.axesSpec.values().map((c) => [v(O(c)), c]);
|
|
44
40
|
})
|
|
45
41
|
);
|
|
46
|
-
for (const [
|
|
47
|
-
const
|
|
48
|
-
({ spec:
|
|
42
|
+
for (const [e, s] of i.entries()) {
|
|
43
|
+
const c = S(e), h = p.find(
|
|
44
|
+
({ spec: x }) => N(x) && an(c, O(x.axesSpec[0]))
|
|
49
45
|
);
|
|
50
46
|
t.set(
|
|
51
|
-
|
|
52
|
-
(
|
|
47
|
+
h ? v({ type: "column", id: h.columnId }) : v({ type: "axis", id: c }),
|
|
48
|
+
b(h == null ? void 0 : h.spec, g.Label) ?? b(s, g.Label) ?? "Unlabeled axis"
|
|
53
49
|
);
|
|
54
50
|
}
|
|
55
|
-
const { hits: o } = await
|
|
51
|
+
const { hits: o } = await m.findColumns(l, {
|
|
56
52
|
columnFilter: {},
|
|
57
|
-
compatibleWith:
|
|
53
|
+
compatibleWith: i.keys().map((e) => S(e)).toArray(),
|
|
58
54
|
strictlyCompatible: !1
|
|
59
55
|
});
|
|
60
|
-
for (const { columnId:
|
|
61
|
-
const
|
|
62
|
-
t.has(
|
|
63
|
-
|
|
64
|
-
(
|
|
56
|
+
for (const { columnId: e, spec: s } of o) {
|
|
57
|
+
const c = v({ type: "column", id: e });
|
|
58
|
+
t.has(c) || t.set(
|
|
59
|
+
c,
|
|
60
|
+
b(s, g.Label) ?? "Unlabeled column"
|
|
65
61
|
);
|
|
66
62
|
}
|
|
67
|
-
const
|
|
68
|
-
if (
|
|
69
|
-
const
|
|
70
|
-
return
|
|
71
|
-
}).map(({ value:
|
|
72
|
-
return { options:
|
|
63
|
+
const f = t.entries().map(([e, s]) => ({ label: s, value: S(e) })).toArray(), d = f.values().filter(({ value: e }) => {
|
|
64
|
+
if (e.type === "axis") return !0;
|
|
65
|
+
const s = p.find(({ columnId: c }) => c === e.id);
|
|
66
|
+
return s && N(s.spec);
|
|
67
|
+
}).map(({ value: e }) => e).toArray();
|
|
68
|
+
return { options: f, defaults: d };
|
|
73
69
|
}
|
|
74
|
-
async function
|
|
75
|
-
pFrame:
|
|
76
|
-
sequenceColumnIds:
|
|
70
|
+
async function ln({
|
|
71
|
+
pFrame: l,
|
|
72
|
+
sequenceColumnIds: r
|
|
77
73
|
}) {
|
|
78
|
-
if (!
|
|
79
|
-
const p = await
|
|
80
|
-
(
|
|
74
|
+
if (!l || (r == null ? void 0 : r.length) !== 1) return;
|
|
75
|
+
const p = await C().listColumns(l), t = p.find(
|
|
76
|
+
(i) => i.columnId === r[0]
|
|
81
77
|
);
|
|
82
78
|
if (!t)
|
|
83
79
|
throw new Error(
|
|
84
|
-
`Couldn't find sequence column (ID: \`${
|
|
80
|
+
`Couldn't find sequence column (ID: \`${r[0]}\`).`
|
|
85
81
|
);
|
|
86
82
|
return p.values().filter(
|
|
87
|
-
(
|
|
88
|
-
var
|
|
89
|
-
return ((
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
).
|
|
95
|
-
var u;
|
|
96
|
-
return {
|
|
97
|
-
value: l,
|
|
98
|
-
label: ((u = o.annotations) == null ? void 0 : u["pl7.app/label"]) ?? "Unlabeled column"
|
|
99
|
-
};
|
|
100
|
-
}).toArray();
|
|
83
|
+
(i) => !!j(i.spec, g.Sequence.IsAnnotation) && J(t.spec.axesSpec, i.spec.axesSpec) && Object.entries(t.spec.domain ?? {}).every(([o, f]) => {
|
|
84
|
+
var d;
|
|
85
|
+
return ((d = i.spec.domain) == null ? void 0 : d[o]) === f;
|
|
86
|
+
})
|
|
87
|
+
).map(({ columnId: i, spec: o }) => ({
|
|
88
|
+
value: i,
|
|
89
|
+
label: b(o, g.Label) ?? "Unlabeled column"
|
|
90
|
+
})).toArray();
|
|
101
91
|
}
|
|
102
|
-
async function
|
|
103
|
-
pFrame:
|
|
104
|
-
sequenceColumnIds:
|
|
105
|
-
labelColumnIds:
|
|
92
|
+
async function cn({
|
|
93
|
+
pFrame: l,
|
|
94
|
+
sequenceColumnIds: r,
|
|
95
|
+
labelColumnIds: m,
|
|
106
96
|
selection: p,
|
|
107
97
|
colorScheme: t,
|
|
108
|
-
alignmentParams:
|
|
98
|
+
alignmentParams: i
|
|
109
99
|
}) {
|
|
110
|
-
var
|
|
111
|
-
if (!
|
|
112
|
-
const o =
|
|
113
|
-
let
|
|
100
|
+
var F;
|
|
101
|
+
if (!l || !(r != null && r.length) || !m) return;
|
|
102
|
+
const o = C(), f = await o.listColumns(l), d = f.filter((n) => G(n.spec)), e = H({ selection: p });
|
|
103
|
+
let s = {
|
|
114
104
|
type: "inner",
|
|
115
|
-
entries:
|
|
105
|
+
entries: r.map((n) => ({
|
|
116
106
|
type: "column",
|
|
117
107
|
column: n
|
|
118
108
|
}))
|
|
119
109
|
};
|
|
120
|
-
|
|
110
|
+
d.length > 0 && (s = {
|
|
121
111
|
type: "outer",
|
|
122
|
-
primary:
|
|
123
|
-
secondary:
|
|
112
|
+
primary: s,
|
|
113
|
+
secondary: d.map(({ columnId: n }) => ({
|
|
124
114
|
type: "column",
|
|
125
115
|
column: n
|
|
126
116
|
}))
|
|
127
|
-
}),
|
|
117
|
+
}), e && (s = {
|
|
128
118
|
type: "inner",
|
|
129
119
|
entries: [
|
|
130
|
-
|
|
120
|
+
s,
|
|
131
121
|
{
|
|
132
122
|
type: "inlineColumn",
|
|
133
|
-
column:
|
|
123
|
+
column: e
|
|
134
124
|
}
|
|
135
125
|
]
|
|
136
126
|
});
|
|
137
|
-
const
|
|
138
|
-
t.type === "markup" &&
|
|
139
|
-
const
|
|
127
|
+
const c = m.flatMap((n) => n.type !== "column" ? [] : { type: "column", column: n.id });
|
|
128
|
+
t.type === "markup" && c.push({ type: "column", column: t.columnId });
|
|
129
|
+
const h = Array.from(
|
|
140
130
|
new Set(
|
|
141
|
-
|
|
142
|
-
const
|
|
143
|
-
if (!
|
|
131
|
+
r.values().flatMap((n) => {
|
|
132
|
+
const u = f.find(({ columnId: a }) => a === n);
|
|
133
|
+
if (!u)
|
|
144
134
|
throw new Error(`Couldn't find sequence column (ID: ${n})`);
|
|
145
|
-
return
|
|
135
|
+
return u.spec.axesSpec.map((a) => v(O(a)));
|
|
146
136
|
})
|
|
147
137
|
)
|
|
148
138
|
).sort().map((n) => ({
|
|
149
|
-
column: { type: "axis", id:
|
|
139
|
+
column: { type: "axis", id: S(n) },
|
|
150
140
|
ascending: !0,
|
|
151
141
|
naAndAbsentAreLeastValues: !0
|
|
152
|
-
})),
|
|
142
|
+
})), x = {
|
|
153
143
|
src: {
|
|
154
144
|
type: "outer",
|
|
155
|
-
primary:
|
|
156
|
-
secondary:
|
|
145
|
+
primary: s,
|
|
146
|
+
secondary: c
|
|
157
147
|
},
|
|
158
148
|
filters: [],
|
|
159
|
-
sorting:
|
|
160
|
-
},
|
|
161
|
-
|
|
162
|
-
JSON.parse(JSON.stringify(
|
|
149
|
+
sorting: h
|
|
150
|
+
}, w = await o.calculateTableData(
|
|
151
|
+
l,
|
|
152
|
+
JSON.parse(JSON.stringify(x)),
|
|
163
153
|
{
|
|
164
154
|
offset: 0,
|
|
165
155
|
// +1 is a hack to check whether the selection is over the limit
|
|
166
|
-
length:
|
|
156
|
+
length: E + 1
|
|
167
157
|
}
|
|
168
158
|
);
|
|
169
|
-
let
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
const
|
|
173
|
-
if (!
|
|
159
|
+
let A = (w == null ? void 0 : w[0].data.data.length) ?? 0, I = !1;
|
|
160
|
+
A > E && (A = E, I = !0);
|
|
161
|
+
const R = r.map((n) => {
|
|
162
|
+
const u = w.find(({ spec: a }) => a.id === n);
|
|
163
|
+
if (!u)
|
|
174
164
|
throw new Error(`Couldn't find sequence column (ID: \`${n}\`).`);
|
|
175
|
-
return
|
|
176
|
-
}),
|
|
177
|
-
const
|
|
178
|
-
if (n.type === "axis" &&
|
|
179
|
-
return J(n.id,
|
|
180
|
-
if (n.type === "column" &&
|
|
181
|
-
return n.id ===
|
|
165
|
+
return u;
|
|
166
|
+
}), z = m.map((n) => {
|
|
167
|
+
const u = w.find(({ spec: a }) => {
|
|
168
|
+
if (n.type === "axis" && a.type === "axis")
|
|
169
|
+
return J(n.id, a.id);
|
|
170
|
+
if (n.type === "column" && a.type === "column")
|
|
171
|
+
return n.id === a.id;
|
|
182
172
|
});
|
|
183
|
-
if (!
|
|
173
|
+
if (!u)
|
|
184
174
|
throw new Error(`Couldn't find label column (ID: \`${n}\`).`);
|
|
185
|
-
return
|
|
186
|
-
}),
|
|
187
|
-
|
|
188
|
-
(n) =>
|
|
175
|
+
return u;
|
|
176
|
+
}), B = await Promise.all(
|
|
177
|
+
R.map(
|
|
178
|
+
(n) => tn(
|
|
189
179
|
Array.from(
|
|
190
|
-
{ length:
|
|
191
|
-
(
|
|
192
|
-
var
|
|
193
|
-
return ((
|
|
180
|
+
{ length: A },
|
|
181
|
+
(u, a) => {
|
|
182
|
+
var y;
|
|
183
|
+
return ((y = q(n.data, a, { na: "", absent: "" })) == null ? void 0 : y.toString()) ?? "";
|
|
194
184
|
}
|
|
195
185
|
),
|
|
196
|
-
|
|
186
|
+
i
|
|
197
187
|
)
|
|
198
188
|
)
|
|
199
|
-
),
|
|
200
|
-
{ length:
|
|
201
|
-
(n,
|
|
202
|
-
),
|
|
203
|
-
(n) =>
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
(s) => {
|
|
211
|
-
var w;
|
|
212
|
-
return ((w = O(s.data, r, { na: "", absent: "" })) == null ? void 0 : w.toString()) ?? "";
|
|
189
|
+
), $ = Array.from(
|
|
190
|
+
{ length: A },
|
|
191
|
+
(n, u) => B.map((a) => a[u])
|
|
192
|
+
), T = R.map(
|
|
193
|
+
(n) => b(n.spec.spec, g.Label) ?? "Unlabeled column"
|
|
194
|
+
), V = Array.from(
|
|
195
|
+
{ length: A },
|
|
196
|
+
(n, u) => z.map(
|
|
197
|
+
(a) => {
|
|
198
|
+
var y;
|
|
199
|
+
return ((y = q(a.data, u, { na: "", absent: "" })) == null ? void 0 : y.toString()) ?? "";
|
|
213
200
|
}
|
|
214
201
|
)
|
|
215
|
-
),
|
|
216
|
-
sequences:
|
|
217
|
-
sequenceNames:
|
|
218
|
-
labelRows:
|
|
219
|
-
exceedsLimit:
|
|
220
|
-
residueCounts:
|
|
202
|
+
), D = $.map((n) => n.join(" ")), U = en(D), k = {
|
|
203
|
+
sequences: D,
|
|
204
|
+
sequenceNames: T,
|
|
205
|
+
labelRows: V,
|
|
206
|
+
exceedsLimit: I,
|
|
207
|
+
residueCounts: U
|
|
221
208
|
};
|
|
222
209
|
if (t.type === "chemical-properties")
|
|
223
|
-
k.highlightImage =
|
|
224
|
-
sequences:
|
|
225
|
-
residueCounts:
|
|
210
|
+
k.highlightImage = Q({
|
|
211
|
+
sequences: D,
|
|
212
|
+
residueCounts: U
|
|
226
213
|
});
|
|
227
214
|
else if (t.type === "markup") {
|
|
228
|
-
const n =
|
|
229
|
-
({ spec:
|
|
215
|
+
const n = w.find(
|
|
216
|
+
({ spec: y }) => y.id === t.columnId
|
|
230
217
|
);
|
|
231
218
|
if (!n)
|
|
232
219
|
throw new Error(
|
|
233
220
|
`Couldn't find markup column (ID: \`${t.columnId}\`).`
|
|
234
221
|
);
|
|
235
|
-
const
|
|
236
|
-
{ length:
|
|
237
|
-
(
|
|
238
|
-
var
|
|
239
|
-
const
|
|
240
|
-
((
|
|
222
|
+
const u = Array.from(
|
|
223
|
+
{ length: A },
|
|
224
|
+
(y, P) => {
|
|
225
|
+
var _;
|
|
226
|
+
const W = X(
|
|
227
|
+
((_ = q(n.data, P, { na: "", absent: "" })) == null ? void 0 : _.toString()) ?? ""
|
|
241
228
|
);
|
|
242
|
-
return
|
|
229
|
+
return Y($[P][0], W);
|
|
243
230
|
}
|
|
244
|
-
),
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
columnCount: ((P = x.at(0)) == null ? void 0 : P.length) ?? 0,
|
|
250
|
-
labels: s
|
|
231
|
+
), a = j(n.spec.spec, g.Sequence.Annotation.Mapping) ?? {};
|
|
232
|
+
k.highlightImage = nn({
|
|
233
|
+
markupRows: u,
|
|
234
|
+
columnCount: ((F = D.at(0)) == null ? void 0 : F.length) ?? 0,
|
|
235
|
+
labels: a
|
|
251
236
|
});
|
|
252
237
|
}
|
|
253
238
|
return k;
|
|
254
239
|
}
|
|
255
|
-
function
|
|
256
|
-
const
|
|
240
|
+
function L(l) {
|
|
241
|
+
const r = M(), m = M(!0), p = M();
|
|
257
242
|
let t;
|
|
258
|
-
return (
|
|
259
|
-
if (J(o,
|
|
260
|
-
const
|
|
243
|
+
return (i) => (K(i, async (o, f) => {
|
|
244
|
+
if (J(o, f)) return;
|
|
245
|
+
const d = t = Symbol();
|
|
261
246
|
try {
|
|
262
|
-
p.value = void 0,
|
|
263
|
-
const
|
|
264
|
-
|
|
265
|
-
} catch (
|
|
266
|
-
console.error(
|
|
247
|
+
p.value = void 0, m.value = !0;
|
|
248
|
+
const e = await l(o);
|
|
249
|
+
d === t && (r.value = e);
|
|
250
|
+
} catch (e) {
|
|
251
|
+
console.error(e), d === t && (p.value = rn(e));
|
|
267
252
|
} finally {
|
|
268
|
-
|
|
253
|
+
d === t && (m.value = !1);
|
|
269
254
|
}
|
|
270
|
-
}, { immediate: !0 }), { data:
|
|
255
|
+
}, { immediate: !0 }), { data: r, isLoading: m, error: p });
|
|
271
256
|
}
|
|
272
257
|
export {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
258
|
+
E as sequenceLimit,
|
|
259
|
+
An as useLabelColumnsOptions,
|
|
260
|
+
bn as useMarkupColumnsOptions,
|
|
261
|
+
vn as useMultipleAlignmentData,
|
|
262
|
+
wn as useSequenceColumnsOptions
|
|
278
263
|
};
|
|
279
264
|
//# sourceMappingURL=data.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n value: columnId,\n }))\n .toArray();\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/label']\n ?? 'Unlabeled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns.values()\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData({\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n}): Promise<MultipleAlignmentData | undefined> {\n if (!pFrame || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n secondaryEntry.push({ type: 'column', column: colorScheme.columnId });\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n const table = await pFrameDriver.calculateTableData(\n pFrame,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabeled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (colorScheme.type === 'chemical-properties') {\n result.highlightImage = highlightByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n });\n } else if (colorScheme.type === 'markup') {\n const markupColumn = table.find(({ spec }) =>\n spec.id === colorScheme.columnId,\n );\n if (!markupColumn) {\n throw new Error(\n `Couldn't find markup column (ID: \\`${colorScheme.columnId}\\`).`,\n );\n }\n const markupRows = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n const labels: Record<string, string> = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n result.highlightImage = highlightByMarkup({\n markupRows,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n labels,\n });\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage?: {\n blob: Blob;\n legend: HighlightLegend;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","labelColumnIds","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","highlightByChemicalProperties","markupColumn","markupRows","markup","parseMarkup","markupAlignedSequence","highlightByMarkup","cb","data","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n readAnnotation,\n Annotation,\n readAnnotationJson,\n} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n value: columnId,\n }))\n .toArray();\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n readAnnotation(labelColumn?.spec, Annotation.Label)\n ?? readAnnotation(axisSpec, Annotation.Label)\n ?? 'Unlabeled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson({ type: 'column', id: columnId } satisfies PTableColumnId);\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns.values()\n .filter((column) =>\n !!readAnnotationJson(column.spec, Annotation.Sequence.IsAnnotation)\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData({\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n}): Promise<MultipleAlignmentData | undefined> {\n if (!pFrame || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n secondaryEntry.push({ type: 'column', column: colorScheme.columnId });\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n const table = await pFrameDriver.calculateTableData(\n pFrame,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n readAnnotation(column.spec.spec, Annotation.Label) ?? 'Unlabeled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (colorScheme.type === 'chemical-properties') {\n result.highlightImage = highlightByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n });\n } else if (colorScheme.type === 'markup') {\n const markupColumn = table.find(({ spec }) =>\n spec.id === colorScheme.columnId,\n );\n if (!markupColumn) {\n throw new Error(\n `Couldn't find markup column (ID: \\`${colorScheme.columnId}\\`).`,\n );\n }\n const markupRows = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n const labels = readAnnotationJson(markupColumn.spec.spec, Annotation.Sequence.Annotation.Mapping) ?? {};\n result.highlightImage = highlightByMarkup({\n markupRows,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n labels,\n });\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage?: {\n blob: Blob;\n legend: HighlightLegend;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","readAnnotation","Annotation","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","compatibleColumns","columnIdJson","label","sequenceColumn","readAnnotationJson","isJsonEqual","key","_a","labelColumnIds","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","highlightByChemicalProperties","markupColumn","markupRows","markup","parseMarkup","markupAlignedSequence","highlightByMarkup","cb","data","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ref as J, reactive as V, watch as h } from "vue";
|
|
2
2
|
import "../../sdk/model/dist/index.js";
|
|
3
3
|
import { isJsonEqual as b } from "../../lib/util/helpers/dist/index.js";
|
|
4
|
-
import { getFilterOptions as g, makeDiscreteOptions as
|
|
5
|
-
import { getPTableColumnId as
|
|
6
|
-
function
|
|
4
|
+
import { getFilterOptions as g, makeDiscreteOptions as j, isFilterValid as F, isAlphabetic as k, getColumnName as q } from "./filters_logic.js";
|
|
5
|
+
import { getPTableColumnId as x, canonicalizeJson as f } from "../../lib/model/common/dist/index.js";
|
|
6
|
+
function K(M, m) {
|
|
7
7
|
const w = J(/* @__PURE__ */ new Map()), o = V({
|
|
8
8
|
value: []
|
|
9
9
|
});
|
|
@@ -13,17 +13,17 @@ function N(M, m) {
|
|
|
13
13
|
const p = w.value = new Map(
|
|
14
14
|
d.map((e, t) => {
|
|
15
15
|
try {
|
|
16
|
-
const i =
|
|
16
|
+
const i = x(e), l = n(e), r = l.options ? g(e).filter((y) => l.options.includes(y.value)) : g(e);
|
|
17
17
|
if (r.length === 0) return null;
|
|
18
|
-
const u =
|
|
18
|
+
const u = j(e), c = l.default && F(l.default, r, u) ? l.default : null, S = c ? {
|
|
19
19
|
value: c,
|
|
20
20
|
disabled: !1,
|
|
21
21
|
open: !1
|
|
22
22
|
} : null, C = {
|
|
23
23
|
id: i,
|
|
24
24
|
spec: e,
|
|
25
|
-
label:
|
|
26
|
-
alphabetic:
|
|
25
|
+
label: q(e, t),
|
|
26
|
+
alphabetic: k(e),
|
|
27
27
|
options: r,
|
|
28
28
|
discreteOptions: u,
|
|
29
29
|
defaultFilter: c,
|
|
@@ -73,6 +73,6 @@ function N(M, m) {
|
|
|
73
73
|
), o;
|
|
74
74
|
}
|
|
75
75
|
export {
|
|
76
|
-
|
|
76
|
+
K as useFilters
|
|
77
77
|
};
|
|
78
78
|
//# sourceMappingURL=filters-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters_logic.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/filters_logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"filters_logic.d.ts","sourceRoot":"","sources":["../../../src/components/PlTableFilters/filters_logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAQtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACtC,eAAe,EAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAC7C,OAAO,CAUT;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAmC9D;AAED,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAU7C,CAAC;AAEX,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAU7C,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAM1F;AAED,MAAM,MAAM,qBAAqB,GAC7B,yBAAyB,GACzB,4BAA4B,GAC5B,yBAAyB,GACzB,4BAA4B,CAAC;AAEjC,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAEtE,eAAO,MAAM,mBAAmB,EAAE,yBAAyB,EAKjD,CAAC;AAEX,eAAO,MAAM,oBAAoB,WACvB,iBAAiB,KACxB,MAAM,IAAI,yBAEZ,CAAC;AAEF,eAAO,MAAM,gBAAgB,WAAY,aAAa,KAAG,MAAM,IAAI,qBAElE,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,UAE7E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CA0BrF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAsChH;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,iBAAiB,EACvB,eAAe,EAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAC7C,aAAa,CASf;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAsB3E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,GAChB,UAAU,CAAC,MAAM,CAAC,EAAE,CAoBtB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAc3F;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAI9D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,sBAAsB,CA+GhG"}
|