@milaboratories/miplots4 1.0.169 → 1.0.170
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/bubble/ChartRenderer.js +86 -86
- package/dist/bubble/ChartRenderer.js.map +1 -1
- package/dist/discrete/ChartRenderer.js +102 -102
- package/dist/discrete/ChartRenderer.js.map +1 -1
- package/dist/heatmap/ChartRenderer.js +121 -121
- package/dist/heatmap/ChartRenderer.js.map +1 -1
- package/dist/histogram/ChartRenderer.js +73 -73
- package/dist/histogram/ChartRenderer.js.map +1 -1
- package/dist/scatterplot/ChartRenderer.js +96 -96
- package/dist/scatterplot/ChartRenderer.js.map +1 -1
- package/dist/scatterplot-umap/ChartRenderer.js +99 -99
- package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
var S = Object.defineProperty;
|
|
2
|
-
var U = (
|
|
3
|
-
var
|
|
4
|
-
import { j as
|
|
2
|
+
var U = (c, i, t) => i in c ? S(c, i, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[i] = t;
|
|
3
|
+
var g = (c, i, t) => U(c, typeof i != "symbol" ? i + "" : i, t);
|
|
4
|
+
import { j as w } from "../_virtual/jsx-runtime.js";
|
|
5
5
|
import X from "../_virtual/lodash.js";
|
|
6
6
|
import { c as k } from "../_virtual/client.js";
|
|
7
7
|
import { Error as V } from "../common/Error.js";
|
|
8
8
|
import { DataFrameProvider as y } from "../common/useDataFrame.js";
|
|
9
9
|
import { DEFAULT_HEIGHT as z, DEFAULT_WIDTH as W, TITLE_LINE_HEIGHT as Z, TITLE_MARGIN as $ } from "../constants.js";
|
|
10
|
-
import { DEFAULT_COMMON_AES as
|
|
10
|
+
import { DEFAULT_COMMON_AES as H, DEFAULT_TICKS_SIZE as D } from "../scatterplot/constants.js";
|
|
11
11
|
import { arrangeLegendParts as q } from "../utils/arrangeLegendParts.js";
|
|
12
12
|
import { TextMeasurer as J } from "../utils/TextMeasurer/TextMeasurer.js";
|
|
13
13
|
import { ChartsGroup as Q } from "./components/ChartsGroup.js";
|
|
14
|
-
import { DEFAULT_AES as P, LEGEND_OFFSET as G, TICK_OFFSET as v, TITLE_LINE as
|
|
14
|
+
import { DEFAULT_AES as P, LEGEND_OFFSET as G, TICK_OFFSET as v, TITLE_LINE as I, MIN_PADDING as _, FACET_TITLE_OFFSET as K, FACET_TITLE_LINE as tt } from "./constants.js";
|
|
15
15
|
import { getChartStatsPadding as B } from "./utils/getChartStatsPadding.js";
|
|
16
16
|
import { splitTextByWidth as O } from "../utils/splitTextByWidth.js";
|
|
17
17
|
import { createMultilineDiscreteLabels as it } from "../utils/createMultilineDiscreteLabels.js";
|
|
@@ -21,34 +21,34 @@ import j from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/or
|
|
|
21
21
|
import Y from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js";
|
|
22
22
|
import F from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/band.js";
|
|
23
23
|
import ot from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/log.js";
|
|
24
|
-
function ht(
|
|
24
|
+
function ht(c, i, t, s) {
|
|
25
25
|
const o = [];
|
|
26
|
-
return
|
|
26
|
+
return c % t === t - 1 && o.push("right"), c % t === 0 && o.push("left"), c < t && o.push("top"), (Math.ceil((c + 1) / t) === s || Math.ceil((c + 1) / t) === s - 1 && c % t > (i - 1) % t) && o.push("bottom"), o;
|
|
27
27
|
}
|
|
28
|
-
function nt(
|
|
29
|
-
const
|
|
28
|
+
function nt(c, i, t, s, o, n, r, e, l, p, u) {
|
|
29
|
+
const d = c === "vertical", C = r.includes("left") || d && !(e != null && e.sharedY) || !d && !(e != null && e.sharedX), a = r.includes("left") && t.title !== "", A = r.includes("bottom") || d && !(e != null && e.sharedX) || !d && !(e != null && e.sharedY), h = r.includes("bottom") && i.title !== "", T = s.leftAxisCaptionsWidth, x = (t.showTicks ? D : 0) + (t.hiddenLabels ? 0 : v), m = a ? I : 0, f = d ? s.bottomAxisCaptionsWidthByRows[l] : s.leftAxisCaptionsWidthByColumns[p], b = (i.showTicks ? D : 0) + (i.hiddenLabels ? 0 : v), L = d && h || !d && a ? I : 0, N = d ? T + x + m : f + b + L, R = d ? b + f + L : x + 2 * I, M = Math.max(...o.map((E) => n[E].length));
|
|
30
30
|
return {
|
|
31
|
-
left:
|
|
32
|
-
top:
|
|
33
|
-
bottom:
|
|
34
|
-
right: u ? 0 :
|
|
31
|
+
left: C ? N : _,
|
|
32
|
+
top: M === 0 ? 0 : K * 2 + M * tt,
|
|
33
|
+
bottom: A ? R : _,
|
|
34
|
+
right: u ? 0 : _
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
|
-
function at(
|
|
38
|
-
const t = Math.floor(
|
|
37
|
+
function at(c, i) {
|
|
38
|
+
const t = Math.floor(c / i), s = c - t * i;
|
|
39
39
|
return [t, s];
|
|
40
40
|
}
|
|
41
|
-
function rt(
|
|
42
|
-
return typeof
|
|
41
|
+
function rt(c) {
|
|
42
|
+
return typeof c == "object" && "type" in c;
|
|
43
43
|
}
|
|
44
|
-
class
|
|
44
|
+
class Rt {
|
|
45
45
|
constructor() {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
g(this, "reactRoot", null);
|
|
47
|
+
g(this, "parentNode", null);
|
|
48
|
+
g(this, "rootNode", null);
|
|
49
|
+
g(this, "component", /* @__PURE__ */ w.jsx(w.Fragment, {}));
|
|
50
|
+
g(this, "chartsDimensions", {});
|
|
51
|
+
g(this, "chartSizes", {
|
|
52
52
|
chartWidth: W,
|
|
53
53
|
// width of single chart
|
|
54
54
|
chartHeight: z,
|
|
@@ -62,9 +62,9 @@ class It {
|
|
|
62
62
|
totalHeight: z
|
|
63
63
|
// width of all charts in charts height, plus bottom axis, plus top title
|
|
64
64
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
g(this, "columnsCount", 1);
|
|
66
|
+
g(this, "rowsCount", 1);
|
|
67
|
+
g(this, "scales", {
|
|
68
68
|
// Scale from primary grouping categories to every category x coordinate
|
|
69
69
|
xPrimary: { null: F().range([0, W]).domain(["1"]) },
|
|
70
70
|
// Scale from secondary grouping categories to x shift inside corresponding primary group
|
|
@@ -76,21 +76,21 @@ class It {
|
|
|
76
76
|
// Scale for link secondary grouping category and aesthetics
|
|
77
77
|
xSecondaryAes: j().unknown(P)
|
|
78
78
|
});
|
|
79
|
-
|
|
79
|
+
g(this, "facetTitles", {});
|
|
80
80
|
// can be multiline
|
|
81
|
-
|
|
81
|
+
g(this, "mainTitle", []);
|
|
82
82
|
// can be multiline
|
|
83
|
-
|
|
83
|
+
g(this, "axisLabelsX", {});
|
|
84
84
|
// can be multiline
|
|
85
|
-
|
|
85
|
+
g(this, "captionsSizes", {
|
|
86
86
|
bottomAxisCaptionsWidthByRows: [],
|
|
87
87
|
leftAxisCaptionsWidthByColumns: [],
|
|
88
88
|
bottomCaptionsTail: 0,
|
|
89
89
|
leftCaptionsTail: 0,
|
|
90
90
|
leftAxisCaptionsWidth: 100
|
|
91
91
|
});
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
g(this, "legend", { width: 0, height: 0, items: [] });
|
|
93
|
+
g(this, "margins", { left: 0, right: 0, top: 0, bottom: 0 });
|
|
94
94
|
}
|
|
95
95
|
clear() {
|
|
96
96
|
var i;
|
|
@@ -102,59 +102,59 @@ class It {
|
|
|
102
102
|
init(i) {
|
|
103
103
|
this.parentNode === null && (this.parentNode = i, this.rootNode = document.createElement("div"), this.parentNode.appendChild(this.rootNode), this.reactRoot = k.createRoot(this.rootNode));
|
|
104
104
|
}
|
|
105
|
-
updateChartSize(i, t, s, o,
|
|
106
|
-
const e = i.innerOffset, l = i.innerOffset, p = B(r, o, i.innerOffset), u = t.length,
|
|
107
|
-
this.columnsCount = s != null && s.nRows ? Math.ceil(u /
|
|
108
|
-
let { width: a, height:
|
|
109
|
-
|
|
105
|
+
updateChartSize(i, t, s, o, n, r) {
|
|
106
|
+
const e = i.innerOffset, l = i.innerOffset, p = B(r, o, i.innerOffset), u = t.length, d = Math.min((s == null ? void 0 : s.nRows) ?? u, u), C = Math.min((s == null ? void 0 : s.nCols) ?? u, u);
|
|
107
|
+
this.columnsCount = s != null && s.nRows ? Math.ceil(u / d) : C, this.rowsCount = Math.ceil(u / this.columnsCount);
|
|
108
|
+
let { width: a, height: A } = i;
|
|
109
|
+
n === "vertical" && p > e && (A += p), n === "horizontal" && p > l && (a += p), this.chartSizes.chartWidth = a, this.chartSizes.chartHeight = A;
|
|
110
110
|
}
|
|
111
|
-
updateChartDimensions(i, t, s, o,
|
|
111
|
+
updateChartDimensions(i, t, s, o, n) {
|
|
112
112
|
const { chartWidth: r, chartHeight: e } = this.chartSizes;
|
|
113
113
|
let l = 0, p = 0;
|
|
114
114
|
const u = et(i, this.rowsCount, this.columnsCount);
|
|
115
|
-
this.chartsDimensions = i.reduce((a,
|
|
116
|
-
const [
|
|
115
|
+
this.chartsDimensions = i.reduce((a, A, h) => {
|
|
116
|
+
const [T, x] = at(h, this.columnsCount), m = ht(h, i.length, this.columnsCount, this.rowsCount), f = nt(
|
|
117
117
|
s,
|
|
118
118
|
o,
|
|
119
|
-
|
|
119
|
+
n,
|
|
120
120
|
this.captionsSizes,
|
|
121
|
-
u[
|
|
121
|
+
u[T],
|
|
122
122
|
this.facetTitles,
|
|
123
123
|
m,
|
|
124
124
|
t,
|
|
125
|
-
|
|
125
|
+
T,
|
|
126
126
|
x,
|
|
127
127
|
x === this.columnsCount - 1
|
|
128
|
-
), b = r +
|
|
129
|
-
return a[
|
|
128
|
+
), b = r + f.left + f.right, L = e + f.top + f.bottom;
|
|
129
|
+
return a[A] = {
|
|
130
130
|
left: l,
|
|
131
131
|
top: p,
|
|
132
132
|
chartEdgeSides: m,
|
|
133
|
-
padding:
|
|
133
|
+
padding: f,
|
|
134
134
|
inner: { width: r, height: e },
|
|
135
|
-
outer: { width: b, height:
|
|
136
|
-
}, l += b, x === this.columnsCount - 1 && (l = 0, p +=
|
|
135
|
+
outer: { width: b, height: L }
|
|
136
|
+
}, l += b, x === this.columnsCount - 1 && (l = 0, p += L), a;
|
|
137
137
|
}, {});
|
|
138
|
-
const
|
|
138
|
+
const d = Math.max(
|
|
139
139
|
...i.map((a) => this.chartsDimensions[a].outer.width + this.chartsDimensions[a].left)
|
|
140
|
-
),
|
|
140
|
+
), C = Math.max(
|
|
141
141
|
...i.map((a) => this.chartsDimensions[a].outer.height + this.chartsDimensions[a].top)
|
|
142
142
|
);
|
|
143
|
-
this.chartSizes.chartsWidth =
|
|
143
|
+
this.chartSizes.chartsWidth = d, this.chartSizes.chartsHeight = C;
|
|
144
144
|
}
|
|
145
|
-
updateViewport(i, t, s, o,
|
|
146
|
-
const
|
|
145
|
+
updateViewport(i, t, s, o, n, r, e, l, p, u) {
|
|
146
|
+
const d = p.innerOffset, C = i === "vertical", a = B(l, t, p.innerOffset), A = n === null || n.sharedX, h = n === null || n.sharedY, { chartHeight: T, chartWidth: x } = this.chartSizes;
|
|
147
147
|
o.forEach((m) => {
|
|
148
|
-
const
|
|
149
|
-
|
|
148
|
+
const f = r.scale === "log" ? ot() : Y(), b = Math.min(...h ? e.map(({ meta: M }) => M.minY) : e.map(({ geoms: M }) => Math.min(...M[m].map(({ boundsY: E }) => E.min)))), L = Math.max(...h ? e.map(({ meta: M }) => M.maxY) : e.map(({ geoms: M }) => Math.max(...M[m].map(({ boundsY: E }) => E.max)))), N = f.copy().domain([b, L]).range(
|
|
149
|
+
C ? [T - d, a] : [d, x - a]
|
|
150
150
|
);
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
this.scales.xPrimary[m] = F().domain(
|
|
151
|
+
f.domain([N.invert(C ? T : 0), N.invert(C ? 0 : x)]).range(C ? [T, 0] : [0, x]), this.scales.y[m] = f;
|
|
152
|
+
const R = A ? t : u[m];
|
|
153
|
+
this.scales.xPrimary[m] = F().domain(R).range(C ? [0, x] : [T, 0]), this.scales.xSecondary[m] = F().domain(s).range([0, this.scales.xPrimary[m].bandwidth()]);
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
156
|
createFacetTitles(i, t) {
|
|
157
|
-
this.facetTitles = i.reduce((s, o,
|
|
157
|
+
this.facetTitles = i.reduce((s, o, n) => (t[n].length === 1 && t[n][0] === "null" ? s[o] = [] : s[o] = O(t[n].join(", "), this.chartSizes.chartWidth, 14), s), {});
|
|
158
158
|
}
|
|
159
159
|
createMainTitle(i, t) {
|
|
160
160
|
const s = this.chartsDimensions[i[0]], o = this.chartsDimensions[i[i.length - 1]];
|
|
@@ -177,43 +177,43 @@ class It {
|
|
|
177
177
|
updateAesScales(i, t) {
|
|
178
178
|
if (i.inheritedAes) {
|
|
179
179
|
const { inheritedAes: s, keys: o } = i;
|
|
180
|
-
this.scales.xPrimaryAes.domain(o).range(o.map((
|
|
180
|
+
this.scales.xPrimaryAes.domain(o).range(o.map((n) => s[n] ?? H));
|
|
181
181
|
} else
|
|
182
182
|
this.scales.xPrimaryAes.domain([]).range([]);
|
|
183
183
|
if (t.inheritedAes) {
|
|
184
184
|
const { inheritedAes: s, keys: o } = t;
|
|
185
|
-
this.scales.xSecondaryAes.domain(o).range(o.map((
|
|
185
|
+
this.scales.xSecondaryAes.domain(o).range(o.map((n) => s[n] ?? H));
|
|
186
186
|
} else
|
|
187
187
|
this.scales.xSecondaryAes.domain([]).range([]);
|
|
188
188
|
}
|
|
189
189
|
updateCaptionsSize(i, t, s, o) {
|
|
190
190
|
const r = new J("600 14px Manrope");
|
|
191
191
|
function e(a) {
|
|
192
|
-
return a.length ? Math.max(...a.map((
|
|
192
|
+
return a.length ? Math.max(...a.map((A) => r.getTextWidth(A))) : 0;
|
|
193
193
|
}
|
|
194
|
-
const { xTail: l, yTail: p, axisCaptionsWidthByRows: u, axisCaptionsWidthByColumns:
|
|
194
|
+
const { xTail: l, yTail: p, axisCaptionsWidthByRows: u, axisCaptionsWidthByColumns: d } = st(t, this.rowsCount, this.columnsCount, s.labelsPosition, this.axisLabelsX, i, this.scales.xPrimary), C = X.flatten(
|
|
195
195
|
t.map((a) => {
|
|
196
196
|
if (o.hiddenLabels)
|
|
197
197
|
return [];
|
|
198
|
-
const
|
|
199
|
-
return
|
|
198
|
+
const A = this.scales.y[a], h = A.ticks(), T = h.some((m) => Math.abs(m) < 1e-4 && m !== 0 || m > 1e4) ? ",e" : ",f", x = A.tickFormat(10, T);
|
|
199
|
+
return h.map(x);
|
|
200
200
|
})
|
|
201
201
|
);
|
|
202
202
|
this.captionsSizes = {
|
|
203
203
|
bottomCaptionsTail: l,
|
|
204
204
|
leftCaptionsTail: p,
|
|
205
205
|
bottomAxisCaptionsWidthByRows: u,
|
|
206
|
-
leftAxisCaptionsWidthByColumns:
|
|
207
|
-
leftAxisCaptionsWidth: e(
|
|
206
|
+
leftAxisCaptionsWidthByColumns: d,
|
|
207
|
+
leftAxisCaptionsWidth: e(C)
|
|
208
208
|
};
|
|
209
209
|
}
|
|
210
210
|
updateMargins(i, t, s) {
|
|
211
|
-
const o = this.chartsDimensions[t[0]],
|
|
211
|
+
const o = this.chartsDimensions[t[0]], n = this.chartsDimensions[t[t.length - 1]], r = i === "vertical", e = this.mainTitle.length ? Z * this.mainTitle.length + $ * 2 : 0, l = s.outerOffset;
|
|
212
212
|
this.margins = {
|
|
213
213
|
left: Math.max(l, r ? this.captionsSizes.bottomCaptionsTail - o.padding.left : 0),
|
|
214
214
|
right: this.legend.width + l,
|
|
215
215
|
top: Math.max(e, l),
|
|
216
|
-
bottom: Math.max(l, r ? 0 : this.captionsSizes.leftCaptionsTail -
|
|
216
|
+
bottom: Math.max(l, r ? 0 : this.captionsSizes.leftCaptionsTail - n.padding.bottom)
|
|
217
217
|
}, this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right, this.chartSizes.totalHeight = this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;
|
|
218
218
|
}
|
|
219
219
|
updateLegendSize(i, t, s, o) {
|
|
@@ -221,24 +221,24 @@ class It {
|
|
|
221
221
|
this.legend = { width: 0, height: 0, items: [] };
|
|
222
222
|
return;
|
|
223
223
|
}
|
|
224
|
-
const
|
|
225
|
-
function l(
|
|
224
|
+
const n = this.chartSizes.chartHeight, r = { width: 0, height: 0, left: 0, top: 0 }, e = [];
|
|
225
|
+
function l(h, T) {
|
|
226
226
|
return o.some((x) => {
|
|
227
|
-
const m = x.aes[
|
|
228
|
-
return m && rt(m) && m.type ===
|
|
227
|
+
const m = x.aes[T];
|
|
228
|
+
return m && rt(m) && m.type === h;
|
|
229
229
|
});
|
|
230
230
|
}
|
|
231
|
-
function p(
|
|
231
|
+
function p(h) {
|
|
232
232
|
return {
|
|
233
|
-
dotFill: l(
|
|
234
|
-
fillColor: l(
|
|
235
|
-
lineColor: l(
|
|
236
|
-
dotShape: l(
|
|
237
|
-
lineShape: l(
|
|
233
|
+
dotFill: l(h, "dotFill"),
|
|
234
|
+
fillColor: l(h, "fillColor"),
|
|
235
|
+
lineColor: l(h, "lineColor"),
|
|
236
|
+
dotShape: l(h, "dotShape"),
|
|
237
|
+
lineShape: l(h, "lineShape")
|
|
238
238
|
};
|
|
239
239
|
}
|
|
240
|
-
const u = p("primaryGrouping"),
|
|
241
|
-
if (Object.values(u).some((
|
|
240
|
+
const u = p("primaryGrouping"), d = p("secondaryGrouping");
|
|
241
|
+
if (Object.values(u).some((h) => h) && t.inheritedAes && e.push({
|
|
242
242
|
type: "discreteMulti",
|
|
243
243
|
id: "primary",
|
|
244
244
|
title: t.label,
|
|
@@ -247,42 +247,42 @@ class It {
|
|
|
247
247
|
labels: t.valueLabels,
|
|
248
248
|
usedAes: u,
|
|
249
249
|
...r
|
|
250
|
-
}), Object.values(
|
|
250
|
+
}), Object.values(d).some((h) => h) && s.inheritedAes && e.push({
|
|
251
251
|
type: "discreteMulti",
|
|
252
252
|
id: "secondary",
|
|
253
253
|
title: s.label,
|
|
254
254
|
scale: this.scales.xSecondaryAes,
|
|
255
255
|
values: s.keys,
|
|
256
256
|
labels: s.valueLabels,
|
|
257
|
-
usedAes:
|
|
257
|
+
usedAes: d,
|
|
258
258
|
...r
|
|
259
259
|
}), !e.length) {
|
|
260
260
|
this.legend = { width: 0, height: 0, items: [] };
|
|
261
261
|
return;
|
|
262
262
|
}
|
|
263
|
-
const
|
|
263
|
+
const C = q(e, this.chartSizes.chartHeight), A = C.reduce((h, T) => Math.max(h, T.left + T.width), 0) + G;
|
|
264
264
|
this.legend = {
|
|
265
|
-
width:
|
|
266
|
-
height:
|
|
267
|
-
items:
|
|
265
|
+
width: A,
|
|
266
|
+
height: n,
|
|
267
|
+
items: C
|
|
268
268
|
};
|
|
269
269
|
}
|
|
270
|
-
render(i, t, s, o,
|
|
270
|
+
render(i, t, s, o, n, r, e, l, p, u, d, C, a, A) {
|
|
271
271
|
var b;
|
|
272
|
-
const { orientation:
|
|
273
|
-
this.updateChartSize(m, e, r, o.keys,
|
|
274
|
-
|
|
272
|
+
const { orientation: h, xAxis: T, yAxis: x, size: m } = s;
|
|
273
|
+
this.updateChartSize(m, e, r, o.keys, h, u), this.updateViewport(
|
|
274
|
+
h,
|
|
275
275
|
o.keys,
|
|
276
|
-
|
|
276
|
+
n.keys,
|
|
277
277
|
e,
|
|
278
278
|
r,
|
|
279
279
|
x,
|
|
280
280
|
p,
|
|
281
281
|
u,
|
|
282
282
|
m,
|
|
283
|
-
|
|
284
|
-
), this.createAxisLabels(e,
|
|
285
|
-
const
|
|
283
|
+
C
|
|
284
|
+
), this.createAxisLabels(e, T, o, h), this.createFacetTitles(e, l), this.updateCaptionsSize(h, e, T, x), this.updateChartDimensions(e, r, h, T, x), this.updateLegendSize(s.legend, o, n, p), this.createMainTitle(e, s.title), this.updateMargins(h, e, m), this.updateAesScales(o, n);
|
|
285
|
+
const f = /* @__PURE__ */ w.jsx(y, { dataFrame: i, children: /* @__PURE__ */ w.jsx(
|
|
286
286
|
Q,
|
|
287
287
|
{
|
|
288
288
|
settingsId: t,
|
|
@@ -298,22 +298,22 @@ class It {
|
|
|
298
298
|
legendData: this.legend,
|
|
299
299
|
margins: this.margins,
|
|
300
300
|
columnsCount: this.columnsCount,
|
|
301
|
-
keyColumn:
|
|
301
|
+
keyColumn: d,
|
|
302
302
|
xLabels: this.axisLabelsX,
|
|
303
303
|
chartTitle: this.mainTitle,
|
|
304
304
|
onlyPositive: a,
|
|
305
|
-
secondaryGrouping:
|
|
306
|
-
onTooltipHintSwitch:
|
|
305
|
+
secondaryGrouping: n,
|
|
306
|
+
onTooltipHintSwitch: A
|
|
307
307
|
}
|
|
308
308
|
) });
|
|
309
|
-
this.component =
|
|
309
|
+
this.component = f, (b = this.reactRoot) == null || b.render(f);
|
|
310
310
|
}
|
|
311
311
|
renderError(i) {
|
|
312
312
|
var t;
|
|
313
|
-
(t = this.reactRoot) == null || t.render(/* @__PURE__ */
|
|
313
|
+
(t = this.reactRoot) == null || t.render(/* @__PURE__ */ w.jsx(V, { message: i }));
|
|
314
314
|
}
|
|
315
315
|
}
|
|
316
316
|
export {
|
|
317
|
-
|
|
317
|
+
Rt as default
|
|
318
318
|
};
|
|
319
319
|
//# sourceMappingURL=ChartRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","sources":["../../src/discrete/ChartRenderer.tsx"],"sourcesContent":["import { scaleBand, scaleLinear, scaleLog, scaleOrdinal } from 'd3-scale';\nimport lodash from 'lodash';\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 { LegendData, LegendItemDiscreteMultiAes } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame, GroupKey } from '../DataFrame';\nimport { DEFAULT_COMMON_AES, DEFAULT_TICKS_SIZE } from '../scatterplot/constants';\nimport type { AesItem, ColumnName, GroupingData, InheritAesDiscrete, Orientation } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { CaptionsSizes, ChartDimensionsData, ChartSizes, ChartsScales, Margins } from './components/types';\nimport { DEFAULT_AES, FACET_TITLE_LINE, FACET_TITLE_OFFSET, LEGEND_OFFSET, MIN_PADDING, TICK_OFFSET, TITLE_LINE } from './constants';\nimport type { DiscreteSettingsImpl } from './DiscreteSettingsImpl';\nimport type { LayerData, StatsData } from './layers/types';\nimport { getChartStatsPadding, splitTextByWidth } from './utils';\nimport { createMultilineDiscreteLabels } from '../utils/createMultilineDiscreteLabels';\nimport { measureMultilineDiscreteLabels } from '../utils/measureMultilineDiscreteLabels';\nimport { getFacetRows } from '../utils/getFacetRowsColumns';\n\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n orientation: Orientation,\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n currentRow: number,\n currentColumn: number,\n lastInRow: boolean\n) {\n const isVertical = orientation === 'vertical';\n const needLeftAxis =\n chartEdgeSides.includes('left') ||\n (isVertical && !facetSettings?.sharedY) ||\n (!isVertical && !facetSettings?.sharedX);\n const needLeftAxisTitle = chartEdgeSides.includes('left') && yAxis.title !== '';\n const needBottomAxis =\n chartEdgeSides.includes('bottom') ||\n (isVertical && !facetSettings?.sharedX) ||\n (!isVertical && !facetSettings?.sharedY);\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = captionsSizes.leftAxisCaptionsWidth;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (yAxis.hiddenLabels ? 0 : TICK_OFFSET);\n const yAxisTitle = needLeftAxisTitle ? TITLE_LINE : 0;\n\n const xCaptions = isVertical ? captionsSizes.bottomAxisCaptionsWidthByRows[currentRow] : captionsSizes.leftAxisCaptionsWidthByColumns[currentColumn];\n const xTicks = (xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (xAxis.hiddenLabels ? 0 : TICK_OFFSET);\n const xAxisTitle = isVertical && needBottomAxisTitle || !isVertical && needLeftAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = isVertical ? yCaptions + yTicks + yAxisTitle : xCaptions + xTicks + xAxisTitle;\n const bottomAxisElements = isVertical ? xTicks + xCaptions + xAxisTitle : yTicks + 2 * TITLE_LINE;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction isInheritAes(v: InheritAesDiscrete | string | number | boolean): v is InheritAesDiscrete {\n return typeof v === 'object' && 'type' in v;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\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 columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n // Scale from primary grouping categories to every category x coordinate\n xPrimary: { null: scaleBand().range([0, DEFAULT_WIDTH]).domain(['1']) },\n // Scale from secondary grouping categories to x shift inside corresponding primary group\n xSecondary: { null: scaleBand().range([0, DEFAULT_WIDTH]).domain(['1']) },\n // Scale from y value to y coordinate, by facet\n y: { null: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]).nice() },\n // Scale for link primary grouping category and aesthetics\n xPrimaryAes: scaleOrdinal<string, AesItem, AesItem>().unknown(DEFAULT_AES),\n // Scale for link secondary grouping category and aesthetics\n xSecondaryAes: scaleOrdinal<string, AesItem, AesItem>().unknown(DEFAULT_AES),\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n axisLabelsX: Record<string, Record<string, string[]>> = {}; // can be multiline\n captionsSizes: CaptionsSizes = {\n bottomAxisCaptionsWidthByRows: [],\n leftAxisCaptionsWidthByColumns: [],\n bottomCaptionsTail: 0,\n leftCaptionsTail: 0,\n leftAxisCaptionsWidth: 100,\n };\n legend: LegendData = { width: 0, height: 0, items: [] };\n margins: Margins = { left: 0, right: 0, top: 0, bottom: 0 };\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = 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.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSize(\n size: DiscreteSettingsImpl['chartSettings']['size'],\n facetKeys: string[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n primaryKeys: GroupKey[],\n orientation: Orientation,\n statsData: StatsData[]\n ) {\n const paddingTop = size.innerOffset;\n const paddingBottom = size.innerOffset;\n // It may be necessary increase chart height/width for p-value\n const statsPadding = getChartStatsPadding(statsData, primaryKeys, size.innerOffset);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings?.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings?.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings?.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let { width, height } = size;\n // avoid situation when statistics fill all available chart area\n if (orientation === 'vertical' && statsPadding > paddingTop) {\n height += statsPadding;\n }\n if (orientation === 'horizontal' && statsPadding > paddingBottom) {\n width += statsPadding;\n }\n this.chartSizes.chartWidth = width;\n this.chartSizes.chartHeight = height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n orientation: Orientation,\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n ) {\n const { chartWidth, chartHeight } = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n const facetRows = getFacetRows(facetKeys, this.rowsCount, this.columnsCount);\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n orientation,\n xAxis,\n yAxis,\n this.captionsSizes,\n facetRows[currentRow],\n this.facetTitles,\n chartEdgeSides,\n facetSettings,\n currentRow,\n currentColumn,\n currentColumn === this.columnsCount - 1\n );\n\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: { width: chartWidth, height: chartHeight },\n outer: { width: outerWidth, height: outerHeight },\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n orientation: Orientation,\n primaryKeys: string[],\n secondaryKeys: string[],\n facetKeys: string[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n layersData: LayerData[],\n statsData: StatsData[],\n size: DiscreteSettingsImpl['chartSettings']['size'],\n nonEmptyGroupsByFacets: Record<string, string[]>,\n ) {\n const paddingBottom = size.innerOffset;\n const isVertical = orientation === 'vertical';\n const statsPadding = getChartStatsPadding(statsData, primaryKeys, size.innerOffset);\n const sharedX = facetSettings === null || facetSettings.sharedX;\n const sharedY = facetSettings === null || facetSettings.sharedY;\n\n const { chartHeight, chartWidth } = this.chartSizes;\n facetKeys.forEach(key => {\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const min = sharedY\n ? Math.min(...layersData.map(({ meta }) => meta.minY))\n : Math.min(...layersData.map(({ geoms }) => Math.min(...geoms[key].map(({ boundsY }) => boundsY.min))));\n const max = sharedY\n ? Math.max(...layersData.map(({ meta }) => meta.maxY))\n : Math.max(...layersData.map(({ geoms }) => Math.max(...geoms[key].map(({ boundsY }) => boundsY.max))));\n\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([min, max])\n .range(\n isVertical\n ? [chartHeight - paddingBottom, statsPadding]\n : [paddingBottom, chartWidth - statsPadding]\n );\n scaleY\n .domain([tempY.invert(isVertical ? chartHeight : 0), tempY.invert(isVertical ? 0 : chartWidth)])\n .range(isVertical ? [chartHeight, 0] : [0, chartWidth]);\n this.scales.y[key] = scaleY;\n\n const facetPrimaryKeys = sharedX ? primaryKeys : nonEmptyGroupsByFacets[key];\n this.scales.xPrimary[key] = scaleBand()\n .domain(facetPrimaryKeys)\n .range(isVertical ? [0, chartWidth] : [chartHeight, 0]);\n this.scales.xSecondary[key] = scaleBand()\n .domain(secondaryKeys)\n .range([0, this.scales.xPrimary[key].bandwidth()]);\n });\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n createMainTitle(facetKeys: string[], title: DiscreteSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createAxisLabels(\n facetKeys: string[],\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n primaryGrouping: GroupingData,\n orientation: Orientation\n ) {\n this.axisLabelsX = createMultilineDiscreteLabels(\n facetKeys,\n xAxis.labelsPosition,\n primaryGrouping.valueLabels,\n xAxis.hiddenLabels,\n orientation,\n this.scales.xPrimary,\n );\n }\n\n updateAesScales(primaryGrouping: GroupingData, secondaryGrouping: GroupingData) {\n if (primaryGrouping.inheritedAes) {\n const { inheritedAes, keys } = primaryGrouping;\n this.scales.xPrimaryAes.domain(keys).range(keys.map(key => inheritedAes[key] ?? DEFAULT_COMMON_AES));\n } else {\n this.scales.xPrimaryAes.domain([]).range([]);\n }\n if (secondaryGrouping.inheritedAes) {\n const { inheritedAes, keys } = secondaryGrouping;\n this.scales.xSecondaryAes.domain(keys).range(keys.map(key => inheritedAes[key] ?? DEFAULT_COMMON_AES));\n } else {\n this.scales.xSecondaryAes.domain([]).range([]);\n }\n }\n\n updateCaptionsSize(\n orientation: Orientation,\n facetKeys: string[],\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n ) {\n const LABEL_FONT_SIZE = 14;\n const textMeasurer = new TextMeasurer(`600 ${LABEL_FONT_SIZE}px Manrope`);\n\n function getMaxStrWidth(strs: string[]) {\n if (!strs.length) {\n return 0;\n }\n return Math.max(...strs.map(str => textMeasurer.getTextWidth(str)));\n }\n\n const { xTail, yTail, axisCaptionsWidthByRows, axisCaptionsWidthByColumns } = measureMultilineDiscreteLabels(facetKeys, this.rowsCount, this.columnsCount, xAxis.labelsPosition, this.axisLabelsX, orientation, this.scales.xPrimary);\n\n const yTicks = lodash.flatten(\n facetKeys.map(facetKey => {\n if (yAxis.hiddenLabels) {\n return [];\n }\n const scaleY = this.scales.y[facetKey];\n const ticks = scaleY.ticks();\n const specifier = ticks.some(tick => (Math.abs(tick) < 0.0001 && tick !== 0) || tick > 10000)\n ? ',e'\n : ',f';\n const format = scaleY.tickFormat(10, specifier);\n return ticks.map(format);\n })\n );\n\n this.captionsSizes = {\n bottomCaptionsTail: xTail,\n leftCaptionsTail: yTail,\n bottomAxisCaptionsWidthByRows: axisCaptionsWidthByRows,\n leftAxisCaptionsWidthByColumns: axisCaptionsWidthByColumns,\n leftAxisCaptionsWidth: getMaxStrWidth(yTicks),\n };\n }\n\n updateMargins(orientation: Orientation, facetKeys: string[], size: DiscreteSettingsImpl['chartSettings']['size']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n const isVertical = orientation === 'vertical';\n\n const mainTitleHeight = this.mainTitle.length ? TITLE_LINE_HEIGHT * this.mainTitle.length + TITLE_MARGIN * 2 : 0;\n const minMargin = size.outerOffset;\n this.margins = {\n left: Math.max(minMargin, isVertical ? this.captionsSizes.bottomCaptionsTail - firstChart.padding.left : 0),\n right: this.legend.width + minMargin,\n top: Math.max(mainTitleHeight, minMargin),\n bottom: Math.max(minMargin, isVertical ? 0 : this.captionsSizes.leftCaptionsTail - lastChart.padding.bottom),\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;\n }\n\n updateLegendSize(\n legend: DiscreteSettingsImpl['chartSettings']['legend'],\n primaryGrouping: GroupingData,\n secondaryGrouping: GroupingData,\n layersData: LayerData[]\n ) {\n if (!legend.show) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n const legendHeight = this.chartSizes.chartHeight;\n const emptySizes = { width: 0, height: 0, left: 0, top: 0 };\n const legendItems: LegendItemDiscreteMultiAes[] = [];\n\n function layersHasInheritedAesByField(\n type: 'primaryGrouping' | 'secondaryGrouping',\n field: keyof LegendItemDiscreteMultiAes['usedAes']\n ) {\n return layersData.some(l => {\n const value = l.aes[field as keyof typeof l.aes] as (string | InheritAesDiscrete);\n return value && isInheritAes(value) && value.type === type;\n });\n }\n function getUsedAes(type: 'primaryGrouping' | 'secondaryGrouping'): LegendItemDiscreteMultiAes['usedAes'] {\n return {\n dotFill: layersHasInheritedAesByField(type, 'dotFill'),\n fillColor: layersHasInheritedAesByField(type, 'fillColor'),\n lineColor: layersHasInheritedAesByField(type, 'lineColor'),\n dotShape: layersHasInheritedAesByField(type, 'dotShape'),\n lineShape: layersHasInheritedAesByField(type, 'lineShape'),\n };\n }\n const primaryUsedAes = getUsedAes('primaryGrouping');\n const secondaryUsedAes = getUsedAes('secondaryGrouping');\n if (Object.values(primaryUsedAes).some(v => v) && primaryGrouping.inheritedAes) {\n legendItems.push({\n type: 'discreteMulti',\n id: 'primary',\n title: primaryGrouping.label,\n scale: this.scales.xPrimaryAes,\n values: primaryGrouping.keys,\n labels: primaryGrouping.valueLabels,\n usedAes: primaryUsedAes,\n ...emptySizes,\n });\n }\n if (Object.values(secondaryUsedAes).some(v => v) && secondaryGrouping.inheritedAes) {\n legendItems.push({\n type: 'discreteMulti',\n id: 'secondary',\n title: secondaryGrouping.label,\n scale: this.scales.xSecondaryAes,\n values: secondaryGrouping.keys,\n labels: secondaryGrouping.valueLabels,\n usedAes: secondaryUsedAes,\n ...emptySizes\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\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items\n };\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: DiscreteSettingsImpl['chartSettings'],\n primaryGrouping: GroupingData,\n secondaryGrouping: GroupingData,\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n layersData: LayerData[],\n statsData: StatsData[],\n keyColumn: ColumnName | null,\n nonEmptyGroupsByFacets: Record<string, string[]>,\n onlyPositive: boolean,\n onTooltipHintSwitch: (v: boolean) => void\n ) {\n const { orientation, xAxis, yAxis, size } = chartSettings;\n this.updateChartSize(size, facetKeys, facetSettings, primaryGrouping.keys, orientation, statsData);\n this.updateViewport(\n orientation,\n primaryGrouping.keys,\n secondaryGrouping.keys,\n facetKeys,\n facetSettings,\n yAxis,\n layersData,\n statsData,\n size,\n nonEmptyGroupsByFacets\n );\n this.createAxisLabels(facetKeys, xAxis, primaryGrouping, orientation);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateCaptionsSize(orientation, facetKeys, xAxis, yAxis);\n this.updateChartDimensions(facetKeys, facetSettings, orientation, xAxis, yAxis);\n this.updateLegendSize(chartSettings.legend, primaryGrouping, secondaryGrouping, layersData);\n this.createMainTitle(facetKeys, chartSettings.title);\n this.updateMargins(orientation, facetKeys, size);\n this.updateAesScales(primaryGrouping, secondaryGrouping);\n\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n facetTitles={this.facetTitles}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n layersData={layersData}\n statsData={statsData}\n legendData={this.legend}\n margins={this.margins}\n columnsCount={this.columnsCount}\n keyColumn={keyColumn}\n xLabels={this.axisLabelsX}\n chartTitle={this.mainTitle}\n onlyPositive={onlyPositive}\n secondaryGrouping={secondaryGrouping}\n onTooltipHintSwitch={onTooltipHintSwitch}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["getChartEdgeSides","index","facetsCount","columnsCount","rowsCount","chartSides","calculatePaddings","orientation","xAxis","yAxis","captionsSizes","currentRowFacetKeys","facetTitles","chartEdgeSides","facetSettings","currentRow","currentColumn","lastInRow","isVertical","needLeftAxis","needLeftAxisTitle","needBottomAxis","needBottomAxisTitle","yCaptions","yTicks","DEFAULT_TICKS_SIZE","TICK_OFFSET","yAxisTitle","TITLE_LINE","xCaptions","xTicks","xAxisTitle","leftAxisElements","bottomAxisElements","facetTitlesLinesCount","key","MIN_PADDING","FACET_TITLE_OFFSET","FACET_TITLE_LINE","getRowColumn","idx","row","column","isInheritAes","v","ChartRenderer","__publicField","jsx","Fragment","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleBand","scaleLinear","scaleOrdinal","DEFAULT_AES","_a","node","createRoot","size","facetKeys","primaryKeys","statsData","paddingTop","paddingBottom","statsPadding","getChartStatsPadding","facetCount","maxNRows","maxNCols","width","height","chartWidth","chartHeight","currentLeft","currentTop","facetRows","getFacetRows","res","padding","outerWidth","outerHeight","chartsWidth","chartsHeight","secondaryKeys","layersData","nonEmptyGroupsByFacets","sharedX","sharedY","scaleY","scaleLog","min","meta","geoms","boundsY","max","tempY","facetPrimaryKeys","facetLabels","splitTextByWidth","title","firstChart","lastChart","primaryGrouping","createMultilineDiscreteLabels","secondaryGrouping","inheritedAes","keys","DEFAULT_COMMON_AES","textMeasurer","TextMeasurer","getMaxStrWidth","strs","str","xTail","yTail","axisCaptionsWidthByRows","axisCaptionsWidthByColumns","measureMultilineDiscreteLabels","lodash","facetKey","ticks","specifier","tick","format","mainTitleHeight","TITLE_LINE_HEIGHT","TITLE_MARGIN","minMargin","legend","legendHeight","emptySizes","legendItems","layersHasInheritedAesByField","type","field","l","value","getUsedAes","primaryUsedAes","secondaryUsedAes","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","dataFrame","settingsId","chartSettings","keyColumn","onlyPositive","onTooltipHintSwitch","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","sources":["../../src/discrete/ChartRenderer.tsx"],"sourcesContent":["import { scaleBand, scaleLinear, scaleLog, scaleOrdinal } from 'd3-scale';\nimport lodash from 'lodash';\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 { LegendData, LegendItemDiscreteMultiAes } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame, GroupKey } from '../DataFrame';\nimport { DEFAULT_COMMON_AES, DEFAULT_TICKS_SIZE } from '../scatterplot/constants';\nimport type { AesItem, ColumnName, GroupingData, InheritAesDiscrete, Orientation } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { CaptionsSizes, ChartDimensionsData, ChartSizes, ChartsScales, Margins } from './components/types';\nimport { DEFAULT_AES, FACET_TITLE_LINE, FACET_TITLE_OFFSET, LEGEND_OFFSET, MIN_PADDING, TICK_OFFSET, TITLE_LINE } from './constants';\nimport type { DiscreteSettingsImpl } from './DiscreteSettingsImpl';\nimport type { LayerData, StatsData } from './layers/types';\nimport { getChartStatsPadding, splitTextByWidth } from './utils';\nimport { createMultilineDiscreteLabels } from '../utils/createMultilineDiscreteLabels';\nimport { measureMultilineDiscreteLabels } from '../utils/measureMultilineDiscreteLabels';\nimport { getFacetRows } from '../utils/getFacetRowsColumns';\n\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n orientation: Orientation,\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n currentRow: number,\n currentColumn: number,\n lastInRow: boolean\n) {\n const isVertical = orientation === 'vertical';\n const needLeftAxis =\n chartEdgeSides.includes('left') ||\n (isVertical && !facetSettings?.sharedY) ||\n (!isVertical && !facetSettings?.sharedX);\n const needLeftAxisTitle = chartEdgeSides.includes('left') && yAxis.title !== '';\n const needBottomAxis =\n chartEdgeSides.includes('bottom') ||\n (isVertical && !facetSettings?.sharedX) ||\n (!isVertical && !facetSettings?.sharedY);\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = captionsSizes.leftAxisCaptionsWidth;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (yAxis.hiddenLabels ? 0 : TICK_OFFSET);\n const yAxisTitle = needLeftAxisTitle ? TITLE_LINE : 0;\n\n const xCaptions = isVertical ? captionsSizes.bottomAxisCaptionsWidthByRows[currentRow] : captionsSizes.leftAxisCaptionsWidthByColumns[currentColumn];\n const xTicks = (xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + (xAxis.hiddenLabels ? 0 : TICK_OFFSET);\n const xAxisTitle = isVertical && needBottomAxisTitle || !isVertical && needLeftAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = isVertical ? yCaptions + yTicks + yAxisTitle : xCaptions + xTicks + xAxisTitle;\n const bottomAxisElements = isVertical ? xTicks + xCaptions + xAxisTitle : yTicks + 2 * TITLE_LINE;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction isInheritAes(v: InheritAesDiscrete | string | number | boolean): v is InheritAesDiscrete {\n return typeof v === 'object' && 'type' in v;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\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 columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n // Scale from primary grouping categories to every category x coordinate\n xPrimary: { null: scaleBand().range([0, DEFAULT_WIDTH]).domain(['1']) },\n // Scale from secondary grouping categories to x shift inside corresponding primary group\n xSecondary: { null: scaleBand().range([0, DEFAULT_WIDTH]).domain(['1']) },\n // Scale from y value to y coordinate, by facet\n y: { null: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]).nice() },\n // Scale for link primary grouping category and aesthetics\n xPrimaryAes: scaleOrdinal<string, AesItem, AesItem>().unknown(DEFAULT_AES),\n // Scale for link secondary grouping category and aesthetics\n xSecondaryAes: scaleOrdinal<string, AesItem, AesItem>().unknown(DEFAULT_AES),\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n axisLabelsX: Record<string, Record<string, string[]>> = {}; // can be multiline\n captionsSizes: CaptionsSizes = {\n bottomAxisCaptionsWidthByRows: [],\n leftAxisCaptionsWidthByColumns: [],\n bottomCaptionsTail: 0,\n leftCaptionsTail: 0,\n leftAxisCaptionsWidth: 100,\n };\n legend: LegendData = { width: 0, height: 0, items: [] };\n margins: Margins = { left: 0, right: 0, top: 0, bottom: 0 };\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = 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.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSize(\n size: DiscreteSettingsImpl['chartSettings']['size'],\n facetKeys: string[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n primaryKeys: GroupKey[],\n orientation: Orientation,\n statsData: StatsData[]\n ) {\n const paddingTop = size.innerOffset;\n const paddingBottom = size.innerOffset;\n // It may be necessary increase chart height/width for p-value\n const statsPadding = getChartStatsPadding(statsData, primaryKeys, size.innerOffset);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings?.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings?.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings?.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let { width, height } = size;\n // avoid situation when statistics fill all available chart area\n if (orientation === 'vertical' && statsPadding > paddingTop) {\n height += statsPadding;\n }\n if (orientation === 'horizontal' && statsPadding > paddingBottom) {\n width += statsPadding;\n }\n this.chartSizes.chartWidth = width;\n this.chartSizes.chartHeight = height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n orientation: Orientation,\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis']\n ) {\n const { chartWidth, chartHeight } = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n const facetRows = getFacetRows(facetKeys, this.rowsCount, this.columnsCount);\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n orientation,\n xAxis,\n yAxis,\n this.captionsSizes,\n facetRows[currentRow],\n this.facetTitles,\n chartEdgeSides,\n facetSettings,\n currentRow,\n currentColumn,\n currentColumn === this.columnsCount - 1\n );\n\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: { width: chartWidth, height: chartHeight },\n outer: { width: outerWidth, height: outerHeight },\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n orientation: Orientation,\n primaryKeys: string[],\n secondaryKeys: string[],\n facetKeys: string[],\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n layersData: LayerData[],\n statsData: StatsData[],\n size: DiscreteSettingsImpl['chartSettings']['size'],\n nonEmptyGroupsByFacets: Record<string, string[]>,\n ) {\n const paddingBottom = size.innerOffset;\n const isVertical = orientation === 'vertical';\n const statsPadding = getChartStatsPadding(statsData, primaryKeys, size.innerOffset);\n const sharedX = facetSettings === null || facetSettings.sharedX;\n const sharedY = facetSettings === null || facetSettings.sharedY;\n\n const { chartHeight, chartWidth } = this.chartSizes;\n facetKeys.forEach(key => {\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const min = sharedY\n ? Math.min(...layersData.map(({ meta }) => meta.minY))\n : Math.min(...layersData.map(({ geoms }) => Math.min(...geoms[key].map(({ boundsY }) => boundsY.min))));\n const max = sharedY\n ? Math.max(...layersData.map(({ meta }) => meta.maxY))\n : Math.max(...layersData.map(({ geoms }) => Math.max(...geoms[key].map(({ boundsY }) => boundsY.max))));\n\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([min, max])\n .range(\n isVertical\n ? [chartHeight - paddingBottom, statsPadding]\n : [paddingBottom, chartWidth - statsPadding]\n );\n scaleY\n .domain([tempY.invert(isVertical ? chartHeight : 0), tempY.invert(isVertical ? 0 : chartWidth)])\n .range(isVertical ? [chartHeight, 0] : [0, chartWidth]);\n this.scales.y[key] = scaleY;\n\n const facetPrimaryKeys = sharedX ? primaryKeys : nonEmptyGroupsByFacets[key];\n this.scales.xPrimary[key] = scaleBand()\n .domain(facetPrimaryKeys)\n .range(isVertical ? [0, chartWidth] : [chartHeight, 0]);\n this.scales.xSecondary[key] = scaleBand()\n .domain(secondaryKeys)\n .range([0, this.scales.xPrimary[key].bandwidth()]);\n });\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n createMainTitle(facetKeys: string[], title: DiscreteSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createAxisLabels(\n facetKeys: string[],\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n primaryGrouping: GroupingData,\n orientation: Orientation\n ) {\n this.axisLabelsX = createMultilineDiscreteLabels(\n facetKeys,\n xAxis.labelsPosition,\n primaryGrouping.valueLabels,\n xAxis.hiddenLabels,\n orientation,\n this.scales.xPrimary,\n );\n }\n\n updateAesScales(primaryGrouping: GroupingData, secondaryGrouping: GroupingData) {\n if (primaryGrouping.inheritedAes) {\n const { inheritedAes, keys } = primaryGrouping;\n this.scales.xPrimaryAes.domain(keys).range(keys.map(key => inheritedAes[key] ?? DEFAULT_COMMON_AES));\n } else {\n this.scales.xPrimaryAes.domain([]).range([]);\n }\n if (secondaryGrouping.inheritedAes) {\n const { inheritedAes, keys } = secondaryGrouping;\n this.scales.xSecondaryAes.domain(keys).range(keys.map(key => inheritedAes[key] ?? DEFAULT_COMMON_AES));\n } else {\n this.scales.xSecondaryAes.domain([]).range([]);\n }\n }\n\n updateCaptionsSize(\n orientation: Orientation,\n facetKeys: string[],\n xAxis: DiscreteSettingsImpl['chartSettings']['xAxis'],\n yAxis: DiscreteSettingsImpl['chartSettings']['yAxis'],\n ) {\n const LABEL_FONT_SIZE = 14;\n const textMeasurer = new TextMeasurer(`600 ${LABEL_FONT_SIZE}px Manrope`);\n\n function getMaxStrWidth(strs: string[]) {\n if (!strs.length) {\n return 0;\n }\n return Math.max(...strs.map(str => textMeasurer.getTextWidth(str)));\n }\n\n const { xTail, yTail, axisCaptionsWidthByRows, axisCaptionsWidthByColumns } = measureMultilineDiscreteLabels(facetKeys, this.rowsCount, this.columnsCount, xAxis.labelsPosition, this.axisLabelsX, orientation, this.scales.xPrimary);\n\n const yTicks = lodash.flatten(\n facetKeys.map(facetKey => {\n if (yAxis.hiddenLabels) {\n return [];\n }\n const scaleY = this.scales.y[facetKey];\n const ticks = scaleY.ticks();\n const specifier = ticks.some(tick => (Math.abs(tick) < 0.0001 && tick !== 0) || tick > 10000)\n ? ',e'\n : ',f';\n const format = scaleY.tickFormat(10, specifier);\n return ticks.map(format);\n })\n );\n\n this.captionsSizes = {\n bottomCaptionsTail: xTail,\n leftCaptionsTail: yTail,\n bottomAxisCaptionsWidthByRows: axisCaptionsWidthByRows,\n leftAxisCaptionsWidthByColumns: axisCaptionsWidthByColumns,\n leftAxisCaptionsWidth: getMaxStrWidth(yTicks),\n };\n }\n\n updateMargins(orientation: Orientation, facetKeys: string[], size: DiscreteSettingsImpl['chartSettings']['size']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n const isVertical = orientation === 'vertical';\n\n const mainTitleHeight = this.mainTitle.length ? TITLE_LINE_HEIGHT * this.mainTitle.length + TITLE_MARGIN * 2 : 0;\n const minMargin = size.outerOffset;\n this.margins = {\n left: Math.max(minMargin, isVertical ? this.captionsSizes.bottomCaptionsTail - firstChart.padding.left : 0),\n right: this.legend.width + minMargin,\n top: Math.max(mainTitleHeight, minMargin),\n bottom: Math.max(minMargin, isVertical ? 0 : this.captionsSizes.leftCaptionsTail - lastChart.padding.bottom),\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;\n }\n\n updateLegendSize(\n legend: DiscreteSettingsImpl['chartSettings']['legend'],\n primaryGrouping: GroupingData,\n secondaryGrouping: GroupingData,\n layersData: LayerData[]\n ) {\n if (!legend.show) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n const legendHeight = this.chartSizes.chartHeight;\n const emptySizes = { width: 0, height: 0, left: 0, top: 0 };\n const legendItems: LegendItemDiscreteMultiAes[] = [];\n\n function layersHasInheritedAesByField(\n type: 'primaryGrouping' | 'secondaryGrouping',\n field: keyof LegendItemDiscreteMultiAes['usedAes']\n ) {\n return layersData.some(l => {\n const value = l.aes[field as keyof typeof l.aes] as (string | InheritAesDiscrete);\n return value && isInheritAes(value) && value.type === type;\n });\n }\n function getUsedAes(type: 'primaryGrouping' | 'secondaryGrouping'): LegendItemDiscreteMultiAes['usedAes'] {\n return {\n dotFill: layersHasInheritedAesByField(type, 'dotFill'),\n fillColor: layersHasInheritedAesByField(type, 'fillColor'),\n lineColor: layersHasInheritedAesByField(type, 'lineColor'),\n dotShape: layersHasInheritedAesByField(type, 'dotShape'),\n lineShape: layersHasInheritedAesByField(type, 'lineShape'),\n };\n }\n const primaryUsedAes = getUsedAes('primaryGrouping');\n const secondaryUsedAes = getUsedAes('secondaryGrouping');\n if (Object.values(primaryUsedAes).some(v => v) && primaryGrouping.inheritedAes) {\n legendItems.push({\n type: 'discreteMulti',\n id: 'primary',\n title: primaryGrouping.label,\n scale: this.scales.xPrimaryAes,\n values: primaryGrouping.keys,\n labels: primaryGrouping.valueLabels,\n usedAes: primaryUsedAes,\n ...emptySizes,\n });\n }\n if (Object.values(secondaryUsedAes).some(v => v) && secondaryGrouping.inheritedAes) {\n legendItems.push({\n type: 'discreteMulti',\n id: 'secondary',\n title: secondaryGrouping.label,\n scale: this.scales.xSecondaryAes,\n values: secondaryGrouping.keys,\n labels: secondaryGrouping.valueLabels,\n usedAes: secondaryUsedAes,\n ...emptySizes\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 maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items\n };\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: DiscreteSettingsImpl['chartSettings'],\n primaryGrouping: GroupingData,\n secondaryGrouping: GroupingData,\n facetSettings: DiscreteSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n layersData: LayerData[],\n statsData: StatsData[],\n keyColumn: ColumnName | null,\n nonEmptyGroupsByFacets: Record<string, string[]>,\n onlyPositive: boolean,\n onTooltipHintSwitch: (v: boolean) => void\n ) {\n const { orientation, xAxis, yAxis, size } = chartSettings;\n this.updateChartSize(size, facetKeys, facetSettings, primaryGrouping.keys, orientation, statsData);\n this.updateViewport(\n orientation,\n primaryGrouping.keys,\n secondaryGrouping.keys,\n facetKeys,\n facetSettings,\n yAxis,\n layersData,\n statsData,\n size,\n nonEmptyGroupsByFacets\n );\n this.createAxisLabels(facetKeys, xAxis, primaryGrouping, orientation);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateCaptionsSize(orientation, facetKeys, xAxis, yAxis);\n this.updateChartDimensions(facetKeys, facetSettings, orientation, xAxis, yAxis);\n this.updateLegendSize(chartSettings.legend, primaryGrouping, secondaryGrouping, layersData);\n this.createMainTitle(facetKeys, chartSettings.title);\n this.updateMargins(orientation, facetKeys, size);\n this.updateAesScales(primaryGrouping, secondaryGrouping);\n\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n facetTitles={this.facetTitles}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n layersData={layersData}\n statsData={statsData}\n legendData={this.legend}\n margins={this.margins}\n columnsCount={this.columnsCount}\n keyColumn={keyColumn}\n xLabels={this.axisLabelsX}\n chartTitle={this.mainTitle}\n onlyPositive={onlyPositive}\n secondaryGrouping={secondaryGrouping}\n onTooltipHintSwitch={onTooltipHintSwitch}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["getChartEdgeSides","index","facetsCount","columnsCount","rowsCount","chartSides","calculatePaddings","orientation","xAxis","yAxis","captionsSizes","currentRowFacetKeys","facetTitles","chartEdgeSides","facetSettings","currentRow","currentColumn","lastInRow","isVertical","needLeftAxis","needLeftAxisTitle","needBottomAxis","needBottomAxisTitle","yCaptions","yTicks","DEFAULT_TICKS_SIZE","TICK_OFFSET","yAxisTitle","TITLE_LINE","xCaptions","xTicks","xAxisTitle","leftAxisElements","bottomAxisElements","facetTitlesLinesCount","key","MIN_PADDING","FACET_TITLE_OFFSET","FACET_TITLE_LINE","getRowColumn","idx","row","column","isInheritAes","v","ChartRenderer","__publicField","jsx","Fragment","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleBand","scaleLinear","scaleOrdinal","DEFAULT_AES","_a","node","createRoot","size","facetKeys","primaryKeys","statsData","paddingTop","paddingBottom","statsPadding","getChartStatsPadding","facetCount","maxNRows","maxNCols","width","height","chartWidth","chartHeight","currentLeft","currentTop","facetRows","getFacetRows","res","padding","outerWidth","outerHeight","chartsWidth","chartsHeight","secondaryKeys","layersData","nonEmptyGroupsByFacets","sharedX","sharedY","scaleY","scaleLog","min","meta","geoms","boundsY","max","tempY","facetPrimaryKeys","facetLabels","splitTextByWidth","title","firstChart","lastChart","primaryGrouping","createMultilineDiscreteLabels","secondaryGrouping","inheritedAes","keys","DEFAULT_COMMON_AES","textMeasurer","TextMeasurer","getMaxStrWidth","strs","str","xTail","yTail","axisCaptionsWidthByRows","axisCaptionsWidthByColumns","measureMultilineDiscreteLabels","lodash","facetKey","ticks","specifier","tick","format","mainTitleHeight","TITLE_LINE_HEIGHT","TITLE_MARGIN","minMargin","legend","legendHeight","emptySizes","legendItems","layersHasInheritedAesByField","type","field","l","value","getUsedAes","primaryUsedAes","secondaryUsedAes","items","arrangeLegendParts","legendWidth","item","LEGEND_OFFSET","dataFrame","settingsId","chartSettings","keyColumn","onlyPositive","onTooltipHintSwitch","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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"}
|