@milaboratories/miplots4 1.0.137 → 1.0.139
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/dist/discrete/index.d.ts.map +1 -1
- package/dist/discrete/index.js +88 -87
- package/dist/discrete/index.js.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.js +117 -113
- package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/dist/utils/arraysAreDifferent.d.ts +3 -1
- package/dist/utils/arraysAreDifferent.d.ts.map +1 -1
- package/dist/utils/arraysAreDifferent.js +11 -3
- package/dist/utils/arraysAreDifferent.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discrete/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,EAAmC,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvH,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAIH,oBAAoB,EAUvB,MAAM,wBAAwB,CAAC;AAgBhC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discrete/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,EAAmC,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvH,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAIH,oBAAoB,EAUvB,MAAM,wBAAwB,CAAC;AAgBhC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqE3D,qBAAa,aAAc,SAAQ,aAAa;IAC5C,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,aAAa,gBAAuB;IAEpC,mBAAmB,EAAE,CAAC,CAAC,EAAC,OAAO,KAAK,IAAI,CAAmB;IAC3D,cAAc,EAAE;QACZ,UAAU,EAAE,SAAS,EAAE,CAAC;QACxB,eAAe,EAAE,SAAS,EAAE,CAAC;QAC7B,eAAe,EAAE,YAAY,CAAC;QAC9B,iBAAiB,EAAE,YAAY,CAAC;QAChC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC5B,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,YAAY,EAAE,OAAO,CAAC;KACzB,GAAG,IAAI,CAAQ;gBAEJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,qBAAqB;IAS9F,KAAK,CAAC,IAAI,EAAE,WAAW;IAevB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB;IAyBjE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAIhD,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,oBAAoB;IAmBtG,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IAUpE,WAAW;IA0GX,gBAAgB;IA2BhB,YAAY;CAyBf"}
|
package/dist/discrete/index.js
CHANGED
|
@@ -1,43 +1,44 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { l as
|
|
5
|
-
import { renderToString as
|
|
1
|
+
var K = Object.defineProperty;
|
|
2
|
+
var x = (u, n, e) => n in u ? K(u, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : u[n] = e;
|
|
3
|
+
var G = (u, n, e) => x(u, typeof n != "symbol" ? n + "" : n, e);
|
|
4
|
+
import { l as N } from "../node_modules/lodash/lodash.js";
|
|
5
|
+
import { renderToString as O } from "../node_modules/react-dom/server.browser.js";
|
|
6
6
|
import { AbstractChart as T } from "../AbstractChart.js";
|
|
7
7
|
import { NO_GROUPED as C } from "../DataFrame.js";
|
|
8
8
|
import P from "./ChartRenderer.js";
|
|
9
|
-
import { MAX_GROUPS_COUNT as
|
|
10
|
-
import { DiscreteSettingsImpl as
|
|
11
|
-
import { getBoxesData as
|
|
12
|
-
import { getViolinsData as
|
|
13
|
-
import { getSinaData as
|
|
14
|
-
import { getDotsData as
|
|
15
|
-
import { getLinesData as
|
|
16
|
-
import { getErrorBarsData as
|
|
17
|
-
import { getBarsData as
|
|
18
|
-
import { getStackedBarsData as
|
|
19
|
-
import { getStackedAreaData as
|
|
20
|
-
import { getBinnedDotsData as
|
|
9
|
+
import { MAX_GROUPS_COUNT as S, MAX_FACETS_COUNT as U } from "./constants.js";
|
|
10
|
+
import { DiscreteSettingsImpl as _, StatLayer as B, BoxLayer as I, ViolinLayer as F, DotLayer as V, LineLayer as $, ErrorBarLayer as j, BarLayer as H, StackedBarLayer as M, StackedAreaLayer as X, BinnedDotsLayer as q, PairedPointsLayer as z, SinaLayer as J, LogoPlotLayer as Q } from "./DiscreteSettingsImpl.js";
|
|
11
|
+
import { getBoxesData as W } from "./layers/boxes.js";
|
|
12
|
+
import { getViolinsData as Y } from "./layers/violins.js";
|
|
13
|
+
import { getSinaData as Z } from "./layers/sina.js";
|
|
14
|
+
import { getDotsData as tt } from "./layers/dots.js";
|
|
15
|
+
import { getLinesData as at } from "./layers/lines.js";
|
|
16
|
+
import { getErrorBarsData as et } from "./layers/errorbars.js";
|
|
17
|
+
import { getBarsData as rt } from "./layers/bar.js";
|
|
18
|
+
import { getStackedBarsData as ot } from "./layers/stackedBar.js";
|
|
19
|
+
import { getStackedAreaData as nt } from "./layers/stackedArea.js";
|
|
20
|
+
import { getBinnedDotsData as it } from "./layers/binnedDots.js";
|
|
21
21
|
import { getPairedPointsData as st } from "./layers/pairedPoints.js";
|
|
22
|
-
import { getLogoData as
|
|
23
|
-
import { getStatsData as
|
|
24
|
-
import { getFacetStringKey as
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
import { getLogoData as lt } from "./layers/logo.js";
|
|
23
|
+
import { getStatsData as ut } from "./layers/stats/index.js";
|
|
24
|
+
import { getFacetStringKey as v } from "./utils/getFacetStringKey.js";
|
|
25
|
+
import { arraysAreDifferent as k } from "../utils/arraysAreDifferent.js";
|
|
26
|
+
function b(u, n, e = null) {
|
|
27
|
+
const t = n.value, o = u.getColumnCategories(t);
|
|
28
|
+
return N.intersection(e ?? o, o).map(String);
|
|
28
29
|
}
|
|
29
|
-
function
|
|
30
|
-
if (!
|
|
30
|
+
function A(u) {
|
|
31
|
+
if (!u.length)
|
|
31
32
|
return [];
|
|
32
33
|
let n = [[]];
|
|
33
|
-
return
|
|
34
|
+
return u.forEach((e) => {
|
|
34
35
|
const t = [];
|
|
35
36
|
e.forEach((o) => {
|
|
36
37
|
t.push(...n.map((s) => [...s, o]));
|
|
37
38
|
}), n = t;
|
|
38
39
|
}), n;
|
|
39
40
|
}
|
|
40
|
-
function
|
|
41
|
+
function E(u, n) {
|
|
41
42
|
if (!n)
|
|
42
43
|
return {
|
|
43
44
|
keys: ["null"],
|
|
@@ -46,29 +47,29 @@ function G(l, n) {
|
|
|
46
47
|
valueLabels: { null: "" },
|
|
47
48
|
inheritedAes: null
|
|
48
49
|
};
|
|
49
|
-
const e = n.columnName.value, t = n.columnName.valueLabels, o =
|
|
50
|
-
|
|
50
|
+
const e = n.columnName.value, t = n.columnName.valueLabels, o = u.getColumnCategories(e, !1), s = (r) => t ? String(
|
|
51
|
+
u.getColumnValue(
|
|
51
52
|
t,
|
|
52
|
-
|
|
53
|
+
u.getColumnCategoryRowIndex(e, r)
|
|
53
54
|
)
|
|
54
|
-
) : r,
|
|
55
|
+
) : r, l = u.getColumnCategories(e, !n.allowNullGroup);
|
|
55
56
|
return {
|
|
56
|
-
keys: n.order === void 0 ?
|
|
57
|
+
keys: n.order === void 0 ? l : N.intersection(n.order.map(String), l),
|
|
57
58
|
value: e,
|
|
58
59
|
label: n.columnName.label ?? e,
|
|
59
|
-
valueLabels: o.reduce((r,
|
|
60
|
+
valueLabels: o.reduce((r, c) => (r[c] = s(c), r), {}),
|
|
60
61
|
inheritedAes: n.inheritedAes ?? null
|
|
61
62
|
};
|
|
62
63
|
}
|
|
63
|
-
class
|
|
64
|
+
class Kt extends T {
|
|
64
65
|
constructor(e, t, o) {
|
|
65
66
|
super(e, t);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
G(this, "settings");
|
|
68
|
+
G(this, "chartRenderer", new P());
|
|
69
|
+
G(this, "onTooltipHintSwitch", () => {
|
|
69
70
|
});
|
|
70
|
-
|
|
71
|
-
this.settings = new
|
|
71
|
+
G(this, "calculatedData", null);
|
|
72
|
+
this.settings = new _(t), o && (this.onTooltipHintSwitch = o[0]);
|
|
72
73
|
}
|
|
73
74
|
mount(e) {
|
|
74
75
|
try {
|
|
@@ -83,7 +84,7 @@ class At extends T {
|
|
|
83
84
|
updateSettingsAndData(e, t) {
|
|
84
85
|
try {
|
|
85
86
|
const o = this.settings, s = this.data;
|
|
86
|
-
this.settings = new
|
|
87
|
+
this.settings = new _(t), this.data = e, this._needUpdateCalculatedDataBySettings(o, this.settings) || this._needUpdateCalculatedDataByData(s, this.data) ? this._updateData() : this._updateAesInData(), this._updateChart(), this.hasError = !1;
|
|
87
88
|
} catch (o) {
|
|
88
89
|
this.hasError = !0, o instanceof Error && (this.chartRenderer.renderError(o.message), console.error(o));
|
|
89
90
|
}
|
|
@@ -92,103 +93,103 @@ class At extends T {
|
|
|
92
93
|
console.warn("no chart state for discrete");
|
|
93
94
|
}
|
|
94
95
|
export() {
|
|
95
|
-
return this._updateChart(),
|
|
96
|
+
return this._updateChart(), O(this.chartRenderer.component);
|
|
96
97
|
}
|
|
97
98
|
_needUpdateCalculatedDataBySettings(e, t) {
|
|
98
|
-
var o, s,
|
|
99
|
-
return e.chartSettings.yAxis.scale !== t.chartSettings.yAxis.scale || (((o = e.primaryGrouping) == null ? void 0 : o.columnName.value) ?? "") !== (((s = t.primaryGrouping) == null ? void 0 : s.columnName.value) ?? "") || (((
|
|
100
|
-
var
|
|
101
|
-
return
|
|
102
|
-
}) || e.layers.length !== t.layers.length || e.layers.some((
|
|
99
|
+
var o, s, l, h, r, c, d, m, L, f, p, i;
|
|
100
|
+
return e.chartSettings.yAxis.scale !== t.chartSettings.yAxis.scale || (((o = e.primaryGrouping) == null ? void 0 : o.columnName.value) ?? "") !== (((s = t.primaryGrouping) == null ? void 0 : s.columnName.value) ?? "") || (((l = e.secondaryGrouping) == null ? void 0 : l.columnName.value) ?? "") !== (((h = t.secondaryGrouping) == null ? void 0 : h.columnName.value) ?? "") || (((r = e.primaryGrouping) == null ? void 0 : r.allowNullGroup) ?? "") !== (((c = t.primaryGrouping) == null ? void 0 : c.allowNullGroup) ?? "") || (((d = e.secondaryGrouping) == null ? void 0 : d.allowNullGroup) ?? "") !== (((m = t.secondaryGrouping) == null ? void 0 : m.allowNullGroup) ?? "") || k((L = e.primaryGrouping) == null ? void 0 : L.order, (f = t.primaryGrouping) == null ? void 0 : f.order, { ignoreOrder: !0 }) || k((p = e.secondaryGrouping) == null ? void 0 : p.order, (i = t.secondaryGrouping) == null ? void 0 : i.order, { ignoreOrder: !0 }) || e.facetBy.some((y, g) => {
|
|
101
|
+
var w;
|
|
102
|
+
return y.value !== ((w = t.facetBy[g]) == null ? void 0 : w.value);
|
|
103
|
+
}) || e.layers.length !== t.layers.length || e.layers.some((y, g) => !y.isEqualForCalculation(t.layers[g]));
|
|
103
104
|
}
|
|
104
105
|
_needUpdateCalculatedDataByData(e, t) {
|
|
105
106
|
const o = Object.keys(e.data), s = Object.keys(t.data);
|
|
106
|
-
return e.id !== t.id || o.length !== s.length || o.some((
|
|
107
|
+
return e.id !== t.id || o.length !== s.length || o.some((l) => {
|
|
107
108
|
var h;
|
|
108
|
-
return e.data[
|
|
109
|
+
return e.data[l].length !== ((h = t.data[l]) == null ? void 0 : h.length);
|
|
109
110
|
});
|
|
110
111
|
}
|
|
111
112
|
_updateData() {
|
|
112
|
-
const { chartSettings: e, y: t, keyColumn: o, facetBy: s, layers:
|
|
113
|
-
if (!f && d.keys.length >
|
|
113
|
+
const { chartSettings: e, y: t, keyColumn: o, facetBy: s, layers: l, facetSettings: h } = this.settings, { yAxis: r } = e, c = this.data.getColumn(t.value).every((a) => a === null || !(Number(a) < 0)), d = E(this.data, this.settings.primaryGrouping), m = E(this.data, this.settings.secondaryGrouping), L = s.map((a) => a.value), f = l.some((a) => a.type === "logo" || a.type === "bar");
|
|
114
|
+
if (!f && d.keys.length > S)
|
|
114
115
|
throw Error(`Too many primary groups (${d.keys.length})`);
|
|
115
|
-
if (!f && m.keys.length >
|
|
116
|
+
if (!f && m.keys.length > S)
|
|
116
117
|
throw Error(`Too many secondary groups (${m.keys.length})`);
|
|
117
|
-
const p = s.length ?
|
|
118
|
+
const p = s.length ? A(
|
|
118
119
|
s.map((a) => {
|
|
119
|
-
var
|
|
120
|
-
return
|
|
120
|
+
var D;
|
|
121
|
+
return b(this.data, a, (D = h == null ? void 0 : h.order) == null ? void 0 : D[a.value]);
|
|
121
122
|
})
|
|
122
123
|
) : [[C]];
|
|
123
124
|
if (p.length > U)
|
|
124
125
|
throw Error(`Too many facets (${p.length})`);
|
|
125
|
-
this.data.setGrouping([...
|
|
126
|
-
const
|
|
126
|
+
this.data.setGrouping([...L, d.value, m.value]);
|
|
127
|
+
const i = {
|
|
127
128
|
facet: p,
|
|
128
129
|
primary: d.value !== null ? d.keys : [C],
|
|
129
130
|
secondary: m.value !== null ? m.keys : [C]
|
|
130
|
-
},
|
|
131
|
-
(
|
|
132
|
-
).map(String), a), {}),
|
|
133
|
-
if (a instanceof O)
|
|
134
|
-
return Q(a, c, this.data, t, o, r);
|
|
131
|
+
}, y = i.facet.reduce((a, D) => (a[v(D)] = i.primary.filter(
|
|
132
|
+
(R) => this.data.getRowsByGrouping([...D, R]).length > 0
|
|
133
|
+
).map(String), a), {}), g = l.filter((a) => !(a instanceof B)).map((a) => {
|
|
135
134
|
if (a instanceof I)
|
|
136
|
-
return W(a,
|
|
135
|
+
return W(a, i, this.data, t, o, r);
|
|
137
136
|
if (a instanceof F)
|
|
138
|
-
return
|
|
137
|
+
return Y(a, i, this.data, t, r);
|
|
139
138
|
if (a instanceof V)
|
|
140
|
-
return tt(a,
|
|
139
|
+
return tt(a, i, this.data, t, r, o);
|
|
141
140
|
if (a instanceof $)
|
|
142
|
-
return at(a,
|
|
141
|
+
return at(a, i, this.data, t, r);
|
|
143
142
|
if (a instanceof j)
|
|
144
|
-
return et(a,
|
|
143
|
+
return et(a, i, this.data, t, r);
|
|
145
144
|
if (a instanceof H)
|
|
146
|
-
return rt(a,
|
|
145
|
+
return rt(a, i, this.data, t, r);
|
|
147
146
|
if (a instanceof M)
|
|
148
|
-
return ot(a,
|
|
147
|
+
return ot(a, i, this.data, t);
|
|
149
148
|
if (a instanceof X)
|
|
150
|
-
return nt(a,
|
|
149
|
+
return nt(a, i, this.data, t);
|
|
151
150
|
if (a instanceof q)
|
|
152
|
-
return
|
|
151
|
+
return it(a, i, this.data, t, r);
|
|
153
152
|
if (a instanceof z)
|
|
154
|
-
return
|
|
153
|
+
return st(a, i, this.data, t, r);
|
|
155
154
|
if (a instanceof J)
|
|
156
|
-
return
|
|
155
|
+
return Z(a, i, this.data, t, r);
|
|
156
|
+
if (a instanceof Q)
|
|
157
|
+
return lt(a, i, this.data, t);
|
|
157
158
|
throw new Error("Unknown layer type");
|
|
158
|
-
}),
|
|
159
|
+
}), w = l.filter((a) => a instanceof B).map((a) => {
|
|
159
160
|
if (d.value === null)
|
|
160
161
|
throw new Error("Cannot calculate p-value without data grouping");
|
|
161
|
-
return
|
|
162
|
+
return ut(a, i.facet, i.primary, t, this.data);
|
|
162
163
|
});
|
|
163
164
|
this.calculatedData = {
|
|
164
|
-
layersData:
|
|
165
|
-
statsLayersData:
|
|
165
|
+
layersData: g,
|
|
166
|
+
statsLayersData: w,
|
|
166
167
|
primaryGrouping: d,
|
|
167
168
|
secondaryGrouping: m,
|
|
168
169
|
facetKeyLists: p,
|
|
169
|
-
nonEmptyGroupsByFacets:
|
|
170
|
-
onlyPositive:
|
|
170
|
+
nonEmptyGroupsByFacets: y,
|
|
171
|
+
onlyPositive: c
|
|
171
172
|
};
|
|
172
173
|
}
|
|
173
174
|
_updateAesInData() {
|
|
174
175
|
if (this.calculatedData === null)
|
|
175
176
|
return;
|
|
176
|
-
const { layers: e, facetBy: t, primaryGrouping: o, secondaryGrouping: s, facetSettings:
|
|
177
|
+
const { layers: e, facetBy: t, primaryGrouping: o, secondaryGrouping: s, facetSettings: l } = this.settings, h = e.filter((r) => !(r instanceof B));
|
|
177
178
|
for (let r = 0; r < h.length; r++) {
|
|
178
|
-
const
|
|
179
|
-
"aes" in
|
|
179
|
+
const c = h[r];
|
|
180
|
+
"aes" in c && (this.calculatedData.layersData[r].aes = c.aes);
|
|
180
181
|
}
|
|
181
|
-
this.calculatedData.primaryGrouping =
|
|
182
|
+
this.calculatedData.primaryGrouping = E(this.data, o), this.calculatedData.secondaryGrouping = E(this.data, s), this.calculatedData.facetKeyLists = t.length ? A(
|
|
182
183
|
t.map((r) => {
|
|
183
|
-
var
|
|
184
|
-
return
|
|
184
|
+
var c;
|
|
185
|
+
return b(this.data, r, (c = l == null ? void 0 : l.order) == null ? void 0 : c[r.value]);
|
|
185
186
|
})
|
|
186
187
|
) : [[C]];
|
|
187
188
|
}
|
|
188
189
|
_updateChart() {
|
|
189
190
|
if (!this.calculatedData)
|
|
190
191
|
return;
|
|
191
|
-
const { id: e, chartSettings: t, keyColumn: o, facetSettings: s } = this.settings,
|
|
192
|
+
const { id: e, chartSettings: t, keyColumn: o, facetSettings: s } = this.settings, l = this.calculatedData.facetKeyLists.map(v), h = this.calculatedData.facetKeyLists.map((r) => r.map((c) => c === C ? "null" : c));
|
|
192
193
|
this.chartRenderer.render(
|
|
193
194
|
this.data,
|
|
194
195
|
e,
|
|
@@ -196,7 +197,7 @@ class At extends T {
|
|
|
196
197
|
this.calculatedData.primaryGrouping,
|
|
197
198
|
this.calculatedData.secondaryGrouping,
|
|
198
199
|
s,
|
|
199
|
-
|
|
200
|
+
l,
|
|
200
201
|
h,
|
|
201
202
|
this.calculatedData.layersData,
|
|
202
203
|
this.calculatedData.statsLayersData,
|
|
@@ -208,6 +209,6 @@ class At extends T {
|
|
|
208
209
|
}
|
|
209
210
|
}
|
|
210
211
|
export {
|
|
211
|
-
|
|
212
|
+
Kt as ChartDiscrete
|
|
212
213
|
};
|
|
213
214
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/discrete/index.ts"],"sourcesContent":["import { intersection } from 'lodash';\nimport { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame, GroupKey } from '../DataFrame';\nimport { NO_GROUPED } from '../DataFrame';\nimport type { Category, ColumnName, DataValue, DiscreteEventHandlers, DiscreteSettings, GroupingData } from '../types';\nimport ChartRenderer from './ChartRenderer';\nimport { MAX_FACETS_COUNT, MAX_GROUPS_COUNT } from './constants';\nimport {\n BarLayer,\n BinnedDotsLayer,\n BoxLayer,\n DiscreteSettingsImpl,\n DotLayer,\n ErrorBarLayer,\n LineLayer,\n LogoPlotLayer,\n PairedPointsLayer,\n SinaLayer, StackedAreaLayer,\n StackedBarLayer,\n StatLayer,\n ViolinLayer,\n} from './DiscreteSettingsImpl';\nimport {\n getBarsData,\n getBinnedDotsData,\n getBoxesData,\n getDotsData,\n getErrorBarsData,\n getLinesData,\n getPairedPointsData,\n getSinaData,\n getStackedBarsData,\n getStatsData,\n getViolinsData,\n} from './layers';\nimport { getLogoData } from './layers/logo';\nimport {getStackedAreaData} from './layers/stackedArea';\nimport type { LayerData, StatsData } from './layers/types';\nimport { getFacetStringKey } from './utils/getFacetStringKey';\n\nfunction getGroupingKeys(data: DataFrame, column: ColumnName, order: DataValue[] | null = null) {\n const groupingColumn = column.value;\n const availableKeys = data.getColumnCategories(groupingColumn);\n return intersection(order ?? availableKeys, availableKeys).map(String);\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nfunction getGroupingData(\n data: DataFrame,\n grouping: DiscreteSettingsImpl['primaryGrouping' | 'secondaryGrouping']\n): GroupingData {\n if (!grouping) {\n return {\n keys: ['null'],\n value: null,\n label: '',\n valueLabels: {null: ''},\n inheritedAes: null,\n };\n }\n\n const groupingColumnId = grouping.columnName.value;\n const groupingColumnLabelId = grouping.columnName.valueLabels;\n const categories = data.getColumnCategories(groupingColumnId, false);\n const getValueLabel = (category: Category) => {\n return groupingColumnLabelId \n ? String(\n data.getColumnValue(\n groupingColumnLabelId,\n data.getColumnCategoryRowIndex(groupingColumnId, category)\n )\n )\n : category;\n };\n \n const keys = data.getColumnCategories(groupingColumnId, !grouping.allowNullGroup);\n const orderedKeys = grouping.order === undefined ? keys : intersection(grouping.order.map(String), keys);\n\n return {\n keys: orderedKeys,\n value: groupingColumnId,\n label: grouping.columnName.label ?? groupingColumnId,\n valueLabels: categories.reduce((res: Record<string, string>, category: Category) => {\n res[category] = getValueLabel(category);\n return res;\n }, {}),\n inheritedAes: grouping.inheritedAes ?? null,\n };\n}\n\nexport class ChartDiscrete extends AbstractChart {\n settings: DiscreteSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n layersData: LayerData[];\n statsLayersData: StatsData[];\n primaryGrouping: GroupingData;\n secondaryGrouping: GroupingData;\n facetKeyLists: GroupKey[][];\n nonEmptyGroupsByFacets: Record<string, string[]>;\n onlyPositive: boolean;\n } | null = null;\n\n constructor(data: DataFrame, settings: DiscreteSettings, eventHandlers?: DiscreteEventHandlers) {\n super(data, settings);\n\n this.settings = new DiscreteSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: DiscreteSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new DiscreteSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for discrete');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: DiscreteSettingsImpl, settings: DiscreteSettingsImpl) {\n return (\n prevSettings.chartSettings.yAxis.scale !== settings.chartSettings.yAxis.scale ||\n (prevSettings.primaryGrouping?.columnName.value ?? '') !==\n (settings.primaryGrouping?.columnName.value ?? '') ||\n (prevSettings.secondaryGrouping?.columnName.value ?? '') !==\n (settings.secondaryGrouping?.columnName.value ?? '') ||\n (prevSettings.primaryGrouping?.allowNullGroup ?? '') !==\n (settings.primaryGrouping?.allowNullGroup ?? '') ||\n (prevSettings.secondaryGrouping?.allowNullGroup ?? '') !==\n (settings.secondaryGrouping?.allowNullGroup ?? '') ||\n prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => !l.isEqualForCalculation(settings.layers[idx] as typeof l))\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {chartSettings, y, keyColumn, facetBy, layers, facetSettings} = this.settings;\n const {yAxis} = chartSettings;\n\n const onlyPositive = this.data.getColumn(y.value).every(v => {\n return v === null || !(Number(v) < 0);\n });\n // console.info('only positive Y:', onlyPositive);\n\n const primaryGrouping = getGroupingData(this.data, this.settings.primaryGrouping);\n const secondaryGrouping = getGroupingData(this.data, this.settings.secondaryGrouping);\n const facetGroupingValues = facetBy.map(column => column.value);\n const hasLogoOrBarLayer = layers.some(l => l.type === 'logo' || l.type === 'bar');\n\n if (!hasLogoOrBarLayer && primaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n throw Error(`Too many primary groups (${primaryGrouping.keys.length})`);\n }\n if (!hasLogoOrBarLayer && secondaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n throw Error(`Too many secondary groups (${secondaryGrouping.keys.length})`);\n }\n\n // if facet created by more than 1 data column facet key contains all of them, and all keys are used in data grouping;\n // after data preparing we need only complex keys from concatenated strings\n const facetKeyLists:(GroupKey)[][] = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n\n if (facetKeyLists.length > MAX_FACETS_COUNT) {\n throw Error(`Too many facets (${facetKeyLists.length})`);\n }\n this.data.setGrouping([...facetGroupingValues, primaryGrouping.value, secondaryGrouping.value]);\n const groupingKeys = {\n facet: facetKeyLists,\n primary: (primaryGrouping.value !== null ? primaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n secondary: (secondaryGrouping.value !== null ? secondaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n };\n\n const nonEmptyGroupsByFacets = groupingKeys.facet.reduce((res: Record<string, string[]>, facetKey) => {\n res[getFacetStringKey(facetKey)] = groupingKeys.primary.filter(\n primaryKey => this.data.getRowsByGrouping([...facetKey, primaryKey]).length > 0\n ).map(String);\n return res;\n }, {});\n\n const layersData = layers\n .filter(layer => !(layer instanceof StatLayer))\n .map(layer => {\n if (layer instanceof BoxLayer) {\n return getBoxesData(layer, groupingKeys, this.data, y, keyColumn, yAxis);\n }\n if (layer instanceof ViolinLayer) {\n return getViolinsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof DotLayer) {\n return getDotsData(layer, groupingKeys, this.data, y, yAxis, keyColumn);\n }\n if (layer instanceof LineLayer) {\n return getLinesData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof ErrorBarLayer) {\n return getErrorBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof BarLayer) {\n return getBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof StackedBarLayer) {\n return getStackedBarsData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof StackedAreaLayer) {\n return getStackedAreaData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof BinnedDotsLayer) {\n return getBinnedDotsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof PairedPointsLayer) {\n return getPairedPointsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof SinaLayer) {\n return getSinaData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof LogoPlotLayer) {\n return getLogoData(layer, groupingKeys, this.data, y);\n }\n throw new Error('Unknown layer type');\n });\n const statsLayersData = layers\n .filter(layer => layer instanceof StatLayer)\n .map(layer => {\n if (primaryGrouping.value === null) {\n throw new Error('Cannot calculate p-value without data grouping');\n }\n return getStatsData(layer as StatLayer, groupingKeys.facet, groupingKeys.primary, y, this.data);\n });\n this.calculatedData = {\n layersData,\n statsLayersData,\n primaryGrouping,\n secondaryGrouping,\n facetKeyLists,\n nonEmptyGroupsByFacets,\n onlyPositive,\n };\n }\n\n _updateAesInData() {\n if (this.calculatedData === null) {\n return;\n }\n const {layers, facetBy, primaryGrouping, secondaryGrouping, facetSettings} = this.settings;\n\n // updating aes in layers (except for stat layers with p-value), layers data is not recalculating\n const noStatLayers = layers.filter(layer => !(layer instanceof StatLayer));\n for (let i = 0; i < noStatLayers.length; i++) {\n const layer = noStatLayers[i];\n if ('aes' in layer) {\n this.calculatedData.layersData[i].aes = layer.aes;\n }\n }\n\n // updating grouping to update linked aes\n this.calculatedData.primaryGrouping = getGroupingData(this.data, primaryGrouping);\n this.calculatedData.secondaryGrouping = getGroupingData(this.data, secondaryGrouping);\n\n // updating for possibly changed facetSettings.order\n this.calculatedData.facetKeyLists = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, keyColumn, facetSettings} = this.settings;\n\n const facetKeys = this.calculatedData.facetKeyLists.map(getFacetStringKey);\n const facetLabels = this.calculatedData.facetKeyLists.map(v => v.map(v => v === NO_GROUPED ? 'null' : v)) as string[][];\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n this.calculatedData.primaryGrouping,\n this.calculatedData.secondaryGrouping,\n facetSettings,\n facetKeys,\n facetLabels,\n this.calculatedData.layersData,\n this.calculatedData.statsLayersData,\n keyColumn,\n this.calculatedData.nonEmptyGroupsByFacets,\n this.calculatedData.onlyPositive,\n this.onTooltipHintSwitch\n );\n }\n}\n"],"names":["getGroupingKeys","data","column","order","groupingColumn","availableKeys","intersection","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","getGroupingData","grouping","groupingColumnId","groupingColumnLabelId","categories","getValueLabel","category","res","ChartDiscrete","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","DiscreteSettingsImpl","node","err","previousSettings","previousData","_field","_value","renderToString","prevSettings","_a","_b","_c","_d","_e","_f","_g","_h","el","idx","l","prevData","prevKeys","chartSettings","y","keyColumn","facetBy","layers","facetSettings","yAxis","onlyPositive","v","primaryGrouping","secondaryGrouping","facetGroupingValues","hasLogoOrBarLayer","MAX_GROUPS_COUNT","facetKeyLists","NO_GROUPED","MAX_FACETS_COUNT","groupingKeys","nonEmptyGroupsByFacets","facetKey","getFacetStringKey","primaryKey","layersData","layer","StatLayer","BoxLayer","getBoxesData","ViolinLayer","getViolinsData","DotLayer","getDotsData","LineLayer","getLinesData","ErrorBarLayer","getErrorBarsData","BarLayer","getBarsData","StackedBarLayer","getStackedBarsData","StackedAreaLayer","getStackedAreaData","BinnedDotsLayer","getBinnedDotsData","PairedPointsLayer","getPairedPointsData","SinaLayer","getSinaData","LogoPlotLayer","getLogoData","statsLayersData","getStatsData","noStatLayers","i","id","facetKeys","facetLabels"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/discrete/index.ts"],"sourcesContent":["import { intersection } from 'lodash';\nimport { renderToString } from 'react-dom/server';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame, GroupKey } from '../DataFrame';\nimport { NO_GROUPED } from '../DataFrame';\nimport type { Category, ColumnName, DataValue, DiscreteEventHandlers, DiscreteSettings, GroupingData } from '../types';\nimport ChartRenderer from './ChartRenderer';\nimport { MAX_FACETS_COUNT, MAX_GROUPS_COUNT } from './constants';\nimport {\n BarLayer,\n BinnedDotsLayer,\n BoxLayer,\n DiscreteSettingsImpl,\n DotLayer,\n ErrorBarLayer,\n LineLayer,\n LogoPlotLayer,\n PairedPointsLayer,\n SinaLayer, StackedAreaLayer,\n StackedBarLayer,\n StatLayer,\n ViolinLayer,\n} from './DiscreteSettingsImpl';\nimport {\n getBarsData,\n getBinnedDotsData,\n getBoxesData,\n getDotsData,\n getErrorBarsData,\n getLinesData,\n getPairedPointsData,\n getSinaData,\n getStackedBarsData,\n getStatsData,\n getViolinsData,\n} from './layers';\nimport { getLogoData } from './layers/logo';\nimport {getStackedAreaData} from './layers/stackedArea';\nimport type { LayerData, StatsData } from './layers/types';\nimport { getFacetStringKey } from './utils/getFacetStringKey';\nimport { arraysAreDifferent } from '../utils/arraysAreDifferent';\n\nfunction getGroupingKeys(data: DataFrame, column: ColumnName, order: DataValue[] | null = null) {\n const groupingColumn = column.value;\n const availableKeys = data.getColumnCategories(groupingColumn);\n return intersection(order ?? availableKeys, availableKeys).map(String);\n}\n\n// all combinations with 1 key from each list\nfunction getKeysCombinations(keysLists: string[][]) {\n if (!keysLists.length) {\n return [];\n }\n let result: string[][] = [[]];\n keysLists.forEach(keys => {\n const nextResult: string[][] = [];\n keys.forEach(key => {\n nextResult.push(...result.map(resultItem => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nfunction getGroupingData(\n data: DataFrame,\n grouping: DiscreteSettingsImpl['primaryGrouping' | 'secondaryGrouping']\n): GroupingData {\n if (!grouping) {\n return {\n keys: ['null'],\n value: null,\n label: '',\n valueLabels: {null: ''},\n inheritedAes: null,\n };\n }\n\n const groupingColumnId = grouping.columnName.value;\n const groupingColumnLabelId = grouping.columnName.valueLabels;\n const categories = data.getColumnCategories(groupingColumnId, false);\n const getValueLabel = (category: Category) => {\n return groupingColumnLabelId \n ? String(\n data.getColumnValue(\n groupingColumnLabelId,\n data.getColumnCategoryRowIndex(groupingColumnId, category)\n )\n )\n : category;\n };\n \n const keys = data.getColumnCategories(groupingColumnId, !grouping.allowNullGroup);\n const orderedKeys = grouping.order === undefined ? keys : intersection(grouping.order.map(String), keys);\n\n return {\n keys: orderedKeys,\n value: groupingColumnId,\n label: grouping.columnName.label ?? groupingColumnId,\n valueLabels: categories.reduce((res: Record<string, string>, category: Category) => {\n res[category] = getValueLabel(category);\n return res;\n }, {}),\n inheritedAes: grouping.inheritedAes ?? null,\n };\n}\n\nexport class ChartDiscrete extends AbstractChart {\n settings: DiscreteSettingsImpl;\n chartRenderer = new ChartRenderer();\n\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n calculatedData: {\n layersData: LayerData[];\n statsLayersData: StatsData[];\n primaryGrouping: GroupingData;\n secondaryGrouping: GroupingData;\n facetKeyLists: GroupKey[][];\n nonEmptyGroupsByFacets: Record<string, string[]>;\n onlyPositive: boolean;\n } | null = null;\n\n constructor(data: DataFrame, settings: DiscreteSettings, eventHandlers?: DiscreteEventHandlers) {\n super(data, settings);\n\n this.settings = new DiscreteSettingsImpl(settings);\n if (eventHandlers) {\n this.onTooltipHintSwitch = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: DiscreteSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new DiscreteSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(_field: string, _value: unknown) {\n console.warn('no chart state for discrete');\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: DiscreteSettingsImpl, settings: DiscreteSettingsImpl) {\n return (\n prevSettings.chartSettings.yAxis.scale !== settings.chartSettings.yAxis.scale ||\n (prevSettings.primaryGrouping?.columnName.value ?? '') !==\n (settings.primaryGrouping?.columnName.value ?? '') ||\n (prevSettings.secondaryGrouping?.columnName.value ?? '') !==\n (settings.secondaryGrouping?.columnName.value ?? '') ||\n (prevSettings.primaryGrouping?.allowNullGroup ?? '') !==\n (settings.primaryGrouping?.allowNullGroup ?? '') ||\n (prevSettings.secondaryGrouping?.allowNullGroup ?? '') !==\n (settings.secondaryGrouping?.allowNullGroup ?? '') ||\n arraysAreDifferent(prevSettings.primaryGrouping?.order, settings.primaryGrouping?.order, {ignoreOrder: true}) ||\n arraysAreDifferent(prevSettings.secondaryGrouping?.order, settings.secondaryGrouping?.order, {ignoreOrder: true}) ||\n prevSettings.facetBy.some((el, idx) => el.value !== settings.facetBy[idx]?.value) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => !l.isEqualForCalculation(settings.layers[idx] as typeof l))\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {chartSettings, y, keyColumn, facetBy, layers, facetSettings} = this.settings;\n const {yAxis} = chartSettings;\n\n const onlyPositive = this.data.getColumn(y.value).every(v => {\n return v === null || !(Number(v) < 0);\n });\n // console.info('only positive Y:', onlyPositive);\n\n const primaryGrouping = getGroupingData(this.data, this.settings.primaryGrouping);\n const secondaryGrouping = getGroupingData(this.data, this.settings.secondaryGrouping);\n const facetGroupingValues = facetBy.map(column => column.value);\n const hasLogoOrBarLayer = layers.some(l => l.type === 'logo' || l.type === 'bar');\n\n if (!hasLogoOrBarLayer && primaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n throw Error(`Too many primary groups (${primaryGrouping.keys.length})`);\n }\n if (!hasLogoOrBarLayer && secondaryGrouping.keys.length > MAX_GROUPS_COUNT) {\n throw Error(`Too many secondary groups (${secondaryGrouping.keys.length})`);\n }\n\n // if facet created by more than 1 data column facet key contains all of them, and all keys are used in data grouping;\n // after data preparing we need only complex keys from concatenated strings\n const facetKeyLists:(GroupKey)[][] = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n\n if (facetKeyLists.length > MAX_FACETS_COUNT) {\n throw Error(`Too many facets (${facetKeyLists.length})`);\n }\n this.data.setGrouping([...facetGroupingValues, primaryGrouping.value, secondaryGrouping.value]);\n const groupingKeys = {\n facet: facetKeyLists,\n primary: (primaryGrouping.value !== null ? primaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n secondary: (secondaryGrouping.value !== null ? secondaryGrouping.keys : [NO_GROUPED]) as GroupKey[],\n };\n\n const nonEmptyGroupsByFacets = groupingKeys.facet.reduce((res: Record<string, string[]>, facetKey) => {\n res[getFacetStringKey(facetKey)] = groupingKeys.primary.filter(\n primaryKey => this.data.getRowsByGrouping([...facetKey, primaryKey]).length > 0\n ).map(String);\n return res;\n }, {});\n\n const layersData = layers\n .filter(layer => !(layer instanceof StatLayer))\n .map(layer => {\n if (layer instanceof BoxLayer) {\n return getBoxesData(layer, groupingKeys, this.data, y, keyColumn, yAxis);\n }\n if (layer instanceof ViolinLayer) {\n return getViolinsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof DotLayer) {\n return getDotsData(layer, groupingKeys, this.data, y, yAxis, keyColumn);\n }\n if (layer instanceof LineLayer) {\n return getLinesData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof ErrorBarLayer) {\n return getErrorBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof BarLayer) {\n return getBarsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof StackedBarLayer) {\n return getStackedBarsData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof StackedAreaLayer) {\n return getStackedAreaData(layer, groupingKeys, this.data, y);\n }\n if (layer instanceof BinnedDotsLayer) {\n return getBinnedDotsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof PairedPointsLayer) {\n return getPairedPointsData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof SinaLayer) {\n return getSinaData(layer, groupingKeys, this.data, y, yAxis);\n }\n if (layer instanceof LogoPlotLayer) {\n return getLogoData(layer, groupingKeys, this.data, y);\n }\n throw new Error('Unknown layer type');\n });\n const statsLayersData = layers\n .filter(layer => layer instanceof StatLayer)\n .map(layer => {\n if (primaryGrouping.value === null) {\n throw new Error('Cannot calculate p-value without data grouping');\n }\n return getStatsData(layer as StatLayer, groupingKeys.facet, groupingKeys.primary, y, this.data);\n });\n this.calculatedData = {\n layersData,\n statsLayersData,\n primaryGrouping,\n secondaryGrouping,\n facetKeyLists,\n nonEmptyGroupsByFacets,\n onlyPositive,\n };\n }\n\n _updateAesInData() {\n if (this.calculatedData === null) {\n return;\n }\n const {layers, facetBy, primaryGrouping, secondaryGrouping, facetSettings} = this.settings;\n\n // updating aes in layers (except for stat layers with p-value), layers data is not recalculating\n const noStatLayers = layers.filter(layer => !(layer instanceof StatLayer));\n for (let i = 0; i < noStatLayers.length; i++) {\n const layer = noStatLayers[i];\n if ('aes' in layer) {\n this.calculatedData.layersData[i].aes = layer.aes;\n }\n }\n\n // updating grouping to update linked aes\n this.calculatedData.primaryGrouping = getGroupingData(this.data, primaryGrouping);\n this.calculatedData.secondaryGrouping = getGroupingData(this.data, secondaryGrouping);\n\n // updating for possibly changed facetSettings.order\n this.calculatedData.facetKeyLists = facetBy.length\n ? getKeysCombinations(\n facetBy.map(column => getGroupingKeys(this.data, column, facetSettings?.order?.[column.value]))\n )\n : [[NO_GROUPED]];\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, keyColumn, facetSettings} = this.settings;\n\n const facetKeys = this.calculatedData.facetKeyLists.map(getFacetStringKey);\n const facetLabels = this.calculatedData.facetKeyLists.map(v => v.map(v => v === NO_GROUPED ? 'null' : v)) as string[][];\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n this.calculatedData.primaryGrouping,\n this.calculatedData.secondaryGrouping,\n facetSettings,\n facetKeys,\n facetLabels,\n this.calculatedData.layersData,\n this.calculatedData.statsLayersData,\n keyColumn,\n this.calculatedData.nonEmptyGroupsByFacets,\n this.calculatedData.onlyPositive,\n this.onTooltipHintSwitch\n );\n }\n}\n"],"names":["getGroupingKeys","data","column","order","groupingColumn","availableKeys","intersection","getKeysCombinations","keysLists","result","keys","nextResult","key","resultItem","getGroupingData","grouping","groupingColumnId","groupingColumnLabelId","categories","getValueLabel","category","res","ChartDiscrete","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","DiscreteSettingsImpl","node","err","previousSettings","previousData","_field","_value","renderToString","prevSettings","_a","_b","_c","_d","_e","_f","_g","_h","arraysAreDifferent","_i","_j","_k","_l","el","idx","l","prevData","prevKeys","chartSettings","y","keyColumn","facetBy","layers","facetSettings","yAxis","onlyPositive","v","primaryGrouping","secondaryGrouping","facetGroupingValues","hasLogoOrBarLayer","MAX_GROUPS_COUNT","facetKeyLists","NO_GROUPED","MAX_FACETS_COUNT","groupingKeys","nonEmptyGroupsByFacets","facetKey","getFacetStringKey","primaryKey","layersData","layer","StatLayer","BoxLayer","getBoxesData","ViolinLayer","getViolinsData","DotLayer","getDotsData","LineLayer","getLinesData","ErrorBarLayer","getErrorBarsData","BarLayer","getBarsData","StackedBarLayer","getStackedBarsData","StackedAreaLayer","getStackedAreaData","BinnedDotsLayer","getBinnedDotsData","PairedPointsLayer","getPairedPointsData","SinaLayer","getSinaData","LogoPlotLayer","getLogoData","statsLayersData","getStatsData","noStatLayers","i","id","facetKeys","facetLabels"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EAAe,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EAAc,UAAU,EAAc,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
var
|
|
2
|
-
var k = (
|
|
3
|
-
var h = (
|
|
1
|
+
var B = Object.defineProperty;
|
|
2
|
+
var k = (S, t, e) => t in S ? B(S, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : S[t] = e;
|
|
3
|
+
var h = (S, t, e) => k(S, typeof t != "symbol" ? t + "" : t, e);
|
|
4
4
|
import { j as b } from "../node_modules/react/jsx-runtime.js";
|
|
5
5
|
import K from "../node_modules/@d3fc/d3fc-chart/src/cartesian.js";
|
|
6
6
|
import "../node_modules/@d3fc/d3fc-webgl/src/scale/scaleMapper.js";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
7
|
+
import X from "../node_modules/@d3fc/d3fc-webgl/src/style/fillColor.js";
|
|
8
|
+
import Y from "../node_modules/@d3fc/d3fc-series/src/webgl/point.js";
|
|
9
9
|
import j from "../node_modules/@d3fc/d3fc-series/src/svg/multi.js";
|
|
10
10
|
import q from "../node_modules/@d3fc/d3fc-series/src/webgl/multi.js";
|
|
11
11
|
import $ from "../node_modules/d3-zoom/src/zoom.js";
|
|
12
12
|
import "../node_modules/d3-zoom/src/transform.js";
|
|
13
13
|
import { createRoot as Q } from "../node_modules/react-dom/client.js";
|
|
14
14
|
import { Error as J } from "../common/Error.js";
|
|
15
|
-
import { BLACK as G, DEFAULT_HEIGHT as w, DEFAULT_WIDTH as D, TITLE_LINE_HEIGHT as Z,
|
|
16
|
-
import { splitTextByWidth as
|
|
17
|
-
import { MIN_MARGIN as
|
|
15
|
+
import { BLACK as G, DEFAULT_HEIGHT as w, DEFAULT_WIDTH as D, TITLE_LINE_HEIGHT as Z, MAX_SHOWN_UNIQUE_VALUES_IN_LABELS as tt, TITLE_MARGIN as et } from "../constants.js";
|
|
16
|
+
import { splitTextByWidth as it } from "../utils/splitTextByWidth.js";
|
|
17
|
+
import { MIN_MARGIN as L, DEFAULT_DOT_AES as F } from "../scatterplot/constants.js";
|
|
18
18
|
import { createAesGetter as H } from "../scatterplot/utils/createAesGetter.js";
|
|
19
|
-
import { getTicksAndFormat as
|
|
20
|
-
import { createLabelPositioner as
|
|
21
|
-
import { isContinuousAes as
|
|
19
|
+
import { getTicksAndFormat as st } from "../scatterplot/utils/getTicksAndFormat.js";
|
|
20
|
+
import { createLabelPositioner as ot } from "../scatterplot/utils/getVisibleLabels.js";
|
|
21
|
+
import { isContinuousAes as A } from "../types/common.js";
|
|
22
22
|
import "../types/discrete.js";
|
|
23
23
|
import "../types/scatterplot.js";
|
|
24
24
|
import "../types/heatmap.js";
|
|
25
25
|
import "../types/dendro.js";
|
|
26
26
|
import "../types/histogram.js";
|
|
27
27
|
import "../types/bubble.js";
|
|
28
|
-
import { getContinuousColorScale as
|
|
29
|
-
import { getContinuousLegendTicks as
|
|
30
|
-
import { TextMeasurer as
|
|
31
|
-
import { SVGLayer as
|
|
32
|
-
import { PADDINGS as
|
|
33
|
-
import
|
|
34
|
-
import
|
|
35
|
-
import { DataFrameProvider as
|
|
36
|
-
import { DataFrame as
|
|
37
|
-
import { arrangeLegendParts as
|
|
28
|
+
import { getContinuousColorScale as at } from "../utils/getContinuousColorScale.js";
|
|
29
|
+
import { getContinuousLegendTicks as nt } from "../utils/getContinuousLegendTicks.js";
|
|
30
|
+
import { TextMeasurer as R } from "../utils/TextMeasurer/TextMeasurer.js";
|
|
31
|
+
import { SVGLayer as rt } from "./components/SVGLayer.js";
|
|
32
|
+
import { PADDINGS as E, TITLE_LINE as I, LEGEND_OFFSET as lt } from "./constants.js";
|
|
33
|
+
import ht from "../node_modules/@d3fc/d3fc-pointer/src/pointer.js";
|
|
34
|
+
import ct from "../node_modules/kdbush/index.js";
|
|
35
|
+
import { DataFrameProvider as dt } from "../common/useDataFrame.js";
|
|
36
|
+
import { DataFrame as mt } from "../DataFrame.js";
|
|
37
|
+
import { arrangeLegendParts as pt } from "../utils/arrangeLegendParts.js";
|
|
38
38
|
import { stringToNumberRgba as M, getColorWithFakeOpacity as P, GET_BLACK as O } from "./colors.js";
|
|
39
|
-
import
|
|
40
|
-
import
|
|
39
|
+
import C from "../node_modules/d3-scale/src/linear.js";
|
|
40
|
+
import U from "../node_modules/d3-scale/src/log.js";
|
|
41
41
|
import N from "../node_modules/d3-selection/src/select.js";
|
|
42
|
-
import
|
|
43
|
-
import
|
|
44
|
-
import { sqrt as
|
|
45
|
-
import
|
|
46
|
-
function
|
|
47
|
-
return
|
|
42
|
+
import gt from "../node_modules/d3-scale/src/ordinal.js";
|
|
43
|
+
import ut from "../node_modules/d3-scale/src/symlog.js";
|
|
44
|
+
import { sqrt as ft } from "../node_modules/d3-scale/src/pow.js";
|
|
45
|
+
import St from "../node_modules/d3-polygon/src/contains.js";
|
|
46
|
+
function _(S) {
|
|
47
|
+
return S / 2.35 * (S / 2.35) * 64;
|
|
48
48
|
}
|
|
49
|
-
function
|
|
50
|
-
return e.length === 0 ? !0 : e.some((i) => i.closed && i.points.length > 2 &&
|
|
49
|
+
function W(S, t, e) {
|
|
50
|
+
return e.length === 0 ? !0 : e.some((i) => i.closed && i.points.length > 2 && St(i.points, [S, t]));
|
|
51
51
|
}
|
|
52
|
-
function
|
|
52
|
+
function V(S, t, e) {
|
|
53
53
|
const i = e.find((o) => o.type === "dots"), l = e.find((o) => o.type === "curve");
|
|
54
54
|
return {
|
|
55
|
-
dotFill: H(
|
|
56
|
-
dotSize: H(
|
|
57
|
-
lineType: H(
|
|
55
|
+
dotFill: H(S, t, (i == null ? void 0 : i.aes.dotFill) ?? F.color, "dotFill"),
|
|
56
|
+
dotSize: H(S, t, (i == null ? void 0 : i.aes.dotSize) ?? F.size, "dotSize"),
|
|
57
|
+
lineType: H(S, t, (l == null ? void 0 : l.aes.lineShape) ?? "solid", "lineShape")
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
class
|
|
60
|
+
class re {
|
|
61
61
|
constructor() {
|
|
62
62
|
h(this, "reactRoot", null);
|
|
63
63
|
h(this, "parentNode", null);
|
|
@@ -72,10 +72,10 @@ class ne {
|
|
|
72
72
|
});
|
|
73
73
|
h(this, "tools", null);
|
|
74
74
|
h(this, "margins", {
|
|
75
|
-
top:
|
|
76
|
-
bottom:
|
|
77
|
-
left:
|
|
78
|
-
right:
|
|
75
|
+
top: L,
|
|
76
|
+
bottom: L,
|
|
77
|
+
left: L,
|
|
78
|
+
right: L
|
|
79
79
|
});
|
|
80
80
|
h(this, "chartSizes", {
|
|
81
81
|
chartWidth: D,
|
|
@@ -88,10 +88,10 @@ class ne {
|
|
|
88
88
|
// width of all charts in charts height, plus bottom axis, plus top title
|
|
89
89
|
});
|
|
90
90
|
h(this, "scales", {
|
|
91
|
-
x:
|
|
92
|
-
y:
|
|
93
|
-
xOriginal:
|
|
94
|
-
yOriginal:
|
|
91
|
+
x: C().domain([0, 10]).range([0, D]),
|
|
92
|
+
y: C().domain([0, 10]).range([w, 0]),
|
|
93
|
+
xOriginal: C().domain([0, 10]).range([0, D]),
|
|
94
|
+
yOriginal: C().domain([0, 10]).range([w, 0])
|
|
95
95
|
});
|
|
96
96
|
h(this, "polygons", []);
|
|
97
97
|
h(this, "onPolygonUpdateOutside", () => {
|
|
@@ -113,10 +113,10 @@ class ne {
|
|
|
113
113
|
h(this, "notCalculatedProps", {});
|
|
114
114
|
h(this, "allDots", []);
|
|
115
115
|
h(this, "visibleLabels", []);
|
|
116
|
-
h(this, "dataFrame", new
|
|
116
|
+
h(this, "dataFrame", new mt("", {}));
|
|
117
117
|
h(this, "onPolygonUpdate", (t) => {
|
|
118
118
|
this.polygons = t, this.updateByLasso();
|
|
119
|
-
const e = this.allDots.filter((i) =>
|
|
119
|
+
const e = this.allDots.filter((i) => W(i.x, i.y, this.polygons)).map((i) => i.idx);
|
|
120
120
|
this.onPolygonUpdateOutside(e, t);
|
|
121
121
|
});
|
|
122
122
|
}
|
|
@@ -134,52 +134,52 @@ class ne {
|
|
|
134
134
|
(t.width !== this.chartSizes.chartWidth || t.height !== this.chartSizes.chartHeight) && (this.chartSizes.chartWidth = t.width, this.chartSizes.chartHeight = t.height, this.scales.x.range([0, this.chartSizes.chartWidth]), this.scales.y.range([this.chartSizes.chartHeight, 0]));
|
|
135
135
|
}
|
|
136
136
|
updateViewport(t, e, i) {
|
|
137
|
-
const l = t.scale === "log" ?
|
|
137
|
+
const l = t.scale === "log" ? U() : C();
|
|
138
138
|
let { minX: o, minY: c, maxX: m, maxY: u } = i;
|
|
139
139
|
if (t.lowerValue !== void 0 && (o = Math.max(o, t.lowerValue)), t.upperValue !== void 0 && (m = Math.min(m, t.upperValue)), e.lowerValue !== void 0 && (c = Math.max(c, e.lowerValue)), e.upperValue !== void 0 && (u = Math.min(u, e.upperValue)), t.symmetricRange !== void 0) {
|
|
140
|
-
const
|
|
141
|
-
if (
|
|
142
|
-
const f = Math.max(
|
|
143
|
-
o =
|
|
140
|
+
const r = t.symmetricRange;
|
|
141
|
+
if (r >= o && r <= m) {
|
|
142
|
+
const f = Math.max(r - o, m - r);
|
|
143
|
+
o = r - f, m = r + f;
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
if (typeof e.symmetricRange < "u") {
|
|
147
|
-
const
|
|
148
|
-
if (
|
|
149
|
-
const f = Math.max(
|
|
150
|
-
c =
|
|
147
|
+
const r = e.symmetricRange;
|
|
148
|
+
if (r >= c && r <= u) {
|
|
149
|
+
const f = Math.max(r - c, u - r);
|
|
150
|
+
c = r - f, u = r + f;
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
|
-
const
|
|
154
|
-
l.domain([x.invert(0), x.invert(this.chartSizes.chartWidth)]).range(
|
|
155
|
-
const d = e.scale === "log" ?
|
|
156
|
-
d.domain([g.invert(this.chartSizes.chartHeight), g.invert(0)]).range(
|
|
153
|
+
const y = [0, this.chartSizes.chartWidth], x = l.copy().domain([o, m]).range([E.LEFT, this.chartSizes.chartWidth - E.RIGHT]);
|
|
154
|
+
l.domain([x.invert(0), x.invert(this.chartSizes.chartWidth)]).range(y).nice(), this.scales.x = l, this.scales.xOriginal = l.copy();
|
|
155
|
+
const d = e.scale === "log" ? U() : C(), n = [this.chartSizes.chartHeight, 0], g = d.copy().domain([c, u]).range([this.chartSizes.chartHeight - E.BOTTOM, E.TOP]);
|
|
156
|
+
d.domain([g.invert(this.chartSizes.chartHeight), g.invert(0)]).range(n).nice(), this.scales.y = d, this.scales.yOriginal = d.copy();
|
|
157
157
|
}
|
|
158
158
|
updateCaptionsSize() {
|
|
159
|
-
const t = new
|
|
159
|
+
const t = new R("600 14px Arial");
|
|
160
160
|
function e(c) {
|
|
161
161
|
return Math.max(...c.map((m) => t.getTextWidth(m)));
|
|
162
162
|
}
|
|
163
|
-
const { ticks: i, format: l } =
|
|
163
|
+
const { ticks: i, format: l } = st(this.scales.y, !1), o = e(i.map(l));
|
|
164
164
|
this.captionsSizes = {
|
|
165
165
|
xAxisCaptionsWidth: 20,
|
|
166
166
|
yAxisCaptionsWidth: o
|
|
167
167
|
};
|
|
168
168
|
}
|
|
169
169
|
createMainTitle(t) {
|
|
170
|
-
this.mainTitle =
|
|
170
|
+
this.mainTitle = it(
|
|
171
171
|
t.name,
|
|
172
172
|
this.chartSizes.totalWidth - this.margins.left - this.margins.right,
|
|
173
173
|
20
|
|
174
174
|
);
|
|
175
175
|
}
|
|
176
176
|
updateMargins() {
|
|
177
|
-
const t = Z * this.mainTitle.length, e = t > 0 ? t +
|
|
177
|
+
const t = Z * this.mainTitle.length, e = t > 0 ? t + et * 2 : 0;
|
|
178
178
|
this.margins = {
|
|
179
|
-
top: Math.max(e,
|
|
180
|
-
bottom:
|
|
181
|
-
left:
|
|
182
|
-
right: this.legend.width +
|
|
179
|
+
top: Math.max(e, L),
|
|
180
|
+
bottom: L + this.captionsSizes.xAxisCaptionsWidth + I,
|
|
181
|
+
left: L + this.captionsSizes.yAxisCaptionsWidth + I,
|
|
182
|
+
right: this.legend.width + L
|
|
183
183
|
}, this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right, this.chartSizes.totalHeight = this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom, N(this.canvasNode).style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
|
|
184
184
|
}
|
|
185
185
|
updateLegendSize(t, e, i, l) {
|
|
@@ -189,51 +189,55 @@ class ne {
|
|
|
189
189
|
}
|
|
190
190
|
const o = [], c = { width: 0, height: 0, left: 0, top: 0 };
|
|
191
191
|
if (i.forEach((d) => {
|
|
192
|
-
const
|
|
193
|
-
if (
|
|
192
|
+
const n = e[d.value];
|
|
193
|
+
if (n.usedAes.length === 0 || !n.aesMap)
|
|
194
194
|
return;
|
|
195
|
+
if (n.values.length > tt) {
|
|
196
|
+
console.warn(`Too many values for discrete legend (${n.values.length})`);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
195
199
|
const g = {};
|
|
196
|
-
|
|
197
|
-
g[p] || (g[p] = { ...F }),
|
|
198
|
-
s === "dotFill" && (g[p].color =
|
|
200
|
+
n.values.forEach((p) => {
|
|
201
|
+
g[p] || (g[p] = { ...F }), n.usedAes.forEach((s) => {
|
|
202
|
+
s === "dotFill" && (g[p].color = n.aesMap(p, s) ?? G), s === "dotSize" && (g[p].size = Number(n.aesMap(p, s) ?? 3));
|
|
199
203
|
});
|
|
200
204
|
});
|
|
201
|
-
const
|
|
202
|
-
o.push({ ...c, id: d.value, type: "dots", title:
|
|
205
|
+
const r = d.label ?? d.value, f = gt().domain(n.values).range(n.values.map((p) => g[p]));
|
|
206
|
+
o.push({ ...c, id: d.value, type: "dots", title: r, scale: f, values: n.values, labels: n.labels });
|
|
203
207
|
}), l.forEach((d) => {
|
|
204
|
-
if (d.type === "dots" &&
|
|
205
|
-
const { domain:
|
|
208
|
+
if (d.type === "dots" && A(d.aes.dotFill)) {
|
|
209
|
+
const { domain: n, range: g, columnName: r, type: f = "linear" } = d.aes.dotFill, p = r.label ?? r.value, s = at(g, n, "linear"), a = (f === "log" ? ut() : C()).domain(n).range([this.chartSizes.chartHeight, 0]), v = nt(a, n);
|
|
206
210
|
o.push({ ...c, id: "dotFill", type: "continuous", title: p, scale: s, tickPositionScale: a, values: v });
|
|
207
211
|
}
|
|
208
|
-
if (d.type === "dots" &&
|
|
209
|
-
const { columnName:
|
|
210
|
-
o.push({ ...c, id:
|
|
212
|
+
if (d.type === "dots" && A(d.aes.dotSize)) {
|
|
213
|
+
const { columnName: n, domain: g, range: r } = d.aes.dotSize, f = n.label ?? n.value, p = ft(g, r), s = p.ticks(3), a = p.tickFormat(3), v = s.reduce((z, T) => (z[String(T)] = a(T), z), {});
|
|
214
|
+
o.push({ ...c, id: n.value, type: "size", title: f, scale: p, values: s, labels: v });
|
|
211
215
|
}
|
|
212
216
|
}), !o.length) {
|
|
213
217
|
this.legend = { width: 0, height: 0, items: [] };
|
|
214
218
|
return;
|
|
215
219
|
}
|
|
216
|
-
const m =
|
|
220
|
+
const m = pt(o, this.chartSizes.chartHeight), u = m[m.length - 1], y = u.left + u.width + lt, x = this.chartSizes.chartHeight;
|
|
217
221
|
this.legend = {
|
|
218
|
-
width:
|
|
222
|
+
width: y,
|
|
219
223
|
height: x,
|
|
220
224
|
items: m
|
|
221
225
|
};
|
|
222
226
|
}
|
|
223
227
|
initSettings(t, e, i, l, o, c) {
|
|
224
|
-
const { xAxis: m, yAxis: u, size:
|
|
225
|
-
this.updateChartSizes(
|
|
226
|
-
const
|
|
228
|
+
const { xAxis: m, yAxis: u, size: y, title: x, legend: d } = e;
|
|
229
|
+
this.updateChartSizes(y), this.updateViewport(m, u, i), this.updateCaptionsSize(), this.updateLegendSize(d, l, c, o), this.createMainTitle(x), this.updateMargins(), this.aesGetters = V(this.dataFrame, l, o);
|
|
230
|
+
const n = X().data(t).value((s) => {
|
|
227
231
|
const a = M(this.aesGetters.dotFill(s.idx));
|
|
228
|
-
return a[3] = !s.dimmed &&
|
|
229
|
-
}), g =
|
|
232
|
+
return a[3] = !s.dimmed && W(s.x, s.y, this.polygons) ? 1 : 0.4, P(a, a);
|
|
233
|
+
}), g = Y().equals((s, a) => s === a).size((s) => _(this.aesGetters.dotSize(s.idx))).crossValue((s) => s.x).mainValue((s) => s.y).decorate((s) => n(s)), r = $().scaleExtent([0.1, 1e3]).filter((s) => s.type === "wheel" || s.metaKey || s.ctrlKey).on("start", () => {
|
|
230
234
|
this.selectedDot = null;
|
|
231
235
|
}).on("zoom", (s) => {
|
|
232
236
|
const a = s.transform, v = a.rescaleX(this.scales.xOriginal), z = a.rescaleY(this.scales.yOriginal);
|
|
233
237
|
this.scales.x.domain(v.domain()), this.scales.y.domain(z.domain()), this.zoomTransform = a, this.zoomStateKey = `${a.x}_${a.y}_${a.k}`, this.updateLabelsPosition(this.visibleLabels), this.renderSvgLayer(), this.renderWebglLayer();
|
|
234
238
|
}).on("end", () => {
|
|
235
239
|
this.visibleLabels = this.computeLabels(this.allDots), this.renderSvgLayer();
|
|
236
|
-
}), f =
|
|
240
|
+
}), f = ht().on("point", ([s]) => {
|
|
237
241
|
var z;
|
|
238
242
|
let a;
|
|
239
243
|
s && (a = this.getClosestDot(s.x, s.y));
|
|
@@ -247,68 +251,68 @@ class ne {
|
|
|
247
251
|
q().series([g]).mapping((s) => s)
|
|
248
252
|
).decorate((s) => {
|
|
249
253
|
const a = s.enter();
|
|
250
|
-
a && !this.svgLayerElement && (a.style("grid-template-columns", "0 auto 1fr auto 0"), a.style("grid-template-rows", "0 auto 1fr auto 0"), this.svgLayerElement = a.select(".svg-plot-area.plot-area svg").node()), a.select(".svg-plot-area.plot-area").attr("class", "svg-plot-area plot-area miplots-scatterplot-plot-area").call(
|
|
254
|
+
a && !this.svgLayerElement && (a.style("grid-template-columns", "0 auto 1fr auto 0"), a.style("grid-template-rows", "0 auto 1fr auto 0"), this.svgLayerElement = a.select(".svg-plot-area.plot-area svg").node()), a.select(".svg-plot-area.plot-area").attr("class", "svg-plot-area plot-area miplots-scatterplot-plot-area").call(r).call(f);
|
|
251
255
|
});
|
|
252
256
|
this.tools = {
|
|
253
257
|
webglChart: p,
|
|
254
|
-
zoom:
|
|
255
|
-
fillColor:
|
|
258
|
+
zoom: r,
|
|
259
|
+
fillColor: n,
|
|
256
260
|
pointSeries: g
|
|
257
261
|
}, N(this.canvasNode).datum(t).style("position", "absolute").style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
|
|
258
262
|
}
|
|
259
263
|
updateAes(t, e) {
|
|
260
|
-
this.tools !== null && (this.aesGetters =
|
|
264
|
+
this.tools !== null && (this.aesGetters = V(this.dataFrame, t, e), this.tools.fillColor.value((i) => {
|
|
261
265
|
const l = this.aesGetters.dotFill ?? O, o = M(l(i.idx));
|
|
262
|
-
return o[3] = !i.dimmed &&
|
|
266
|
+
return o[3] = !i.dimmed && W(i.x, i.y, this.polygons) ? 1 : 0.4, P(o, o);
|
|
263
267
|
}));
|
|
264
268
|
}
|
|
265
269
|
updatePointSize() {
|
|
266
|
-
this.tools !== null && (N(this.canvasNode).datum([...this.allDots]), this.tools.pointSeries.size((t) =>
|
|
270
|
+
this.tools !== null && (N(this.canvasNode).datum([...this.allDots]), this.tools.pointSeries.size((t) => _(this.aesGetters.dotSize(t.data))));
|
|
267
271
|
}
|
|
268
272
|
updateByLasso() {
|
|
269
273
|
var t;
|
|
270
274
|
this.tools !== null && ((t = this.tools) == null || t.fillColor.value((e) => {
|
|
271
275
|
const i = this.aesGetters.dotFill ?? O, l = M(i(e.idx));
|
|
272
|
-
return l[3] = !e.dimmed &&
|
|
276
|
+
return l[3] = !e.dimmed && W(e.x, e.y, this.polygons) ? 1 : 0.4, P(l, l);
|
|
273
277
|
}), this.renderWebglLayer());
|
|
274
278
|
}
|
|
275
279
|
createQuadtree(t) {
|
|
276
|
-
const e = new
|
|
280
|
+
const e = new ct(t.length, 512);
|
|
277
281
|
for (let i = 0; i < t.length; i++)
|
|
278
282
|
e.add(t[i].x, t[i].y);
|
|
279
283
|
return e.finish();
|
|
280
284
|
}
|
|
281
285
|
getClosestDot(t, e) {
|
|
282
|
-
var
|
|
283
|
-
const i = (
|
|
286
|
+
var r, f;
|
|
287
|
+
const i = (r = this.tools) == null ? void 0 : r.qt;
|
|
284
288
|
if (!i) return null;
|
|
285
|
-
const l = this.allDots, o = this.scales.x.invert(t), c = this.scales.y.invert(e), m = 1 / (((f = this.zoomTransform) == null ? void 0 : f.k) || 1), u = o - m,
|
|
289
|
+
const l = this.allDots, o = this.scales.x.invert(t), c = this.scales.y.invert(e), m = 1 / (((f = this.zoomTransform) == null ? void 0 : f.k) || 1), u = o - m, y = o + m, x = c - m, d = c + m, n = i.range(u, x, y, d), g = n.reduce((p, s) => {
|
|
286
290
|
const a = l[s], v = this.scales.x(a.x) - t, z = this.scales.y(a.y) - e, T = Math.hypot(v, z);
|
|
287
291
|
return (p === null || T < p.distance) && (p.index = s, p.distance = T), p;
|
|
288
292
|
}, {
|
|
289
293
|
index: -1,
|
|
290
294
|
distance: 1 / 0
|
|
291
295
|
});
|
|
292
|
-
return
|
|
296
|
+
return n.length === 0 || g.index === -1 ? null : l[g.index];
|
|
293
297
|
}
|
|
294
298
|
updateDots(t) {
|
|
295
299
|
this.tools !== null && (N(this.canvasNode).datum(t), this.tools.fillColor.data(t), this.tools.qt = this.createQuadtree(t), this.allDots = t);
|
|
296
300
|
}
|
|
297
|
-
render(t, e, i, l, o, c, m, u,
|
|
301
|
+
render(t, e, i, l, o, c, m, u, y, x, d, n, g) {
|
|
298
302
|
if (this.dataFrame = t, this.tools === null)
|
|
299
303
|
this.initSettings(
|
|
300
304
|
o,
|
|
301
305
|
i,
|
|
302
306
|
c,
|
|
303
|
-
|
|
307
|
+
y,
|
|
304
308
|
u,
|
|
305
309
|
x
|
|
306
310
|
);
|
|
307
311
|
else {
|
|
308
|
-
const { title:
|
|
309
|
-
this.updateChartSizes(p), this.updateLegendSize(f,
|
|
312
|
+
const { title: r, legend: f, size: p } = i;
|
|
313
|
+
this.updateChartSizes(p), this.updateLegendSize(f, y, x, u), this.createMainTitle(r), this.updateMargins(), this.updateAes(y, u);
|
|
310
314
|
}
|
|
311
|
-
this.onPolygonUpdateOutside = d, this.onTooltipHintSwitch =
|
|
315
|
+
this.onPolygonUpdateOutside = d, this.onTooltipHintSwitch = n, this.onLassoControlsStateUpdate = g, this.allDots !== o && (this.updateDots(o), this.visibleLabels = this.computeLabels(o)), this.notCalculatedProps = {
|
|
312
316
|
settingsId: e,
|
|
313
317
|
chartSettings: i,
|
|
314
318
|
keyColumn: l,
|
|
@@ -344,29 +348,29 @@ class ne {
|
|
|
344
348
|
onTooltipHintSwitch: this.onTooltipHintSwitch,
|
|
345
349
|
onLassoControlsStateUpdate: this.onLassoControlsStateUpdate
|
|
346
350
|
};
|
|
347
|
-
this.svgLayerComponent = /* @__PURE__ */ b.jsx(
|
|
351
|
+
this.svgLayerComponent = /* @__PURE__ */ b.jsx(dt, { dataFrame: this.dataFrame, children: /* @__PURE__ */ b.jsx(rt, { ...t }) }), (e = this.reactRoot) == null || e.render(this.svgLayerComponent);
|
|
348
352
|
}
|
|
349
353
|
renderError(t) {
|
|
350
354
|
var e;
|
|
351
355
|
(e = this.reactRoot) == null || e.render(/* @__PURE__ */ b.jsx(J, { message: t }));
|
|
352
356
|
}
|
|
353
357
|
computeLabels(t) {
|
|
354
|
-
const e = new
|
|
358
|
+
const e = new R("16px Manrope"), i = ot(this.chartSizes.chartWidth, this.chartSizes.chartHeight), l = [];
|
|
355
359
|
for (let o = 0; o < t.length; o++) {
|
|
356
360
|
const c = t[o];
|
|
357
361
|
if (c.label == null)
|
|
358
362
|
continue;
|
|
359
|
-
const m = String(c.label), u = e.getTextMetrics(m),
|
|
360
|
-
|
|
361
|
-
x:
|
|
363
|
+
const m = String(c.label), u = e.getTextMetrics(m), y = this.scales.x(c.x), x = this.scales.y(c.y), d = u.width, n = u.actualBoundingBoxAscent + u.actualBoundingBoxDescent, g = 10, r = i(y, x, d, n, g);
|
|
364
|
+
r && l.push({
|
|
365
|
+
x: y,
|
|
362
366
|
y: x,
|
|
363
367
|
dot: c,
|
|
364
368
|
name: m,
|
|
365
369
|
width: d,
|
|
366
|
-
height:
|
|
370
|
+
height: n,
|
|
367
371
|
padding: g,
|
|
368
|
-
xPosition:
|
|
369
|
-
yPosition:
|
|
372
|
+
xPosition: r[0],
|
|
373
|
+
yPosition: r[1]
|
|
370
374
|
});
|
|
371
375
|
}
|
|
372
376
|
return l;
|
|
@@ -379,6 +383,6 @@ class ne {
|
|
|
379
383
|
}
|
|
380
384
|
}
|
|
381
385
|
export {
|
|
382
|
-
|
|
386
|
+
re as default
|
|
383
387
|
};
|
|
384
388
|
//# sourceMappingURL=ChartRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n dataFrame: DataFrame = new DataFrame('', {});\n\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer();\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer();\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer();\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) {\n this.dataFrame = dataFrame; \n if (this.tools === null) {\n this.initSettings(\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer();\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer() {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={this.dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","DataFrame","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","i","name","metrics","w","h","position","label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n dataFrame: DataFrame = new DataFrame('', {});\n\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer();\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer();\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer();\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) {\n this.dataFrame = dataFrame; \n if (this.tools === null) {\n this.initSettings(\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer();\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer() {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={this.dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","DataFrame","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","i","name","metrics","w","h","position","label"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,SAASA,EAAwBC,GAAU;AACvC,SAAQA,IAAI,QAASA,IAAI,QAAQ;AACrC;AAEA,SAASC,EAAoBC,GAAUC,GAAUC,GAAqB;AAClE,SAAIA,EAAS,WAAW,IACb,KAEJA,EAAS,KAAK,CAACC,MAAMA,EAAE,UAAUA,EAAE,OAAO,SAAS,KAAKC,GAAgBD,EAAE,QAAQ,CAACH,GAAGC,CAAC,CAAC,CAAC;AACpG;AAEA,SAASI,EACLC,GACAC,GACAC,GACU;AACV,QAAMC,IAAWD,EAAO,KAAK,CAAAE,MAAKA,EAAE,SAAS,MAAM,GAC7CC,IAAaH,EAAO,KAAK,CAAAE,MAAKA,EAAE,SAAS,OAAO;AACtD,SAAO;AAAA,IACH,SAASE,EAAgBN,GAAWC,IAAYE,KAAA,gBAAAA,EAAU,IAAI,YAAWI,EAAgB,OAAO,SAAS;AAAA,IACzG,SAASD,EAAgBN,GAAWC,IAAYE,KAAA,gBAAAA,EAAU,IAAI,YAAWI,EAAgB,MAAM,SAAS;AAAA,IACxG,UAAUD,EAAgBN,GAAWC,IAAYI,KAAA,gBAAAA,EAAY,IAAI,cAAa,SAAS,WAAW;AAAA,EAAA;AAE1G;AAEA,MAAMG,GAAc;AAAA,EAApB;AACI,IAAAC,EAAA,mBAAyB;AACzB,IAAAA,EAAA,oBAAiC;AACjC,IAAAA,EAAA,kBAA+B;AAC/B,IAAAA,EAAA,oBAAiC;AAEjC,IAAAA,EAAA,yBAAqC;AACrC,IAAAA,EAAA,2BAAmCC,gBAAAA,EAAAA,IAAAC,EAAAA,UAAA,EAAE;AAErC,IAAAF,EAAA,oBAAyB;AAAA,MACrB,SAAS,MAAM;AAAA,MACf,SAAS,MAAMG;AAAA,MACf,UAAU,MAAM;AAAA,IAAA;AAGpB,IAAAH,EAAA,eASW;AAEX,IAAAA,EAAA,iBAAmB;AAAA,MACf,KAAKI;AAAA,MACL,QAAQA;AAAA,MACR,MAAMA;AAAA,MACN,OAAOA;AAAA,IAAA;AAEX,IAAAJ,EAAA,oBAAyB;AAAA,MACrB,YAAYK;AAAA;AAAA,MACZ,aAAaC;AAAA;AAAA,MACb,YAAYD;AAAA;AAAA,MACZ,aAAaC;AAAA;AAAA,IAAA;AAEjB,IAAAN,EAAA,gBAAsB;AAAA,MAClB,GAAGO,EAAA,EAAc,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,GAAGF,CAAa,CAAC;AAAA,MACzD,GAAGE,EAAA,EAAc,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAACD,GAAgB,CAAC,CAAC;AAAA,MAC1D,WAAWC,EAAA,EAAc,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,GAAGF,CAAa,CAAC;AAAA,MACjE,WAAWE,EAAA,EAAc,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAACD,GAAgB,CAAC,CAAC;AAAA,IAAA;AAGtE,IAAAN,EAAA,kBAAqB,CAAA;AACrB,IAAAA,EAAA,gCAAsE,MAAA;AAAA;AACtE,IAAAA,EAAA,6BAAuE,MAAA;AAAA;AACvE,IAAAA,EAAA,oCAAqF,MAAA;AAAA;AAErF,IAAAA,EAAA,uBAAuC;AACvC,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,qBAA0B;AAC1B,IAAAA,EAAA,uBAA+B;AAAA,MAC3B,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IAAA;AAExB,IAAAA,EAAA,mBAAsB,CAAA;AACtB;AAAA,IAAAA,EAAA,gBAAqB,EAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAC;AAEnD,IAAAA,EAAA,4BAA6C,CAAA;AAE7C,IAAAA,EAAA,iBAAiB,CAAA;AACjB,IAAAA,EAAA,uBAAyB,CAAA;AACzB,IAAAA,EAAA,mBAAuB,IAAIQ,GAAU,IAAI,EAAE;AAqgB3C,IAAAR,EAAA,yBAAkB,CAACZ,MAAgB;AAC/B,WAAK,WAAWA,GAChB,KAAK,cAAA;AACL,YAAMqB,IAAsB,KAAK,QAC5B,OAAO,CAAAC,MAAK1B,EAAoB0B,EAAE,GAAGA,EAAE,GAAG,KAAK,QAAQ,CAAC,EACxD,IAAI,CAAAA,MAAKA,EAAE,GAAG;AACnB,WAAK,uBAAuBD,GAAqBrB,CAAC;AAAA,IACtD;AAAA;AAAA,EA1gBA,QAAQ;;AACJ,IAAI,KAAK,cAAc,KAAK,YAAY,KAAK,gBACzCuB,IAAA,KAAK,eAAL,QAAAA,EAAiB,YAAY,KAAK,YAClCC,IAAA,KAAK,eAAL,QAAAA,EAAiB,YAAY,KAAK,aAClC,KAAK,aAAa,MAClB,KAAK,WAAW,MAChB,KAAK,aAAa,MAClB,KAAK,kBAAkB,MACvB,KAAK,QAAQ,OAGjB,WAAW,MAAM;;AACb,OAAAD,IAAA,KAAK,cAAL,QAAAA,EAAgB,WAChB,KAAK,YAAY;AAAA,IACrB,CAAC;AAAA,EACL;AAAA,EAEA,KAAKE,GAAmB;AACpB,IAAI,KAAK,eAAe,SACpB,KAAK,aAAaA,GAClB,KAAK,WAAW,SAAS,cAAc,KAAK,GAC5C,KAAK,aAAa,SAAS,cAAc,KAAK,GAC9C,KAAK,WAAW,YAAY,KAAK,QAAQ,GACzC,KAAK,WAAW,YAAY,KAAK,UAAU,GAC3C,KAAK,YAAYC,EAAW,KAAK,QAAQ;AAAA,EAEjD;AAAA,EAEA,iBAAiBC,GAA4D;AACzE,KAAIA,EAAK,UAAU,KAAK,WAAW,cAAcA,EAAK,WAAW,KAAK,WAAW,iBAE7E,KAAK,WAAW,aAAaA,EAAK,OAClC,KAAK,WAAW,cAAcA,EAAK,QACnC,KAAK,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,WAAW,UAAU,CAAC,GACnD,KAAK,OAAO,EAAE,MAAM,CAAC,KAAK,WAAW,aAAa,CAAC,CAAC;AAAA,EAG5D;AAAA,EAEA,eACIC,GACAC,GACAC,GACF;AACE,UAAMC,IAASH,EAAM,UAAU,QAAQI,EAAA,IAAab,EAAA;AAEpD,QAAI,EAAC,MAAAc,GAAM,MAAAC,GAAM,MAAAC,GAAM,MAAAC,MAAQN;AAa/B,QAZIF,EAAM,eAAe,WACrBK,IAAO,KAAK,IAAIA,GAAML,EAAM,UAAU,IAEtCA,EAAM,eAAe,WACrBO,IAAO,KAAK,IAAIA,GAAMP,EAAM,UAAU,IAEtCC,EAAM,eAAe,WACrBK,IAAO,KAAK,IAAIA,GAAML,EAAM,UAAU,IAEtCA,EAAM,eAAe,WACrBO,IAAO,KAAK,IAAIA,GAAMP,EAAM,UAAU,IAEtCD,EAAM,mBAAmB,QAAW;AACpC,YAAMS,IAAST,EAAM;AACrB,UAAIS,KAAUJ,KAAQI,KAAUF,GAAM;AAClC,cAAMG,IAAY,KAAK,IAAID,IAASJ,GAAME,IAAOE,CAAM;AACvD,QAAAJ,IAAOI,IAASC,GAChBH,IAAOE,IAASC;AAAA,MACpB;AAAA,IACJ;AACA,QAAI,OAAOT,EAAM,iBAAmB,KAAa;AAC7C,YAAMQ,IAASR,EAAM;AACrB,UAAIQ,KAAUH,KAAQG,KAAUD,GAAM;AAClC,cAAME,IAAY,KAAK,IAAID,IAASH,GAAME,IAAOC,CAAM;AACvD,QAAAH,IAAOG,IAASC,GAChBF,IAAOC,IAASC;AAAA,MACpB;AAAA,IACJ;AAEA,UAAMC,IAAS,CAAC,GAAG,KAAK,WAAW,UAAU,GAEvCC,IAAQT,EACT,KAAA,EACA,OAAO,CAACE,GAAME,CAAI,CAAC,EACnB,MAAM,CAACM,EAAS,MAAM,KAAK,WAAW,aAAaA,EAAS,KAAK,CAAC;AACvE,IAAAV,EACK,OAAO,CAACS,EAAM,OAAO,CAAC,GAAGA,EAAM,OAAO,KAAK,WAAW,UAAU,CAAC,CAAC,EAClE,MAAMD,CAAM,EACZ,KAAA,GACL,KAAK,OAAO,IAAIR,GAChB,KAAK,OAAO,YAAYA,EAAO,KAAA;AAE/B,UAAMW,IAASb,EAAM,UAAU,QAAQG,EAAA,IAAab,EAAA,GAC9CwB,IAAS,CAAC,KAAK,WAAW,aAAa,CAAC,GAExCC,IAAQF,EACT,KAAA,EACA,OAAO,CAACR,GAAME,CAAI,CAAC,EACnB,MAAM,CAAC,KAAK,WAAW,cAAcK,EAAS,QAAQA,EAAS,GAAG,CAAC;AACxE,IAAAC,EACK,OAAO,CAACE,EAAM,OAAO,KAAK,WAAW,WAAW,GAAGA,EAAM,OAAO,CAAC,CAAC,CAAC,EACnE,MAAMD,CAAM,EACZ,KAAA,GACL,KAAK,OAAO,IAAID,GAChB,KAAK,OAAO,YAAYA,EAAO,KAAA;AAAA,EACnC;AAAA,EAEA,qBAAqB;AACjB,UAAMG,IAAe,IAAIC,EAAa,gBAAgB;AAEtD,aAASC,EAAgBC,GAAiB;AACtC,aAAO,KAAK,IAAI,GAAGA,EAAM,IAAI,OAAOH,EAAa,aAAaI,CAAG,CAAC,CAAC;AAAA,IACvE;AAEA,UAAM,EAAC,OAAAD,GAAO,QAAAE,MAAUC,GAAkB,KAAK,OAAO,GAAG,EAAK,GACxDC,IAAWL,EAAgBC,EAAM,IAAIE,CAAM,CAAC;AAElD,SAAK,gBAAgB;AAAA,MACjB,oBAAoB;AAAA,MACpB,oBAAoBE;AAAA,IAAA;AAAA,EAE5B;AAAA,EAEA,gBAAgBC,GAA8D;AAC1E,SAAK,YAAYC;AAAA,MACbD,EAAM;AAAA,MACN,KAAK,WAAW,aAAa,KAAK,QAAQ,OAAO,KAAK,QAAQ;AAAA,MAC9D;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,gBAAgB;AACZ,UAAME,IAAkBC,IAAoB,KAAK,UAAU,QACrDC,IAAcF,IAAkB,IAAIA,IAAkBG,KAAe,IAAI;AAC/E,SAAK,UAAU;AAAA,MACX,KAAK,KAAK,IAAID,GAAazC,CAAU;AAAA,MACrC,QAAQA,IAAa,KAAK,cAAc,qBAAqB2C;AAAA,MAC7D,MAAM3C,IAAa,KAAK,cAAc,qBAAqB2C;AAAA,MAC3D,OAAO,KAAK,OAAO,QAAQ3C;AAAA,IAAA,GAE/B,KAAK,WAAW,aAAa,KAAK,QAAQ,OAAO,KAAK,WAAW,aAAa,KAAK,QAAQ,OAC3F,KAAK,WAAW,cACZ,KAAK,QAAQ,MAAM,KAAK,IAAI,KAAK,WAAW,aAAa,KAAK,OAAO,MAAM,IAAI,KAAK,QAAQ,QAEhG4C,EAAO,KAAK,UAAU,EACjB,MAAM,SAAS,KAAK,WAAW,aAAa,IAAI,EAChD,MAAM,UAAU,KAAK,WAAW,cAAc,IAAI,EAClD,MAAM,OAAO,KAAK,QAAQ,MAAM,IAAI,EACpC,MAAM,QAAQ,KAAK,QAAQ,OAAO,IAAI;AAAA,EAC/C;AAAA,EAEA,iBACIC,GACAC,GACAC,GACA1D,GACF;AACE,QAAI,CAACwD,EAAO,MAAM;AACd,WAAK,SAAS,EAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAC;AAC5C;AAAA,IACJ;AAEA,UAAMG,IAA4B,CAAA,GAC5BC,IAAa,EAAC,OAAM,GAAG,QAAO,GAAG,MAAK,GAAG,KAAK,EAAA;AA2DpD,QAzDAF,EAAS,QAAQ,CAAAG,MAAU;AACvB,YAAMC,IAAOL,EAAaI,EAAO,KAAK;AACtC,UAAIC,EAAK,QAAQ,WAAW,KAAK,CAACA,EAAK;AACnC;AAEJ,UAAIA,EAAK,OAAO,SAASC,IAAmC;AACxD,gBAAQ,KAAK,wCAAwCD,EAAK,OAAO,MAAM,GAAG;AAC1E;AAAA,MACJ;AACA,YAAME,IAAsC,CAAA;AAC5C,MAAAF,EAAK,OAAO,QAAQ,CAAAG,MAAY;AAC5B,QAAKD,EAAQC,CAAQ,MACjBD,EAAQC,CAAQ,IAAI,EAAC,GAAG5D,EAAA,IAE5ByD,EAAK,QAAQ,QAAQ,CAAAlB,MAAO;AACxB,UAAIA,MAAQ,cACRoB,EAAQC,CAAQ,EAAE,QAASH,EAAK,OAAOG,GAAUrB,CAAG,KAAKlC,IAEzDkC,MAAQ,cACRoB,EAAQC,CAAQ,EAAE,OAAO,OAAOH,EAAK,OAAOG,GAAUrB,CAAG,KAAK,CAAC;AAAA,QAEvE,CAAC;AAAA,MACL,CAAC;AAED,YAAMI,IAAQa,EAAO,SAASA,EAAO,OAC/BK,IAAQC,GAAA,EACT,OAAOL,EAAK,MAAM,EAClB,MAAMA,EAAK,OAAO,IAAI,CAAAM,MAASJ,EAAQI,CAAK,CAAC,CAAC;AACnD,MAAAT,EAAY,KAAK,EAAC,GAAGC,GAAY,IAAIC,EAAO,OAAO,MAAM,QAAQ,OAAAb,GAAO,OAAAkB,GAAO,QAAOJ,EAAK,QAAQ,QAAOA,EAAK,QAAO;AAAA,IAC1H,CAAC,GAED9D,EAAO,QAAQ,CAAAqE,MAAS;AACpB,UAAIA,EAAM,SAAS,UAAUC,EAAgBD,EAAM,IAAI,OAAO,GAAG;AAC7D,cAAM,EAAC,QAAAE,GAAQ,OAAAC,GAAO,YAAAC,GAAY,MAAAC,IAAO,SAAA,IAAYL,EAAM,IAAI,SACzDrB,IAAQyB,EAAW,SAASA,EAAW,OACvCE,IAAaC,GAAwBJ,GAAOD,GAAQ,QAAQ,GAC5DM,KAAqBH,MAAS,QAAQI,GAAA,IAAgChE,KACvE,OAAOyD,CAAM,EAEb,MAAM,CAAC,KAAK,WAAW,aAAa,CAAC,CAAC,GACrCQ,IAASC,GAAyBH,GAAmBN,CAA0B;AACrF,QAAAZ,EAAY,KAAK,EAAC,GAAGC,GAAY,IAAI,WAAW,MAAM,cAAc,OAAAZ,GAAO,OAAO2B,GAAY,mBAAAE,GAAmB,QAAAE,GAAO;AAAA,MAC5H;AACA,UAAIV,EAAM,SAAS,UAAUC,EAAgBD,EAAM,IAAI,OAAO,GAAG;AAC7D,cAAM,EAAC,YAAAI,GAAY,QAAAF,GAAQ,OAAAC,EAAA,IAASH,EAAM,IAAI,SACxCrB,IAAQyB,EAAW,SAASA,EAAW,OACvCP,IAAQe,GAAUV,GAAQC,CAAK,GAC/BO,IAASb,EAAM,MAAM,CAAC,GACtBrB,IAASqB,EAAM,WAAW,CAAC,GAC3BgB,IAASH,EAAO,OAAO,CAACI,GAA6BC,OACvDD,EAAI,OAAOC,CAAC,CAAC,IAAIvC,EAAOuC,CAAC,GAClBD,IACR,CAAA,CAAE;AACL,QAAAxB,EAAY,KAAK,EAAC,GAAGC,GAAY,IAAIa,EAAW,OAAO,MAAM,QAAQ,OAAAzB,GAAO,OAAAkB,GAAO,QAAAa,GAAQ,QAAAG,GAAO;AAAA,MACtG;AAAA,IACJ,CAAC,GAEG,CAACvB,EAAY,QAAQ;AACrB,WAAK,SAAS,EAAC,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAC;AAC5C;AAAA,IACJ;AAEA,UAAM0B,IAAQC,GAAmB3B,GAAa,KAAK,WAAW,WAAW,GACnE4B,IAAWF,EAAMA,EAAM,SAAS,CAAC,GACjCG,IAAcD,EAAS,OAAOA,EAAS,QAAQE,IAC/CC,IAAe,KAAK,WAAW;AAErC,SAAK,SAAS;AAAA,MACV,OAAOF;AAAA,MACP,QAAQE;AAAA,MACR,OAAAL;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,aACIM,GACAC,GACAC,GACA9F,GACAC,GACA0D,GACF;AACE,UAAM,EAAC,OAAAnC,GAAO,OAAAC,GAAO,MAAAF,GAAM,OAAA0B,GAAO,QAAAQ,MAAUoC;AAC5C,SAAK,iBAAiBtE,CAAI,GAC1B,KAAK,eAAeC,GAAOC,GAAOqE,CAAU,GAC5C,KAAK,mBAAA,GACL,KAAK,iBAAiBrC,GAAQzD,GAAY2D,GAAU1D,CAAM,GAC1D,KAAK,gBAAgBgD,CAAK,GAC1B,KAAK,cAAA,GAEL,KAAK,aAAanD,EAAqB,KAAK,WAAWE,GAAYC,CAAM;AAEzE,UAAM8F,IAAYC,IACb,KAAKJ,CAAI,EACT,MAAM,CAAC1E,MAAW;AACf,YAAM+E,IAAOC,EAAmB,KAAK,WAAW,QAAQhF,EAAE,GAAG,CAAC;AAC9D,aAAA+E,EAAK,CAAC,IAAI,CAAC/E,EAAE,UAAU1B,EAAoB0B,EAAE,GAAGA,EAAE,GAAG,KAAK,QAAQ,IAAI,IAAI,KACnEiF,EAAwBF,GAAMA,CAAI;AAAA,IAC7C,CAAC,GAECG,IAAcC,EAAA,EACf,OAAO,CAACC,GAAUC,MAAaD,MAAMC,CAAC,EACtC,KAAK,CAACrF,MAAW5B,EAAwB,KAAK,WAAW,QAAQ4B,EAAE,GAAG,CAAC,CAAC,EACxE,WAAW,CAACA,MAAWA,EAAE,CAAC,EAC1B,UAAU,CAACA,MAAWA,EAAE,CAAC,EACzB,SAAS,CAACsF,MAAqBT,EAAUS,CAAO,CAAC,GAEhDC,IAAIC,EAAA,EACL,YAAY,CAAC,KAAK,GAAI,CAAC,EACvB,OAAO,CAACC,MACEA,EAAE,SAAS,WAAWA,EAAE,WAAWA,EAAE,OAC/C,EACA,GAAG,SAAS,MAAM;AACf,WAAK,cAAc;AAAA,IACvB,CAAC,EACA,GAAG,QAAQ,CAACA,MAAwC;AACjD,YAAMC,IAAYD,EAAE,WACdlH,IAAImH,EAAU,SAAS,KAAK,OAAO,SAAS,GAC5ClH,IAAIkH,EAAU,SAAS,KAAK,OAAO,SAAS;AAClD,WAAK,OAAO,EAAE,OAAOnH,EAAE,QAAQ,GAC/B,KAAK,OAAO,EAAE,OAAOC,EAAE,QAAQ,GAE/B,KAAK,gBAAgBkH,GACrB,KAAK,eAAe,GAAGA,EAAU,CAAC,IAAIA,EAAU,CAAC,IAAIA,EAAU,CAAC,IAEhE,KAAK,qBAAqB,KAAK,aAAa,GAC5C,KAAK,eAAA,GACL,KAAK,iBAAA;AAAA,IACT,CAAC,EAAE,GAAG,OAAO,MAAM;AACf,WAAK,gBAAgB,KAAK,cAAc,KAAK,OAAO,GACpD,KAAK,eAAA;AAAA,IACT,CAAC,GAIChH,IAAIiH,KAAU,GAAG,SAAS,CAAC,CAACC,CAAK,MAAM;;AACzC,UAAIC;AACJ,MAAID,MACAC,IAAe,KAAK,cAAcD,EAAM,GAAGA,EAAM,CAAC;AAGtD,YAAME,IACD,KAAK,eAAe,CAACD,KACrB,CAAC,KAAK,eAAeA,OACtB5F,IAAA,KAAK,gBAAL,gBAAAA,EAAkB,UAAQ4F,KAAA,gBAAAA,EAAc;AAE5C,WAAK,cAAcA,KAAgB,MAE/BC,KACA,KAAK,eAAA;AAAA,IAEb,CAAC,GAEKC,IAAaC,EAAe;AAAA,MAC9B,QAAQ,KAAK,OAAO;AAAA,MACpB,QAAQ,KAAK,OAAO;AAAA,IAAA,CACvB,EACI,YAAY,MAAM,GAAG,EACrB,WAAW,MAAM,GAAG,EACpB,YAAYC,EAAA,CAAgB,EAC5B;AAAA;AAAA,MAEGC,EAAA,EACK,OAAO,CAAChB,CAAW,CAAC,EACpB,QAAQ,CAAClF,MAAeA,CAAC;AAAA,IAAA,EAEjC,SAAS,CAAAmG,MAAa;AACnB,YAAMC,IAAID,EAAU,MAAA;AACpB,MAAIC,KAAK,CAAC,KAAK,oBACXA,EAAE,MAAM,yBAAyB,mBAAmB,GACpDA,EAAE,MAAM,sBAAsB,mBAAmB,GACjD,KAAK,kBAAkBA,EAAE,OAAO,8BAA8B,EAAE,KAAA,IAEpEA,EAAE,OAAO,0BAA0B,EAAE,KAAK,SAAS,uDAAuD,EAGrG,KAAKb,CAAC,EACN,KAAK7G,CAAC;AAAA,IACf,CAAC;AAEL,SAAK,QAAQ;AAAA,MACT,YAAAqH;AAAA,MACA,MAAMR;AAAA,MACN,WAAAV;AAAA,MACA,aAAAK;AAAA,IAAA,GAGJ5C,EAAO,KAAK,UAAU,EACjB,MAAMoC,CAAI,EACV,MAAM,YAAY,UAAU,EAC5B,MAAM,SAAS,KAAK,WAAW,aAAa,IAAI,EAChD,MAAM,UAAU,KAAK,WAAW,cAAc,IAAI,EAClD,MAAM,OAAO,KAAK,QAAQ,MAAM,IAAI,EACpC,MAAM,QAAQ,KAAK,QAAQ,OAAO,IAAI;AAAA,EAC/C;AAAA,EAEA,UACI5F,GACAC,GACF;AACE,IAAI,KAAK,UAAU,SAGnB,KAAK,aAAaH,EAAqB,KAAK,WAAWE,GAAYC,CAAM,GAGzE,KAAK,MAAM,UAAU,MAAM,CAACiB,MAAW;AACnC,YAAMqG,IAAc,KAAK,WAAW,WAAWC,GACzCvB,IAAOC,EAAmBqB,EAAYrG,EAAE,GAAG,CAAC;AAClD,aAAA+E,EAAK,CAAC,IAAI,CAAC/E,EAAE,UAAU1B,EAAoB0B,EAAE,GAAGA,EAAE,GAAG,KAAK,QAAQ,IAAI,IAAI,KACnEiF,EAAwBF,GAAMA,CAAI;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EAEA,kBAAkB;AACd,IAAI,KAAK,UAAU,SAInBzC,EAAO,KAAK,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAG/C,KAAK,MAAM,YAAY,KAAK,CAACtC,MAAW5B,EAAwB,KAAK,WAAW,QAAQ4B,EAAE,IAAI,CAAC,CAAC;AAAA,EACpG;AAAA,EAEA,gBAAgB;;AACZ,IAAI,KAAK,UAAU,UAKnBC,IAAA,KAAK,UAAL,QAAAA,EAAY,UAAU,MAAM,CAACD,MAAW;AACpC,YAAMqG,IAAc,KAAK,WAAW,WAAWC,GACzCvB,IAAOC,EAAmBqB,EAAYrG,EAAE,GAAG,CAAC;AAClD,aAAA+E,EAAK,CAAC,IAAI,CAAC/E,EAAE,UAAU1B,EAAoB0B,EAAE,GAAGA,EAAE,GAAG,KAAK,QAAQ,IAAI,IAAI,KACnEiF,EAAwBF,GAAMA,CAAI;AAAA,IAC7C,IACA,KAAK,iBAAA;AAAA,EACT;AAAA,EAEA,eAAeL,GAAqB;AAChC,UAAM6B,IAAO,IAAIC,GAAO9B,EAAK,QAAQ,GAAG;AAExC,aAAS,IAAI,GAAG,IAAIA,EAAK,QAAQ;AAC7B,MAAA6B,EAAK,IAAI7B,EAAK,CAAC,EAAE,GAAGA,EAAK,CAAC,EAAE,CAAC;AAGjC,WAAO6B,EAAK,OAAA;AAAA,EAChB;AAAA,EAEA,cAAcE,GAAYC,GAAwB;;AAC9C,UAAMH,KAAOtG,IAAA,KAAK,UAAL,gBAAAA,EAAY;AACzB,QAAI,CAACsG,EAAM,QAAO;AAClB,UAAM7B,IAAO,KAAK,SACZnG,IAAI,KAAK,OAAO,EAAE,OAAOkI,CAAE,GAC3BjI,IAAI,KAAK,OAAO,EAAE,OAAOkI,CAAE,GAC3BC,IAAS,OAAKzG,IAAA,KAAK,kBAAL,gBAAAA,EAAoB,MAAK,IACvCS,IAAOpC,IAAIoI,GACX9F,IAAOtC,IAAIoI,GACX/F,IAAOpC,IAAImI,GACX7F,IAAOtC,IAAImI,GAEXC,IAAUL,EAAK,MAAM5F,GAAMC,GAAMC,GAAMC,CAAI,GAC3C+F,IAAUD,EAAQ,OAAO,CAACC,GAASC,MAAgB;AACrD,YAAMC,IAAMrC,EAAKoC,CAAG,GACdE,IAAK,KAAK,OAAO,EAAED,EAAI,CAAC,IAAIN,GAC5BQ,IAAK,KAAK,OAAO,EAAEF,EAAI,CAAC,IAAIL,GAC5BQ,IAAW,KAAK,MAAMF,GAAIC,CAAE;AAClC,cAAIJ,MAAY,QAAQK,IAAWL,EAAQ,cACvCA,EAAQ,QAAQC,GAChBD,EAAQ,WAAWK,IAEhBL;AAAAA,IACX,GAAG;AAAA,MACC,OAAO;AAAA,MACP,UAAU;AAAA,IAAA,CACb;AACD,WAAOD,EAAQ,WAAW,KAAKC,EAAQ,UAAU,KAAK,OAAOnC,EAAKmC,EAAQ,KAAK;AAAA,EACnF;AAAA,EAEA,WAAWnC,GAAa;AACpB,IAAI,KAAK,UAAU,SAGnBpC,EAAO,KAAK,UAAU,EAAE,MAAMoC,CAAI,GAGlC,KAAK,MAAM,UAAU,KAAKA,CAAI,GAC9B,KAAK,MAAM,KAAK,KAAK,eAAeA,CAAI,GACxC,KAAK,UAAUA;AAAA,EACnB;AAAA,EAEA,OACI7F,GACAsI,GACAxC,GACAyC,GACA1C,GACAE,GACAyC,GACAtI,GACAD,GACA2D,GACA6E,GACAC,GACAC,GACF;AAEE,QADA,KAAK,YAAY3I,GACb,KAAK,UAAU;AACf,WAAK;AAAA,QACD6F;AAAA,QACAC;AAAA,QACAC;AAAA,QACA9F;AAAA,QACAC;AAAA,QACA0D;AAAA,MAAA;AAAA,SAED;AACH,YAAM,EAAC,OAAAV,GAAO,QAAAQ,GAAQ,MAAAlC,EAAA,IAAQsE;AAC9B,WAAK,iBAAiBtE,CAAI,GAC1B,KAAK,iBAAiBkC,GAAQzD,GAAY2D,GAAU1D,CAAM,GAC1D,KAAK,gBAAgBgD,CAAK,GAC1B,KAAK,cAAA,GACL,KAAK,UAAUjD,GAAYC,CAAM;AAAA,IACrC;AAEA,SAAK,yBAAyBuI,GAC9B,KAAK,sBAAsBC,GAC3B,KAAK,6BAA6BC,GAE9B,KAAK,YAAY9C,MACjB,KAAK,WAAWA,CAAI,GACpB,KAAK,gBAAgB,KAAK,cAAcA,CAAI,IAGhD,KAAK,qBAAqB;AAAA,MACtB,YAAAyC;AAAA,MACA,eAAAxC;AAAA,MACA,WAAAyC;AAAA,MACA,gBAAAC;AAAA,MACA,QAAAtI;AAAA,IAAA,GAGJ,KAAK,iBAAA,GACL,KAAK,eAAA;AAAA,EACT;AAAA,EAEA,mBAAmB;;AACf,KAAIkB,IAAA,KAAK,UAAL,QAAAA,EAAY,cACZqC,EAAO,KAAK,UAAU,EAAE,MAAKpC,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAU;AAAA,EAE3D;AAAA,EAWA,iBAAiB;;AACb,UAAMuH,IAAQ;AAAA,MACV,YAAY,KAAK,mBAAmB;AAAA,MACpC,eAAe,KAAK,mBAAmB;AAAA,MACvC,WAAW,KAAK,mBAAmB;AAAA,MACnC,gBAAgB,KAAK,mBAAmB;AAAA,MACxC,QAAQ,KAAK,mBAAmB;AAAA,MAChC,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,iBAAiB,KAAK;AAAA,MACtB,qBAAqB,KAAK;AAAA,MAC1B,4BAA4B,KAAK;AAAA,IAAA;AAErC,SAAK,oBACDlI,gBAAAA,EAAAA,IAACmI,IAAA,EAAkB,WAAW,KAAK,WAC/B,UAAAnI,gBAAAA,EAAAA,IAACoI,IAAA,EAAU,GAAGF,EAAA,CAAO,EAAA,CACzB,IAEJxH,IAAA,KAAK,cAAL,QAAAA,EAAgB,OAAO,KAAK;AAAA,EAChC;AAAA,EAEA,YAAY2H,GAAiB;;AACzB,KAAA3H,IAAA,KAAK,cAAL,QAAAA,EAAgB,OAAOV,gBAAAA,EAAAA,IAACsI,GAAA,EAAM,SAAAD,GAAkB;AAAA,EACpD;AAAA,EAEQ,cAAclD,GAAa;AAC/B,UAAMnD,IAAe,IAAIC,EAAa,cAAc,GAC9CsG,IAAcC,GAAsB,KAAK,WAAW,YAAY,KAAK,WAAW,WAAW,GAC3F9D,IAAS,CAAA;AAEf,aAAS+D,IAAI,GAAGA,IAAItD,EAAK,QAAQsD,KAAK;AAClC,YAAMjB,IAAMrC,EAAKsD,CAAC;AAClB,UAAIjB,EAAI,SAAS;AACb;AAEJ,YAAMkB,IAAO,OAAOlB,EAAI,KAAK,GACvBmB,IAAU3G,EAAa,eAAe0G,CAAI,GAC1C1J,IAAI,KAAK,OAAO,EAAEwI,EAAI,CAAC,GACvBvI,IAAI,KAAK,OAAO,EAAEuI,EAAI,CAAC,GACvBoB,IAAID,EAAQ,OACZE,IAAKF,EAAQ,0BAA4BA,EAAQ,0BACjDxJ,IAAI,IACJ2J,IAAWP,EAAYvJ,GAAGC,GAAG2J,GAAGC,GAAG1J,CAAC;AAC1C,MAAK2J,KAILpE,EAAO,KAAK;AAAA,QACR,GAAA1F;AAAA,QACA,GAAAC;AAAA,QACA,KAAAuI;AAAA,QACA,MAAAkB;AAAA,QACA,OAAOE;AAAA,QACP,QAAQC;AAAA,QACR,SAAS1J;AAAA,QACT,WAAW2J,EAAS,CAAC;AAAA,QACrB,WAAWA,EAAS,CAAC;AAAA,MAAA,CACR;AAAA,IACrB;AAEA,WAAOpE;AAAA,EACX;AAAA,EAEQ,qBAAqBA,GAAiB;AAC1C,aAAS+D,IAAI,GAAGA,IAAI/D,EAAO,QAAQ+D,KAAK;AACpC,YAAMM,IAAQrE,EAAO+D,CAAC;AACtB,MAAAM,EAAM,IAAI,KAAK,OAAO,EAAEA,EAAM,IAAI,CAAW,GAC7CA,EAAM,IAAI,KAAK,OAAO,EAAEA,EAAM,IAAI,CAAW;AAAA,IACjD;AAAA,EACJ;AACJ;"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export declare function arraysAreDifferent(arr1?: unknown[] | null, arr2?: unknown[] | null
|
|
1
|
+
export declare function arraysAreDifferent(arr1?: unknown[] | null, arr2?: unknown[] | null, options?: {
|
|
2
|
+
ignoreOrder: boolean;
|
|
3
|
+
}): boolean;
|
|
2
4
|
//# sourceMappingURL=arraysAreDifferent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arraysAreDifferent.d.ts","sourceRoot":"","sources":["../../src/utils/arraysAreDifferent.ts"],"names":[],"mappings":"AACA,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,EAAC,OAAO,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"arraysAreDifferent.d.ts","sourceRoot":"","sources":["../../src/utils/arraysAreDifferent.ts"],"names":[],"mappings":"AACA,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAC,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,EAAC,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,GAAE;IAAC,WAAW,EAAE,OAAO,CAAA;CAAwB,WAYxI"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
1
|
+
function i(e, n, s = { ignoreOrder: !1 }) {
|
|
2
|
+
if (!e && !n)
|
|
3
|
+
return !1;
|
|
4
|
+
if (!e && n || !n && e || (e == null ? void 0 : e.length) !== (n == null ? void 0 : n.length))
|
|
5
|
+
return !0;
|
|
6
|
+
if (s.ignoreOrder) {
|
|
7
|
+
const t = new Set(n ?? []);
|
|
8
|
+
return e == null ? void 0 : e.some((f) => !t.has(f));
|
|
9
|
+
}
|
|
10
|
+
return e == null ? void 0 : e.some((t, f) => t !== (n == null ? void 0 : n[f]));
|
|
3
11
|
}
|
|
4
12
|
export {
|
|
5
|
-
|
|
13
|
+
i as arraysAreDifferent
|
|
6
14
|
};
|
|
7
15
|
//# sourceMappingURL=arraysAreDifferent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arraysAreDifferent.js","sources":["../../src/utils/arraysAreDifferent.ts"],"sourcesContent":["\nexport function arraysAreDifferent(arr1?:unknown[] | null, arr2?:unknown[] | null) {\n if (!arr1 && !arr2) {\n return false;\n }\n if (!arr1 && arr2 || !arr2 && arr1 || arr1?.length !== arr2?.length) {\n return true;\n }\n return arr1?.some((el, idx) => el !== arr2?.[idx]) as boolean;\n}"],"names":["arraysAreDifferent","arr1","arr2","el","idx"],"mappings":"AACO,SAASA,EAAmBC,GAAwBC,
|
|
1
|
+
{"version":3,"file":"arraysAreDifferent.js","sources":["../../src/utils/arraysAreDifferent.ts"],"sourcesContent":["\nexport function arraysAreDifferent(arr1?:unknown[] | null, arr2?:unknown[] | null, options: {ignoreOrder: boolean} = {ignoreOrder: false}) {\n if (!arr1 && !arr2) {\n return false;\n }\n if (!arr1 && arr2 || !arr2 && arr1 || arr1?.length !== arr2?.length) {\n return true;\n }\n if (options.ignoreOrder) {\n const set2 = new Set(arr2 ?? []);\n return arr1?.some((el) => !set2.has(el)) as boolean;\n }\n return arr1?.some((el, idx) => el !== arr2?.[idx]) as boolean;\n}"],"names":["arraysAreDifferent","arr1","arr2","options","set2","el","idx"],"mappings":"AACO,SAASA,EAAmBC,GAAwBC,GAAwBC,IAAkC,EAAC,aAAa,MAAQ;AACvI,MAAI,CAACF,KAAQ,CAACC;AACV,WAAO;AAEX,MAAI,CAACD,KAAQC,KAAQ,CAACA,KAAQD,MAAQA,KAAA,gBAAAA,EAAM,aAAWC,KAAA,gBAAAA,EAAM;AACzD,WAAO;AAEX,MAAIC,EAAQ,aAAa;AACrB,UAAMC,IAAO,IAAI,IAAIF,KAAQ,CAAA,CAAE;AAC/B,WAAOD,KAAA,gBAAAA,EAAM,KAAK,CAACI,MAAO,CAACD,EAAK,IAAIC,CAAE;AAAA,EAC1C;AACA,SAAOJ,KAAA,gBAAAA,EAAM,KAAK,CAACI,GAAIC,MAAQD,OAAOH,KAAA,gBAAAA,EAAOI;AACjD;"}
|