@milaboratories/graph-maker 1.1.166 → 1.1.168

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 (111) hide show
  1. package/dist/GraphMaker/constantsCommon.d.ts +2 -9
  2. package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
  3. package/dist/GraphMaker/constantsCommon.js +78 -83
  4. package/dist/GraphMaker/constantsCommon.js.map +1 -1
  5. package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js +8 -2
  6. package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js.map +1 -1
  7. package/dist/GraphMaker/forms/DataMappingForm/DiscreteForm.vue.js +26 -20
  8. package/dist/GraphMaker/forms/DataMappingForm/DiscreteForm.vue.js.map +1 -1
  9. package/dist/GraphMaker/forms/LayersForm/Layer/discrete/StackedArea.vue.d.ts.map +1 -1
  10. package/dist/GraphMaker/forms/LayersForm/Layer/discrete/StackedArea.vue.js +56 -38
  11. package/dist/GraphMaker/forms/LayersForm/Layer/discrete/StackedArea.vue.js.map +1 -1
  12. package/dist/GraphMaker/forms/LayersForm/Layer/discrete/StackedBar.vue.d.ts.map +1 -1
  13. package/dist/GraphMaker/forms/LayersForm/Layer/discrete/StackedBar.vue.js +48 -30
  14. package/dist/GraphMaker/forms/LayersForm/Layer/discrete/StackedBar.vue.js.map +1 -1
  15. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot/Scatter.vue.d.ts.map +1 -1
  16. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot/Scatter.vue.js +37 -31
  17. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot/Scatter.vue.js.map +1 -1
  18. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot-umap/Scatter.vue.js +30 -24
  19. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot-umap/Scatter.vue.js.map +1 -1
  20. package/dist/GraphMaker/forms/StatisticsForm/DiscreteStatisticsForm.vue.js +33 -27
  21. package/dist/GraphMaker/forms/StatisticsForm/DiscreteStatisticsForm.vue.js.map +1 -1
  22. package/dist/GraphMaker/index.vue.js +8 -2
  23. package/dist/GraphMaker/index.vue.js.map +1 -1
  24. package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.js +22 -16
  25. package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.js.map +1 -1
  26. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts +2 -0
  27. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts.map +1 -1
  28. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.js +17 -11
  29. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.js.map +1 -1
  30. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js +26 -20
  31. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js.map +1 -1
  32. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.js +29 -23
  33. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.js.map +1 -1
  34. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts.map +1 -1
  35. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.js +83 -68
  36. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.js.map +1 -1
  37. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.js +25 -19
  38. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.js.map +1 -1
  39. package/dist/GraphMaker/utils/createChartSettingsForRender/getLayersDataFromForms.d.ts.map +1 -1
  40. package/dist/GraphMaker/utils/createChartSettingsForRender/getLayersDataFromForms.js +7 -5
  41. package/dist/GraphMaker/utils/createChartSettingsForRender/getLayersDataFromForms.js.map +1 -1
  42. package/dist/GraphMaker/utils/getUsedAesInMapping.js +37 -31
  43. package/dist/GraphMaker/utils/getUsedAesInMapping.js.map +1 -1
  44. package/dist/GraphMaker/utils/loadDefaultSources.d.ts.map +1 -1
  45. package/dist/GraphMaker/utils/loadDefaultSources.js +36 -31
  46. package/dist/GraphMaker/utils/loadDefaultSources.js.map +1 -1
  47. package/dist/_virtual/stringify.js +5 -0
  48. package/dist/_virtual/stringify.js.map +1 -0
  49. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/DiscreteSettingsImpl.js +8 -8
  50. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/DiscreteSettingsImpl.js.map +1 -1
  51. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/index.js +8 -8
  52. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/stackedBar.js +54 -29
  53. package/dist/node_modules/@milaboratories/miplots4/dist/discrete/layers/stackedBar.js.map +1 -1
  54. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-array/src/min.js +12 -6
  55. package/dist/node_modules/@milaboratories/miplots4/dist/node_modules/d3-array/src/min.js.map +1 -1
  56. package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js +2 -0
  57. package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js.map +1 -1
  58. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js +106 -107
  59. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js.map +1 -1
  60. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js +120 -121
  61. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js.map +1 -1
  62. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js +83 -84
  63. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js.map +1 -1
  64. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/dendro.js +4 -4
  65. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/discrete.js +11 -11
  66. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js +123 -124
  67. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js.map +1 -1
  68. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/histogram.js +8 -8
  69. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js +116 -117
  70. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js.map +1 -1
  71. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js +100 -102
  72. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js.map +1 -1
  73. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js +148 -119
  74. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js.map +1 -1
  75. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/dist/components/PlDataTable.js +4 -4
  76. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/dist/render/util/label.js +5 -5
  77. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js +8 -0
  78. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js.map +1 -0
  79. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js +182 -0
  80. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js.map +1 -0
  81. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/errors.js +18 -0
  82. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/errors.js.map +1 -0
  83. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/json.js +12 -0
  84. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/json.js.map +1 -0
  85. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/plid.js +7 -0
  86. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/plid.js.map +1 -0
  87. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/ref.js +8 -0
  88. package/dist/node_modules/@milaboratories/pf-plots/dist/node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/ref.js.map +1 -0
  89. package/dist/node_modules/@milaboratories/pf-plots/dist/pframe/ColumnsProvider.js +105 -111
  90. package/dist/node_modules/@milaboratories/pf-plots/dist/pframe/ColumnsProvider.js.map +1 -1
  91. package/dist/node_modules/@milaboratories/pf-plots/dist/utils.js +158 -163
  92. package/dist/node_modules/@milaboratories/pf-plots/dist/utils.js.map +1 -1
  93. package/dist/node_modules/@milaboratories/pl-error-like/dist/error_like_shape.js +36 -0
  94. package/dist/node_modules/@milaboratories/pl-error-like/dist/error_like_shape.js.map +1 -0
  95. package/dist/node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js +8 -0
  96. package/dist/node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js.map +1 -0
  97. package/dist/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js +52 -0
  98. package/dist/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js.map +1 -0
  99. package/dist/node_modules/@milaboratories/pl-model-common/dist/plid.js +7 -0
  100. package/dist/node_modules/@milaboratories/pl-model-common/dist/plid.js.map +1 -0
  101. package/dist/node_modules/@milaboratories/pl-model-common/dist/ref.js +8 -0
  102. package/dist/node_modules/@milaboratories/pl-model-common/dist/ref.js.map +1 -0
  103. package/dist/node_modules/@platforma-sdk/model/dist/render/util/label.js +16 -0
  104. package/dist/node_modules/@platforma-sdk/model/dist/render/util/label.js.map +1 -0
  105. package/dist/node_modules/json-stringify-safe/stringify.js +20 -0
  106. package/dist/node_modules/json-stringify-safe/stringify.js.map +1 -0
  107. package/dist/node_modules/zod/lib/index.js +2978 -0
  108. package/dist/node_modules/zod/lib/index.js.map +1 -0
  109. package/package.json +4 -4
  110. package/dist/node_modules/@milaboratories/pf-plots/dist/constants.js +0 -18
  111. package/dist/node_modules/@milaboratories/pf-plots/dist/constants.js.map +0 -1
@@ -1,17 +1,20 @@
1
- import { DISCRETE_VALUES_KEY as E, HIGH_CARDINALITY as D } from "../constants.js";
2
- import { AxisId as w, columnOrAxisIdFromString as A } from "../spec.js";
3
- import { getStateCopy as k, getDefaultInfo as O, dataColumnPredicateDefault as B, createLinkerMap as P, createMultipliesByMap as j, getColumnOrAxisValueLabelsId as F } from "../utils.js";
4
1
  import "../node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js";
5
- import "../node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
2
+ import { readAnnotation as I, Annotation as k } from "../node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
6
3
  import "../_virtual/canonicalize.js";
7
4
  import "../node_modules/@milaboratories/pl-model-common/dist/plid.js";
8
5
  import "../node_modules/@milaboratories/pl-model-common/dist/ref.js";
6
+ import { AxisId as b, columnOrAxisIdFromString as A } from "../spec.js";
7
+ import { getStateCopy as O, getDefaultInfo as D, dataColumnPredicateDefault as B, createLinkerMap as E, createMultipliesByMap as P, getColumnOrAxisValueLabelsId as j } from "../utils.js";
8
+ import "../node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js";
9
+ import "../node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
10
+ import "../node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/plid.js";
11
+ import "../node_modules/@platforma-sdk/model/node_modules/@milaboratories/pl-model-common/dist/ref.js";
9
12
  import { deriveLabels as M } from "../node_modules/@platforma-sdk/model/dist/render/util/label.js";
10
13
  import "../node_modules/@milaboratories/pl-error-like/dist/error_like_shape.js";
11
- var V = Object.defineProperty, H = (h, e, t) => e in h ? V(h, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[e] = t, x = (h, e, t) => H(h, typeof e != "symbol" ? e + "" : e, t);
12
- class W {
14
+ var F = Object.defineProperty, V = (g, e, t) => e in g ? F(g, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : g[e] = t, w = (g, e, t) => V(g, typeof e != "symbol" ? e + "" : e, t);
15
+ class z {
13
16
  constructor(e, t) {
14
- x(this, "ignoredOptionIdNames", []), x(this, "dataInputs", []), x(this, "dontAllowUnfilteredHighCardinality", !1), x(this, "allowHangingAxes", !1), this.simpleComponentControllers = e, this.filterComponentControllers = t;
17
+ w(this, "ignoredOptionIdNames", []), w(this, "dataInputs", []), w(this, "dontAllowUnfilteredHighCardinality", !1), w(this, "allowHangingAxes", !1), this.simpleComponentControllers = e, this.filterComponentControllers = t;
15
18
  }
16
19
  addSelected(e, t, o) {
17
20
  if (e in this.simpleComponentControllers)
@@ -28,20 +31,20 @@ class W {
28
31
  throw Error(`Unknown input name: ${String(e)}`);
29
32
  }
30
33
  changeSelected(e, t, o, r) {
31
- const n = o.components[e].selectorStates, a = n.filter((s) => !r.find((l) => l.selectedSource === s.selectedSource)), d = r.filter((s) => !n.find((l) => l.selectedSource === s.selectedSource));
32
- let m = k(o);
33
- return a.forEach((s) => {
34
- m = this.deleteSelected(e, t, m, s);
35
- }), d.forEach((s) => {
36
- m = this.addSelected(e, m, s);
34
+ const s = o.components[e].selectorStates, a = s.filter((i) => !r.find((n) => n.selectedSource === i.selectedSource)), c = r.filter((i) => !s.find((n) => n.selectedSource === i.selectedSource));
35
+ let u = O(o);
36
+ return a.forEach((i) => {
37
+ u = this.deleteSelected(e, t, u, i);
38
+ }), c.forEach((i) => {
39
+ u = this.addSelected(e, u, i);
37
40
  }), o.components[e].selectorStates = r.map(
38
- (s) => o.components[e].selectorStates.find(
39
- (l) => l.selectedSource === s.selectedSource
41
+ (i) => o.components[e].selectorStates.find(
42
+ (n) => n.selectedSource === i.selectedSource
40
43
  )
41
- ).filter(Boolean), m;
44
+ ).filter(Boolean), u;
42
45
  }
43
46
  switchDividableAxis(e, t) {
44
- return k(e);
47
+ return O(e);
45
48
  }
46
49
  createEmptyComponentsGuide(e) {
47
50
  return Object.fromEntries(
@@ -62,7 +65,7 @@ class W {
62
65
  getEmptyInputGuide(e) {
63
66
  return {
64
67
  components: this.createEmptyComponentsGuide(e),
65
- getSourceInfo: (t) => O(t),
68
+ getSourceInfo: (t) => D(t),
66
69
  fullOptionsSet: /* @__PURE__ */ new Set(),
67
70
  readyData: !1,
68
71
  ready: !1,
@@ -77,14 +80,14 @@ class W {
77
80
  t.add(r);
78
81
  for (const o of Object.keys(this.filterComponentControllers))
79
82
  if (this.filterComponentControllers[o].isDimensionsConsumer)
80
- for (const { selectedSource: r, type: n, selectedFilterValues: a } of e.components[o].selectorStates)
81
- n === "equals" && (a == null ? void 0 : a.length) === 1 && t.add(r);
83
+ for (const { selectedSource: r, type: s, selectedFilterValues: a } of e.components[o].selectorStates)
84
+ s === "equals" && (a == null ? void 0 : a.length) === 1 && t.add(r);
82
85
  return t;
83
86
  }
84
87
  async getParentAndHangingAxesByInputs(e, t, o, r) {
85
- const n = { ...this.simpleComponentControllers, ...this.filterComponentControllers }, a = {};
86
- for (const [d, m] of Object.entries(n))
87
- a[d] = await m.getParentAndHangingAxes(e, t, o, r);
88
+ const s = { ...this.simpleComponentControllers, ...this.filterComponentControllers }, a = {};
89
+ for (const [c, u] of Object.entries(s))
90
+ a[c] = await u.getParentAndHangingAxes(e, t, o, r);
88
91
  return a;
89
92
  }
90
93
  /** Depends on chart type. */
@@ -94,53 +97,50 @@ class W {
94
97
  /** Axes that go to the "Drag to build the chart" section.
95
98
  * If some of them is not moved to 'filters', 'tabBy' or 'facetBy' (dimension reducers) chart can't be rendered */
96
99
  markMustBeConsumedAxes(e, t, o, r) {
97
- var n;
98
- const a = this.getConsumedOptionsSet(e), d = (s) => {
99
- const l = t.get(s);
100
- l && l.kind === "axis" && (l.mustBeConsumed = !0);
101
- }, m = this.getMustBeConsumedAxes(e, t);
102
- for (const s of m)
103
- a.has(s) || d(s);
104
- this.allowHangingAxes || Object.entries(r).forEach(([s, { hangingAxes: l }]) => {
105
- for (const i of l.keys())
106
- a.has(i) || d(i);
100
+ var s;
101
+ const a = this.getConsumedOptionsSet(e), c = (i) => {
102
+ const n = t.get(i);
103
+ n && n.kind === "axis" && (n.mustBeConsumed = !0);
104
+ }, u = this.getMustBeConsumedAxes(e, t);
105
+ for (const i of u)
106
+ a.has(i) || c(i);
107
+ this.allowHangingAxes || Object.entries(r).forEach(([i, { hangingAxes: n }]) => {
108
+ for (const l of n.keys())
109
+ a.has(l) || c(l);
107
110
  });
108
- for (const s of o) {
109
- const l = t.get(s);
110
- (l == null ? void 0 : l.kind) === "axis" && l.isNonHomogenous && !a.has(s) && d(s);
111
+ for (const i of o) {
112
+ const n = t.get(i);
113
+ (n == null ? void 0 : n.kind) === "axis" && n.isNonHomogenous && !a.has(i) && c(i);
111
114
  }
112
115
  if (this.dontAllowUnfilteredHighCardinality) {
113
- const s = (i) => {
114
- var c;
115
- return ((c = i == null ? void 0 : i.annotations) == null ? void 0 : c[D]) === "true";
116
- }, l = ((n = e.components.filters) == null ? void 0 : n.selectorStates.reduce((i, c) => {
116
+ const i = (l) => I(l, k.Graph.Axis.HighCardinality) === "true", n = ((s = e.components.filters) == null ? void 0 : s.selectorStates.reduce((l, m) => {
117
117
  var p;
118
- if (((p = c == null ? void 0 : c.selectedFilterValues) == null ? void 0 : p.length) !== 1 && c.type !== "subset")
119
- return i;
120
- const u = t.get(c.selectedSource);
121
- return (u == null ? void 0 : u.kind) === "column" && u.spec.axesSpec.filter(s).forEach((f) => i.add(w.fromAxisSpec(f).toCanonicalString())), (u == null ? void 0 : u.kind) === "axis" && s(u.spec) && i.add(w.fromAxisSpec(u.spec).toCanonicalString()), i;
118
+ if (((p = m == null ? void 0 : m.selectedFilterValues) == null ? void 0 : p.length) !== 1 && m.type !== "subset")
119
+ return l;
120
+ const d = t.get(m.selectedSource);
121
+ return (d == null ? void 0 : d.kind) === "column" && d.spec.axesSpec.filter(i).forEach((f) => l.add(b.fromAxisSpec(f).toCanonicalString())), (d == null ? void 0 : d.kind) === "axis" && i(d.spec) && l.add(b.fromAxisSpec(d.spec).toCanonicalString()), l;
122
122
  }, /* @__PURE__ */ new Set())) ?? /* @__PURE__ */ new Set();
123
- this.dataInputs.forEach((i) => {
124
- for (const { selectedSource: c } of e.components[i].selectorStates) {
125
- const p = t.get(c);
126
- if ((p == null ? void 0 : p.kind) === "column" && p.spec.axesSpec.filter(s).forEach((u) => {
127
- const f = w.fromAxisSpec(u).toCanonicalString();
128
- l.has(f) || d(f);
129
- }), (p == null ? void 0 : p.kind) === "axis" && s(p.spec)) {
130
- const u = w.fromAxisSpec(p.spec).toCanonicalString();
131
- l.has(u) || d(u);
123
+ this.dataInputs.forEach((l) => {
124
+ for (const { selectedSource: m } of e.components[l].selectorStates) {
125
+ const p = t.get(m);
126
+ if ((p == null ? void 0 : p.kind) === "column" && p.spec.axesSpec.filter(i).forEach((d) => {
127
+ const f = b.fromAxisSpec(d).toCanonicalString();
128
+ n.has(f) || c(f);
129
+ }), (p == null ? void 0 : p.kind) === "axis" && i(p.spec)) {
130
+ const d = b.fromAxisSpec(p.spec).toCanonicalString();
131
+ n.has(d) || c(d);
132
132
  }
133
133
  }
134
134
  });
135
135
  }
136
136
  }
137
137
  setColumnLabels(e, t) {
138
- const o = [...e].filter((n) => {
138
+ const o = [...e].filter((s) => {
139
139
  var a;
140
- return ((a = t.get(n)) == null ? void 0 : a.kind) === "column";
141
- }), r = M(o, (n) => t.get(n).spec);
142
- o.forEach((n, a) => {
143
- t.get(n).label = r[a].label;
140
+ return ((a = t.get(s)) == null ? void 0 : a.kind) === "column";
141
+ }), r = M(o, (s) => t.get(s).spec);
142
+ o.forEach((s, a) => {
143
+ t.get(s).label = r[a].label;
144
144
  });
145
145
  }
146
146
  /** Calculates information for data-mapping interface:
@@ -148,121 +148,120 @@ class W {
148
148
  * information for every option (label, value type, must be consumed etc),
149
149
  * information about full data-mapping state (ready to data loading and rendering or not, contains inconsistency or not) */
150
150
  async calculateOptions(e, t, o = [], r = B) {
151
- const n = this.createEmptyComponentsGuide(t), a = new Set(this.ignoredOptionIdNames), d = new Set(o), m = await P(e), s = await j(e), l = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set(), c = await this.getParentAndHangingAxesByInputs(e, t, m, s), p = { ...this.simpleComponentControllers, ...this.filterComponentControllers };
152
- for (const [C, y] of Object.entries(p)) {
153
- const S = await y.getOptions(
151
+ const s = this.createEmptyComponentsGuide(t), a = new Set(this.ignoredOptionIdNames), c = new Set(o), u = await E(e), i = await P(e), n = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Set(), m = await this.getParentAndHangingAxesByInputs(e, t, u, i), p = { ...this.simpleComponentControllers, ...this.filterComponentControllers };
152
+ for (const [S, h] of Object.entries(p)) {
153
+ const y = await h.getOptions(
154
154
  e,
155
155
  t,
156
+ u,
157
+ i,
156
158
  m,
157
- s,
158
- c,
159
159
  r,
160
160
  a,
161
- d
161
+ c
162
162
  );
163
- for (const g of S.options)
164
- i.add(g.value);
165
- for (const g of S.optionsInfo)
166
- l.set(...g);
167
- n[C] = S;
163
+ for (const C of y.options)
164
+ l.add(C.value);
165
+ for (const C of y.optionsInfo)
166
+ n.set(...C);
167
+ s[S] = y;
168
168
  }
169
- this.markMustBeConsumedAxes(t, l, i, c), this.setColumnLabels(i, l);
170
- const u = this.isConsistent(t, n), f = (C) => l.get(C) ?? O(C);
169
+ this.markMustBeConsumedAxes(t, n, l, m), this.setColumnLabels(l, n);
170
+ const d = this.isConsistent(t, s), f = (S) => n.get(S) ?? D(S);
171
171
  return {
172
- components: n,
172
+ components: s,
173
173
  getSourceInfo: f,
174
- fullOptionsSet: i,
174
+ fullOptionsSet: l,
175
175
  readyData: this.readyDataInputs(t),
176
- ready: this.readyForPlotBuilding(t, u, i, f),
177
- consistent: u
176
+ ready: this.readyForPlotBuilding(t, d, l, f),
177
+ consistent: d
178
178
  };
179
179
  }
180
- async getUniqueSourceValuesWithLabels(e, t, o, r, n, a) {
181
- var d;
182
- const m = (i) => i.sort((c, p) => c.label.localeCompare(p.label, "en", { numeric: !0 })), s = t.getSourceInfo(o), l = (d = s.annotations) == null ? void 0 : d[E];
180
+ async getUniqueSourceValuesWithLabels(e, t, o, r, s, a) {
181
+ const c = (n) => n.sort((l, m) => l.label.localeCompare(m.label, "en", { numeric: !0 })), u = t.getSourceInfo(o), i = I(u.spec, k.DiscreteValues);
183
182
  try {
184
- const i = l ? JSON.parse(l).map((c) => String(c)) : null;
185
- if (i) {
186
- const c = i.map((p) => ({ value: p, label: p }));
187
- return m(c), { values: c, overflow: !1 };
183
+ const n = i ? JSON.parse(i).map((l) => String(l)) : null;
184
+ if (n) {
185
+ const l = n.map((m) => ({ value: m, label: m }));
186
+ return c(l), { values: l, overflow: !1 };
188
187
  }
189
188
  } catch {
190
- console.error(`Parsing error: discrete values annotation ${l} in ${o}`);
189
+ console.error(`Parsing error: discrete values annotation ${i} in ${o}`);
191
190
  }
192
- if (s.kind === "axis") {
193
- const i = A(o), c = s.parentSources.map(A), p = await F(e, o, s.parentSources);
194
- let u = [];
195
- if (p) {
196
- n && (u = [{
191
+ if (u.kind === "axis") {
192
+ const n = A(o), l = u.parentSources.map(A), m = await j(e, o, u.parentSources);
193
+ let p = [];
194
+ if (m) {
195
+ s && (p = [{
197
196
  type: "bySingleColumnV2",
198
197
  column: {
199
198
  type: "column",
200
- id: p.name
199
+ id: m.name
201
200
  },
202
201
  predicate: {
203
202
  operator: "StringIContains",
204
- substring: n
203
+ substring: s
205
204
  }
206
- }]), a && (u = [{
205
+ }]), a && (p = [{
207
206
  type: "bySingleColumnV2",
208
207
  column: {
209
208
  type: "axis",
210
- id: i.toPFrameId()
209
+ id: n.toPFrameId()
211
210
  },
212
211
  predicate: {
213
212
  operator: "StringIContains",
214
213
  substring: a
215
214
  }
216
215
  }]);
217
- const { data: S, axesData: g } = await e.pFrameProvider.getSingleColumnData(p, u), v = g[i.toCanonicalString()], I = [];
218
- for (let b = 0; b < Math.min(v.length, r ?? v.length); b++)
219
- I.push({ value: String(v[b]), label: String(S[b]) });
220
- return m(I), { values: I, overflow: !(r === void 0 || v.length < r) };
216
+ const { data: h, axesData: y } = await e.pFrameProvider.getSingleColumnData(m, p), C = y[n.toCanonicalString()], x = [];
217
+ for (let v = 0; v < Math.min(C.length, r ?? C.length); v++)
218
+ x.push({ value: String(C[v]), label: String(h[v]) });
219
+ return c(x), { values: x, overflow: !(r === void 0 || C.length < r) };
221
220
  }
222
- const f = n ?? a;
223
- f && (u = [{
221
+ const d = s ?? a;
222
+ d && (p = [{
224
223
  type: "bySingleColumnV2",
225
224
  column: {
226
225
  type: "axis",
227
- id: i.toPFrameId()
226
+ id: n.toPFrameId()
228
227
  },
229
228
  predicate: {
230
229
  operator: "StringIContains",
231
- substring: f
230
+ substring: d
232
231
  }
233
232
  }]);
234
- const C = await e.pFrameProvider.getAxisUniqueValues(i, [c[0]], r, u), y = C.values.map((S) => ({ value: String(S), label: String(S) }));
235
- return m(y), { values: y, overflow: C.overflow };
233
+ const f = await e.pFrameProvider.getAxisUniqueValues(n, [l[0]], r, p), S = f.values.map((h) => ({ value: String(h), label: String(h) }));
234
+ return c(S), { values: S, overflow: f.overflow };
236
235
  }
237
- if (s.kind === "column") {
238
- const i = n ?? a, c = A(o), p = i ? [{
236
+ if (u.kind === "column") {
237
+ const n = s ?? a, l = A(o), m = n ? [{
239
238
  type: "bySingleColumnV2",
240
239
  column: {
241
240
  type: "column",
242
- id: c.name
241
+ id: l.name
243
242
  },
244
243
  predicate: {
245
244
  operator: "StringIContains",
246
- substring: i
245
+ substring: n
247
246
  }
248
- }] : [], u = await e.pFrameProvider.getColumnUniqueValues(c, r, p), f = u.values.map((C) => ({ value: String(C), label: String(C) }));
249
- return m(f), { values: f, overflow: u.overflow };
247
+ }] : [], p = await e.pFrameProvider.getColumnUniqueValues(l, r, m), d = p.values.map((f) => ({ value: String(f), label: String(f) }));
248
+ return c(d), { values: d, overflow: p.overflow };
250
249
  }
251
250
  return { values: [], overflow: !1 };
252
251
  }
253
252
  checkStateConsistency(e, t) {
254
253
  const o = /* @__PURE__ */ new Map(), r = { ...this.simpleComponentControllers, ...this.filterComponentControllers };
255
- for (const n of Object.keys(r))
254
+ for (const s of Object.keys(r))
256
255
  o.set(
257
- n,
258
- r[n].checkStateConsistency(e, t[n].options)
256
+ s,
257
+ r[s].checkStateConsistency(e, t[s].options)
259
258
  );
260
259
  return o;
261
260
  }
262
261
  isConsistent(e, t) {
263
262
  const o = this.checkStateConsistency(e, t);
264
263
  for (const r of o.values())
265
- if (Object.values(r).some((n) => !n))
264
+ if (Object.values(r).some((s) => !s))
266
265
  return !1;
267
266
  return !0;
268
267
  }
@@ -272,18 +271,18 @@ class W {
272
271
  readyForPlotBuilding(e, t, o, r) {
273
272
  if (!t || !this.readyDataInputs(e))
274
273
  return !1;
275
- let n = !1;
276
- for (const d of o) {
277
- const m = r(d);
278
- if (m && m.kind === "axis" && m.mustBeConsumed) {
279
- n = !0;
274
+ let s = !1;
275
+ for (const c of o) {
276
+ const u = r(c);
277
+ if (u && u.kind === "axis" && u.mustBeConsumed) {
278
+ s = !0;
280
279
  break;
281
280
  }
282
281
  }
283
282
  const a = [];
284
- for (const d of Object.keys(this.simpleComponentControllers))
285
- this.simpleComponentControllers[d].isRequired && a.push(d);
286
- return a.every((d) => e.components[d].selectorStates.length > 0) && !n;
283
+ for (const c of Object.keys(this.simpleComponentControllers))
284
+ this.simpleComponentControllers[c].isRequired && a.push(c);
285
+ return a.every((c) => e.components[c].selectorStates.length > 0) && !s;
287
286
  }
288
287
  async createDataForPlot(e, t) {
289
288
  return {
@@ -293,6 +292,6 @@ class W {
293
292
  }
294
293
  }
295
294
  export {
296
- W as ControllerBase
295
+ z as ControllerBase
297
296
  };
298
297
  //# sourceMappingURL=ControllerBase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ControllerBase.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts"],"sourcesContent":["import {\n AxisSpec,\n LinkerMap,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2\n} from '@milaboratories/pl-model-common';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport { DISCRETE_VALUES_KEY, HIGH_CARDINALITY } from '../constants';\nimport { PValue } from '../store';\nimport type { DataStore } from '../store';\nimport type { AxesSet, ColumnOrAxisIdString } from '../spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString } from '../spec';\nimport {\n createLinkerMap,\n createMultipliesByMap,\n dataColumnPredicateDefault,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n MultipliesByMap,\n OptionsInfo,\n} from '../utils';\nimport { ComponentController } from './ComponentController';\nimport { deriveLabels } from '@platforma-sdk/model';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n readonly allowHangingAxes: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) { }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n fullOptionsSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource } of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource, type, selectedFilterValues } of state.components[componentName].selectorStates as SelectorStateFilter[]) {\n if (type === 'equals' && selectedFilterValues?.length === 1) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n }\n return consumedSourcesSet;\n }\n\n async getParentAndHangingAxesByInputs(store: DataStore, state: State, linkerMap: LinkerMap, multipliesByMap: MultipliesByMap): Promise<Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>> {\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n const result: Record<string, { parentsAxes: AxesSet, hangingAxes: AxesSet }> = {};\n for (const [name, componentController] of Object.entries(allControllers)) {\n result[name] = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getParentAndHangingAxes(store, state, linkerMap, multipliesByMap);\n }\n\n return result as Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>;\n }\n\n /** Depends on chart type. */\n getMustBeConsumedAxes(state: State, optionsInfo: OptionsInfo): Set<ColumnOrAxisIdString> {\n return new Set();\n }\n\n /** Axes that go to the \"Drag to build the chart\" section.\n * If some of them is not moved to 'filters', 'tabBy' or 'facetBy' (dimension reducers) chart can't be rendered */\n markMustBeConsumedAxes(\n state: State,\n optionsInfo: OptionsInfo,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n parentAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>\n ) {\n // set of columns and axes that selected in dimension-reducing components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n };\n // Depends on chart type: axes from heatmap data column, to make visible what axes should be moved to x/y; hanging axes from X/Y scatterplot\n const mustBeConsumedAxes = this.getMustBeConsumedAxes(state, optionsInfo);\n for (const idStr of mustBeConsumedAxes) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (!this.allowHangingAxes) {\n // All 'hanging' axes must be moved to dimension reducers (for example, axes that exist in X/Y/Data source column, but not exist in Grouping)\n Object.entries(parentAndHangingAxes).forEach(([name, { hangingAxes }]) => {\n for (const idStr of hangingAxes.keys()) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n });\n }\n\n // Mark all non-homogenous axes\n for (const idStr of fullOptionsSet) {\n const info = optionsInfo.get(idStr);\n if (info?.kind === 'axis' && info.isNonHomogenous && !consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n if ((s as SelectorStateFilter)?.selectedFilterValues?.length !== 1 && (s as SelectorStateFilter).type !== 'subset') {\n return consumed;\n }\n const info = optionsInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const { selectedSource } of state.components[inputName].selectorStates) {\n const info = optionsInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n }\n\n setColumnLabels(optionsSet: Set<ColumnOrAxisIdString>, optionsInfo: OptionsInfo) {\n const columnIds = [...optionsSet].filter((v) => optionsInfo.get(v)?.kind === 'column');\n const labelsMap = deriveLabels(columnIds, (id: string) => (optionsInfo.get(id) as ColumnData).spec);\n columnIds.forEach((id, idx) => {\n optionsInfo.get(id)!.label = labelsMap[idx].label;\n });\n\n }\n\n /** Calculates information for data-mapping interface: \n * options for every input (basket), \n * information for every option (label, value type, must be consumed etc),\n * information about full data-mapping state (ready to data loading and rendering or not, contains inconsistency or not) */\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n // Two type of linkers: regular ones and \"multiplying\"\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const optionsInfo: OptionsInfo = new Map();\n const fullOptionsSet = new Set<ColumnOrAxisIdString>();\n\n const parentAndHangingAxes = await this.getParentAndHangingAxesByInputs(store, state, linkerMap, multipliesByMap);\n\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n for (const [name, componentController] of Object.entries(allControllers) as ([keyof InputOptionsUnion<State>, ComponentController<State, SimpleComponents<State> | FilterComponents<State>>][])) {\n const componentGuide = await componentController.getOptions(\n store, state,\n linkerMap, multipliesByMap,\n parentAndHangingAxes,\n dataColumnPredicate,\n ignoredNamesSet, fixedSelectedSet\n );\n for (const item of componentGuide.options) {\n fullOptionsSet.add(item.value);\n }\n for (const v of componentGuide.optionsInfo) {\n optionsInfo.set(...v);\n }\n resultComponentsGuide[name] = componentGuide;\n }\n\n this.markMustBeConsumedAxes(state, optionsInfo, fullOptionsSet, parentAndHangingAxes);\n this.setColumnLabels(fullOptionsSet, optionsInfo);\n\n const consistent = this.isConsistent(state, resultComponentsGuide as ComponentsGuide<State['components']>);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => optionsInfo.get(sourceIdStr) ?? getDefaultInfo(sourceIdStr);\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n fullOptionsSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(state, consistent, fullOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({ value: v, label: v }));\n sortValues(values);\n return { values, overflow: false };\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters: PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const { data: dataValues, axesData } = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values: { value: string, label: string }[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n sortValues(values);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n return { values: [], overflow: false };\n }\n\n checkStateConsistency(\n state: State, componentsGuide: ComponentsGuide<State['components']>\n ): Map<keyof State['components'], Record<string, boolean>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n\n for (const component of Object.keys(allControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n allControllers[component].checkStateConsistency(state, componentsGuide[component].options)\n );\n }\n return result;\n }\n\n isConsistent(state: State, componentsGuide: ComponentsGuide<State['components']>): boolean {\n const consistency = this.checkStateConsistency(state, componentsGuide);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n state: State,\n consistent: boolean,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of fullOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n\n const requiredComponents: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n requiredComponents.push(componentName);\n }\n }\n\n return (\n requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n"],"names":["ControllerBase","simpleComponentControllers","filterComponentControllers","__publicField","inputName","state","selectorState","store","nextSelectorStates","currentStates","deletedStates","currentState","s","addedStates","nextState","c","getStateCopy","st","axis","key","value","sourceIdStr","getDefaultInfo","consumedSourcesSet","componentName","selectedSource","type","selectedFilterValues","linkerMap","multipliesByMap","allControllers","result","name","componentController","optionsInfo","fullOptionsSet","parentAndHangingAxes","markMustBeConsumed","id","option","mustBeConsumedAxes","idStr","hangingAxes","info","isHighCardinality","spec","_a","HIGH_CARDINALITY","consumedHighCardinalityAxes","consumed","AxisId","optionsSet","columnIds","v","labelsMap","deriveLabels","idx","fixedIds","dataColumnPredicate","dataColumnPredicateDefault","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","createLinkerMap","createMultipliesByMap","componentGuide","item","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","values","a","b","discreteValuesStr","DISCRETE_VALUES_KEY","discreteValues","axisId","columnOrAxisIdFromString","parentSources","labelsColumnId","getColumnOrAxisValueLabelsId","filters","dataValues","axesData","axisKeys","i","searchInLabelsOrValue","response","columnId","f","componentsGuide","component","consistency","hasFreeDimensions","optionId","requiredComponents"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ControllerBase.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts"],"sourcesContent":["import {\n Annotation,\n AxisSpec,\n LinkerMap,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n readAnnotation\n} from '@milaboratories/pl-model-common';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport { PValue } from '../store';\nimport type { DataStore } from '../store';\nimport type { AxesSet, ColumnOrAxisIdString } from '../spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString } from '../spec';\nimport {\n createLinkerMap,\n createMultipliesByMap,\n dataColumnPredicateDefault,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n MultipliesByMap,\n OptionsInfo,\n} from '../utils';\nimport { ComponentController } from './ComponentController';\nimport { deriveLabels } from '@platforma-sdk/model';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n readonly allowHangingAxes: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) { }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n fullOptionsSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource } of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource, type, selectedFilterValues } of state.components[componentName].selectorStates as SelectorStateFilter[]) {\n if (type === 'equals' && selectedFilterValues?.length === 1) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n }\n return consumedSourcesSet;\n }\n\n async getParentAndHangingAxesByInputs(store: DataStore, state: State, linkerMap: LinkerMap, multipliesByMap: MultipliesByMap): Promise<Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>> {\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n const result: Record<string, { parentsAxes: AxesSet, hangingAxes: AxesSet }> = {};\n for (const [name, componentController] of Object.entries(allControllers)) {\n result[name] = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getParentAndHangingAxes(store, state, linkerMap, multipliesByMap);\n }\n\n return result as Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>;\n }\n\n /** Depends on chart type. */\n getMustBeConsumedAxes(state: State, optionsInfo: OptionsInfo): Set<ColumnOrAxisIdString> {\n return new Set();\n }\n\n /** Axes that go to the \"Drag to build the chart\" section.\n * If some of them is not moved to 'filters', 'tabBy' or 'facetBy' (dimension reducers) chart can't be rendered */\n markMustBeConsumedAxes(\n state: State,\n optionsInfo: OptionsInfo,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n parentAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>\n ) {\n // set of columns and axes that selected in dimension-reducing components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n };\n // Depends on chart type: axes from heatmap data column, to make visible what axes should be moved to x/y; hanging axes from X/Y scatterplot\n const mustBeConsumedAxes = this.getMustBeConsumedAxes(state, optionsInfo);\n for (const idStr of mustBeConsumedAxes) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (!this.allowHangingAxes) {\n // All 'hanging' axes must be moved to dimension reducers (for example, axes that exist in X/Y/Data source column, but not exist in Grouping)\n Object.entries(parentAndHangingAxes).forEach(([name, { hangingAxes }]) => {\n for (const idStr of hangingAxes.keys()) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n });\n }\n\n // Mark all non-homogenous axes\n for (const idStr of fullOptionsSet) {\n const info = optionsInfo.get(idStr);\n if (info?.kind === 'axis' && info.isNonHomogenous && !consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => readAnnotation(spec, Annotation.Graph.Axis.HighCardinality) === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n if ((s as SelectorStateFilter)?.selectedFilterValues?.length !== 1 && (s as SelectorStateFilter).type !== 'subset') {\n return consumed;\n }\n const info = optionsInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const { selectedSource } of state.components[inputName].selectorStates) {\n const info = optionsInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n }\n\n setColumnLabels(optionsSet: Set<ColumnOrAxisIdString>, optionsInfo: OptionsInfo) {\n const columnIds = [...optionsSet].filter((v) => optionsInfo.get(v)?.kind === 'column');\n const labelsMap = deriveLabels(columnIds, (id: string) => (optionsInfo.get(id) as ColumnData).spec);\n columnIds.forEach((id, idx) => {\n optionsInfo.get(id)!.label = labelsMap[idx].label;\n });\n\n }\n\n /** Calculates information for data-mapping interface: \n * options for every input (basket), \n * information for every option (label, value type, must be consumed etc),\n * information about full data-mapping state (ready to data loading and rendering or not, contains inconsistency or not) */\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n // Two type of linkers: regular ones and \"multiplying\"\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const optionsInfo: OptionsInfo = new Map();\n const fullOptionsSet = new Set<ColumnOrAxisIdString>();\n\n const parentAndHangingAxes = await this.getParentAndHangingAxesByInputs(store, state, linkerMap, multipliesByMap);\n\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n for (const [name, componentController] of Object.entries(allControllers) as ([keyof InputOptionsUnion<State>, ComponentController<State, SimpleComponents<State> | FilterComponents<State>>][])) {\n const componentGuide = await componentController.getOptions(\n store, state,\n linkerMap, multipliesByMap,\n parentAndHangingAxes,\n dataColumnPredicate,\n ignoredNamesSet, fixedSelectedSet\n );\n for (const item of componentGuide.options) {\n fullOptionsSet.add(item.value);\n }\n for (const v of componentGuide.optionsInfo) {\n optionsInfo.set(...v);\n }\n resultComponentsGuide[name] = componentGuide;\n }\n\n this.markMustBeConsumedAxes(state, optionsInfo, fullOptionsSet, parentAndHangingAxes);\n this.setColumnLabels(fullOptionsSet, optionsInfo);\n\n const consistent = this.isConsistent(state, resultComponentsGuide as ComponentsGuide<State['components']>);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => optionsInfo.get(sourceIdStr) ?? getDefaultInfo(sourceIdStr);\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n fullOptionsSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(state, consistent, fullOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = readAnnotation(info.spec, Annotation.DiscreteValues);\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({ value: v, label: v }));\n sortValues(values);\n return { values, overflow: false };\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters: PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const { data: dataValues, axesData } = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values: { value: string, label: string }[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n sortValues(values);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n return { values: [], overflow: false };\n }\n\n checkStateConsistency(\n state: State, componentsGuide: ComponentsGuide<State['components']>\n ): Map<keyof State['components'], Record<string, boolean>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n\n for (const component of Object.keys(allControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n allControllers[component].checkStateConsistency(state, componentsGuide[component].options)\n );\n }\n return result;\n }\n\n isConsistent(state: State, componentsGuide: ComponentsGuide<State['components']>): boolean {\n const consistency = this.checkStateConsistency(state, componentsGuide);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n state: State,\n consistent: boolean,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of fullOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n\n const requiredComponents: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n requiredComponents.push(componentName);\n }\n }\n\n return (\n requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n"],"names":["ControllerBase","simpleComponentControllers","filterComponentControllers","__publicField","inputName","state","selectorState","store","nextSelectorStates","currentStates","deletedStates","currentState","s","addedStates","nextState","o","getStateCopy","st","axis","key","value","sourceIdStr","getDefaultInfo","consumedSourcesSet","componentName","selectedSource","type","selectedFilterValues","linkerMap","multipliesByMap","allControllers","result","name","componentController","optionsInfo","fullOptionsSet","parentAndHangingAxes","markMustBeConsumed","id","option","mustBeConsumedAxes","idStr","hangingAxes","info","isHighCardinality","spec","readAnnotation","Annotation","consumedHighCardinalityAxes","_a","consumed","AxisId","optionsSet","columnIds","v","labelsMap","deriveLabels","idx","fixedIds","dataColumnPredicate","dataColumnPredicateDefault","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","createLinkerMap","createMultipliesByMap","componentGuide","item","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","values","a","b","discreteValuesStr","discreteValues","axisId","columnOrAxisIdFromString","parentSources","labelsColumnId","getColumnOrAxisValueLabelsId","filters","dataValues","axesData","axisKeys","i","searchInLabelsOrValue","response","columnId","C","componentsGuide","component","consistency","hasFreeDimensions","optionId","requiredComponents"],"mappings":"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","x_google_ignoreList":[0]}