@milaboratories/miplots4 1.0.179 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/MiPlots.d.ts.map +1 -1
  2. package/dist/MiPlots.js +16 -14
  3. package/dist/MiPlots.js.map +1 -1
  4. package/dist/common/ContinuousAxis.d.ts +3 -1
  5. package/dist/common/ContinuousAxis.d.ts.map +1 -1
  6. package/dist/common/ContinuousAxis.js +8 -8
  7. package/dist/common/ContinuousAxis.js.map +1 -1
  8. package/dist/common/Legend.d.ts +12 -1
  9. package/dist/common/Legend.d.ts.map +1 -1
  10. package/dist/common/Legend.js +14 -6
  11. package/dist/common/Legend.js.map +1 -1
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/scatterplot/ChartRenderer.d.ts +2 -2
  15. package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
  16. package/dist/scatterplot/ChartRenderer.js +155 -115
  17. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  18. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +11 -1
  19. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
  20. package/dist/scatterplot/ScatterplotSettingsImpl.js +20 -0
  21. package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  22. package/dist/scatterplot/components/ChartLayersData.d.ts +5 -0
  23. package/dist/scatterplot/components/ChartLayersData.d.ts.map +1 -1
  24. package/dist/scatterplot/components/ChartLayersData.js +115 -35
  25. package/dist/scatterplot/components/ChartLayersData.js.map +1 -1
  26. package/dist/scatterplot/components/types.d.ts +2 -0
  27. package/dist/scatterplot/components/types.d.ts.map +1 -1
  28. package/dist/scatterplot/getLayersData.d.ts +11 -2
  29. package/dist/scatterplot/getLayersData.d.ts.map +1 -1
  30. package/dist/scatterplot/getLayersData.js +36 -19
  31. package/dist/scatterplot/getLayersData.js.map +1 -1
  32. package/dist/scatterplot/index.d.ts.map +1 -1
  33. package/dist/scatterplot/index.js +51 -33
  34. package/dist/scatterplot/index.js.map +1 -1
  35. package/dist/scatterplot/linearRegression.js +1 -1
  36. package/dist/scatterplot/utils/createAesGetter.d.ts.map +1 -1
  37. package/dist/scatterplot/utils/createAesGetter.js +5 -3
  38. package/dist/scatterplot/utils/createAesGetter.js.map +1 -1
  39. package/dist/scatterplot/utils/createLegendInfo.d.ts +11 -2
  40. package/dist/scatterplot/utils/createLegendInfo.d.ts.map +1 -1
  41. package/dist/scatterplot/utils/createLegendInfo.js +21 -16
  42. package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
  43. package/dist/scatterplot-umap/ChartRenderer.d.ts +6 -6
  44. package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
  45. package/dist/scatterplot-umap/ChartRenderer.js +99 -57
  46. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  47. package/dist/scatterplot-umap/SettingsImpl.d.ts +11 -1
  48. package/dist/scatterplot-umap/SettingsImpl.d.ts.map +1 -1
  49. package/dist/scatterplot-umap/SettingsImpl.js +21 -1
  50. package/dist/scatterplot-umap/SettingsImpl.js.map +1 -1
  51. package/dist/scatterplot-umap/components/LowerSVG.d.ts +3 -2
  52. package/dist/scatterplot-umap/components/LowerSVG.d.ts.map +1 -1
  53. package/dist/scatterplot-umap/components/LowerSVG.js +159 -108
  54. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  55. package/dist/scatterplot-umap/components/SVGLayer.d.ts +1 -1
  56. package/dist/scatterplot-umap/components/SVGLayer.d.ts.map +1 -1
  57. package/dist/scatterplot-umap/components/SVGLayer.js +9 -8
  58. package/dist/scatterplot-umap/components/SVGLayer.js.map +1 -1
  59. package/dist/scatterplot-umap/index.d.ts +6 -1
  60. package/dist/scatterplot-umap/index.d.ts.map +1 -1
  61. package/dist/scatterplot-umap/index.js +65 -31
  62. package/dist/scatterplot-umap/index.js.map +1 -1
  63. package/dist/scatterplot-umap/types.d.ts +7 -0
  64. package/dist/scatterplot-umap/types.d.ts.map +1 -1
  65. package/dist/selection/ChartRenderer.d.ts +90 -0
  66. package/dist/selection/ChartRenderer.d.ts.map +1 -0
  67. package/dist/selection/ChartRenderer.js +254 -0
  68. package/dist/selection/ChartRenderer.js.map +1 -0
  69. package/dist/selection/SelectionSettingsImpl.d.ts +53 -0
  70. package/dist/selection/SelectionSettingsImpl.d.ts.map +1 -0
  71. package/dist/selection/SelectionSettingsImpl.js +47 -0
  72. package/dist/selection/SelectionSettingsImpl.js.map +1 -0
  73. package/dist/selection/components/Chart/Bars/GroupSelectedBars.d.ts +8 -0
  74. package/dist/selection/components/Chart/Bars/GroupSelectedBars.d.ts.map +1 -0
  75. package/dist/selection/components/Chart/Bars/GroupSelectedBars.js +57 -0
  76. package/dist/selection/components/Chart/Bars/GroupSelectedBars.js.map +1 -0
  77. package/dist/selection/components/Chart/Bars/StackedBars.d.ts +12 -0
  78. package/dist/selection/components/Chart/Bars/StackedBars.d.ts.map +1 -0
  79. package/dist/selection/components/Chart/Bars/StackedBars.js +58 -0
  80. package/dist/selection/components/Chart/Bars/StackedBars.js.map +1 -0
  81. package/dist/selection/components/Chart/Bars/UngroupedBars.d.ts +6 -0
  82. package/dist/selection/components/Chart/Bars/UngroupedBars.d.ts.map +1 -0
  83. package/dist/selection/components/Chart/Bars/UngroupedBars.js +38 -0
  84. package/dist/selection/components/Chart/Bars/UngroupedBars.js.map +1 -0
  85. package/dist/selection/components/Chart/Bars.d.ts +10 -0
  86. package/dist/selection/components/Chart/Bars.d.ts.map +1 -0
  87. package/dist/selection/components/Chart/Bars.js +48 -0
  88. package/dist/selection/components/Chart/Bars.js.map +1 -0
  89. package/dist/selection/components/Chart/ChartAxes.d.ts +7 -0
  90. package/dist/selection/components/Chart/ChartAxes.d.ts.map +1 -0
  91. package/dist/selection/components/Chart/ChartAxes.js +51 -0
  92. package/dist/selection/components/Chart/ChartAxes.js.map +1 -0
  93. package/dist/selection/components/Chart/ChartFrame.d.ts +9 -0
  94. package/dist/selection/components/Chart/ChartFrame.d.ts.map +1 -0
  95. package/dist/selection/components/Chart/ChartFrame.js +41 -0
  96. package/dist/selection/components/Chart/ChartFrame.js.map +1 -0
  97. package/dist/selection/components/Chart/Dividers.d.ts +8 -0
  98. package/dist/selection/components/Chart/Dividers.d.ts.map +1 -0
  99. package/dist/selection/components/Chart/Dividers.js +27 -0
  100. package/dist/selection/components/Chart/Dividers.js.map +1 -0
  101. package/dist/selection/components/Chart/Gridlines.d.ts +10 -0
  102. package/dist/selection/components/Chart/Gridlines.d.ts.map +1 -0
  103. package/dist/selection/components/Chart/Gridlines.js +32 -0
  104. package/dist/selection/components/Chart/Gridlines.js.map +1 -0
  105. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.d.ts +9 -0
  106. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.d.ts.map +1 -0
  107. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js +36 -0
  108. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js.map +1 -0
  109. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.d.ts +6 -0
  110. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.d.ts.map +1 -0
  111. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.js +22 -0
  112. package/dist/selection/components/Chart/Ribbons/MultiGroupRibbon.js.map +1 -0
  113. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.d.ts +10 -0
  114. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.d.ts.map +1 -0
  115. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.js +33 -0
  116. package/dist/selection/components/Chart/Ribbons/SimpleRibbon.js.map +1 -0
  117. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts +10 -0
  118. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts.map +1 -0
  119. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js +65 -0
  120. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js.map +1 -0
  121. package/dist/selection/components/Chart/Ribbons/ribbonPath.d.ts +10 -0
  122. package/dist/selection/components/Chart/Ribbons/ribbonPath.d.ts.map +1 -0
  123. package/dist/selection/components/Chart/Ribbons/ribbonPath.js +13 -0
  124. package/dist/selection/components/Chart/Ribbons/ribbonPath.js.map +1 -0
  125. package/dist/selection/components/Chart/Ribbons.d.ts +9 -0
  126. package/dist/selection/components/Chart/Ribbons.d.ts.map +1 -0
  127. package/dist/selection/components/Chart/Ribbons.js +58 -0
  128. package/dist/selection/components/Chart/Ribbons.js.map +1 -0
  129. package/dist/selection/components/Chart/StageCounts.d.ts +7 -0
  130. package/dist/selection/components/Chart/StageCounts.d.ts.map +1 -0
  131. package/dist/selection/components/Chart/StageCounts.js +20 -0
  132. package/dist/selection/components/Chart/StageCounts.js.map +1 -0
  133. package/dist/selection/components/Chart/types.d.ts +132 -0
  134. package/dist/selection/components/Chart/types.d.ts.map +1 -0
  135. package/dist/selection/components/Chart.d.ts +22 -0
  136. package/dist/selection/components/Chart.d.ts.map +1 -0
  137. package/dist/selection/components/Chart.js +97 -0
  138. package/dist/selection/components/Chart.js.map +1 -0
  139. package/dist/selection/components/ChartsGroup.d.ts +18 -0
  140. package/dist/selection/components/ChartsGroup.d.ts.map +1 -0
  141. package/dist/selection/components/ChartsGroup.js +181 -0
  142. package/dist/selection/components/ChartsGroup.js.map +1 -0
  143. package/dist/selection/components/FacetCell.d.ts +22 -0
  144. package/dist/selection/components/FacetCell.d.ts.map +1 -0
  145. package/dist/selection/components/FacetCell.js +18 -0
  146. package/dist/selection/components/FacetCell.js.map +1 -0
  147. package/dist/selection/components/types.d.ts +58 -0
  148. package/dist/selection/components/types.d.ts.map +1 -0
  149. package/dist/selection/constants.d.ts +25 -0
  150. package/dist/selection/constants.d.ts.map +1 -0
  151. package/dist/selection/constants.js +4 -0
  152. package/dist/selection/constants.js.map +1 -0
  153. package/dist/selection/createSelectionData.d.ts +50 -0
  154. package/dist/selection/createSelectionData.d.ts.map +1 -0
  155. package/dist/selection/createSelectionData.js +92 -0
  156. package/dist/selection/createSelectionData.js.map +1 -0
  157. package/dist/selection/index.d.ts +26 -0
  158. package/dist/selection/index.d.ts.map +1 -0
  159. package/dist/selection/index.js +96 -0
  160. package/dist/selection/index.js.map +1 -0
  161. package/dist/selection/utils.d.ts +4 -0
  162. package/dist/selection/utils.d.ts.map +1 -0
  163. package/dist/selection/utils.js +13 -0
  164. package/dist/selection/utils.js.map +1 -0
  165. package/dist/types/bubble.d.ts +42 -0
  166. package/dist/types/bubble.d.ts.map +1 -1
  167. package/dist/types/common.d.ts +38 -0
  168. package/dist/types/common.d.ts.map +1 -1
  169. package/dist/types/common.js +1 -0
  170. package/dist/types/common.js.map +1 -1
  171. package/dist/types/dendro.d.ts +103 -0
  172. package/dist/types/dendro.d.ts.map +1 -1
  173. package/dist/types/discrete.d.ts +167 -0
  174. package/dist/types/discrete.d.ts.map +1 -1
  175. package/dist/types/heatmap.d.ts +159 -0
  176. package/dist/types/heatmap.d.ts.map +1 -1
  177. package/dist/types/histogram.d.ts +22 -0
  178. package/dist/types/histogram.d.ts.map +1 -1
  179. package/dist/types/index.d.ts +3 -1
  180. package/dist/types/index.d.ts.map +1 -1
  181. package/dist/types/index.js +1 -0
  182. package/dist/types/scatterplot-umap.d.ts +951 -87
  183. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  184. package/dist/types/scatterplot-umap.js +19 -3
  185. package/dist/types/scatterplot-umap.js.map +1 -1
  186. package/dist/types/scatterplot.d.ts +1647 -44
  187. package/dist/types/scatterplot.d.ts.map +1 -1
  188. package/dist/types/scatterplot.js +27 -3
  189. package/dist/types/scatterplot.js.map +1 -1
  190. package/dist/types/selection.d.ts +452 -0
  191. package/dist/types/selection.d.ts.map +1 -0
  192. package/dist/types/selection.js +53 -0
  193. package/dist/types/selection.js.map +1 -0
  194. package/package.json +2 -2
@@ -41,7 +41,7 @@ var p = class extends e {
41
41
  let n = this.settings, r = this.data;
42
42
  this.settings = new l(t), this.data = e, this._needUpdateCalculatedDataBySettings(n, this.settings) || this._needUpdateCalculatedDataByData(r, this.data) ? this._updateData() : this._updateAesInData();
43
43
  let i = n.layers.find((e) => e.type === "dots"), a = this.settings.layers.find((e) => e.type === "dots");
44
- f(i.aes.dotSize, a.aes.dotSize) && this.calculatedData && this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers), this._updateChart(), this.hasError = !1;
44
+ f(i.aes.dotSize, a.aes.dotSize) && this.calculatedData && this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers, this.settings.additionalCurves), this._updateChart(), this.hasError = !1;
45
45
  } catch (e) {
46
46
  this.hasError = !0, e instanceof Error && (this.chartRenderer.renderError(e.message), console.error(e));
47
47
  }
@@ -69,70 +69,104 @@ var p = class extends e {
69
69
  return console.warn("export not implemented"), "";
70
70
  }
71
71
  _needUpdateCalculatedDataBySettings(e, t) {
72
- return n(e.grouping.map((e) => e.columnName.value), t.grouping.map((e) => e.columnName.value)) || n(e.grouping.map((e) => e.columnName.nullValueLabel), t.grouping.map((e) => e.columnName.nullValueLabel)) || e.grouping.some((e, r) => n(e.order, t.grouping?.[r].order)) || e.layers.length !== t.layers.length || e.layers.some((e, n) => e.type !== t.layers[n].type) || (e.label?.value || t.label?.value) && e.label?.value !== t.label?.value;
72
+ let r = e.additionalCurves?.curves ?? [], i = t.additionalCurves?.curves ?? [];
73
+ return n(e.grouping.map((e) => e.columnName.value), t.grouping.map((e) => e.columnName.value)) || n(e.grouping.map((e) => e.columnName.nullValueLabel), t.grouping.map((e) => e.columnName.nullValueLabel)) || e.grouping.some((e, r) => n(e.order, t.grouping?.[r].order)) || e.layers.length !== t.layers.length || e.layers.some((e, n) => e.type !== t.layers[n].type) || (e.label?.value || t.label?.value) && e.label?.value !== t.label?.value || r.length !== i.length || n(r.map((e) => e.columnName.value), i.map((e) => e.columnName.value));
73
74
  }
74
75
  _needUpdateCalculatedDataByData(e, t) {
75
76
  let n = Object.keys(e.data), r = Object.keys(t.data);
76
77
  return e.id !== t.id || n.length !== r.length || n.some((n) => e.data[n].length !== t.data[n]?.length);
77
78
  }
78
79
  _updateData() {
79
- let { x: e, y: t, label: n, highlight: a, grouping: s, layers: c } = this.settings, l = {
80
+ let { x: e, y: t, label: n, highlight: a, grouping: s, layers: c, additionalCurves: l } = this.settings, d = {
80
81
  minX: Infinity,
81
82
  maxX: -Infinity,
82
83
  minY: Infinity,
83
84
  maxY: -Infinity
84
- }, d = c.some((e) => e.type === "curve"), f = /* @__PURE__ */ new Set(), p = {}, m = [], h = n?.format ? u(n.format) : void 0;
85
+ }, f = c.some((e) => e.type === "curve"), p = /* @__PURE__ */ new Set(), m = {}, h = [], g = n?.format ? u(n.format) : void 0;
85
86
  for (let i = 0; i < this.data.rowsCount; i++) {
86
87
  let o = this.data.getColumnValue(e.value, i), c = this.data.getColumnValue(t.value, i);
87
88
  if (typeof o != "number" || typeof c != "number" || !isFinite(o) || !isFinite(c)) continue;
88
- o < l.minX && (l.minX = o), o > l.maxX && (l.maxX = o), c < l.minY && (l.minY = c), c > l.maxY && (l.maxY = c);
89
- let u = a ? !this.data.getColumnValue(a.value, i) : !1, g = {
89
+ o < d.minX && (d.minX = o), o > d.maxX && (d.maxX = o), c < d.minY && (d.minY = c), c > d.maxY && (d.maxY = c);
90
+ let l = a ? !this.data.getColumnValue(a.value, i) : !1, u = {
90
91
  x: o,
91
92
  y: c,
92
93
  idx: i,
93
- label: r(this.data, i, n, h),
94
- dimmed: u
94
+ label: r(this.data, i, n, g),
95
+ dimmed: l
95
96
  };
96
- if (d) {
97
+ if (f) {
97
98
  let e = s.map(({ columnName: e }) => this.data.getColumnValue(e.value, i)).join("_");
98
- f.add(e), p[e] || (p[e] = []), p[e].push(g);
99
+ p.add(e), m[e] || (m[e] = []), m[e].push(u);
99
100
  }
100
- m.push(g);
101
+ h.push(u);
101
102
  }
102
- let g = [...f];
103
- d && g.forEach((e) => {
104
- p[e].sort((e, t) => e.x - t.x);
105
- }), i(this.data, m, s, a, c.find((e) => e.type === "dots"));
106
- let _ = o(this.data, s, c), v = this.calculatedData?.dotsExtents ?? null;
107
- if (v) {
108
- let { minX: e, maxX: t, minY: n, maxY: r } = v;
109
- (e !== l.minX || t !== l.maxX || n !== l.minY || r !== l.maxY) && this.onZoomChange(!0);
103
+ let _ = [...p];
104
+ f && _.forEach((e) => {
105
+ m[e].sort((e, t) => e.x - t.x);
106
+ });
107
+ let v = [];
108
+ if (l) for (let t of l.curves) {
109
+ let n = t.columnName.value, r = {};
110
+ for (let t = 0; t < this.data.rowsCount; t++) {
111
+ let i = this.data.getColumnValue(e.value, t), a = this.data.getColumnValue(n, t);
112
+ if (typeof i != "number" || !isFinite(i) || typeof a != "number" || !isFinite(a)) continue;
113
+ let o = s.map(({ columnName: e }) => this.data.getColumnValue(e.value, t)).join("_");
114
+ r[o] || (r[o] = []), r[o].push({
115
+ idx: t,
116
+ x: i,
117
+ y: a,
118
+ label: null,
119
+ dimmed: !1
120
+ });
121
+ }
122
+ for (let e of Object.keys(r)) r[e].sort((e, t) => e.x - t.x);
123
+ v.push({
124
+ entry: t,
125
+ dotsByGrouping: r,
126
+ smoothing: l.smoothing
127
+ });
128
+ }
129
+ i(this.data, h, s, a, c.find((e) => e.type === "dots"));
130
+ let y = o(this.data, s, c, l), b = this.calculatedData?.dotsExtents ?? null;
131
+ if (b) {
132
+ let { minX: e, maxX: t, minY: n, maxY: r } = b;
133
+ (e !== d.minX || t !== d.maxX || n !== d.minY || r !== d.maxY) && this.onZoomChange(!0);
110
134
  }
111
135
  this.calculatedData = {
112
- dots: m,
113
- dotsByGrouping: p,
114
- groupingKeys: g,
115
- dotsExtents: l,
116
- legendLabels: _
136
+ dots: h,
137
+ dotsByGrouping: m,
138
+ groupingKeys: _,
139
+ dotsExtents: d,
140
+ legendLabels: y,
141
+ additionalCurves: v
117
142
  };
118
143
  }
119
144
  _updateAesInData() {
120
145
  let e = this.calculatedData;
121
146
  if (!e) return;
122
- let { layers: t, grouping: n } = this.settings;
123
- n.forEach(({ columnName: n, inheritedAes: r }) => {
124
- let i = /* @__PURE__ */ new Set(), o = {};
147
+ let { layers: t, grouping: n, additionalCurves: r } = this.settings;
148
+ r && (e.additionalCurves = e.additionalCurves.map((e, t) => {
149
+ let n = r.curves[t];
150
+ return n ? {
151
+ ...e,
152
+ entry: n,
153
+ smoothing: r.smoothing
154
+ } : e;
155
+ })), n.forEach(({ columnName: n, inheritedAes: i }) => {
156
+ let o = /* @__PURE__ */ new Set(), s = {};
125
157
  t.forEach((e) => {
126
158
  e.aes && Object.entries(e.aes).forEach(([e, t]) => {
127
- d(t) && t.value === n.value && (i.add(e), t.palette && (o[e] = t.palette));
159
+ d(t) && t.value === n.value && (o.add(e), t.palette && (s[e] = t.palette));
128
160
  });
129
- }), e.legendLabels[n.value].usedAes = [...i], e.legendLabels[n.value].aesMap = a(n, o, r);
161
+ });
162
+ for (let e of r?.curves ?? []) d(e.lineColor) && e.lineColor.value === n.value && (o.add("lineColor"), e.lineColor.palette && (s.lineColor = e.lineColor.palette));
163
+ e.legendLabels[n.value].usedAes = [...o], e.legendLabels[n.value].aesMap = a(n, s, i);
130
164
  });
131
165
  }
132
166
  _updateChart() {
133
167
  if (!this.calculatedData) return;
134
- let { id: e, chartSettings: t, keyColumn: n, layers: r, grouping: i } = this.settings;
135
- this.chartRenderer.render(this.data, e, t, n, this.calculatedData.dots, this.calculatedData.dotsExtents, this.calculatedData.dotsByGrouping, r, this.calculatedData.legendLabels, i.map((e) => e.columnName), this.onPolygonUpdate, this.onTooltipHintSwitch, this.onLassoControlsStateUpdate, this.onZoomChange);
168
+ let { id: e, chartSettings: t, keyColumn: n, layers: r, grouping: i, additionalCurves: a, y: o } = this.settings;
169
+ this.chartRenderer.render(this.data, e, t, n, this.calculatedData.dots, this.calculatedData.dotsExtents, this.calculatedData.dotsByGrouping, r, this.calculatedData.legendLabels, i.map((e) => e.columnName), this.onPolygonUpdate, this.onTooltipHintSwitch, this.onLassoControlsStateUpdate, this.onZoomChange, this.calculatedData.additionalCurves, a, o);
136
170
  }
137
171
  };
138
172
  export { p as ChartScatterplotUmap };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/scatterplot-umap/index.ts"],"sourcesContent":["import {format} from 'd3-format';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { addPalettesToAesMapping, createLegendInfo } from '../scatterplot/utils/createLegendInfo';\nimport {formatColumnValue} from '../scatterplot/utils/formatColumnValue';\nimport {sortDotsByGrouping} from '../scatterplot/utils/sortDotsByGrouping';\nimport { type AesItem, type ContinuousAesFromColumn, type InheritAesScatterplot, isContinuousAes, type ScatterplotEventHandlers } from '../types';\nimport type { ScatterplotUmapLegendInfo, ScatterplotUmapSettings } from '../types/scatterplot-umap';\nimport {arraysAreDifferent} from '../utils/arraysAreDifferent';\nimport ChartRenderer from './ChartRenderer';\nimport { SCATTERPLOT_CONTROLS_EVENTS } from './constants';\nimport type { DotsLayer } from './SettingsImpl';\nimport { ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type { Dot, DotsExtents, LassoControlsState, LassoMode, Polygon } from './types';\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\n\nfunction dotSizeChanged(prevDotSize?: number | ContinuousAesFromColumn<number>, currentDotSize?: number | ContinuousAesFromColumn<number> ) {\n if (typeof prevDotSize === 'number' && typeof currentDotSize === 'number') {\n return prevDotSize !== currentDotSize;\n }\n if ((!prevDotSize && currentDotSize) || (!currentDotSize && prevDotSize)) {\n return true;\n }\n if (isContinuousAes(prevDotSize) && isContinuousAes(currentDotSize)) {\n return prevDotSize.range[0] !== currentDotSize.range[0] || prevDotSize.range[1] !== currentDotSize.range[1];\n }\n return false;\n}\n\nexport class ChartScatterplotUmap extends AbstractChart {\n settings: ScatterplotUmapSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onPolygonUpdate: (data: number[], polygons: Polygon[]) => void = () => undefined; // dots indexes from input data\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n onLassoControlsStateUpdate: (v: LassoControlsState) => void = () => undefined;\n onZoomChange: (isZoomChanged: boolean) => void = () => undefined;\n\n calculatedData: {\n dots: Dot[],\n groupingKeys: string[],\n dotsByGrouping: Record<string, Dot[]>,\n dotsExtents: DotsExtents,\n legendLabels: ScatterplotUmapLegendInfo,\n } | null = null;\n\n constructor(data: DataFrame, settings: ScatterplotUmapSettings, eventHandlers?: ScatterplotEventHandlers) {\n super(data, settings);\n\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.chartRenderer = new ChartRenderer();\n\n if (eventHandlers) {\n this.onPolygonUpdate = eventHandlers.onPolygonUpdate;\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = eventHandlers.onLassoControlsStateUpdate;\n this.onZoomChange = eventHandlers.onZoomChange;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: ScatterplotUmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n\n // for some reason it's not enough for size updating to do like with fillColor\n const prevLayer = previousSettings.layers.find(l => l.type === 'dots') as DotsLayer;\n const currentLayer = this.settings.layers.find(l => l.type === 'dots') as DotsLayer;\n if (dotSizeChanged(prevLayer.aes.dotSize, currentLayer.aes.dotSize) && this.calculatedData) {\n this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers);\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(field: string, value: unknown) {\n if (field === 'polygon') {\n this.chartRenderer.polygons = value as Polygon[];\n this._updateChart();\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoDelete) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoDelete);\n document.dispatchEvent(event);\n }}\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode, {detail: value as LassoMode});\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoForward) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoForward);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoBack) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoBack);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.resetViewport) {\n this.chartRenderer.resetZoom(this.settings.chartSettings.xAxis, this.settings.chartSettings.yAxis, this.calculatedData?.dotsExtents);\n this.onZoomChange(false);\n }\n }\n\n export(): string {\n console.warn('export not implemented');\n return '';\n // this._updateChart();\n // return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: ScatterplotUmapSettingsImpl, settings: ScatterplotUmapSettingsImpl) {\n return (\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.value),\n settings.grouping.map(v => v.columnName.value),\n ) ||\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.nullValueLabel),\n settings.grouping.map(v => v.columnName.nullValueLabel),\n ) ||\n prevSettings.grouping.some((v, idx) => arraysAreDifferent(v.order, settings.grouping?.[idx].order)) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => l.type !== settings.layers[idx].type) ||\n (prevSettings.label?.value || settings.label?.value) && prevSettings.label?.value !== settings.label?.value\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {x, y, label, highlight, grouping, layers} = this.settings;\n\n const dotsExtents = {\n minX: Infinity,\n maxX: -Infinity,\n minY: Infinity,\n maxY: -Infinity,\n };\n\n const hasCurve = layers.some(layer => layer.type === 'curve');\n const groupingKeysSet = new Set<string>();\n const dotsByGrouping:Record<string, Dot[]> = {};\n\n const dots: Dot[] = [];\n const labelFormatter = label?.format ? format(label.format) : undefined;\n for (let idx = 0; idx < this.data.rowsCount; idx++) {\n const xv = this.data.getColumnValue(x.value, idx);\n const yv = this.data.getColumnValue(y.value, idx);\n\n if (typeof xv !== 'number' || typeof yv !== 'number') {\n continue;\n }\n if (!isFinite(xv) || !isFinite(yv)) {\n continue;\n }\n\n if (xv < dotsExtents.minX) {\n dotsExtents.minX = xv;\n }\n if (xv > dotsExtents.maxX) {\n dotsExtents.maxX = xv;\n }\n if (yv < dotsExtents.minY) {\n dotsExtents.minY = yv;\n }\n if (yv > dotsExtents.maxY) {\n dotsExtents.maxY = yv;\n }\n\n const dimmed = highlight ? !this.data.getColumnValue(highlight.value, idx) : false;\n const dot: Dot = {\n x: xv,\n y: yv,\n idx,\n label: formatColumnValue(this.data, idx, label, labelFormatter),\n dimmed\n };\n if (hasCurve) {\n const groupingKey = grouping.map(({columnName}) => this.data.getColumnValue(columnName.value, idx)).join('_');\n groupingKeysSet.add(groupingKey);\n if (!dotsByGrouping[groupingKey]) {\n dotsByGrouping[groupingKey] = [];\n }\n dotsByGrouping[groupingKey].push(dot);\n }\n dots.push(dot);\n }\n\n const groupingKeys = [...groupingKeysSet];\n if (hasCurve) {\n groupingKeys.forEach(key => {\n dotsByGrouping[key].sort((a, b) => a.x - b.x);\n });\n }\n sortDotsByGrouping(this.data, dots, grouping, highlight, layers.find(l => l.type === 'dots'));\n const legendLabels = createLegendInfo(this.data, grouping, layers);\n\n const prevDotExtents = this.calculatedData?.dotsExtents ?? null;\n if (prevDotExtents) {\n const {minX, maxX, minY, maxY} = prevDotExtents;\n if (minX !== dotsExtents.minX || maxX !== dotsExtents.maxX \n || minY !== dotsExtents.minY || maxY !== dotsExtents.maxY) {\n this.onZoomChange(true); // dots viewport is changed but it will not be changed automatically; this call is to undisable reset button\n }\n }\n this.calculatedData = {\n dots,\n dotsByGrouping,\n groupingKeys,\n dotsExtents,\n legendLabels,\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n const {layers, grouping} = this.settings;\n grouping.forEach(({columnName, inheritedAes}) => {\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n \n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === columnName.value)) return;\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n });\n });\n\n calculated.legendLabels[columnName.value].usedAes = [...usedAes];\n calculated.legendLabels[columnName.value].aesMap = addPalettesToAesMapping(columnName, usedAesFromPalettes, inheritedAes);\n });\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, keyColumn, layers, grouping} = this.settings;\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n keyColumn,\n this.calculatedData.dots,\n this.calculatedData.dotsExtents,\n this.calculatedData.dotsByGrouping,\n layers,\n this.calculatedData.legendLabels,\n grouping.map(v => v.columnName),\n this.onPolygonUpdate,\n this.onTooltipHintSwitch,\n this.onLassoControlsStateUpdate,\n this.onZoomChange\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/scatterplot-umap/index.ts"],"sourcesContent":["import {format} from 'd3-format';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport { addPalettesToAesMapping, createLegendInfo } from '../scatterplot/utils/createLegendInfo';\nimport {formatColumnValue} from '../scatterplot/utils/formatColumnValue';\nimport {sortDotsByGrouping} from '../scatterplot/utils/sortDotsByGrouping';\nimport { type AesItem, type ContinuousAesFromColumn, type InheritAesScatterplot, isContinuousAes, type ScatterplotEventHandlers } from '../types';\nimport type { ScatterplotUmapLegendInfo, ScatterplotUmapSettings } from '../types/scatterplot-umap';\nimport {arraysAreDifferent} from '../utils/arraysAreDifferent';\nimport ChartRenderer from './ChartRenderer';\nimport { SCATTERPLOT_CONTROLS_EVENTS } from './constants';\nimport type { DotsLayer } from './SettingsImpl';\nimport { ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type { Dot, DotsExtents, LassoControlsState, LassoMode, Polygon } from './types';\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\n\nfunction dotSizeChanged(prevDotSize?: number | ContinuousAesFromColumn<number>, currentDotSize?: number | ContinuousAesFromColumn<number> ) {\n if (typeof prevDotSize === 'number' && typeof currentDotSize === 'number') {\n return prevDotSize !== currentDotSize;\n }\n if ((!prevDotSize && currentDotSize) || (!currentDotSize && prevDotSize)) {\n return true;\n }\n if (isContinuousAes(prevDotSize) && isContinuousAes(currentDotSize)) {\n return prevDotSize.range[0] !== currentDotSize.range[0] || prevDotSize.range[1] !== currentDotSize.range[1];\n }\n return false;\n}\n\nexport class ChartScatterplotUmap extends AbstractChart {\n settings: ScatterplotUmapSettingsImpl;\n chartRenderer: ChartRenderer;\n\n onPolygonUpdate: (data: number[], polygons: Polygon[]) => void = () => undefined; // dots indexes from input data\n onTooltipHintSwitch: (v:boolean) => void = () => undefined;\n onLassoControlsStateUpdate: (v: LassoControlsState) => void = () => undefined;\n onZoomChange: (isZoomChanged: boolean) => void = () => undefined;\n\n calculatedData: {\n dots: Dot[],\n groupingKeys: string[],\n dotsByGrouping: Record<string, Dot[]>,\n dotsExtents: DotsExtents,\n legendLabels: ScatterplotUmapLegendInfo,\n // One entry per additional curve; dots share primary x but source y from entry.columnName.\n // Grouped using the same grouping-key logic as the primary curve layer.\n additionalCurves: { entry: NonNullable<ScatterplotUmapSettingsImpl['additionalCurves']>['curves'][number], dotsByGrouping: Record<string, Dot[]>, smoothing: boolean }[],\n } | null = null;\n\n constructor(data: DataFrame, settings: ScatterplotUmapSettings, eventHandlers?: ScatterplotEventHandlers) {\n super(data, settings);\n\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.chartRenderer = new ChartRenderer();\n\n if (eventHandlers) {\n this.onPolygonUpdate = eventHandlers.onPolygonUpdate;\n this.onTooltipHintSwitch = eventHandlers.onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = eventHandlers.onLassoControlsStateUpdate;\n this.onZoomChange = eventHandlers.onZoomChange;\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n console.error(err);\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: ScatterplotUmapSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new ScatterplotUmapSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n\n // for some reason it's not enough for size updating to do like with fillColor\n const prevLayer = previousSettings.layers.find(l => l.type === 'dots') as DotsLayer;\n const currentLayer = this.settings.layers.find(l => l.type === 'dots') as DotsLayer;\n if (dotSizeChanged(prevLayer.aes.dotSize, currentLayer.aes.dotSize) && this.calculatedData) {\n this.chartRenderer.updatePointSize(this.calculatedData.legendLabels, this.settings.layers, this.settings.additionalCurves);\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(field: string, value: unknown) {\n if (field === 'polygon') {\n this.chartRenderer.polygons = value as Polygon[];\n this._updateChart();\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoDelete) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoDelete);\n document.dispatchEvent(event);\n }}\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoSelectMode, {detail: value as LassoMode});\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoForward) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoForward);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.lassoBack) {\n if (document) {\n const event = new CustomEvent(SCATTERPLOT_CONTROLS_EVENTS.lassoBack);\n document.dispatchEvent(event);\n }\n }\n if (field === SCATTERPLOT_CONTROLS_EVENTS.resetViewport) {\n this.chartRenderer.resetZoom(this.settings.chartSettings.xAxis, this.settings.chartSettings.yAxis, this.calculatedData?.dotsExtents);\n this.onZoomChange(false);\n }\n }\n\n export(): string {\n console.warn('export not implemented');\n return '';\n // this._updateChart();\n // return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: ScatterplotUmapSettingsImpl, settings: ScatterplotUmapSettingsImpl) {\n const prevCurves = prevSettings.additionalCurves?.curves ?? [];\n const curves = settings.additionalCurves?.curves ?? [];\n return (\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.value),\n settings.grouping.map(v => v.columnName.value),\n ) ||\n arraysAreDifferent(\n prevSettings.grouping.map(v => v.columnName.nullValueLabel),\n settings.grouping.map(v => v.columnName.nullValueLabel),\n ) ||\n prevSettings.grouping.some((v, idx) => arraysAreDifferent(v.order, settings.grouping?.[idx].order)) ||\n prevSettings.layers.length !== settings.layers.length ||\n prevSettings.layers.some((l, idx) => l.type !== settings.layers[idx].type) ||\n (prevSettings.label?.value || settings.label?.value) && prevSettings.label?.value !== settings.label?.value ||\n // Curve count or columnName change triggers full recalc. UMAP has no per-entry trend.\n prevCurves.length !== curves.length ||\n arraysAreDifferent(prevCurves.map(c => c.columnName.value), curves.map(c => c.columnName.value))\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {x, y, label, highlight, grouping, layers, additionalCurves} = this.settings;\n\n const dotsExtents = {\n minX: Infinity,\n maxX: -Infinity,\n minY: Infinity,\n maxY: -Infinity,\n };\n\n const hasCurve = layers.some(layer => layer.type === 'curve');\n const groupingKeysSet = new Set<string>();\n const dotsByGrouping:Record<string, Dot[]> = {};\n\n const dots: Dot[] = [];\n const labelFormatter = label?.format ? format(label.format) : undefined;\n for (let idx = 0; idx < this.data.rowsCount; idx++) {\n const xv = this.data.getColumnValue(x.value, idx);\n const yv = this.data.getColumnValue(y.value, idx);\n\n if (typeof xv !== 'number' || typeof yv !== 'number') {\n continue;\n }\n if (!isFinite(xv) || !isFinite(yv)) {\n continue;\n }\n\n if (xv < dotsExtents.minX) {\n dotsExtents.minX = xv;\n }\n if (xv > dotsExtents.maxX) {\n dotsExtents.maxX = xv;\n }\n if (yv < dotsExtents.minY) {\n dotsExtents.minY = yv;\n }\n if (yv > dotsExtents.maxY) {\n dotsExtents.maxY = yv;\n }\n\n const dimmed = highlight ? !this.data.getColumnValue(highlight.value, idx) : false;\n const dot: Dot = {\n x: xv,\n y: yv,\n idx,\n label: formatColumnValue(this.data, idx, label, labelFormatter),\n dimmed\n };\n if (hasCurve) {\n const groupingKey = grouping.map(({columnName}) => this.data.getColumnValue(columnName.value, idx)).join('_');\n groupingKeysSet.add(groupingKey);\n if (!dotsByGrouping[groupingKey]) {\n dotsByGrouping[groupingKey] = [];\n }\n dotsByGrouping[groupingKey].push(dot);\n }\n dots.push(dot);\n }\n\n const groupingKeys = [...groupingKeysSet];\n if (hasCurve) {\n groupingKeys.forEach(key => {\n dotsByGrouping[key].sort((a, b) => a.x - b.x);\n });\n }\n\n // Build per-entry grouped dots sourced from each entry's column as y. Same grouping-key logic as primary;\n // skip rows where overlay y is null or non-finite (they'd propagate NaN into d3 scales).\n const additionalCurvesData: NonNullable<typeof this.calculatedData>['additionalCurves'] = [];\n if (additionalCurves) {\n for (const entry of additionalCurves.curves) {\n const overlayColumn = entry.columnName.value;\n const entryDotsByGrouping: Record<string, Dot[]> = {};\n for (let idx = 0; idx < this.data.rowsCount; idx++) {\n const xv = this.data.getColumnValue(x.value, idx);\n const overlayY = this.data.getColumnValue(overlayColumn, idx);\n if (typeof xv !== 'number' || !isFinite(xv)) continue;\n if (typeof overlayY !== 'number' || !isFinite(overlayY)) continue;\n const groupingKey = grouping.map(({columnName}) => this.data.getColumnValue(columnName.value, idx)).join('_');\n if (!entryDotsByGrouping[groupingKey]) entryDotsByGrouping[groupingKey] = [];\n entryDotsByGrouping[groupingKey].push({ idx, x: xv, y: overlayY, label: null, dimmed: false });\n }\n for (const key of Object.keys(entryDotsByGrouping)) {\n entryDotsByGrouping[key].sort((a, b) => a.x - b.x);\n }\n additionalCurvesData.push({ entry, dotsByGrouping: entryDotsByGrouping, smoothing: additionalCurves.smoothing });\n }\n }\n\n sortDotsByGrouping(this.data, dots, grouping, highlight, layers.find(l => l.type === 'dots'));\n const legendLabels = createLegendInfo(this.data, grouping, layers, additionalCurves);\n\n const prevDotExtents = this.calculatedData?.dotsExtents ?? null;\n if (prevDotExtents) {\n const {minX, maxX, minY, maxY} = prevDotExtents;\n if (minX !== dotsExtents.minX || maxX !== dotsExtents.maxX \n || minY !== dotsExtents.minY || maxY !== dotsExtents.maxY) {\n this.onZoomChange(true); // dots viewport is changed but it will not be changed automatically; this call is to undisable reset button\n }\n }\n this.calculatedData = {\n dots,\n dotsByGrouping,\n groupingKeys,\n dotsExtents,\n legendLabels,\n additionalCurves: additionalCurvesData,\n };\n }\n\n _updateAesInData() {\n const calculated = this.calculatedData;\n if (!calculated) {\n return;\n }\n const {layers, grouping, additionalCurves} = this.settings;\n // Aesthetic-only refresh for additional-curve entries (UMAP has no facets; calculated.additionalCurves\n // is a flat array). Re-point entry + smoothing at the new settings so lineShape/lineWidth/lineColor/\n // opacity/showDots + shared smoothing flow into the renderer without a full recompute.\n //\n // The array AND each entry must be replaced (not mutated) — LowerSvg is React.memo'd on the\n // additionalCurves prop, so a stable reference would cause the renderer to skip the update.\n if (additionalCurves) {\n calculated.additionalCurves = calculated.additionalCurves.map((existing, i) => {\n const next = additionalCurves.curves[i];\n if (!next) return existing;\n return {\n ...existing,\n entry: next,\n smoothing: additionalCurves.smoothing,\n };\n });\n }\n grouping.forEach(({columnName, inheritedAes}) => {\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n\n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === columnName.value)) return;\n usedAes.add(key as keyof AesItem);\n if (value.palette) {\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n }\n });\n });\n // Mirrors scatterplot: ensure grouping-inherited lineColor on additional curves contributes\n // to the legend-info aes map, so the renderer can resolve per-group colors.\n for (const entry of additionalCurves?.curves ?? []) {\n if (isInheritMapping(entry.lineColor) && entry.lineColor.value === columnName.value) {\n usedAes.add('lineColor');\n if (entry.lineColor.palette) {\n usedAesFromPalettes['lineColor'] = entry.lineColor.palette;\n }\n }\n }\n\n calculated.legendLabels[columnName.value].usedAes = [...usedAes];\n calculated.legendLabels[columnName.value].aesMap = addPalettesToAesMapping(columnName, usedAesFromPalettes, inheritedAes);\n });\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {id, chartSettings, keyColumn, layers, grouping, additionalCurves, y} = this.settings;\n this.chartRenderer.render(\n this.data,\n id,\n chartSettings,\n keyColumn,\n this.calculatedData.dots,\n this.calculatedData.dotsExtents,\n this.calculatedData.dotsByGrouping,\n layers,\n this.calculatedData.legendLabels,\n grouping.map(v => v.columnName),\n this.onPolygonUpdate,\n this.onTooltipHintSwitch,\n this.onLassoControlsStateUpdate,\n this.onZoomChange,\n this.calculatedData.additionalCurves,\n additionalCurves,\n y,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAS,EAA8C,GAA6F;AAChJ,QAAO,OAAO,KAAU,YAAY,UAAU,KAAS,EAAM,SAAS;;AAG1E,SAAS,EAAe,GAAwD,GAA4D;AAUxI,QATI,OAAO,KAAgB,YAAY,OAAO,KAAmB,WACtD,MAAgB,IAEtB,CAAC,KAAe,KAAoB,CAAC,KAAkB,IACjD,KAEP,EAAgB,EAAY,IAAI,EAAgB,EAAe,GACxD,EAAY,MAAM,OAAO,EAAe,MAAM,MAAM,EAAY,MAAM,OAAO,EAAe,MAAM,KAEtG;;AAGX,IAAa,IAAb,cAA0C,EAAc;CACpD;CACA;CAEA,wBAAuE,KAAA;CACvE,4BAAiD,KAAA;CACjD,mCAAoE,KAAA;CACpE,qBAAuD,KAAA;CAEvD,iBASW;CAEX,YAAY,GAAiB,GAAmC,GAA0C;AAMtG,EALA,MAAM,GAAM,EAAS,EAErB,KAAK,WAAW,IAAI,EAA4B,EAAS,EACzD,KAAK,gBAAgB,IAAI,GAAe,EAEpC,MACA,KAAK,kBAAkB,EAAc,iBACrC,KAAK,sBAAsB,EAAc,qBACzC,KAAK,6BAA6B,EAAc,4BAChD,KAAK,eAAe,EAAc;;CAI1C,MAAM,GAAmB;AACrB,MAAI;AAIA,GAHA,KAAK,cAAc,KAAK,EAAK,EAC7B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW;WACX,GAAK;AAGV,GAFA,KAAK,WAAW,IAChB,QAAQ,MAAM,EAAI,EACd,aAAe,UACf,KAAK,cAAc,YAAY,EAAI,QAAkB,EACrD,QAAQ,MAAM,EAAI;;;CAK9B,UAAU;AACN,OAAK,cAAc,OAAO;;CAG9B,sBAAsB,GAAiB,GAAmC;AACtE,MAAI;GACA,IAAM,IAAmB,KAAK,UACxB,IAAe,KAAK;AAG1B,GAFA,KAAK,WAAW,IAAI,EAA4B,EAAS,EACzD,KAAK,OAAO,GAER,KAAK,oCAAoC,GAAkB,KAAK,SAAS,IACzE,KAAK,gCAAgC,GAAc,KAAK,KAAK,GAE7D,KAAK,aAAa,GAElB,KAAK,kBAAkB;GAI3B,IAAM,IAAY,EAAiB,OAAO,MAAK,MAAK,EAAE,SAAS,OAAO,EAChE,IAAe,KAAK,SAAS,OAAO,MAAK,MAAK,EAAE,SAAS,OAAO;AAKtE,GAJI,EAAe,EAAU,IAAI,SAAS,EAAa,IAAI,QAAQ,IAAI,KAAK,kBACxE,KAAK,cAAc,gBAAgB,KAAK,eAAe,cAAc,KAAK,SAAS,QAAQ,KAAK,SAAS,iBAAiB,EAE9H,KAAK,cAAc,EACnB,KAAK,WAAW;WACX,GAAK;AAEV,GADA,KAAK,WAAW,IACZ,aAAe,UACf,KAAK,cAAc,YAAY,EAAI,QAAkB,EACrD,QAAQ,MAAM,EAAI;;;CAK9B,iBAAiB,GAAe,GAAgB;AAK5C,MAJI,MAAU,cACV,KAAK,cAAc,WAAW,GAC9B,KAAK,cAAc,GAEnB,MAAU,EAA4B,eAClC,UAAU;GACV,IAAM,IAAQ,IAAI,YAAY,EAA4B,YAAY;AACtE,YAAS,cAAc,EAAM;;AAErC,MAAI,MAAU,EAA4B,mBAClC,UAAU;GACV,IAAM,IAAQ,IAAI,YAAY,EAA4B,iBAAiB,EAAC,QAAQ,GAAmB,CAAC;AACxG,YAAS,cAAc,EAAM;;AAGrC,MAAI,MAAU,EAA4B,gBAClC,UAAU;GACV,IAAM,IAAQ,IAAI,YAAY,EAA4B,aAAa;AACvE,YAAS,cAAc,EAAM;;AAGrC,MAAI,MAAU,EAA4B,aAClC,UAAU;GACV,IAAM,IAAQ,IAAI,YAAY,EAA4B,UAAU;AACpE,YAAS,cAAc,EAAM;;AAGrC,EAAI,MAAU,EAA4B,kBACtC,KAAK,cAAc,UAAU,KAAK,SAAS,cAAc,OAAO,KAAK,SAAS,cAAc,OAAO,KAAK,gBAAgB,YAAY,EACpI,KAAK,aAAa,GAAM;;CAIhC,SAAiB;AAEb,SADA,QAAQ,KAAK,yBAAyB,EAC/B;;CAKX,oCAAoC,GAA2C,GAAuC;EAClH,IAAM,IAAa,EAAa,kBAAkB,UAAU,EAAE,EACxD,IAAS,EAAS,kBAAkB,UAAU,EAAE;AACtD,SACI,EACI,EAAa,SAAS,KAAI,MAAK,EAAE,WAAW,MAAM,EAClD,EAAS,SAAS,KAAI,MAAK,EAAE,WAAW,MAAM,CACjD,IACD,EACI,EAAa,SAAS,KAAI,MAAK,EAAE,WAAW,eAAe,EAC3D,EAAS,SAAS,KAAI,MAAK,EAAE,WAAW,eAAe,CAC1D,IACD,EAAa,SAAS,MAAM,GAAG,MAAQ,EAAmB,EAAE,OAAO,EAAS,WAAW,GAAK,MAAM,CAAC,IACnG,EAAa,OAAO,WAAW,EAAS,OAAO,UAC/C,EAAa,OAAO,MAAM,GAAG,MAAQ,EAAE,SAAS,EAAS,OAAO,GAAK,KAAK,KACzE,EAAa,OAAO,SAAS,EAAS,OAAO,UAAU,EAAa,OAAO,UAAU,EAAS,OAAO,SAEtG,EAAW,WAAW,EAAO,UAC7B,EAAmB,EAAW,KAAI,MAAK,EAAE,WAAW,MAAM,EAAE,EAAO,KAAI,MAAK,EAAE,WAAW,MAAM,CAAC;;CAIxG,gCAAgC,GAAqB,GAAiB;EAClE,IAAM,IAAW,OAAO,KAAK,EAAS,KAAK,EACrC,IAAO,OAAO,KAAK,EAAK,KAAK;AACnC,SACI,EAAS,OAAO,EAAK,MACrB,EAAS,WAAW,EAAK,UACzB,EAAS,MAAK,MAAO,EAAS,KAAK,GAAK,WAAW,EAAK,KAAK,IAAM,OAAO;;CAIlF,cAAc;EACV,IAAM,EAAC,MAAG,MAAG,UAAO,cAAW,aAAU,WAAQ,wBAAoB,KAAK,UAEpE,IAAc;GAChB,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACT,EAEK,IAAW,EAAO,MAAK,MAAS,EAAM,SAAS,QAAQ,EACvD,oBAAkB,IAAI,KAAa,EACnC,IAAuC,EAAE,EAEzC,IAAc,EAAE,EAChB,IAAiB,GAAO,SAAS,EAAO,EAAM,OAAO,GAAG,KAAA;AAC9D,OAAK,IAAI,IAAM,GAAG,IAAM,KAAK,KAAK,WAAW,KAAO;GAChD,IAAM,IAAK,KAAK,KAAK,eAAe,EAAE,OAAO,EAAI,EAC3C,IAAK,KAAK,KAAK,eAAe,EAAE,OAAO,EAAI;AAKjD,OAHI,OAAO,KAAO,YAAY,OAAO,KAAO,YAGxC,CAAC,SAAS,EAAG,IAAI,CAAC,SAAS,EAAG,CAC9B;AAYJ,GATI,IAAK,EAAY,SACjB,EAAY,OAAO,IAEnB,IAAK,EAAY,SACjB,EAAY,OAAO,IAEnB,IAAK,EAAY,SACjB,EAAY,OAAO,IAEnB,IAAK,EAAY,SACjB,EAAY,OAAO;GAGvB,IAAM,IAAS,IAAY,CAAC,KAAK,KAAK,eAAe,EAAU,OAAO,EAAI,GAAG,IACvE,IAAW;IACb,GAAG;IACH,GAAG;IACH;IACA,OAAO,EAAkB,KAAK,MAAM,GAAK,GAAO,EAAe;IAC/D;IACH;AACD,OAAI,GAAU;IACV,IAAM,IAAc,EAAS,KAAK,EAAC,oBAAgB,KAAK,KAAK,eAAe,EAAW,OAAO,EAAI,CAAC,CAAC,KAAK,IAAI;AAK7G,IAJA,EAAgB,IAAI,EAAY,EAC3B,EAAe,OAChB,EAAe,KAAe,EAAE,GAEpC,EAAe,GAAa,KAAK,EAAI;;AAEzC,KAAK,KAAK,EAAI;;EAGlB,IAAM,IAAe,CAAC,GAAG,EAAgB;AACzC,EAAI,KACA,EAAa,SAAQ,MAAO;AACxB,KAAe,GAAK,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE;IAC/C;EAKN,IAAM,IAAoF,EAAE;AAC5F,MAAI,EACA,MAAK,IAAM,KAAS,EAAiB,QAAQ;GACzC,IAAM,IAAgB,EAAM,WAAW,OACjC,IAA6C,EAAE;AACrD,QAAK,IAAI,IAAM,GAAG,IAAM,KAAK,KAAK,WAAW,KAAO;IAChD,IAAM,IAAK,KAAK,KAAK,eAAe,EAAE,OAAO,EAAI,EAC3C,IAAW,KAAK,KAAK,eAAe,GAAe,EAAI;AAE7D,QADI,OAAO,KAAO,YAAY,CAAC,SAAS,EAAG,IACvC,OAAO,KAAa,YAAY,CAAC,SAAS,EAAS,CAAE;IACzD,IAAM,IAAc,EAAS,KAAK,EAAC,oBAAgB,KAAK,KAAK,eAAe,EAAW,OAAO,EAAI,CAAC,CAAC,KAAK,IAAI;AAE7G,IADK,EAAoB,OAAc,EAAoB,KAAe,EAAE,GAC5E,EAAoB,GAAa,KAAK;KAAE;KAAK,GAAG;KAAI,GAAG;KAAU,OAAO;KAAM,QAAQ;KAAO,CAAC;;AAElG,QAAK,IAAM,KAAO,OAAO,KAAK,EAAoB,CAC9C,GAAoB,GAAK,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE;AAEtD,KAAqB,KAAK;IAAE;IAAO,gBAAgB;IAAqB,WAAW,EAAiB;IAAW,CAAC;;AAIxH,IAAmB,KAAK,MAAM,GAAM,GAAU,GAAW,EAAO,MAAK,MAAK,EAAE,SAAS,OAAO,CAAC;EAC7F,IAAM,IAAe,EAAiB,KAAK,MAAM,GAAU,GAAQ,EAAiB,EAE9E,IAAiB,KAAK,gBAAgB,eAAe;AAC3D,MAAI,GAAgB;GAChB,IAAM,EAAC,SAAM,SAAM,SAAM,YAAQ;AACjC,IAAI,MAAS,EAAY,QAAQ,MAAS,EAAY,QAC/C,MAAS,EAAY,QAAQ,MAAS,EAAY,SACrD,KAAK,aAAa,GAAK;;AAG/B,OAAK,iBAAiB;GAClB;GACA;GACA;GACA;GACA;GACA,kBAAkB;GACrB;;CAGL,mBAAmB;EACf,IAAM,IAAa,KAAK;AACxB,MAAI,CAAC,EACD;EAEJ,IAAM,EAAC,WAAQ,aAAU,wBAAoB,KAAK;AAkBlD,EAXI,MACA,EAAW,mBAAmB,EAAW,iBAAiB,KAAK,GAAU,MAAM;GAC3E,IAAM,IAAO,EAAiB,OAAO;AAErC,UADK,IACE;IACH,GAAG;IACH,OAAO;IACP,WAAW,EAAiB;IAC/B,GALiB;IAMpB,GAEN,EAAS,SAAS,EAAC,eAAY,sBAAkB;GAC7C,IAAM,oBAAU,IAAI,KAAoB,EAClC,IAA+D,EAAE;AACvE,KAAO,SAAQ,MAAS;AACf,MAAM,OAEX,OAAO,QAAQ,EAAM,IAAI,CAAC,SAAS,CAAC,GAAK,OAAW;AAC1C,OAAiB,EAAM,IAAI,EAAM,UAAU,EAAW,UAC5D,EAAQ,IAAI,EAAqB,EAC7B,EAAM,YACN,EAAoB,KAAwB,EAAM;MAExD;KACJ;AAGF,QAAK,IAAM,KAAS,GAAkB,UAAU,EAAE,CAC9C,CAAI,EAAiB,EAAM,UAAU,IAAI,EAAM,UAAU,UAAU,EAAW,UAC1E,EAAQ,IAAI,YAAY,EACpB,EAAM,UAAU,YAChB,EAAoB,YAAe,EAAM,UAAU;AAM/D,GADA,EAAW,aAAa,EAAW,OAAO,UAAU,CAAC,GAAG,EAAQ,EAChE,EAAW,aAAa,EAAW,OAAO,SAAS,EAAwB,GAAY,GAAqB,EAAa;IAC3H;;CAGN,eAAe;AACX,MAAI,CAAC,KAAK,eACN;EAEJ,IAAM,EAAC,OAAI,kBAAe,cAAW,WAAQ,aAAU,qBAAkB,SAAK,KAAK;AACnF,OAAK,cAAc,OACf,KAAK,MACL,GACA,GACA,GACA,KAAK,eAAe,MACpB,KAAK,eAAe,aACpB,KAAK,eAAe,gBACpB,GACA,KAAK,eAAe,cACpB,EAAS,KAAI,MAAK,EAAE,WAAW,EAC/B,KAAK,iBACL,KAAK,qBACL,KAAK,4BACL,KAAK,cACL,KAAK,eAAe,kBACpB,GACA,EACH"}
@@ -43,6 +43,11 @@ export interface CaptionsSizes {
43
43
  xAxisCaptionsWidth: number;
44
44
  yAxisCaptionsWidth: number;
45
45
  }
46
+ export type AdditionalCurveRenderData = {
47
+ entry: NonNullable<ScatterplotUmapSettingsImpl['additionalCurves']>['curves'][number];
48
+ dotsByGrouping: Record<string, Dot[]>;
49
+ smoothing: boolean;
50
+ };
46
51
  export interface SVGLayerProps {
47
52
  settingsId: string;
48
53
  scales: ChartScales;
@@ -60,6 +65,7 @@ export interface SVGLayerProps {
60
65
  labels: Label[];
61
66
  dotsByGrouping: Record<string, Dot[]>;
62
67
  layers: ScatterplotUmapSettingsImpl['layers'];
68
+ additionalCurves: AdditionalCurveRenderData[];
63
69
  defaultPolygons: Polygon[];
64
70
  onPolygonUpdate: (data: Polygon[]) => void;
65
71
  onTooltipHintSwitch: (v: boolean) => void;
@@ -76,6 +82,7 @@ export type AesGetters = {
76
82
  dotFill: (idx: number) => string;
77
83
  dotSize: (idx: number) => number;
78
84
  lineType: (idx: number) => LineShape;
85
+ additionalCurveLineColor: ((idx: number) => string)[];
79
86
  };
80
87
  export type LassoControlsState = {
81
88
  mode: LassoMode;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { ReactElement } from 'react';
2
+ import { Root } from 'react-dom/client';
3
+ import { LegendData } from '../common/types';
4
+ import { ColumnName, FrameType, TitlePosition } from '../types';
5
+ import { Margins } from './components/types';
6
+ import { FacetedSelectionData } from './createSelectionData';
7
+ import { SelectionFillColor, SelectionSettingsImpl, SelectionXAxisSettings, SelectionYAxisSettings } from './SelectionSettingsImpl';
8
+ type GroupingSettings = NonNullable<SelectionSettingsImpl['grouping']>;
9
+ declare class ChartRenderer {
10
+ reactRoot: Root | null;
11
+ parentNode: HTMLElement | null;
12
+ rootNode: HTMLElement | null;
13
+ component: ReactElement;
14
+ cellPlotWidth: number;
15
+ cellPlotHeight: number;
16
+ nCols: number;
17
+ nRows: number;
18
+ isFaceted: boolean;
19
+ cellLabelHeight: number;
20
+ orderedFaceted: FacetedSelectionData;
21
+ facetLabels: Record<string, string[]>;
22
+ facetTitles: Record<string, string[]>;
23
+ grouped: boolean;
24
+ groupNames: string[];
25
+ colorMap: Map<string, string>;
26
+ solidColor: string;
27
+ xLabelsByFacet: Record<string, Record<string, string[]>>;
28
+ xCountsByFacet: Record<string, Record<string, string>>;
29
+ xLabelsPosition: 'center' | '45deg' | '90deg';
30
+ maxLabelLines: number;
31
+ maxLabelPx: number;
32
+ yTickWidth: number;
33
+ labelBlock: number;
34
+ xTitleHeight: number;
35
+ yTitleWidth: number;
36
+ yTickReserve: number;
37
+ xLabelTopReserve: number;
38
+ topPad: number;
39
+ rightPad: number;
40
+ fullLeftPad: number;
41
+ fullBottomPad: number;
42
+ colLeftPads: number[];
43
+ rowBottomPads: number[];
44
+ colXOffsets: number[];
45
+ rowYOffsets: number[];
46
+ gridWidth: number;
47
+ gridHeight: number;
48
+ legend: LegendData;
49
+ mainTitle: string[];
50
+ margins: Margins;
51
+ totalWidth: number;
52
+ totalHeight: number;
53
+ clear(): void;
54
+ init(node: HTMLElement): void;
55
+ updateChartSizes(width: number, height: number): void;
56
+ updateGrid({ faceted, facetLabels, facetBy, facetSettings, }: {
57
+ faceted: FacetedSelectionData;
58
+ facetLabels: Record<string, string[]>;
59
+ facetBy: ColumnName[];
60
+ facetSettings: SelectionSettingsImpl['facetSettings'];
61
+ }): void;
62
+ updateGroupingMaps(grouping: GroupingSettings | undefined, fillColor: SelectionFillColor): void;
63
+ createAxisLabels(xAxis: SelectionXAxisSettings): void;
64
+ updateCaptionsSize(xAxis: SelectionXAxisSettings, yAxis: SelectionYAxisSettings): void;
65
+ updateChartDimensions(): void;
66
+ updateLegendSize(showLegend: boolean, grouping: GroupingSettings | undefined): void;
67
+ createMainTitle(title: string, showTitle: boolean): void;
68
+ updateMargins(): void;
69
+ render({ faceted, facetLabels, width, height, title, showTitle, grouping, showLegend, facetBy, facetSettings, xAxis, yAxis, frame, titlePosition, fillColor, opacity, }: {
70
+ faceted: FacetedSelectionData;
71
+ facetLabels: Record<string, string[]>;
72
+ width: number;
73
+ height: number;
74
+ title: string;
75
+ showTitle: boolean;
76
+ grouping: GroupingSettings | undefined;
77
+ showLegend: boolean;
78
+ facetBy: ColumnName[];
79
+ facetSettings: SelectionSettingsImpl['facetSettings'];
80
+ xAxis: SelectionXAxisSettings;
81
+ yAxis: SelectionYAxisSettings;
82
+ frame: FrameType;
83
+ titlePosition: TitlePosition;
84
+ fillColor: SelectionFillColor;
85
+ opacity: number;
86
+ }): void;
87
+ renderError(message: string): void;
88
+ }
89
+ export default ChartRenderer;
90
+ //# sourceMappingURL=ChartRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/selection/ChartRenderer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,254 @@
1
+ import { Error as e } from "../common/Error.js";
2
+ import { TextMeasurer as t } from "../utils/TextMeasurer/TextMeasurer.js";
3
+ import { arrangeLegendParts as n } from "../utils/arrangeLegendParts.js";
4
+ import { splitTextByWidth as r } from "../utils/splitTextByWidth.js";
5
+ import "../discrete/utils/index.js";
6
+ import { AGGREGATE_RIBBON_COLOR as i } from "./constants.js";
7
+ import { formatCount as a, formatPercent as o } from "./utils.js";
8
+ import { ChartsGroup as s } from "./components/ChartsGroup.js";
9
+ import { scaleOrdinal as c } from "d3-scale";
10
+ import { createRoot as l } from "react-dom/client";
11
+ import { Fragment as u, jsx as d } from "react/jsx-runtime";
12
+ var f = class {
13
+ reactRoot = null;
14
+ parentNode = null;
15
+ rootNode = null;
16
+ component = /* @__PURE__ */ d(u, {});
17
+ cellPlotWidth = 0;
18
+ cellPlotHeight = 0;
19
+ nCols = 1;
20
+ nRows = 1;
21
+ isFaceted = !1;
22
+ cellLabelHeight = 0;
23
+ orderedFaceted = {
24
+ facetKeys: [],
25
+ byFacet: {},
26
+ groupNames: []
27
+ };
28
+ facetLabels = {};
29
+ facetTitles = {};
30
+ grouped = !1;
31
+ groupNames = [];
32
+ colorMap = /* @__PURE__ */ new Map();
33
+ solidColor = "";
34
+ xLabelsByFacet = {};
35
+ xCountsByFacet = {};
36
+ xLabelsPosition = "center";
37
+ maxLabelLines = 1;
38
+ maxLabelPx = 0;
39
+ yTickWidth = 0;
40
+ labelBlock = 0;
41
+ xTitleHeight = 0;
42
+ yTitleWidth = 0;
43
+ yTickReserve = 0;
44
+ xLabelTopReserve = 0;
45
+ topPad = 0;
46
+ rightPad = 12;
47
+ fullLeftPad = 0;
48
+ fullBottomPad = 0;
49
+ colLeftPads = [];
50
+ rowBottomPads = [];
51
+ colXOffsets = [0];
52
+ rowYOffsets = [0];
53
+ gridWidth = 0;
54
+ gridHeight = 0;
55
+ legend = {
56
+ width: 0,
57
+ height: 0,
58
+ items: []
59
+ };
60
+ mainTitle = [];
61
+ margins = {
62
+ top: 24,
63
+ bottom: 24,
64
+ left: 24,
65
+ right: 24
66
+ };
67
+ totalWidth = 0;
68
+ totalHeight = 0;
69
+ clear() {
70
+ this.parentNode && this.rootNode && (this.parentNode.removeChild(this.rootNode), this.parentNode = null, this.rootNode = null), setTimeout(() => {
71
+ this.reactRoot?.unmount(), this.reactRoot = null;
72
+ });
73
+ }
74
+ init(e) {
75
+ this.parentNode === null && (this.parentNode = e, this.rootNode = document.createElement("div"), this.parentNode.appendChild(this.rootNode), this.reactRoot = l(this.rootNode));
76
+ }
77
+ updateChartSizes(e, t) {
78
+ this.cellPlotWidth = e, this.cellPlotHeight = t;
79
+ }
80
+ updateGrid({ faceted: e, facetLabels: t, facetBy: n, facetSettings: i }) {
81
+ let a = i.order?.length ? i.order.filter((t) => e.facetKeys.includes(t)) : e.facetKeys;
82
+ if (this.orderedFaceted = {
83
+ ...e,
84
+ facetKeys: a
85
+ }, this.facetLabels = t, this.isFaceted = n.length > 0, this.isFaceted) {
86
+ let e = Math.max(this.cellPlotWidth, 40);
87
+ this.facetTitles = {};
88
+ let n = 1;
89
+ for (let i of a) {
90
+ let a = (t[i] ?? []).join(" / "), o = a ? r(a, e, 20) : [];
91
+ this.facetTitles[i] = o, o.length > n && (n = o.length);
92
+ }
93
+ this.cellLabelHeight = 48 + (n - 1) * 24;
94
+ } else this.facetTitles = {}, this.cellLabelHeight = 0;
95
+ let o = a.length;
96
+ this.nCols = Math.min(o, i.nCols ?? Math.max(1, Math.ceil(Math.sqrt(o)))), this.nRows = i.nRows ?? Math.max(1, Math.ceil(o / this.nCols));
97
+ }
98
+ updateGroupingMaps(e, t) {
99
+ let n = typeof t == "object" && !!t;
100
+ this.grouped = n && !!e;
101
+ let r = e?.order ? e.order.map(String).filter((e) => this.orderedFaceted.groupNames.includes(e)) : this.orderedFaceted.groupNames;
102
+ this.groupNames = [...r, ...this.orderedFaceted.groupNames.filter((e) => !r.includes(e))];
103
+ let a = e?.inheritedAes;
104
+ if (this.colorMap = /* @__PURE__ */ new Map(), this.grouped && a) for (let e of this.groupNames) {
105
+ let t = a[e]?.fillColor;
106
+ t && this.colorMap.set(e, t);
107
+ }
108
+ this.solidColor = n ? i : t;
109
+ }
110
+ createAxisLabels(e) {
111
+ let n = new t("500 14px Manrope"), i = this.orderedFaceted.facetKeys, o = i.map((e) => this.orderedFaceted.byFacet[e]?.stages.length ?? 0).reduce((e, t) => Math.max(e, t), 0), s = 0;
112
+ for (let e of i) for (let t of this.orderedFaceted.byFacet[e]?.stages ?? []) s = Math.max(s, n.getTextWidth(t.label));
113
+ this.maxLabelPx = s;
114
+ let c = o > 0 ? this.cellPlotWidth / o : this.cellPlotWidth;
115
+ this.xLabelsPosition = e.labelsPosition ?? (s > c * .65 ? "90deg" : "center");
116
+ let l = this.xLabelsPosition !== "center";
117
+ this.xLabelsByFacet = {}, this.xCountsByFacet = {}, this.maxLabelLines = 1;
118
+ for (let e of i) {
119
+ let t = this.orderedFaceted.byFacet[e]?.stages ?? [], n = {}, i = {};
120
+ for (let [e, o] of t.entries()) {
121
+ let t = l ? [o.label] : r(o.label, 120, 14);
122
+ n[String(e)] = t, i[String(e)] = a(o.total), this.maxLabelLines = Math.max(this.maxLabelLines, t.length);
123
+ }
124
+ this.xLabelsByFacet[e] = n, this.xCountsByFacet[e] = i;
125
+ }
126
+ }
127
+ updateCaptionsSize(e, n) {
128
+ let r = new t("500 14px Manrope");
129
+ n.hiddenLabels ? (this.yTickWidth = 0, this.yTickReserve = n.showTicks ? 4 : 0) : (this.yTickWidth = r.getTextWidth(o(100)), this.yTickReserve = 40), e.hiddenLabels ? (this.labelBlock = 0, this.xLabelTopReserve = e.showTicks ? 4 : 0) : (this.labelBlock = this.xLabelsPosition === "center" ? this.maxLabelLines * 20 : this.xLabelsPosition === "45deg" ? Math.ceil(this.maxLabelPx * .71) + 10 : Math.ceil(this.maxLabelPx) + 10, this.xLabelTopReserve = 6), this.xTitleHeight = e.title ? 26 : 0, this.yTitleWidth = n.title ? 24 : 0;
130
+ }
131
+ updateChartDimensions() {
132
+ this.fullLeftPad = this.yTitleWidth + this.yTickWidth + this.yTickReserve, this.fullBottomPad = this.xLabelTopReserve + this.labelBlock + this.xTitleHeight, this.topPad = 20, this.rightPad = 12, this.colLeftPads = Array.from({ length: this.nCols }, (e, t) => !this.isFaceted || t === 0 ? this.fullLeftPad : 12);
133
+ let e = this.orderedFaceted.facetKeys.length % this.nCols !== 0;
134
+ this.rowBottomPads = Array.from({ length: this.nRows }, (t, n) => {
135
+ let r = n === this.nRows - 1 || n === this.nRows - 2 && e;
136
+ return !this.isFaceted || r ? this.fullBottomPad : 12;
137
+ }), this.colXOffsets = [0];
138
+ for (let [e, t] of this.colLeftPads.entries()) this.colXOffsets.push(this.colXOffsets[e] + t + this.cellPlotWidth + this.rightPad);
139
+ this.rowYOffsets = [0];
140
+ for (let [e, t] of this.rowBottomPads.entries()) this.rowYOffsets.push(this.rowYOffsets[e] + this.topPad + this.cellLabelHeight + this.cellPlotHeight + t);
141
+ this.gridWidth = this.colXOffsets[this.nCols], this.gridHeight = this.rowYOffsets[this.nRows];
142
+ }
143
+ updateLegendSize(e, t) {
144
+ if (!e || !this.grouped || this.groupNames.length === 0) {
145
+ this.legend = {
146
+ width: 0,
147
+ height: 0,
148
+ items: []
149
+ };
150
+ return;
151
+ }
152
+ let r = n([{
153
+ id: "selection-group",
154
+ type: "discreteColor",
155
+ title: t?.columnName.label ?? t?.columnName.value ?? "",
156
+ width: 0,
157
+ height: 0,
158
+ left: 0,
159
+ top: 0,
160
+ values: this.groupNames,
161
+ scale: c().domain(this.groupNames).range(this.groupNames.map((e) => this.colorMap.get(e) ?? "")),
162
+ labels: Object.fromEntries(this.groupNames.map((e) => [e, e === "null" ? t?.columnName.nullValueLabel ?? "N/A" : e]))
163
+ }], this.cellPlotHeight);
164
+ this.legend = {
165
+ width: r.reduce((e, t) => Math.max(e, t.left + t.width), 0) + 24,
166
+ height: this.cellPlotHeight,
167
+ items: r
168
+ };
169
+ }
170
+ createMainTitle(e, t) {
171
+ this.mainTitle = t && e ? r(e, Math.max(this.cellPlotWidth, 40), 20) : [];
172
+ }
173
+ updateMargins() {
174
+ let e = this.mainTitle.length > 0 ? this.mainTitle.length * 24 + 48 : 0;
175
+ this.margins = {
176
+ top: Math.max(e, 24),
177
+ bottom: 24,
178
+ left: 24,
179
+ right: 24 + this.legend.width
180
+ }, this.totalWidth = this.margins.left + this.gridWidth + this.margins.right, this.totalHeight = this.margins.top + this.gridHeight + this.margins.bottom;
181
+ }
182
+ render({ faceted: e, facetLabels: t, width: n, height: r, title: i, showTitle: a, grouping: o, showLegend: c, facetBy: l, facetSettings: u, xAxis: f, yAxis: p, frame: m, titlePosition: h, fillColor: g, opacity: _ }) {
183
+ this.updateChartSizes(n, r), this.updateGrid({
184
+ faceted: e,
185
+ facetLabels: t,
186
+ facetBy: l,
187
+ facetSettings: u
188
+ }), this.updateGroupingMaps(o, g), this.createAxisLabels(f), this.updateCaptionsSize(f, p), this.updateChartDimensions(), this.updateLegendSize(c, o), this.createMainTitle(i, a), this.updateMargins();
189
+ let v = /* @__PURE__ */ d(s, {
190
+ facetData: {
191
+ faceted: this.orderedFaceted,
192
+ facetLabels: this.facetLabels,
193
+ facetTitles: this.facetTitles
194
+ },
195
+ gridLayout: {
196
+ nRows: this.nRows,
197
+ nCols: this.nCols,
198
+ totalWidth: this.totalWidth,
199
+ totalHeight: this.totalHeight,
200
+ margins: this.margins,
201
+ cellPlotWidth: this.cellPlotWidth,
202
+ cellPlotHeight: this.cellPlotHeight,
203
+ cellLabelHeight: this.cellLabelHeight,
204
+ topPad: this.topPad,
205
+ rightPad: this.rightPad,
206
+ colLeftPads: this.colLeftPads,
207
+ rowBottomPads: this.rowBottomPads,
208
+ colXOffsets: this.colXOffsets,
209
+ rowYOffsets: this.rowYOffsets,
210
+ sharedX: this.isFaceted,
211
+ sharedY: this.isFaceted
212
+ },
213
+ xAxis: {
214
+ labelsByFacet: this.xLabelsByFacet,
215
+ countsByFacet: this.xCountsByFacet,
216
+ countsFontSize: 14,
217
+ labelsPosition: this.xLabelsPosition,
218
+ showGrid: f.showGrid,
219
+ showTicks: f.showTicks,
220
+ hiddenLabels: f.hiddenLabels,
221
+ title: f.title
222
+ },
223
+ yAxis: {
224
+ showGrid: p.showGrid,
225
+ showTicks: p.showTicks,
226
+ hiddenLabels: p.hiddenLabels,
227
+ title: p.title
228
+ },
229
+ style: {
230
+ frameType: this.isFaceted ? "full" : m,
231
+ barColor: this.solidColor,
232
+ opacity: _,
233
+ colorMap: this.colorMap,
234
+ nullValueLabel: o?.columnName.nullValueLabel
235
+ },
236
+ title: {
237
+ text: this.mainTitle,
238
+ show: this.mainTitle.length > 0,
239
+ position: h
240
+ },
241
+ legend: this.legend,
242
+ showFacetLabels: this.isFaceted,
243
+ grouped: this.grouped,
244
+ orderedGroupNames: this.groupNames
245
+ });
246
+ this.component = v, this.reactRoot?.render(v);
247
+ }
248
+ renderError(t) {
249
+ this.reactRoot?.render(/* @__PURE__ */ d(e, { message: t }));
250
+ }
251
+ };
252
+ export { f as default };
253
+
254
+ //# sourceMappingURL=ChartRenderer.js.map