@milaboratories/miplots4 1.0.168 → 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.
@@ -1,17 +1,17 @@
1
1
  var S = Object.defineProperty;
2
- var U = (d, i, t) => i in d ? S(d, i, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[i] = t;
3
- var f = (d, i, t) => U(d, typeof i != "symbol" ? i + "" : i, t);
4
- import { j as E } from "../_virtual/jsx-runtime.js";
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 R, DEFAULT_TICKS_SIZE as D } from "../scatterplot/constants.js";
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 _, MIN_PADDING as H, FACET_TITLE_OFFSET as K, FACET_TITLE_LINE as tt } from "./constants.js";
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(d, i, t, s) {
24
+ function ht(c, i, t, s) {
25
25
  const o = [];
26
- return d % t === t - 1 && o.push("right"), d % t === 0 && o.push("left"), d < t && o.push("top"), (Math.ceil((d + 1) / t) === s || Math.ceil((d + 1) / t) === s - 1 && d % t > (i - 1) % t) && o.push("bottom"), o;
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(d, i, t, s, o, h, r, e, l, p, u) {
29
- const c = d === "vertical", T = r.includes("left") || c && !(e != null && e.sharedY) || !c && !(e != null && e.sharedX), a = r.includes("left") && t.title !== "", C = r.includes("bottom") || c && !(e != null && e.sharedX) || !c && !(e != null && e.sharedY), n = r.includes("bottom") && i.title !== "", A = s.leftAxisCaptionsWidth, x = (t.showTicks ? D : 0) + (t.hiddenLabels ? 0 : v), m = a ? _ : 0, g = c ? s.bottomAxisCaptionsWidthByRows[l] : s.leftAxisCaptionsWidthByColumns[p], b = (i.showTicks ? D : 0) + (i.hiddenLabels ? 0 : v), M = c && n || !c && a ? _ : 0, N = c ? A + x + m : g + b + M, I = c ? b + g + M : x + 2 * _, L = Math.max(...o.map((w) => h[w].length));
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: T ? N : H,
32
- top: L === 0 ? 0 : K * 2 + L * tt,
33
- bottom: C ? I : H,
34
- right: u ? 0 : H
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(d, i) {
38
- const t = Math.floor(d / i), s = d - t * i;
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(d) {
42
- return typeof d == "object" && "type" in d;
41
+ function rt(c) {
42
+ return typeof c == "object" && "type" in c;
43
43
  }
44
- class It {
44
+ class Rt {
45
45
  constructor() {
46
- f(this, "reactRoot", null);
47
- f(this, "parentNode", null);
48
- f(this, "rootNode", null);
49
- f(this, "component", /* @__PURE__ */ E.jsx(E.Fragment, {}));
50
- f(this, "chartsDimensions", {});
51
- f(this, "chartSizes", {
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
- f(this, "columnsCount", 1);
66
- f(this, "rowsCount", 1);
67
- f(this, "scales", {
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
- f(this, "facetTitles", {});
79
+ g(this, "facetTitles", {});
80
80
  // can be multiline
81
- f(this, "mainTitle", []);
81
+ g(this, "mainTitle", []);
82
82
  // can be multiline
83
- f(this, "axisLabelsX", {});
83
+ g(this, "axisLabelsX", {});
84
84
  // can be multiline
85
- f(this, "captionsSizes", {
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
- f(this, "legend", { width: 0, height: 0, items: [] });
93
- f(this, "margins", { left: 0, right: 0, top: 0, bottom: 0 });
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, h, r) {
106
- const e = i.innerOffset, l = i.innerOffset, p = B(r, o, i.innerOffset), u = t.length, c = Math.min((s == null ? void 0 : s.nRows) ?? u, u), T = Math.min((s == null ? void 0 : s.nCols) ?? u, u);
107
- this.columnsCount = s != null && s.nRows ? Math.ceil(u / c) : T, this.rowsCount = Math.ceil(u / this.columnsCount);
108
- let { width: a, height: C } = i;
109
- h === "vertical" && p > e && (C += p), h === "horizontal" && p > l && (a += p), this.chartSizes.chartWidth = a, this.chartSizes.chartHeight = C;
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, h) {
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, C, n) => {
116
- const [A, x] = at(n, this.columnsCount), m = ht(n, i.length, this.columnsCount, this.rowsCount), g = nt(
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
- h,
119
+ n,
120
120
  this.captionsSizes,
121
- u[A],
121
+ u[T],
122
122
  this.facetTitles,
123
123
  m,
124
124
  t,
125
- A,
125
+ T,
126
126
  x,
127
127
  x === this.columnsCount - 1
128
- ), b = r + g.left + g.right, M = e + g.top + g.bottom;
129
- return a[C] = {
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: g,
133
+ padding: f,
134
134
  inner: { width: r, height: e },
135
- outer: { width: b, height: M }
136
- }, l += b, x === this.columnsCount - 1 && (l = 0, p += M), a;
135
+ outer: { width: b, height: L }
136
+ }, l += b, x === this.columnsCount - 1 && (l = 0, p += L), a;
137
137
  }, {});
138
- const c = Math.max(
138
+ const d = Math.max(
139
139
  ...i.map((a) => this.chartsDimensions[a].outer.width + this.chartsDimensions[a].left)
140
- ), T = Math.max(
140
+ ), C = Math.max(
141
141
  ...i.map((a) => this.chartsDimensions[a].outer.height + this.chartsDimensions[a].top)
142
142
  );
143
- this.chartSizes.chartsWidth = c, this.chartSizes.chartsHeight = T;
143
+ this.chartSizes.chartsWidth = d, this.chartSizes.chartsHeight = C;
144
144
  }
145
- updateViewport(i, t, s, o, h, r, e, l, p, u) {
146
- const c = p.innerOffset, T = i === "vertical", a = B(l, t, p.innerOffset), C = h === null || h.sharedX, n = h === null || h.sharedY, { chartHeight: A, chartWidth: x } = this.chartSizes;
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 g = r.scale === "log" ? ot() : Y(), b = Math.min(...n ? e.map(({ meta: L }) => L.minY) : e.map(({ geoms: L }) => Math.min(...L[m].map(({ boundsY: w }) => w.min)))), M = Math.max(...n ? e.map(({ meta: L }) => L.maxY) : e.map(({ geoms: L }) => Math.max(...L[m].map(({ boundsY: w }) => w.max)))), N = g.copy().domain([b, M]).range(
149
- T ? [A - c, a] : [c, x - a]
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
- g.domain([N.invert(T ? A : 0), N.invert(T ? 0 : x)]).range(T ? [A, 0] : [0, x]), this.scales.y[m] = g;
152
- const I = C ? t : u[m];
153
- this.scales.xPrimary[m] = F().domain(I).range(T ? [0, x] : [A, 0]), this.scales.xSecondary[m] = F().domain(s).range([0, this.scales.xPrimary[m].bandwidth()]);
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, h) => (t[h].length === 1 && t[h][0] === "null" ? s[o] = [] : s[o] = O(t[h].join(", "), this.chartSizes.chartWidth, 14), s), {});
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((h) => s[h] ?? R));
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((h) => s[h] ?? R));
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((C) => r.getTextWidth(C))) : 0;
192
+ return a.length ? Math.max(...a.map((A) => r.getTextWidth(A))) : 0;
193
193
  }
194
- const { xTail: l, yTail: p, axisCaptionsWidthByRows: u, axisCaptionsWidthByColumns: c } = st(t, this.rowsCount, this.columnsCount, s.labelsPosition, this.axisLabelsX, i, this.scales.xPrimary), T = X.flatten(
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 C = this.scales.y[a], n = C.ticks(), A = n.some((m) => Math.abs(m) < 1e-4 && m !== 0 || m > 1e4) ? ",e" : ",f", x = C.tickFormat(10, A);
199
- return n.map(x);
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: c,
207
- leftAxisCaptionsWidth: e(T)
206
+ leftAxisCaptionsWidthByColumns: d,
207
+ leftAxisCaptionsWidth: e(C)
208
208
  };
209
209
  }
210
210
  updateMargins(i, t, s) {
211
- const o = this.chartsDimensions[t[0]], h = this.chartsDimensions[t[t.length - 1]], r = i === "vertical", e = this.mainTitle.length ? Z * this.mainTitle.length + $ * 2 : 0, l = s.outerOffset;
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 - h.padding.bottom)
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 h = this.chartSizes.chartHeight, r = { width: 0, height: 0, left: 0, top: 0 }, e = [];
225
- function l(n, A) {
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[A];
228
- return m && rt(m) && m.type === n;
227
+ const m = x.aes[T];
228
+ return m && rt(m) && m.type === h;
229
229
  });
230
230
  }
231
- function p(n) {
231
+ function p(h) {
232
232
  return {
233
- dotFill: l(n, "dotFill"),
234
- fillColor: l(n, "fillColor"),
235
- lineColor: l(n, "lineColor"),
236
- dotShape: l(n, "dotShape"),
237
- lineShape: l(n, "lineShape")
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"), c = p("secondaryGrouping");
241
- if (Object.values(u).some((n) => n) && t.inheritedAes && e.push({
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(c).some((n) => n) && s.inheritedAes && e.push({
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: c,
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 T = q(e, this.chartSizes.chartHeight), a = T[T.length - 1], C = a.left + a.width + G;
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: C,
266
- height: h,
267
- items: T
265
+ width: A,
266
+ height: n,
267
+ items: C
268
268
  };
269
269
  }
270
- render(i, t, s, o, h, r, e, l, p, u, c, T, a, C) {
270
+ render(i, t, s, o, n, r, e, l, p, u, d, C, a, A) {
271
271
  var b;
272
- const { orientation: n, xAxis: A, yAxis: x, size: m } = s;
273
- this.updateChartSize(m, e, r, o.keys, n, u), this.updateViewport(
274
- n,
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
- h.keys,
276
+ n.keys,
277
277
  e,
278
278
  r,
279
279
  x,
280
280
  p,
281
281
  u,
282
282
  m,
283
- T
284
- ), this.createAxisLabels(e, A, o, n), this.createFacetTitles(e, l), this.updateCaptionsSize(n, e, A, x), this.updateChartDimensions(e, r, n, A, x), this.updateLegendSize(s.legend, o, h, p), this.createMainTitle(e, s.title), this.updateMargins(n, e, m), this.updateAesScales(o, h);
285
- const g = /* @__PURE__ */ E.jsx(y, { dataFrame: i, children: /* @__PURE__ */ E.jsx(
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: c,
301
+ keyColumn: d,
302
302
  xLabels: this.axisLabelsX,
303
303
  chartTitle: this.mainTitle,
304
304
  onlyPositive: a,
305
- secondaryGrouping: h,
306
- onTooltipHintSwitch: C
305
+ secondaryGrouping: n,
306
+ onTooltipHintSwitch: A
307
307
  }
308
308
  ) });
309
- this.component = g, (b = this.reactRoot) == null || b.render(g);
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__ */ E.jsx(V, { message: i }));
313
+ (t = this.reactRoot) == null || t.render(/* @__PURE__ */ w.jsx(V, { message: i }));
314
314
  }
315
315
  }
316
316
  export {
317
- It as default
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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"}