@milaboratories/graph-maker 1.1.170 → 1.1.172

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 (80) hide show
  1. package/dist/GraphMaker/components/AesSettings/AesDataMappingContinuous.vue.js +5 -5
  2. package/dist/GraphMaker/components/AesSettings/AesDataMappingContinuous.vue.js.map +1 -1
  3. package/dist/GraphMaker/components/Chart.vue.d.ts.map +1 -1
  4. package/dist/GraphMaker/components/Chart.vue.js +44 -34
  5. package/dist/GraphMaker/components/Chart.vue.js.map +1 -1
  6. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.d.ts +0 -2
  7. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.d.ts.map +1 -1
  8. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.js +26 -33
  9. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.js.map +1 -1
  10. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.d.ts.map +1 -1
  11. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.js +14 -17
  12. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.js.map +1 -1
  13. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.d.ts.map +1 -1
  14. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.js +49 -50
  15. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.js.map +1 -1
  16. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts +5 -2
  17. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts.map +1 -1
  18. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js +46 -43
  19. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js.map +1 -1
  20. package/dist/GraphMaker/components/DragAndDrop/types.d.ts +6 -3
  21. package/dist/GraphMaker/components/DragAndDrop/types.d.ts.map +1 -1
  22. package/dist/GraphMaker/dataBindAes.d.ts.map +1 -1
  23. package/dist/GraphMaker/dataBindAes.js +90 -92
  24. package/dist/GraphMaker/dataBindAes.js.map +1 -1
  25. package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js +3 -2
  26. package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js.map +1 -1
  27. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.d.ts.map +1 -1
  28. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.js +40 -43
  29. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.js.map +1 -1
  30. package/dist/GraphMaker/forms/DataMappingForm/DiscreteForm.vue.js +9 -8
  31. package/dist/GraphMaker/forms/DataMappingForm/DiscreteForm.vue.js.map +1 -1
  32. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.d.ts.map +1 -1
  33. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.js +15 -18
  34. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.js.map +1 -1
  35. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot/Scatter.vue.js +8 -7
  36. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot/Scatter.vue.js.map +1 -1
  37. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot-umap/Scatter.vue.js +3 -2
  38. package/dist/GraphMaker/forms/LayersForm/Layer/scatterplot-umap/Scatter.vue.js.map +1 -1
  39. package/dist/GraphMaker/forms/StatisticsForm/DiscreteStatisticsForm.vue.js +3 -2
  40. package/dist/GraphMaker/forms/StatisticsForm/DiscreteStatisticsForm.vue.js.map +1 -1
  41. package/dist/GraphMaker/index.vue.d.ts.map +1 -1
  42. package/dist/GraphMaker/index.vue.js +49 -48
  43. package/dist/GraphMaker/index.vue.js.map +1 -1
  44. package/dist/GraphMaker/store.d.ts +3 -2
  45. package/dist/GraphMaker/store.d.ts.map +1 -1
  46. package/dist/GraphMaker/store.js +132 -116
  47. package/dist/GraphMaker/store.js.map +1 -1
  48. package/dist/GraphMaker/types.d.ts +8 -1
  49. package/dist/GraphMaker/types.d.ts.map +1 -1
  50. package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.js +3 -2
  51. package/dist/GraphMaker/utils/createChartSettingsForRender/composeBubbleSettings.js.map +1 -1
  52. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.js +3 -2
  53. package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.js.map +1 -1
  54. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js +3 -2
  55. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js.map +1 -1
  56. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.js +3 -2
  57. package/dist/GraphMaker/utils/createChartSettingsForRender/composeHistogramSettings.js.map +1 -1
  58. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.js +3 -2
  59. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.js.map +1 -1
  60. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.js +7 -6
  61. package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.js.map +1 -1
  62. package/dist/GraphMaker/utils/createChartSettingsForRender/getLayersDataFromForms.d.ts.map +1 -1
  63. package/dist/GraphMaker/utils/createChartSettingsForRender/getLayersDataFromForms.js +108 -101
  64. package/dist/GraphMaker/utils/createChartSettingsForRender/getLayersDataFromForms.js.map +1 -1
  65. package/dist/GraphMaker/utils/getUsedAesInMapping.js +15 -14
  66. package/dist/GraphMaker/utils/getUsedAesInMapping.js.map +1 -1
  67. package/dist/GraphMaker/utils/loadDefaultSources.js +16 -15
  68. package/dist/GraphMaker/utils/loadDefaultSources.js.map +1 -1
  69. package/dist/GraphMaker/utils/loadUniqueValuesToSave.d.ts +5 -3
  70. package/dist/GraphMaker/utils/loadUniqueValuesToSave.d.ts.map +1 -1
  71. package/dist/GraphMaker/utils/loadUniqueValuesToSave.js +66 -72
  72. package/dist/GraphMaker/utils/loadUniqueValuesToSave.js.map +1 -1
  73. package/dist/node_modules/@milaboratories/helpers/dist/utils.js.map +1 -1
  74. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js +2 -2
  75. package/dist/node_modules/@milaboratories/miplots4/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  76. package/dist/node_modules/@milaboratories/pl-model-common/dist/bmodel/code.js +6 -0
  77. package/dist/node_modules/@milaboratories/pl-model-common/dist/bmodel/code.js.map +1 -0
  78. package/dist/node_modules/@platforma-sdk/model/dist/render/util/label.js +1 -0
  79. package/dist/node_modules/@platforma-sdk/model/dist/render/util/label.js.map +1 -1
  80. package/package.json +3 -3
@@ -1,4 +1,5 @@
1
1
  import "../../node_modules/@milaboratories/pf-plots/dist/index.js";
2
+ import "../../node_modules/@milaboratories/pl-model-common/dist/bmodel/code.js";
2
3
  import "../../node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js";
3
4
  import { readAnnotation as A, Annotation as R } from "../../node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
4
5
  import "../../node_modules/@milaboratories/pl-model-common/dist/plid.js";
@@ -7,17 +8,17 @@ import "../../node_modules/@platforma-sdk/model/dist/render/util/label.js";
7
8
  import "../../node_modules/@milaboratories/pl-error-like/dist/error_like_shape.js";
8
9
  import { toRaw as V } from "vue";
9
10
  import { AxisId as S } from "../../node_modules/@milaboratories/pf-plots/dist/spec.js";
10
- function T(n, r) {
11
+ function T(n, l) {
11
12
  if (typeof n > "u")
12
13
  return !0;
13
14
  const c = Object.keys(n);
14
- return typeof r > "u" ? c.length === 0 : c.every((i) => r[i]);
15
+ return typeof l > "u" ? c.length === 0 : c.every((i) => l[i]);
15
16
  }
16
- function x(n, r, c, i) {
17
- return r && A(r, R.IsSubset) ? "subset" : i !== void 0 ? "range" : c !== void 0 || n === "Int" || n === "String" ? "equals" : "range";
17
+ function x(n, l, c, i) {
18
+ return l && A(l, R.IsSubset) ? "subset" : i !== void 0 ? "range" : c !== void 0 || n === "Int" || n === "String" ? "equals" : "range";
18
19
  }
19
- async function D(n, r, c = !0) {
20
- const i = [], h = r.filter(({ selectedSource: e }) => "kind" in e && e.kind === "PColumn"), w = r.filter(({ selectedSource: e }) => !("kind" in e && e.kind === "PColumn")), C = [];
20
+ async function J(n, l, c = !0) {
21
+ const i = [], h = l.filter(({ selectedSource: e }) => "kind" in e && e.kind === "PColumn"), w = l.filter(({ selectedSource: e }) => !("kind" in e && e.kind === "PColumn")), C = [];
21
22
  for (const { inputName: e, filterType: d, selectedSource: m, selectedFilterValues: o, selectedFilterRange: y } of h) {
22
23
  const { name: s, valueType: f, annotations: F, domain: p } = m, t = await n.pFrameProvider.findColumnBy(s, f, V(F), V(p)), g = e === "filters" || e === "tabBy" || e === "highlight";
23
24
  if (t) {
@@ -25,21 +26,21 @@ async function D(n, r, c = !0) {
25
26
  if (!g)
26
27
  i.push({ inputName: e, selectedSource: t.toCanonicalString() });
27
28
  else {
28
- const l = d ?? x(f, a, o, y), v = l === "equals" && typeof o > "u" ? [(await n.pFrameProvider.getColumnUniqueValues(t, 1)).values[0]] : o, u = { min: void 0, max: void 0, ...y };
29
+ const r = d ?? x(f, a, o, y), v = r === "equals" && typeof o > "u" ? [(await n.pFrameProvider.getColumnUniqueValues(t, 1)).values[0]] : o, u = { min: void 0, max: void 0, ...y };
29
30
  i.push({
30
31
  inputName: e,
31
- filterType: l,
32
+ filterType: r,
32
33
  selectedSource: t.toCanonicalString(),
33
34
  selectedFilterValues: v,
34
35
  selectedFilterRange: u
35
36
  });
36
37
  }
37
- C.push(...(a == null ? void 0 : a.axesSpec.map((l) => ({ spec: l, parentColumn: t }))) ?? []);
38
+ C.push(...(a == null ? void 0 : a.axesSpec.map((r) => ({ spec: r, parentColumn: t }))) ?? []);
38
39
  } else
39
40
  console.warn(`Not found column for default option: ${JSON.stringify({ inputName: e, selectedSource: m })}`);
40
41
  }
41
42
  for (const { inputName: e, selectedSource: d, filterType: m, selectedFilterValues: o, selectedFilterRange: y } of w) {
42
- const s = S.fromAxisSpec(d), f = s.toCanonicalString(), F = e === "filters" || e === "tabBy" || e === "highlight", p = F ? m ?? x(s.type, { annotations: d == null ? void 0 : d.annotations }) : void 0, t = C.find((l) => S.fromAxisSpec(l.spec).toCanonicalString() === f), g = F && p === "equals" && typeof o > "u" && (t != null && t.parentColumn) ? [(await n.pFrameProvider.getAxisUniqueValues(s, [t == null ? void 0 : t.parentColumn], 1)).values[0]] : o, a = { min: void 0, max: void 0, ...y };
43
+ const s = S.fromAxisSpec(d), f = s.toCanonicalString(), F = e === "filters" || e === "tabBy" || e === "highlight", p = F ? m ?? x(s.type, { annotations: d == null ? void 0 : d.annotations }) : void 0, t = C.find((r) => S.fromAxisSpec(r.spec).toCanonicalString() === f), g = F && p === "equals" && typeof o > "u" && (t != null && t.parentColumn) ? [(await n.pFrameProvider.getAxisUniqueValues(s, [t == null ? void 0 : t.parentColumn], 1)).values[0]] : o, a = { min: void 0, max: void 0, ...y };
43
44
  if (c || i.push({
44
45
  inputName: e,
45
46
  filterType: p,
@@ -55,13 +56,13 @@ async function D(n, r, c = !0) {
55
56
  selectedFilterRange: a
56
57
  });
57
58
  else {
58
- const { spec: l, parentColumn: v } = C.find((u) => s.name === u.spec.name && s.type === u.spec.type && T(s.domain, u.spec.domain)) ?? {};
59
- if (l) {
60
- const u = (e === "filters" || e === "tabBy") && typeof o > "u" ? [(await n.pFrameProvider.getAxisUniqueValues(S.fromAxisSpec(l), [v], 1)).values[0]] : o;
59
+ const { spec: r, parentColumn: v } = C.find((u) => s.name === u.spec.name && s.type === u.spec.type && T(s.domain, u.spec.domain)) ?? {};
60
+ if (r) {
61
+ const u = (e === "filters" || e === "tabBy") && typeof o > "u" ? [(await n.pFrameProvider.getAxisUniqueValues(S.fromAxisSpec(r), [v], 1)).values[0]] : o;
61
62
  i.push({
62
63
  inputName: e,
63
64
  filterType: p,
64
- selectedSource: S.fromAxisSpec(l).toCanonicalString(),
65
+ selectedSource: S.fromAxisSpec(r).toCanonicalString(),
65
66
  selectedFilterValues: u,
66
67
  selectedFilterRange: a
67
68
  });
@@ -71,6 +72,6 @@ async function D(n, r, c = !0) {
71
72
  return i;
72
73
  }
73
74
  export {
74
- D as loadDefaultSources
75
+ J as loadDefaultSources
75
76
  };
76
77
  //# sourceMappingURL=loadDefaultSources.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadDefaultSources.js","sources":["../../../src/GraphMaker/utils/loadDefaultSources.ts"],"sourcesContent":["import {\n AxisId,\n ChartType,\n ColumnId,\n DemoDataStore,\n InputNamesByChartType,\n SelectorStateFilter\n} from '@milaboratories/pf-plots';\nimport { PredefinedGraphOption } from '../types';\nimport { Annotation, AxisSpec, PColumnSpec, readAnnotation, ValueType } from '@platforma-sdk/model';\nimport { toRaw } from 'vue';\n\ntype LoadedDefaultOptions<T extends ChartType> = {\n inputName: InputNamesByChartType[T],\n selectedSource: string,\n filterType?: SelectorStateFilter['type']\n selectedFilterRange?: SelectorStateFilter['selectedFilterRange']\n selectedFilterValues?: SelectorStateFilter['selectedFilterValues']\n}\n\nfunction domainIsCompatible(domain?:Record<string, string>, otherDomain?:Record<string, string>):boolean {\n if (typeof domain === 'undefined') {\n return true;\n }\n const keys = Object.keys(domain);\n if (typeof otherDomain === 'undefined') {\n return keys.length === 0;\n }\n return keys.every((key) => otherDomain[key]);\n}\n\nfunction getDefaultFilterType(\n valueType:ValueType,\n spec: PColumnSpec | null,\n selectedFilterValues?: SelectorStateFilter['selectedFilterValues'],\n selectedFilterRange?: Partial<SelectorStateFilter['selectedFilterRange']>\n):SelectorStateFilter['type'] {\n if (spec && readAnnotation(spec, Annotation.IsSubset)) {\n return 'subset';\n }\n if (selectedFilterRange !== undefined) {\n return 'range';\n }\n if (selectedFilterValues !== undefined) {\n return 'equals';\n }\n if (valueType === 'Int' || valueType === 'String') {\n return 'equals';\n }\n return 'range';\n}\nexport async function loadDefaultSources (\n dataStore:DemoDataStore,\n defaultOptions:PredefinedGraphOption<ChartType>[],\n considerAxisDomains = true,\n):Promise<LoadedDefaultOptions<ChartType>[]> {\n const result:LoadedDefaultOptions<ChartType>[] = []\n const defaultColumnStates = defaultOptions.filter(({ selectedSource }) => 'kind' in selectedSource && selectedSource.kind === 'PColumn');\n const defaultAxisStates = defaultOptions.filter(({ selectedSource }) => !('kind' in selectedSource && selectedSource.kind === 'PColumn'));\n\n const allowedAxisSpecs = [] as {spec: AxisSpec, parentColumn:ColumnId}[]; // if default options contain axes - they should be in other default columns\n\n for (const { inputName, filterType, selectedSource, selectedFilterValues, selectedFilterRange } of defaultColumnStates) {\n const { name, valueType, annotations, domain } = selectedSource as PColumnSpec;\n const columnId = await dataStore.pFrameProvider.findColumnBy(name, valueType, toRaw(annotations), toRaw(domain));\n const isFilter = inputName === 'filters' || inputName === 'tabBy' || inputName === 'highlight';\n if (columnId) {\n const spec = await dataStore.pFrameProvider.getColumnSpecById(columnId);\n if (!isFilter) {\n result.push({ inputName, selectedSource: columnId.toCanonicalString()});\n } else {\n const defaultFilterType = filterType ?? getDefaultFilterType(valueType, spec, selectedFilterValues, selectedFilterRange);\n const defaultSelectedFilterValue = defaultFilterType === 'equals' && typeof selectedFilterValues === 'undefined'\n ? [(await dataStore.pFrameProvider.getColumnUniqueValues(columnId, 1)).values[0]]\n : selectedFilterValues;\n const defaultFilterRange = {min: undefined, max: undefined, ...selectedFilterRange};\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: columnId.toCanonicalString(),\n selectedFilterValues: defaultSelectedFilterValue,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n }\n\n allowedAxisSpecs.push(...spec?.axesSpec.map((spec) => ({spec, parentColumn:columnId})) ?? []);\n } else {\n console.warn(`Not found column for default option: ${JSON.stringify({inputName, selectedSource})}`)\n }\n }\n for (const { inputName, selectedSource, filterType, selectedFilterValues, selectedFilterRange } of defaultAxisStates) {\n const axisId = AxisId.fromAxisSpec(selectedSource as AxisSpec);\n const axisSourceStr = axisId.toCanonicalString();\n const isFilter = inputName === 'filters' || inputName === 'tabBy' || inputName === 'highlight';\n const defaultFilterType = isFilter ? filterType ?? getDefaultFilterType(axisId.type, {annotations: selectedSource?.annotations} as PColumnSpec) : undefined;\n\n const columnWithExistingAxis = allowedAxisSpecs.find((el) => AxisId.fromAxisSpec(el.spec).toCanonicalString() === axisSourceStr) ;\n const defaultSelectedFilterValues = isFilter && defaultFilterType === 'equals' && typeof selectedFilterValues === 'undefined' && columnWithExistingAxis?.parentColumn\n ? [(await dataStore.pFrameProvider.getAxisUniqueValues(axisId, [columnWithExistingAxis?.parentColumn], 1)).values[0]]\n : selectedFilterValues\n const defaultFilterRange = {min: undefined, max: undefined, ...selectedFilterRange};\n\n if (!considerAxisDomains) {\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: axisSourceStr,\n selectedFilterValues: defaultSelectedFilterValues,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n }\n if (columnWithExistingAxis) {\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: axisSourceStr,\n selectedFilterValues: defaultSelectedFilterValues,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n } else {\n const { spec: allowedCompatibleAxisSpec, parentColumn } = allowedAxisSpecs.find((el) => {\n return axisId.name === el.spec.name && axisId.type === el.spec.type && domainIsCompatible(axisId.domain, el.spec.domain);\n }) ?? {};\n if (allowedCompatibleAxisSpec) {\n const defaultSelectedFilterValue = (inputName === 'filters' || inputName === 'tabBy') && typeof selectedFilterValues === 'undefined'\n ? [(await dataStore.pFrameProvider.getAxisUniqueValues(AxisId.fromAxisSpec(allowedCompatibleAxisSpec), [parentColumn as ColumnId], 1)).values[0]]\n : selectedFilterValues\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: AxisId.fromAxisSpec(allowedCompatibleAxisSpec).toCanonicalString(),\n selectedFilterValues: defaultSelectedFilterValue,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n }\n }\n }\n\n return result;\n}"],"names":["domainIsCompatible","domain","otherDomain","keys","key","getDefaultFilterType","valueType","spec","selectedFilterValues","selectedFilterRange","readAnnotation","Annotation","loadDefaultSources","dataStore","defaultOptions","considerAxisDomains","result","defaultColumnStates","selectedSource","defaultAxisStates","allowedAxisSpecs","inputName","filterType","name","annotations","columnId","toRaw","isFilter","defaultFilterType","defaultSelectedFilterValue","defaultFilterRange","axisId","AxisId","axisSourceStr","columnWithExistingAxis","el","defaultSelectedFilterValues","allowedCompatibleAxisSpec","parentColumn"],"mappings":"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"}
1
+ {"version":3,"file":"loadDefaultSources.js","sources":["../../../src/GraphMaker/utils/loadDefaultSources.ts"],"sourcesContent":["import {\n AxisId,\n ChartType,\n ColumnId,\n DemoDataStore,\n InputNamesByChartType,\n SelectorStateFilter\n} from '@milaboratories/pf-plots';\nimport { PredefinedGraphOption } from '../types';\nimport { Annotation, AxisSpec, PColumnSpec, readAnnotation, ValueType } from '@platforma-sdk/model';\nimport { toRaw } from 'vue';\n\ntype LoadedDefaultOptions<T extends ChartType> = {\n inputName: InputNamesByChartType[T],\n selectedSource: string,\n filterType?: SelectorStateFilter['type']\n selectedFilterRange?: SelectorStateFilter['selectedFilterRange']\n selectedFilterValues?: SelectorStateFilter['selectedFilterValues']\n}\n\nfunction domainIsCompatible(domain?:Record<string, string>, otherDomain?:Record<string, string>):boolean {\n if (typeof domain === 'undefined') {\n return true;\n }\n const keys = Object.keys(domain);\n if (typeof otherDomain === 'undefined') {\n return keys.length === 0;\n }\n return keys.every((key) => otherDomain[key]);\n}\n\nfunction getDefaultFilterType(\n valueType:ValueType,\n spec: PColumnSpec | null,\n selectedFilterValues?: SelectorStateFilter['selectedFilterValues'],\n selectedFilterRange?: Partial<SelectorStateFilter['selectedFilterRange']>\n):SelectorStateFilter['type'] {\n if (spec && readAnnotation(spec, Annotation.IsSubset)) {\n return 'subset';\n }\n if (selectedFilterRange !== undefined) {\n return 'range';\n }\n if (selectedFilterValues !== undefined) {\n return 'equals';\n }\n if (valueType === 'Int' || valueType === 'String') {\n return 'equals';\n }\n return 'range';\n}\nexport async function loadDefaultSources (\n dataStore:DemoDataStore,\n defaultOptions:PredefinedGraphOption<ChartType>[],\n considerAxisDomains = true,\n):Promise<LoadedDefaultOptions<ChartType>[]> {\n const result:LoadedDefaultOptions<ChartType>[] = []\n const defaultColumnStates = defaultOptions.filter(({ selectedSource }) => 'kind' in selectedSource && selectedSource.kind === 'PColumn');\n const defaultAxisStates = defaultOptions.filter(({ selectedSource }) => !('kind' in selectedSource && selectedSource.kind === 'PColumn'));\n\n const allowedAxisSpecs = [] as {spec: AxisSpec, parentColumn:ColumnId}[]; // if default options contain axes - they should be in other default columns\n\n for (const { inputName, filterType, selectedSource, selectedFilterValues, selectedFilterRange } of defaultColumnStates) {\n const { name, valueType, annotations, domain } = selectedSource as PColumnSpec;\n const columnId = await dataStore.pFrameProvider.findColumnBy(name, valueType, toRaw(annotations), toRaw(domain));\n const isFilter = inputName === 'filters' || inputName === 'tabBy' || inputName === 'highlight';\n if (columnId) {\n const spec = await dataStore.pFrameProvider.getColumnSpecById(columnId);\n if (!isFilter) {\n result.push({ inputName, selectedSource: columnId.toCanonicalString()});\n } else {\n const defaultFilterType = filterType ?? getDefaultFilterType(valueType, spec, selectedFilterValues, selectedFilterRange);\n const defaultSelectedFilterValue = defaultFilterType === 'equals' && typeof selectedFilterValues === 'undefined'\n ? [(await dataStore.pFrameProvider.getColumnUniqueValues(columnId, 1)).values[0]]\n : selectedFilterValues;\n const defaultFilterRange = {min: undefined, max: undefined, ...selectedFilterRange};\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: columnId.toCanonicalString(),\n selectedFilterValues: defaultSelectedFilterValue,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n }\n\n allowedAxisSpecs.push(...spec?.axesSpec.map((spec) => ({spec, parentColumn:columnId})) ?? []);\n } else {\n console.warn(`Not found column for default option: ${JSON.stringify({inputName, selectedSource})}`)\n }\n }\n for (const { inputName, selectedSource, filterType, selectedFilterValues, selectedFilterRange } of defaultAxisStates) {\n const axisId = AxisId.fromAxisSpec(selectedSource as AxisSpec);\n const axisSourceStr = axisId.toCanonicalString();\n const isFilter = inputName === 'filters' || inputName === 'tabBy' || inputName === 'highlight';\n const defaultFilterType = isFilter ? filterType ?? getDefaultFilterType(axisId.type, {annotations: selectedSource?.annotations} as PColumnSpec) : undefined;\n\n const columnWithExistingAxis = allowedAxisSpecs.find((el) => AxisId.fromAxisSpec(el.spec).toCanonicalString() === axisSourceStr) ;\n const defaultSelectedFilterValues = isFilter && defaultFilterType === 'equals' && typeof selectedFilterValues === 'undefined' && columnWithExistingAxis?.parentColumn\n ? [(await dataStore.pFrameProvider.getAxisUniqueValues(axisId, [columnWithExistingAxis?.parentColumn], 1)).values[0]]\n : selectedFilterValues\n const defaultFilterRange = {min: undefined, max: undefined, ...selectedFilterRange};\n\n if (!considerAxisDomains) {\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: axisSourceStr,\n selectedFilterValues: defaultSelectedFilterValues,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n }\n if (columnWithExistingAxis) {\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: axisSourceStr,\n selectedFilterValues: defaultSelectedFilterValues,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n } else {\n const { spec: allowedCompatibleAxisSpec, parentColumn } = allowedAxisSpecs.find((el) => {\n return axisId.name === el.spec.name && axisId.type === el.spec.type && domainIsCompatible(axisId.domain, el.spec.domain);\n }) ?? {};\n if (allowedCompatibleAxisSpec) {\n const defaultSelectedFilterValue = (inputName === 'filters' || inputName === 'tabBy') && typeof selectedFilterValues === 'undefined'\n ? [(await dataStore.pFrameProvider.getAxisUniqueValues(AxisId.fromAxisSpec(allowedCompatibleAxisSpec), [parentColumn as ColumnId], 1)).values[0]]\n : selectedFilterValues\n result.push({\n inputName,\n filterType: defaultFilterType,\n selectedSource: AxisId.fromAxisSpec(allowedCompatibleAxisSpec).toCanonicalString(),\n selectedFilterValues: defaultSelectedFilterValue,\n selectedFilterRange: defaultFilterRange as SelectorStateFilter['selectedFilterRange'],\n });\n }\n }\n }\n\n return result;\n}"],"names":["domainIsCompatible","domain","otherDomain","keys","key","getDefaultFilterType","valueType","spec","selectedFilterValues","selectedFilterRange","readAnnotation","Annotation","loadDefaultSources","dataStore","defaultOptions","considerAxisDomains","result","defaultColumnStates","selectedSource","defaultAxisStates","allowedAxisSpecs","inputName","filterType","name","annotations","columnId","toRaw","isFilter","defaultFilterType","defaultSelectedFilterValue","defaultFilterRange","axisId","AxisId","axisSourceStr","columnWithExistingAxis","el","defaultSelectedFilterValues","allowedCompatibleAxisSpec","parentColumn"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
- import { UniqueValuesBySourceMap } from '../types';
1
+ import { FilterSuggestionsBySourceMap, UniqueValuesBySourceMap } from '../types';
2
2
  import { Controller, DemoDataStore, InputGuide, InputState, PlotDataAndSettings } from '@milaboratories/pf-plots';
3
3
  import { ListOption } from '@platforma-sdk/ui-vue';
4
- export declare function getUniqueValuesFromReadyChartData(chartData: PlotDataAndSettings, inputGuide: InputGuide<InputState>, controller: Controller<InputState>, dataStore: DemoDataStore, previousUniqueValues: UniqueValuesBySourceMap): Promise<UniqueValuesBySourceMap>;
5
- export declare function loadUniqueValuesToSave(optionsState: InputState['components'], inputGuide: InputGuide<InputState>, controller: Controller<InputState>, dataStore: DemoDataStore, previousUniqueValues: UniqueValuesBySourceMap): Promise<UniqueValuesBySourceMap>;
4
+ export declare function getUniqueValuesFromReadyChartData(chartData: PlotDataAndSettings, inputGuide: InputGuide<InputState>, optionsState: InputState['components'], controller: Controller<InputState>, dataStore: DemoDataStore, previousFilterSuggestions: FilterSuggestionsBySourceMap): Promise<{
5
+ uniqueValues: UniqueValuesBySourceMap;
6
+ filterSuggestions: FilterSuggestionsBySourceMap;
7
+ }>;
6
8
  export declare function loadFilterLabelsForTitle(optionsState: InputState['components'], inputGuide: InputGuide<InputState>, controller: Controller<InputState>, dataStore: DemoDataStore): Promise<Record<string, ListOption>>;
7
9
  //# sourceMappingURL=loadUniqueValuesToSave.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadUniqueValuesToSave.d.ts","sourceRoot":"","sources":["../../../src/GraphMaker/utils/loadUniqueValuesToSave.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAoB,MAAM,UAAU,CAAC;AACrE,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACV,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAqBnD,wBAAsB,iCAAiC,CACrD,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,SAAS,EAAE,aAAa,EACxB,oBAAoB,EAAE,uBAAuB,GAC5C,OAAO,CAAC,uBAAuB,CAAC,CA+GlC;AACD,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EACtC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,SAAS,EAAE,aAAa,EACxB,oBAAoB,EAAE,uBAAuB,GAC5C,OAAO,CAAC,uBAAuB,CAAC,CAgDlC;AAED,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EACtC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAyBrC"}
1
+ {"version":3,"file":"loadUniqueValuesToSave.d.ts","sourceRoot":"","sources":["../../../src/GraphMaker/utils/loadUniqueValuesToSave.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAEL,UAAU,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACV,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA+CnD,wBAAsB,iCAAiC,CACrD,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EACtC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,SAAS,EAAE,aAAa,EACxB,yBAAyB,EAAE,4BAA4B,GACtD,OAAO,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAC;IAAC,iBAAiB,EAAE,4BAA4B,CAAA;CAAC,CAAC,CAgFnG;AAED,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,EACtC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAyBrC"}
@@ -1,91 +1,85 @@
1
- const v = ["primaryGrouping", "secondaryGrouping"], g = ["grouping"], T = ["x", "y"], I = ["grouping"], y = [
1
+ const g = ["primaryGrouping", "secondaryGrouping"], E = ["grouping"], A = ["x", "y"], T = ["grouping"], p = [
2
2
  "nodeColor",
3
3
  "nodeShape",
4
4
  "lineColor",
5
5
  "heatmapAnnotation"
6
6
  // dendro
7
- ], L = (o) => o.sort((l, S) => l.label.localeCompare(S.label, "en", { numeric: !0 }));
8
- async function R(o, l, S, E, f) {
9
- const u = {};
10
- function i(s, e) {
11
- const t = o.data.byColumns.values[s], n = e ? o.data.byColumns.values[e] : null, p = /* @__PURE__ */ new Set(), _ = [];
12
- for (let a = 0; a < t.length; a++) {
13
- const r = String(t[a]);
14
- if (p.has(r))
15
- continue;
16
- if (p.size === 100) {
17
- u[s] = null;
18
- return;
19
- }
20
- p.add(r);
21
- const A = n ? String(n[a]) : r;
22
- _.push({ value: r, label: A });
7
+ ], I = ["filters", "highlight", "tabBy"], v = (t) => t.sort((u, c) => u.label.localeCompare(c.label, "en", { numeric: !0 }));
8
+ function _(t, u, c, r) {
9
+ const a = t.data.byColumns.values[c], f = r ? t.data.byColumns.values[r] : null, l = /* @__PURE__ */ new Set(), n = [];
10
+ for (let o = 0; o < a.length; o++) {
11
+ const s = String(a[o]);
12
+ if (l.has(s))
13
+ continue;
14
+ if (l.size === 100) {
15
+ u[c] = null;
16
+ return;
23
17
  }
24
- L(_), u[s] = {
25
- list: _.map((a) => a.value),
26
- labels: _.reduce((a, r) => (a[r.value] = r.label, a), {}),
27
- options: _
28
- };
18
+ l.add(s);
19
+ const e = f ? String(f[o]) : s;
20
+ n.push({ value: s, label: e });
29
21
  }
30
- o.settings.type === "discrete" && v.forEach((s) => {
31
- const e = o.settings[s];
22
+ v(n), u[c] = {
23
+ list: n.map((o) => o.value),
24
+ labels: n.reduce((o, s) => (o[s.value] = s.label, o), {}),
25
+ options: n
26
+ };
27
+ }
28
+ async function y(t, u, c, r, a, f) {
29
+ const l = {};
30
+ t.settings.type === "discrete" && g.forEach((s) => {
31
+ const e = t.settings[s];
32
32
  if (e) {
33
- const { columnName: t } = e;
34
- i(t.value, t.valueLabels);
33
+ const { columnName: i } = e;
34
+ _(t, l, i.value, i.valueLabels);
35
35
  }
36
- }), (o.settings.type === "scatterplot" || o.settings.type === "scatterplot-umap") && (T.forEach((s) => {
37
- const e = o.settings[s];
38
- e && l.getSourceInfo(e.value).type === "String" && i(e.value, e.valueLabels);
39
- }), g.forEach((s) => {
40
- const e = o.settings[s];
41
- e == null || e.forEach(({ columnName: t }) => {
42
- const n = l.getSourceInfo(t.value).type;
43
- (n === "String" || n === "Int" || n === "Long") && i(t.value, t.valueLabels);
36
+ }), (t.settings.type === "scatterplot" || t.settings.type === "scatterplot-umap") && (A.forEach((s) => {
37
+ const e = t.settings[s];
38
+ e && u.getSourceInfo(e.value).type === "String" && _(t, l, e.value, e.valueLabels);
39
+ }), E.forEach((s) => {
40
+ const e = t.settings[s];
41
+ e == null || e.forEach(({ columnName: i }) => {
42
+ const S = u.getSourceInfo(i.value).type;
43
+ (S === "String" || S === "Int" || S === "Long") && _(t, l, i.value, i.valueLabels);
44
44
  });
45
- })), o.settings.type === "histogram" && I.forEach((s) => {
46
- const e = o.settings[s];
47
- e && i(e.value, e.valueLabels);
48
- }), o.settings.type === "dendro" && y.forEach((s) => {
49
- const e = o.settings[s];
50
- e && i(e.value, e.valueLabels);
45
+ })), t.settings.type === "histogram" && T.forEach((s) => {
46
+ const e = t.settings[s];
47
+ e && _(t, l, e.value, e.valueLabels);
48
+ }), t.settings.type === "dendro" && p.forEach((s) => {
49
+ const e = t.settings[s];
50
+ e && _(t, l, e.value, e.valueLabels);
51
51
  });
52
- const c = [];
53
- [...l.fullOptionsSet].forEach((s) => {
54
- const e = l.getSourceInfo(s);
55
- e.kind === "axis" && e.isNonHomogenous && c.push(s);
52
+ const n = { ...f }, o = [];
53
+ [...u.fullOptionsSet].forEach((s) => {
54
+ const e = u.getSourceInfo(s);
55
+ e.kind === "axis" && e.isNonHomogenous && o.push(s);
56
+ }), I.forEach((s) => {
57
+ const e = c[s];
58
+ if (e)
59
+ for (const { selectedSource: i, type: S } of e.selectorStates)
60
+ ((s === "filters" || s === "highlight") && S === "equals" || s === "tabBy") && o.push(i);
56
61
  });
57
- for (const s of c)
58
- if (!u[s]) {
59
- if (f[s] && !u[s])
60
- u[s] = f[s];
61
- else if (E) {
62
- const e = await S.getUniqueSourceValuesWithLabels(E, l, s, 100);
63
- e.overflow ? u[s] = null : u[s] = {
64
- list: e.values.map((t) => t.value),
65
- options: e.values,
66
- labels: e.values.reduce((t, n) => (t[n.value] = n.label, t), {})
67
- };
68
- }
69
- }
70
- return u;
62
+ for (const s of o)
63
+ n[s] || a && (n[s] = await r.getUniqueSourceValuesWithLabels(a, u, s, 100));
64
+ return { uniqueValues: l, filterSuggestions: n };
71
65
  }
72
- async function U(o, l, S, E) {
73
- const f = [];
74
- ["filters", "tabBy"].forEach((c) => {
75
- const s = o[c];
76
- if (s)
77
- for (const { selectedSource: e, selectedFilterValues: t, type: n } of s.selectorStates)
78
- c === "filters" && n === "equals" && t ? f.push([e, t]) : t && f.push([e, t]);
66
+ async function L(t, u, c, r) {
67
+ const a = [];
68
+ ["filters", "tabBy"].forEach((n) => {
69
+ const o = t[n];
70
+ if (o)
71
+ for (const { selectedSource: s, selectedFilterValues: e, type: i } of o.selectorStates)
72
+ n === "filters" && i === "equals" && e ? a.push([s, e]) : e && a.push([s, e]);
79
73
  });
80
- const i = {};
81
- for (const [c, s] of f)
82
- (await Promise.all(s.map((t) => S.getUniqueSourceValuesWithLabels(E, l, c, 1, void 0, t)))).forEach((t) => {
83
- t.values.length === 1 && (i[c] = t.values[0]);
74
+ const l = {};
75
+ for (const [n, o] of a)
76
+ (await Promise.all(o.map((e) => c.getUniqueSourceValuesWithLabels(r, u, n, 1, void 0, e)))).forEach((e) => {
77
+ e.values.length === 1 && (l[n] = e.values[0]);
84
78
  });
85
- return i;
79
+ return l;
86
80
  }
87
81
  export {
88
- R as getUniqueValuesFromReadyChartData,
89
- U as loadFilterLabelsForTitle
82
+ y as getUniqueValuesFromReadyChartData,
83
+ L as loadFilterLabelsForTitle
90
84
  };
91
85
  //# sourceMappingURL=loadUniqueValuesToSave.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadUniqueValuesToSave.js","sources":["../../../src/GraphMaker/utils/loadUniqueValuesToSave.ts"],"sourcesContent":["import { UniqueValuesBySourceMap, UniqueValuesData } from '../types';\nimport {\n Controller,\n DemoDataStore,\n InputGuide,\n InputState,\n PlotDataAndSettings,\n SelectorStateFilter\n} from '@milaboratories/pf-plots';\nimport { ListOption } from '@platforma-sdk/ui-vue';\nimport { DendroSettings, DiscreteSettings, HistogramSettings, ScatterplotSettings } from '@milaboratories/miplots4';\n\nconst INPUTS_REQUESTING_UNIQUE_VALUES = [\n 'primaryGrouping', 'secondaryGrouping', // discrete charts\n 'grouping', 'shape', 'x', 'y', // scatterplot\n 'nodeColor', 'nodeShape', 'lineColor', 'heatmapAnnotation', // dendro\n 'filters', 'highlight', 'tabBy' // all\n] as ((keyof InputState['components'])[]);\nconst SAVED_UNIQUE_VALUES_LIMIT = 100;\n\nconst SAVED_IN_CHART_DATA_DISCRETE_GROUPINGS = ['primaryGrouping', 'secondaryGrouping'];\nconst SAVED_IN_CHART_DATA_SCATTERPLOT_GROUPINGS = ['grouping'];\nconst SAVED_IN_CHART_DATA_SCATTERPLOT_XY = ['x', 'y'];\nconst SAVED_IN_CHART_DATA_HISTOGRAM_GROUPING = ['grouping'];\nconst SAVED_IN_CHART_DATA_DENDRO_GROUPING = [\n 'nodeColor', 'nodeShape', 'lineColor', 'heatmapAnnotation' // dendro\n];\n\nconst sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n\nexport async function getUniqueValuesFromReadyChartData(\n chartData: PlotDataAndSettings,\n inputGuide: InputGuide<InputState>,\n controller: Controller<InputState>,\n dataStore: DemoDataStore,\n previousUniqueValues: UniqueValuesBySourceMap\n): Promise<UniqueValuesBySourceMap> {\n const resultMap: UniqueValuesBySourceMap = {};\n function addUniqueData(sourceId: string, labelId?: string) {\n const data = chartData!.data.byColumns.values[sourceId];\n const dataLabels = labelId ? chartData!.data.byColumns.values[labelId] : null;\n\n const resultSet = new Set();\n const result: { value: string, label: string }[] = [];\n for (let i = 0; i < data.length; i++) {\n const v = String(data[i]);\n if (resultSet.has(v)) {\n continue;\n }\n if (resultSet.size === SAVED_UNIQUE_VALUES_LIMIT) {\n resultMap[sourceId] = null;\n return;\n }\n resultSet.add(v);\n const label = dataLabels ? String(dataLabels[i]) : v;\n result.push({ value: v, label });\n }\n sortValues(result);\n resultMap[sourceId] = {\n list: result.map((el) => el.value),\n labels: result.reduce((res, el) => {\n res[el.value] = el.label;\n return res;\n }, {} as Record<string, string>),\n options: result\n };\n }\n if (chartData.settings.type === 'discrete') {\n SAVED_IN_CHART_DATA_DISCRETE_GROUPINGS.forEach((inputName: string) => {\n const savedData = chartData.settings[inputName] as unknown as DiscreteSettings['primaryGrouping'];\n if (savedData) {\n const { columnName } = savedData;\n addUniqueData(columnName.value, columnName.valueLabels)\n }\n });\n }\n if (chartData.settings.type === 'scatterplot' || chartData.settings.type === 'scatterplot-umap') {\n SAVED_IN_CHART_DATA_SCATTERPLOT_XY.forEach((inputName: string) => {\n const columnName = chartData.settings[inputName] as unknown as ScatterplotSettings['x'];\n if (columnName) {\n const valueType = inputGuide.getSourceInfo(columnName.value).type;\n if (valueType === 'String') {\n addUniqueData(columnName.value, columnName.valueLabels);\n }\n }\n });\n SAVED_IN_CHART_DATA_SCATTERPLOT_GROUPINGS.forEach((inputName: string) => {\n const savedInGrouping = chartData.settings[inputName] as unknown as ScatterplotSettings['grouping'];\n savedInGrouping?.forEach(({ columnName }) => {\n const valueType = inputGuide.getSourceInfo(columnName.value).type;\n if (valueType === 'String' || valueType === 'Int' || valueType === 'Long') {\n addUniqueData(columnName.value, columnName.valueLabels);\n }\n });\n });\n }\n\n if (chartData.settings.type === 'histogram') {\n SAVED_IN_CHART_DATA_HISTOGRAM_GROUPING.forEach((inputName: string) => {\n const savedByInputName = chartData.settings[inputName] as unknown as HistogramSettings['grouping'];\n if (savedByInputName) {\n addUniqueData(savedByInputName.value, savedByInputName.valueLabels);\n }\n });\n }\n\n if (chartData.settings.type === 'dendro') {\n SAVED_IN_CHART_DATA_DENDRO_GROUPING.forEach((inputName: string) => {\n const savedByInputName = chartData.settings[inputName] as unknown as DendroSettings['heatmapAnnotation'];\n if (savedByInputName) {\n addUniqueData(savedByInputName.value, savedByInputName.valueLabels);\n }\n });\n }\n\n // sources for loading\n const selectedSources: string[] = [];\n ([...inputGuide.fullOptionsSet]).forEach(id => {\n const info = inputGuide.getSourceInfo(id);\n if (info.kind === 'axis' && info.isNonHomogenous) {\n selectedSources.push(id);\n }\n });\n\n for (const source of selectedSources) {\n if (resultMap[source]) {\n continue;\n }\n if (previousUniqueValues[source] && !resultMap[source]) {\n resultMap[source] = previousUniqueValues[source];\n } else if (dataStore) {\n const uniqueValuesResponse = await controller.getUniqueSourceValuesWithLabels(dataStore, inputGuide, source, SAVED_UNIQUE_VALUES_LIMIT);\n if (uniqueValuesResponse.overflow) {\n resultMap[source] = null;\n } else {\n resultMap[source] = {\n list: uniqueValuesResponse.values.map((el) => el.value),\n options: uniqueValuesResponse.values,\n labels: uniqueValuesResponse.values.reduce((res: Record<string, string>, el) => {\n res[el.value] = el.label;\n return res;\n }, {})\n } as UniqueValuesData;\n }\n }\n }\n return resultMap;\n}\nexport async function loadUniqueValuesToSave(\n optionsState: InputState['components'],\n inputGuide: InputGuide<InputState>,\n controller: Controller<InputState>,\n dataStore: DemoDataStore,\n previousUniqueValues: UniqueValuesBySourceMap // save null for too long lists of unique values\n): Promise<UniqueValuesBySourceMap> {\n const selectedSources: string[] = [];\n INPUTS_REQUESTING_UNIQUE_VALUES.forEach(inputName => {\n const componentState = optionsState[inputName];\n if (componentState) {\n for (const { selectedSource } of componentState.selectorStates) {\n const info = inputGuide.getSourceInfo(selectedSource);\n if (inputName === 'filters' || inputName === 'highlight') {\n if (info.type === 'String' || info.type === 'Int' || info.type === 'Long') {\n selectedSources.push(selectedSource);\n }\n } else if (inputName === 'grouping' || inputName === 'x' || inputName === 'y') {\n if (info.type === 'String') {\n selectedSources.push(selectedSource);\n }\n } else {\n selectedSources.push(selectedSource);\n }\n }\n }\n });\n ([...inputGuide.fullOptionsSet]).forEach(id => {\n const info = inputGuide.getSourceInfo(id);\n if (info.kind === 'axis' && info.isNonHomogenous) {\n selectedSources.push(id);\n }\n });\n const nextUniqueValuesData: UniqueValuesBySourceMap = {};\n for (const source of selectedSources) {\n if (previousUniqueValues[source]) {\n nextUniqueValuesData[source] = previousUniqueValues[source];\n } else if (dataStore) {\n const uniqueValuesResponse = await controller.getUniqueSourceValuesWithLabels(dataStore, inputGuide, source, SAVED_UNIQUE_VALUES_LIMIT);\n if (uniqueValuesResponse.overflow) {\n nextUniqueValuesData[source] = null;\n } else {\n nextUniqueValuesData[source] = {\n list: uniqueValuesResponse.values.map((el) => el.value),\n options: uniqueValuesResponse.values,\n labels: uniqueValuesResponse.values.reduce((res: Record<string, string>, el) => {\n res[el.value] = el.label;\n return res;\n }, {})\n } as UniqueValuesData;\n }\n }\n }\n return nextUniqueValuesData;\n}\n\nexport async function loadFilterLabelsForTitle(\n optionsState: InputState['components'],\n inputGuide: InputGuide<InputState>,\n controller: Controller<InputState>,\n dataStore: DemoDataStore,\n): Promise<Record<string, ListOption>> {\n const selected: [string, string[]][] = [];\n const INPUTS_REQUESTING_LABELS = ['filters', 'tabBy'] as ((keyof InputState['components'])[]);\n INPUTS_REQUESTING_LABELS.forEach(inputName => {\n const componentState = optionsState[inputName];\n if (componentState) {\n for (const { selectedSource, selectedFilterValues, type } of componentState.selectorStates as SelectorStateFilter[]) {\n if (inputName === 'filters' && type === 'equals' && selectedFilterValues) {\n selected.push([selectedSource, selectedFilterValues]);\n } else if (selectedFilterValues) {\n selected.push([selectedSource, selectedFilterValues]);\n }\n }\n }\n });\n const result: Record<string, ListOption> = {};\n for (const [source, selectedValues] of selected) {\n const uniqueValuesResponses = await Promise.all(selectedValues.map((v) => controller.getUniqueSourceValuesWithLabels(dataStore, inputGuide, source, 1, undefined, v)))\n uniqueValuesResponses.forEach(response => {\n if (response.values.length === 1) {\n result[source] = response.values[0];\n }\n });\n }\n return result;\n}"],"names":["SAVED_IN_CHART_DATA_DISCRETE_GROUPINGS","SAVED_IN_CHART_DATA_SCATTERPLOT_GROUPINGS","SAVED_IN_CHART_DATA_SCATTERPLOT_XY","SAVED_IN_CHART_DATA_HISTOGRAM_GROUPING","SAVED_IN_CHART_DATA_DENDRO_GROUPING","sortValues","values","a","b","getUniqueValuesFromReadyChartData","chartData","inputGuide","controller","dataStore","previousUniqueValues","resultMap","addUniqueData","sourceId","labelId","data","dataLabels","resultSet","result","i","v","label","el","res","inputName","savedData","columnName","savedInGrouping","valueType","savedByInputName","selectedSources","id","info","source","uniqueValuesResponse","loadFilterLabelsForTitle","optionsState","selected","componentState","selectedSource","selectedFilterValues","type","selectedValues","response"],"mappings":"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"}
1
+ {"version":3,"file":"loadUniqueValuesToSave.js","sources":["../../../src/GraphMaker/utils/loadUniqueValuesToSave.ts"],"sourcesContent":["import { FilterSuggestionsBySourceMap, UniqueValuesBySourceMap } from '../types';\nimport {\n ComponentStateFilter,\n Controller,\n DemoDataStore,\n InputGuide,\n InputState,\n PlotDataAndSettings,\n SelectorStateFilter\n} from '@milaboratories/pf-plots';\nimport { ListOption } from '@platforma-sdk/ui-vue';\nimport { DendroSettings, DiscreteSettings, HistogramSettings, ScatterplotSettings } from '@milaboratories/miplots4';\n\nconst SAVED_UNIQUE_VALUES_LIMIT = 100;\n\nconst SAVED_IN_CHART_DATA_DISCRETE_GROUPINGS = ['primaryGrouping', 'secondaryGrouping'];\nconst SAVED_IN_CHART_DATA_SCATTERPLOT_GROUPINGS = ['grouping'];\nconst SAVED_IN_CHART_DATA_SCATTERPLOT_XY = ['x', 'y'];\nconst SAVED_IN_CHART_DATA_HISTOGRAM_GROUPING = ['grouping'];\nconst SAVED_IN_CHART_DATA_DENDRO_GROUPING = [\n 'nodeColor', 'nodeShape', 'lineColor', 'heatmapAnnotation' // dendro\n];\n\nconst FILTER_INPUTS = ['filters', 'highlight', 'tabBy'] as ((keyof InputState['components'])[]);\n\nconst sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n\nfunction addUniqueData(chartData: PlotDataAndSettings, resultMap: UniqueValuesBySourceMap, sourceId: string, labelId?: string) {\n const data = chartData!.data.byColumns.values[sourceId];\n const dataLabels = labelId ? chartData!.data.byColumns.values[labelId] : null;\n\n const resultSet = new Set();\n const result: { value: string, label: string }[] = [];\n for (let i = 0; i < data.length; i++) {\n const v = String(data[i]);\n if (resultSet.has(v)) {\n continue;\n }\n if (resultSet.size === SAVED_UNIQUE_VALUES_LIMIT) {\n resultMap[sourceId] = null;\n return;\n }\n resultSet.add(v);\n const label = dataLabels ? String(dataLabels[i]) : v;\n result.push({ value: v, label });\n }\n sortValues(result);\n resultMap[sourceId] = {\n list: result.map((el) => el.value),\n labels: result.reduce((res, el) => {\n res[el.value] = el.label;\n return res;\n }, {} as Record<string, string>),\n options: result\n };\n}\n\nexport async function getUniqueValuesFromReadyChartData(\n chartData: PlotDataAndSettings,\n inputGuide: InputGuide<InputState>,\n optionsState: InputState['components'],\n controller: Controller<InputState>,\n dataStore: DemoDataStore,\n previousFilterSuggestions: FilterSuggestionsBySourceMap\n): Promise<{uniqueValues: UniqueValuesBySourceMap, filterSuggestions: FilterSuggestionsBySourceMap}> {\n const resultMap: UniqueValuesBySourceMap = {};\n\n if (chartData.settings.type === 'discrete') {\n SAVED_IN_CHART_DATA_DISCRETE_GROUPINGS.forEach((inputName: string) => {\n const savedData = chartData.settings[inputName] as unknown as DiscreteSettings['primaryGrouping'];\n if (savedData) {\n const { columnName } = savedData;\n addUniqueData(chartData, resultMap, columnName.value, columnName.valueLabels)\n }\n });\n }\n if (chartData.settings.type === 'scatterplot' || chartData.settings.type === 'scatterplot-umap') {\n SAVED_IN_CHART_DATA_SCATTERPLOT_XY.forEach((inputName: string) => {\n const columnName = chartData.settings[inputName] as unknown as ScatterplotSettings['x'];\n if (columnName) {\n const valueType = inputGuide.getSourceInfo(columnName.value).type;\n if (valueType === 'String') {\n addUniqueData(chartData, resultMap, columnName.value, columnName.valueLabels);\n }\n }\n });\n SAVED_IN_CHART_DATA_SCATTERPLOT_GROUPINGS.forEach((inputName: string) => {\n const savedInGrouping = chartData.settings[inputName] as unknown as ScatterplotSettings['grouping'];\n savedInGrouping?.forEach(({ columnName }) => {\n const valueType = inputGuide.getSourceInfo(columnName.value).type;\n if (valueType === 'String' || valueType === 'Int' || valueType === 'Long') {\n addUniqueData(chartData, resultMap, columnName.value, columnName.valueLabels);\n }\n });\n });\n }\n\n if (chartData.settings.type === 'histogram') {\n SAVED_IN_CHART_DATA_HISTOGRAM_GROUPING.forEach((inputName: string) => {\n const savedByInputName = chartData.settings[inputName] as unknown as HistogramSettings['grouping'];\n if (savedByInputName) {\n addUniqueData(chartData, resultMap, savedByInputName.value, savedByInputName.valueLabels);\n }\n });\n }\n\n if (chartData.settings.type === 'dendro') {\n SAVED_IN_CHART_DATA_DENDRO_GROUPING.forEach((inputName: string) => {\n const savedByInputName = chartData.settings[inputName] as unknown as DendroSettings['heatmapAnnotation'];\n if (savedByInputName) {\n addUniqueData(chartData, resultMap, savedByInputName.value, savedByInputName.valueLabels);\n }\n });\n }\n\n const filterSuggestionsMap: FilterSuggestionsBySourceMap = {...previousFilterSuggestions};\n\n // sources for loading\n const selectedSources: string[] = [];\n ([...inputGuide.fullOptionsSet]).forEach(id => {\n const info = inputGuide.getSourceInfo(id);\n if (info.kind === 'axis' && info.isNonHomogenous) {\n selectedSources.push(id);\n }\n });\n FILTER_INPUTS.forEach(inputName => {\n const componentState = optionsState[inputName] as ComponentStateFilter;\n if (!componentState) {\n return;\n }\n for (const { selectedSource, type } of componentState.selectorStates as SelectorStateFilter[]) {\n if ((inputName === 'filters' || inputName === 'highlight') && type === 'equals' || inputName === 'tabBy') {\n selectedSources.push(selectedSource);\n }\n }\n });\n for (const source of selectedSources) {\n if (filterSuggestionsMap[source]) {\n continue;\n } else if (dataStore) {\n filterSuggestionsMap[source] = await controller.getUniqueSourceValuesWithLabels(dataStore, inputGuide, source, SAVED_UNIQUE_VALUES_LIMIT);\n }\n }\n return { uniqueValues: resultMap, filterSuggestions: filterSuggestionsMap };\n}\n\nexport async function loadFilterLabelsForTitle(\n optionsState: InputState['components'],\n inputGuide: InputGuide<InputState>,\n controller: Controller<InputState>,\n dataStore: DemoDataStore,\n): Promise<Record<string, ListOption>> {\n const selected: [string, string[]][] = [];\n const INPUTS_REQUESTING_LABELS = ['filters', 'tabBy'] as ((keyof InputState['components'])[]);\n INPUTS_REQUESTING_LABELS.forEach(inputName => {\n const componentState = optionsState[inputName];\n if (componentState) {\n for (const { selectedSource, selectedFilterValues, type } of componentState.selectorStates as SelectorStateFilter[]) {\n if (inputName === 'filters' && type === 'equals' && selectedFilterValues) {\n selected.push([selectedSource, selectedFilterValues]);\n } else if (selectedFilterValues) {\n selected.push([selectedSource, selectedFilterValues]);\n }\n }\n }\n });\n const result: Record<string, ListOption> = {};\n for (const [source, selectedValues] of selected) {\n const uniqueValuesResponses = await Promise.all(selectedValues.map((v) => controller.getUniqueSourceValuesWithLabels(dataStore, inputGuide, source, 1, undefined, v)))\n uniqueValuesResponses.forEach(response => {\n if (response.values.length === 1) {\n result[source] = response.values[0];\n }\n });\n }\n return result;\n}"],"names":["SAVED_IN_CHART_DATA_DISCRETE_GROUPINGS","SAVED_IN_CHART_DATA_SCATTERPLOT_GROUPINGS","SAVED_IN_CHART_DATA_SCATTERPLOT_XY","SAVED_IN_CHART_DATA_HISTOGRAM_GROUPING","SAVED_IN_CHART_DATA_DENDRO_GROUPING","FILTER_INPUTS","sortValues","values","a","b","addUniqueData","chartData","resultMap","sourceId","labelId","data","dataLabels","resultSet","result","i","v","label","el","res","getUniqueValuesFromReadyChartData","inputGuide","optionsState","controller","dataStore","previousFilterSuggestions","inputName","savedData","columnName","savedInGrouping","valueType","savedByInputName","filterSuggestionsMap","selectedSources","id","info","componentState","selectedSource","type","source","loadFilterLabelsForTitle","selected","selectedFilterValues","selectedValues","response"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../node_modules/@milaboratories/helpers/src/utils.ts"],"sourcesContent":["import type { AwaitedStruct, Option, Primitive, Result, Unionize } from './types';\n\nexport function isNil(v: unknown): v is null | undefined | void {\n return v === null || v === undefined;\n}\n\nexport function isPrimitive(v: unknown): v is Primitive {\n return isNil(v)\n || typeof v === 'string'\n || typeof v === 'number'\n || typeof v === 'boolean'\n || typeof v === 'bigint'\n ;\n}\n\nexport function notEmpty<T>(v: T | null | undefined, message?: string): T {\n if (v === null || v === undefined) {\n throw Error(message ?? 'Empty (null | undefined) value');\n }\n\n return v;\n}\n\nexport function notUndef<T>(v: T | undefined, message?: string): T {\n if (v === undefined) {\n throw Error(message ?? 'Undefined value');\n }\n\n return v;\n}\n\nexport function undef<V>(v: V | undefined = undefined): V | undefined {\n return v;\n}\n\nexport function bool<V extends boolean>(v: V): boolean {\n return v;\n}\n\nexport function uniqueValues<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function checkIfNotEmpty<T>(v: T | null | undefined, message?: string): asserts v is T {\n if (v === undefined || v === null) {\n throw Error(message ?? 'Empty (null | undefined) value');\n }\n}\n\nexport function checkIfDefined<T>(v: T | undefined, message?: string): asserts v is T {\n if (v === undefined) {\n throw Error(message ?? 'Undefined value');\n }\n}\n\nexport function between(n: number, a: number, b: number) {\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n\n return n >= min && n <= max;\n}\n\nexport function listToOptions<T>(list: T[] | readonly T[]): Option<T>[] {\n return list.map((value) => ({ text: String(value), value }));\n}\n\nexport function async<A extends unknown[]>(gf: (...args: A) => Generator) {\n return function (...args: A) {\n const generator = gf(...args);\n\n async function handle(result: IteratorResult<unknown>): Promise<unknown> {\n if (result.done) {\n return Promise.resolve(result.value);\n }\n\n return Promise.resolve(result.value).then((res) => {\n return handle(generator.next(res));\n }).catch((err) => {\n return handle(generator.throw(err));\n });\n }\n\n try {\n return handle(generator.next());\n } catch (ex) {\n return Promise.reject(ex instanceof Error ? ex : Error(String(ex)));\n }\n };\n}\n\nexport class Deferred<T> {\n public readonly promise: Promise<T>;\n\n constructor() {\n this.promise = new Promise<T>((res, rej) => {\n this.resolve = res;\n this.reject = rej;\n });\n }\n\n public resolve: (v: T) => void = () => {\n };\n\n public reject: (err: Error) => void = () => {\n };\n}\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function tear() {\n return new Promise<void>((r) => queueMicrotask(r));\n}\n\nexport function timer() {\n const t = new Date().getTime();\n return function () {\n return new Date().getTime() - t;\n };\n}\n\nexport function performanceTimer() {\n const t = performance.now();\n return function () {\n return performance.now() - t;\n };\n}\n\nexport function call<R>(f: () => R): R {\n return f();\n}\n\nexport function clamp(n: number, lo: number, up: number) {\n return lo > n ? lo : n > up ? up : n;\n}\n\nexport function tap<T, R>(v: T, cb: (v: T) => R) {\n return cb(v);\n}\n\nexport function tapIf<T, R>(v: T | null | undefined, cb: (v: T) => R) {\n if (v !== null && v !== undefined) {\n return cb(v);\n }\n\n return;\n}\n\nexport function* range(from: number, to: number, step = 1) {\n for (let i = from; i < to; i += step) {\n yield i;\n }\n}\n\nexport function toList<T>(iterable: Iterable<T>): T[] {\n const lst: T[] = [];\n for (const it of iterable) {\n lst.push(it);\n }\n\n return lst;\n}\n\nexport function times<R>(n: number, cb: (i: number) => R): R[] {\n return toList(range(0, n)).map(cb);\n}\n\nexport class Interval {\n constructor(private _delay: number) {\n }\n\n async* generate(): AsyncGenerator<number> {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n\n async* [Symbol.asyncIterator]() {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n}\n\nexport function arrayFrom<T>(length: number, cb: (i: number) => T) {\n return Array.from({ length }, (_, i) => cb(i));\n}\n\nexport function exhaustive(v: never, message: string): never {\n throw Error(message);\n}\n\nexport type Matcher<T extends string, R = unknown> = {\n [P in T]: () => R;\n};\n\nexport function match<T extends string, R = unknown>(matcher: Matcher<T, R>) {\n return (key: T) => matcher[key]();\n}\n\nexport function okOptional<V>(v: { ok: true; value: V } | { ok: false } | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (v.ok) {\n return v.value;\n }\n}\n\nexport function errorOptional<V>(v: Result<V> | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (!v.ok) {\n return v.error;\n }\n}\n\nexport function unwrap<T>(r: Result<T>): T {\n if (r.ok) {\n return r.value;\n }\n\n throw Error(r.error);\n}\n\nexport function flatValue<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nexport async function resolveAwaited<O extends Record<string, unknown>>(obj: O): Promise<AwaitedStruct<O>> {\n return Object.fromEntries(await Promise.all(Object.entries(obj).map(async ([k, v]) => [k, await v]))) as Promise<AwaitedStruct<O>>;\n}\n\nexport function alike(obj: Record<string, unknown>, to: Record<string, unknown>) {\n return Object.keys(to).every((bKey) => obj[bKey] === to[bKey]);\n}\n\nexport const identity = <T>(v: T): T => v;\n\nexport function asConst<const T>(v: T) {\n return v;\n}\n\nexport function unionize<K extends keyof O, V, O extends Record<K, V>>(obj: O): Unionize<O>[] {\n return Object.entries(obj).map(([key, value]) => ({\n key,\n value,\n })) as Unionize<O>[];\n}\n"],"names":["clamp","lo","up","tapIf","v","cb"],"mappings":"AAqIgB,SAAAA,EAAM,GAAWC,GAAYC,GAAU;AACrD,SAAOD,IAAK,IAAIA,IAAK,IAAIC,IAAKA,IAAK;AACrC;AAMM,SAAUC,EAAYC,GAAyBC,GAAe;AAClE,MAAID,KAAM;AACR,WAAOC,EAAGD,CAAC;AAIf;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../node_modules/@milaboratories/helpers/src/utils.ts"],"sourcesContent":["import type { AwaitedStruct, Option, Primitive, Result, Unionize } from './types';\n\nexport function isNil(v: unknown): v is null | undefined | void {\n return v === null || v === undefined;\n}\n\nexport function isPrimitive(v: unknown): v is Primitive {\n return isNil(v)\n || typeof v === 'string'\n || typeof v === 'number'\n || typeof v === 'boolean'\n || typeof v === 'bigint'\n ;\n}\n\nexport function notEmpty<T>(v: T | null | undefined, message?: string): T {\n if (v === null || v === undefined) {\n throw Error(message ?? 'Empty (null | undefined) value');\n }\n\n return v;\n}\n\nexport function notUndef<T>(v: T | undefined, message?: string): T {\n if (v === undefined) {\n throw Error(message ?? 'Undefined value');\n }\n\n return v;\n}\n\nexport function undef<V>(v: V | undefined = undefined): V | undefined {\n return v;\n}\n\nexport function bool<V extends boolean>(v: V): boolean {\n return v;\n}\n\nexport function uniqueValues<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function checkIfNotEmpty<T>(v: T | null | undefined, message?: string): asserts v is T {\n if (v === undefined || v === null) {\n throw Error(message ?? 'Empty (null | undefined) value');\n }\n}\n\nexport function checkIfDefined<T>(v: T | undefined, message?: string): asserts v is T {\n if (v === undefined) {\n throw Error(message ?? 'Undefined value');\n }\n}\n\nexport function between(n: number, a: number, b: number) {\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n\n return n >= min && n <= max;\n}\n\nexport function listToOptions<T>(list: T[] | readonly T[]): Option<T>[] {\n return list.map((value) => ({ text: String(value), value }));\n}\n\nexport function async<A extends unknown[]>(gf: (...args: A) => Generator) {\n return function (...args: A) {\n const generator = gf(...args);\n\n async function handle(result: IteratorResult<unknown>): Promise<unknown> {\n if (result.done) {\n return Promise.resolve(result.value);\n }\n\n return Promise.resolve(result.value).then((res) => {\n return handle(generator.next(res));\n }).catch((err) => {\n return handle(generator.throw(err));\n });\n }\n\n try {\n return handle(generator.next());\n } catch (ex) {\n return Promise.reject(ex instanceof Error ? ex : Error(String(ex)));\n }\n };\n}\n\nexport class Deferred<T> {\n public readonly promise: Promise<T>;\n\n constructor() {\n this.promise = new Promise<T>((res, rej) => {\n this.resolve = res;\n this.reject = rej;\n });\n }\n\n public resolve: (v: T) => void = () => {\n };\n\n public reject: (err: Error) => void = () => {\n };\n}\n\nexport function delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function tear() {\n return new Promise<void>((r) => queueMicrotask(r));\n}\n\nexport function timer() {\n const t = new Date().getTime();\n return function () {\n return new Date().getTime() - t;\n };\n}\n\nexport function performanceTimer() {\n const t = performance.now();\n return function () {\n return performance.now() - t;\n };\n}\n\nexport function call<R>(f: () => R): R {\n return f();\n}\n\nexport function clamp(n: number, lo: number, up: number) {\n return lo > n ? lo : n > up ? up : n;\n}\n\nexport function tap<T, R>(v: T, cb: (v: T) => R) {\n return cb(v);\n}\n\nexport function tapIf<T, R>(v: T | null | undefined, cb: (v: T) => R) {\n if (v !== null && v !== undefined) {\n return cb(v);\n }\n\n return;\n}\n\nexport function* range(from: number, to: number, step = 1) {\n for (let i = from; i < to; i += step) {\n yield i;\n }\n}\n\nexport function toList<T>(iterable: Iterable<T>): T[] {\n const lst: T[] = [];\n for (const it of iterable) {\n lst.push(it);\n }\n\n return lst;\n}\n\nexport function times<R>(n: number, cb: (i: number) => R): R[] {\n return toList(range(0, n)).map(cb);\n}\n\nexport class Interval {\n constructor(private _delay: number) {\n }\n\n async* generate(): AsyncGenerator<number> {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n\n async* [Symbol.asyncIterator]() {\n let i = 0;\n while (true) {\n await delay(this._delay);\n yield i++;\n }\n }\n}\n\nexport function arrayFrom<T>(length: number, cb: (i: number) => T) {\n return Array.from({ length }, (_, i) => cb(i));\n}\n\nexport function exhaustive(v: never, message: string): never {\n throw Error(message);\n}\n\nexport type Matcher<T extends string, R = unknown> = {\n [P in T]: () => R;\n};\n\nexport function match<T extends string, R = unknown>(matcher: Matcher<T, R>) {\n return (key: T) => matcher[key]();\n}\n\nexport function okOptional<V>(v: { ok: true; value: V } | { ok: false } | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (v.ok) {\n return v.value;\n }\n}\n\nexport function errorOptional<V>(v: Result<V> | undefined) {\n if (!v) {\n return undefined;\n }\n\n if (!v.ok) {\n return v.error;\n }\n}\n\nexport function unwrap<T>(r: Result<T>): T {\n if (r.ok) {\n return r.value;\n }\n\n throw Error(r.error);\n}\n\nexport function flatValue<T>(v: T | T[]): T[] {\n return Array.isArray(v) ? v : [v];\n}\n\nexport async function resolveAwaited<O extends Record<string, unknown>>(obj: O): Promise<AwaitedStruct<O>> {\n return Object.fromEntries(await Promise.all(Object.entries(obj).map(async ([k, v]) => [k, await v]))) as Promise<AwaitedStruct<O>>;\n}\n\nexport function alike(obj: Record<string, unknown>, to: Record<string, unknown>) {\n return Object.keys(to).every((bKey) => obj[bKey] === to[bKey]);\n}\n\nexport const identity = <T>(v: T): T => v;\n\nexport function asConst<const T>(v: T) {\n return v;\n}\n\nexport function unionize<K extends keyof O, V, O extends Record<K, V>>(obj: O): Unionize<O>[] {\n return Object.entries(obj).map(([key, value]) => ({\n key,\n value,\n })) as Unionize<O>[];\n}\n\nexport class Fetcher<K, V> {\n private promises = new Map<K, Promise<V>>();\n fetch(key: K, callback: () => Promise<V>) {\n if (this.promises.has(key)) {\n return this.promises.get(key)!;\n }\n const promise = callback().finally(() => {\n this.promises.delete(key);\n });\n this.promises.set(key, promise);\n return promise;\n }\n}\n"],"names":["clamp","lo","up","tapIf","v","cb"],"mappings":"AAqIgB,SAAAA,EAAM,GAAWC,GAAYC,GAAU;AACrD,SAAOD,IAAK,IAAIA,IAAK,IAAIC,IAAKA,IAAK;AACrC;AAMM,SAAUC,EAAYC,GAAyBC,GAAe;AAClE,MAAID,KAAM;AACR,WAAOC,EAAGD,CAAC;AAIf;","x_google_ignoreList":[0]}
@@ -80,9 +80,9 @@ function tt({
80
80
  title: m,
81
81
  show: w.show,
82
82
  position: w.position,
83
- leftPadding: i.left,
83
+ leftPadding: -i.left,
84
84
  rightPadding: i.right,
85
- chartsWidth: t.chartWidth
85
+ chartsWidth: t.totalWidth
86
86
  }
87
87
  ),
88
88
  /* @__PURE__ */ e.jsxs("g", { dominantBaseline: "central", textAnchor: "middle", fontWeight: "500", fontSize: "14px", fill: U, children: [
@@ -1 +1 @@
1
- {"version":3,"file":"LowerSVG.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/components/LowerSVG.tsx"],"sourcesContent":["import {format} from 'd3-format';\nimport { curveBasis, line } from 'd3-shape';\nimport React, { useEffect, useState } from 'react';\nimport { ChartsTitle } from '../../common/ChartsTitle';\nimport { ContinuousGrid } from '../../common/ContinuousGrid';\nimport fonts from '../../common/fonts';\nimport { Legend } from '../../common/Legend';\nimport type { TooltipsData } from '../../common/Tooltip';\nimport { Tooltip } from '../../common/Tooltip';\nimport type { LegendData } from '../../common/types';\nimport { useDataFrame } from '../../common/useDataFrame';\nimport { BLACK } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport { ContinuousAxis } from '../../common/ContinuousAxis';\nimport {formatColumnValue} from '../../scatterplot/utils/formatColumnValue';\nimport type { ColumnName } from '../../types';\nimport type { CurveUmapLayer } from '../../types/scatterplot-umap';\nimport { DEFAULT_TICKS_SIZE, LEGEND_OFFSET, TITLE_LINE } from '../constants';\nimport type { ScatterplotUmapSettingsImpl } from '../SettingsImpl';\nimport type { CaptionsSizes, ChartScales, ChartSizes, Dot, DotInfo, Margins, SVGLayerProps } from '../types';\n\nfunction getTooltipContent(dataFrame: DataFrame, dot: DotInfo, columnsList: ColumnName[] = [], ) {\n const lines: string[] = [];\n for (const column of columnsList) {\n const columnFormatter = column?.format ? format(column.format) : undefined;\n lines.push(`${column.label}: ${formatColumnValue(dataFrame, dot.idx, column, columnFormatter)}`);\n }\n return lines;\n}\n\nfunction getTitle(title: string | ColumnName): string {\n if (typeof title === 'string') {\n return title;\n }\n return title.label ?? title.value;\n}\n\nconst lineGenerator = line<Dot>().curve(curveBasis);\n\nfunction LowerSvg({\n scales,\n chartSettings,\n mainTitle,\n keyColumn,\n margins,\n chartSizes,\n container,\n zoomStateKey,\n legendData,\n dotsByGrouping,\n layers,\n aesGetters,\n tooltipData\n}: {\n aesGetters: SVGLayerProps['aesGetters'];\n scales: ChartScales;\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'];\n mainTitle: string[];\n keyColumn: ColumnName | null;\n margins: Margins;\n chartSizes: ChartSizes;\n captionsSizes: CaptionsSizes;\n selectedDot?: DotInfo | null;\n container: SVGElement | null;\n zoomStateKey: string;\n legendData: LegendData;\n dotsByGrouping: Record<string, Dot[]>;\n layers: ScatterplotUmapSettingsImpl['layers'];\n tooltipData: TooltipsData<DotInfo>;\n}) {\n const dataFrame = useDataFrame();\n const {title, xAxis, yAxis, frame, legend} = chartSettings;\n const tickSizeX = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const tickSizeY = yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xTitle = xAxis.title;\n const yTitle = yAxis.title;\n const needLeftAxis = true;\n const needBottomAxis = true;\n\n const sideDistances = {\n left: 0,\n right: chartSizes.chartWidth,\n top: 0,\n bottom: chartSizes.chartHeight,\n };\n\n if (!container) {\n return null;\n }\n\n const curveLayer = layers.find(layer => layer.type === 'curve') as CurveUmapLayer | undefined;\n const [lines, setLines] = useState<{key: string, d:string, dot: Dot}[]>([]);\n\n function updateLines() {\n const data = Object.entries(dotsByGrouping);\n const nextLines = data.map(([key, dots]) => ({\n key,\n d: curveLayer?.smoothing ? lineGenerator(dots) ?? '' : dots.map(d => `${scales.x(d.x)},${scales.y(d.y)}`).join(' '),\n dot: dots[0]\n }));\n setLines(nextLines);\n }\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n lineGenerator\n .x((d: Dot) => scales.x(d.x))\n .y((d: Dot) => scales.y(d.y));\n updateLines();\n }, [zoomStateKey, chartSizes.chartWidth, chartSizes.chartHeight]);\n\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n updateLines();\n }, [curveLayer?.smoothing]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n style={{pointerEvents: 'none'}}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${margins.left},${margins.top})`} fontFamily=\"Manrope\">\n <clipPath id=\"viewportClipPath\">\n <rect x=\"0\" y=\"0\" width={chartSizes.chartWidth} height={chartSizes.chartHeight}/>\n </clipPath>\n <ChartsTitle\n title={mainTitle}\n show={title.show}\n position={title.position}\n leftPadding={margins.left}\n rightPadding={margins.right}\n chartsWidth={chartSizes.chartWidth}\n />\n <g dominantBaseline=\"central\" textAnchor=\"middle\" fontWeight=\"500\" fontSize=\"14px\" fill={BLACK}>\n {xTitle && (\n <text\n x={chartSizes.chartWidth / 2}\n y={chartSizes.chartHeight + margins.bottom - TITLE_LINE / 2}\n >\n {getTitle(xTitle)}\n </text>\n )}\n {yTitle && (\n <text\n x={-margins.left + TITLE_LINE / 2}\n y={chartSizes.chartHeight / 2}\n transform={`rotate(-90,${-margins.left + TITLE_LINE / 2},${\n chartSizes.chartHeight / 2\n })`}\n >\n {getTitle(yTitle)}\n </text>\n )}\n </g>\n <ContinuousGrid\n width={chartSizes.chartWidth}\n height={chartSizes.chartHeight}\n scaleX={scales.x}\n scaleY={scales.y}\n axisX={xAxis}\n axisY={yAxis}\n updatingKey={zoomStateKey}\n frameType={frame.type}\n />\n {needBottomAxis && (\n <g transform={`translate(0,${chartSizes.chartHeight})`}>\n <ContinuousAxis scale={scales.x} orient=\"bottom\" tickSize={tickSizeX} />\n </g>\n )}\n {needLeftAxis && (\n <g>\n <ContinuousAxis scale={scales.y} orient=\"left\" tickSize={tickSizeY} />\n </g>\n )}\n {curveLayer && curveLayer.smoothing && (\n <g clipPath=\"url(#viewportClipPath)\">\n {lines.map(({key, d, dot}) => (\n <path\n key={key}\n d={d}\n fill=\"none\"\n stroke={aesGetters.dotFill(dot.idx)}\n strokeWidth={curveLayer.aes?.lineWidth}\n strokeDasharray={aesGetters.lineType(dot.idx)}\n />\n ))}\n </g>\n )}\n {curveLayer && !curveLayer.smoothing && (\n <g clipPath=\"url(#viewportClipPath)\">\n {lines.map(({key, d, dot}) => (\n <polyline\n key={key}\n points={d}\n fill=\"none\"\n stroke={aesGetters.dotFill(dot.idx)}\n strokeWidth={curveLayer.aes?.lineWidth}\n strokeDasharray={aesGetters.lineType(dot.idx)}\n />\n ))}\n </g>\n )}\n {chartSettings.tooltips.show && tooltipData.selectedData && (\n <Tooltip\n content={getTooltipContent(dataFrame, tooltipData.selectedData, chartSettings.tooltips?.content)}\n x={scales.x(tooltipData.selectedData.x)}\n y={scales.y(tooltipData.selectedData.y)}\n active={true}\n fixed={tooltipData.fixed}\n sideDistances={sideDistances}\n container={container}\n onClose={tooltipData.onClose}\n />\n )}\n {legend.show && (\n <g transform={`translate(${chartSizes.chartWidth + LEGEND_OFFSET},0)`}>\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n </svg>\n );\n}\n\nexport default React.memo(LowerSvg);\n"],"names":["getTooltipContent","dataFrame","dot","columnsList","lines","column","columnFormatter","format","formatColumnValue","getTitle","title","lineGenerator","line","curveBasis","LowerSvg","scales","chartSettings","mainTitle","keyColumn","margins","chartSizes","container","zoomStateKey","legendData","dotsByGrouping","layers","aesGetters","tooltipData","useDataFrame","xAxis","yAxis","frame","legend","tickSizeX","DEFAULT_TICKS_SIZE","tickSizeY","xTitle","yTitle","sideDistances","curveLayer","layer","setLines","useState","updateLines","nextLines","key","dots","d","useEffect","jsxs","jsx","fonts","ChartsTitle","BLACK","TITLE_LINE","ContinuousGrid","ContinuousAxis","_a","o","Tooltip","LEGEND_OFFSET","Legend","LowerSvg$1","React"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"LowerSVG.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/scatterplot-umap/components/LowerSVG.tsx"],"sourcesContent":["import {format} from 'd3-format';\nimport { curveBasis, line } from 'd3-shape';\nimport React, { useEffect, useState } from 'react';\nimport { ChartsTitle } from '../../common/ChartsTitle';\nimport { ContinuousGrid } from '../../common/ContinuousGrid';\nimport fonts from '../../common/fonts';\nimport { Legend } from '../../common/Legend';\nimport type { TooltipsData } from '../../common/Tooltip';\nimport { Tooltip } from '../../common/Tooltip';\nimport type { LegendData } from '../../common/types';\nimport { useDataFrame } from '../../common/useDataFrame';\nimport { BLACK } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport { ContinuousAxis } from '../../common/ContinuousAxis';\nimport {formatColumnValue} from '../../scatterplot/utils/formatColumnValue';\nimport type { ColumnName } from '../../types';\nimport type { CurveUmapLayer } from '../../types/scatterplot-umap';\nimport { DEFAULT_TICKS_SIZE, LEGEND_OFFSET, TITLE_LINE } from '../constants';\nimport type { ScatterplotUmapSettingsImpl } from '../SettingsImpl';\nimport type { CaptionsSizes, ChartScales, ChartSizes, Dot, DotInfo, Margins, SVGLayerProps } from '../types';\n\nfunction getTooltipContent(dataFrame: DataFrame, dot: DotInfo, columnsList: ColumnName[] = [], ) {\n const lines: string[] = [];\n for (const column of columnsList) {\n const columnFormatter = column?.format ? format(column.format) : undefined;\n lines.push(`${column.label}: ${formatColumnValue(dataFrame, dot.idx, column, columnFormatter)}`);\n }\n return lines;\n}\n\nfunction getTitle(title: string | ColumnName): string {\n if (typeof title === 'string') {\n return title;\n }\n return title.label ?? title.value;\n}\n\nconst lineGenerator = line<Dot>().curve(curveBasis);\n\nfunction LowerSvg({\n scales,\n chartSettings,\n mainTitle,\n keyColumn,\n margins,\n chartSizes,\n container,\n zoomStateKey,\n legendData,\n dotsByGrouping,\n layers,\n aesGetters,\n tooltipData\n}: {\n aesGetters: SVGLayerProps['aesGetters'];\n scales: ChartScales;\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'];\n mainTitle: string[];\n keyColumn: ColumnName | null;\n margins: Margins;\n chartSizes: ChartSizes;\n captionsSizes: CaptionsSizes;\n selectedDot?: DotInfo | null;\n container: SVGElement | null;\n zoomStateKey: string;\n legendData: LegendData;\n dotsByGrouping: Record<string, Dot[]>;\n layers: ScatterplotUmapSettingsImpl['layers'];\n tooltipData: TooltipsData<DotInfo>;\n}) {\n const dataFrame = useDataFrame();\n const {title, xAxis, yAxis, frame, legend} = chartSettings;\n const tickSizeX = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const tickSizeY = yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xTitle = xAxis.title;\n const yTitle = yAxis.title;\n const needLeftAxis = true;\n const needBottomAxis = true;\n\n const sideDistances = {\n left: 0,\n right: chartSizes.chartWidth,\n top: 0,\n bottom: chartSizes.chartHeight,\n };\n\n if (!container) {\n return null;\n }\n\n const curveLayer = layers.find(layer => layer.type === 'curve') as CurveUmapLayer | undefined;\n const [lines, setLines] = useState<{key: string, d:string, dot: Dot}[]>([]);\n\n function updateLines() {\n const data = Object.entries(dotsByGrouping);\n const nextLines = data.map(([key, dots]) => ({\n key,\n d: curveLayer?.smoothing ? lineGenerator(dots) ?? '' : dots.map(d => `${scales.x(d.x)},${scales.y(d.y)}`).join(' '),\n dot: dots[0]\n }));\n setLines(nextLines);\n }\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n lineGenerator\n .x((d: Dot) => scales.x(d.x))\n .y((d: Dot) => scales.y(d.y));\n updateLines();\n }, [zoomStateKey, chartSizes.chartWidth, chartSizes.chartHeight]);\n\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n updateLines();\n }, [curveLayer?.smoothing]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n style={{pointerEvents: 'none'}}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${margins.left},${margins.top})`} fontFamily=\"Manrope\">\n <clipPath id=\"viewportClipPath\">\n <rect x=\"0\" y=\"0\" width={chartSizes.chartWidth} height={chartSizes.chartHeight}/>\n </clipPath>\n <ChartsTitle\n title={mainTitle}\n show={title.show}\n position={title.position}\n leftPadding={-margins.left}\n rightPadding={margins.right}\n chartsWidth={chartSizes.totalWidth}\n />\n <g dominantBaseline=\"central\" textAnchor=\"middle\" fontWeight=\"500\" fontSize=\"14px\" fill={BLACK}>\n {xTitle && (\n <text\n x={chartSizes.chartWidth / 2}\n y={chartSizes.chartHeight + margins.bottom - TITLE_LINE / 2}\n >\n {getTitle(xTitle)}\n </text>\n )}\n {yTitle && (\n <text\n x={-margins.left + TITLE_LINE / 2}\n y={chartSizes.chartHeight / 2}\n transform={`rotate(-90,${-margins.left + TITLE_LINE / 2},${\n chartSizes.chartHeight / 2\n })`}\n >\n {getTitle(yTitle)}\n </text>\n )}\n </g>\n <ContinuousGrid\n width={chartSizes.chartWidth}\n height={chartSizes.chartHeight}\n scaleX={scales.x}\n scaleY={scales.y}\n axisX={xAxis}\n axisY={yAxis}\n updatingKey={zoomStateKey}\n frameType={frame.type}\n />\n {needBottomAxis && (\n <g transform={`translate(0,${chartSizes.chartHeight})`}>\n <ContinuousAxis scale={scales.x} orient=\"bottom\" tickSize={tickSizeX} />\n </g>\n )}\n {needLeftAxis && (\n <g>\n <ContinuousAxis scale={scales.y} orient=\"left\" tickSize={tickSizeY} />\n </g>\n )}\n {curveLayer && curveLayer.smoothing && (\n <g clipPath=\"url(#viewportClipPath)\">\n {lines.map(({key, d, dot}) => (\n <path\n key={key}\n d={d}\n fill=\"none\"\n stroke={aesGetters.dotFill(dot.idx)}\n strokeWidth={curveLayer.aes?.lineWidth}\n strokeDasharray={aesGetters.lineType(dot.idx)}\n />\n ))}\n </g>\n )}\n {curveLayer && !curveLayer.smoothing && (\n <g clipPath=\"url(#viewportClipPath)\">\n {lines.map(({key, d, dot}) => (\n <polyline\n key={key}\n points={d}\n fill=\"none\"\n stroke={aesGetters.dotFill(dot.idx)}\n strokeWidth={curveLayer.aes?.lineWidth}\n strokeDasharray={aesGetters.lineType(dot.idx)}\n />\n ))}\n </g>\n )}\n {chartSettings.tooltips.show && tooltipData.selectedData && (\n <Tooltip\n content={getTooltipContent(dataFrame, tooltipData.selectedData, chartSettings.tooltips?.content)}\n x={scales.x(tooltipData.selectedData.x)}\n y={scales.y(tooltipData.selectedData.y)}\n active={true}\n fixed={tooltipData.fixed}\n sideDistances={sideDistances}\n container={container}\n onClose={tooltipData.onClose}\n />\n )}\n {legend.show && (\n <g transform={`translate(${chartSizes.chartWidth + LEGEND_OFFSET},0)`}>\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n </svg>\n );\n}\n\nexport default React.memo(LowerSvg);\n"],"names":["getTooltipContent","dataFrame","dot","columnsList","lines","column","columnFormatter","format","formatColumnValue","getTitle","title","lineGenerator","line","curveBasis","LowerSvg","scales","chartSettings","mainTitle","keyColumn","margins","chartSizes","container","zoomStateKey","legendData","dotsByGrouping","layers","aesGetters","tooltipData","useDataFrame","xAxis","yAxis","frame","legend","tickSizeX","DEFAULT_TICKS_SIZE","tickSizeY","xTitle","yTitle","sideDistances","curveLayer","layer","setLines","useState","updateLines","nextLines","key","dots","d","useEffect","jsxs","jsx","fonts","ChartsTitle","BLACK","TITLE_LINE","ContinuousGrid","ContinuousAxis","_a","o","Tooltip","LEGEND_OFFSET","Legend","LowerSvg$1","React"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,6 @@
1
+ import t from "../../../../zod/lib/index.js";
2
+ t.object({
3
+ type: t.literal("plain"),
4
+ content: t.string()
5
+ });
6
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sources":["../../../../../../node_modules/@milaboratories/pl-model-common/src/bmodel/code.ts"],"sourcesContent":["import type { BlockCodeFeatureFlags } from '../flags';\nimport { z } from 'zod';\n\nexport const Code = z.object({\n type: z.literal('plain'),\n content: z.string(),\n});\n\nexport type Code = z.infer<typeof Code>;\n\nexport type BlockCodeWithInfo = {\n readonly code: Code;\n readonly sdkVersion: string;\n readonly featureFlags: BlockCodeFeatureFlags | undefined;\n};\n"],"names":["z"],"mappings":";AAGoBA,EAAE,OAAO;AAAA,EAC3B,MAAMA,EAAE,QAAQ,OAAO;AAAA,EACvB,SAASA,EAAE,OAAM;AAClB,CAAA;","x_google_ignoreList":[0]}
@@ -1,3 +1,4 @@
1
+ import "../../../../../@milaboratories/pl-model-common/dist/bmodel/code.js";
1
2
  import "../../../../../@milaboratories/pl-model-common/dist/drivers/blob.js";
2
3
  import "../../../../../@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
3
4
  import "../../../../../@milaboratories/pl-model-common/dist/plid.js";
@@ -1 +1 @@
1
- {"version":3,"file":"label.js","sources":["../../../../../../../node_modules/@platforma-sdk/model/src/render/util/label.ts"],"sourcesContent":["import { Annotation, parseJson, readAnnotation, type PObjectSpec } from '@milaboratories/pl-model-common';\nimport { z } from 'zod';\n\nexport type RecordsWithLabel<T> = {\n value: T;\n label: string;\n};\n\nexport type LabelDerivationOps = {\n /** Force inclusion of native column label */\n includeNativeLabel?: boolean;\n /** Separator to use between label parts (\" / \" by default) */\n separator?: string;\n /** If true, label will be added as suffix (at the end of the generated label). By default label added as a prefix. */\n addLabelAsSuffix?: boolean;\n /** Trace elements list that will be forced to be included in the label. */\n forceTraceElements?: string[];\n};\n\nexport const TraceEntry = z.object({\n type: z.string(),\n importance: z.number().optional(),\n id: z.string().optional(),\n label: z.string(),\n});\nexport type TraceEntry = z.infer<typeof TraceEntry>;\ntype FullTraceEntry = TraceEntry & { fullType: string; occurrenceIndex: number };\n\nexport const Trace = z.array(TraceEntry);\nexport type Trace = z.infer<typeof Trace>;\ntype FullTrace = FullTraceEntry[];\n\n// Define the possible return types for the specExtractor function\ntype SpecExtractorResult = PObjectSpec | {\n spec: PObjectSpec;\n prefixTrace?: TraceEntry[];\n suffixTrace?: TraceEntry[];\n};\n\nconst DistancePenalty = 0.001;\n\nconst LabelType = '__LABEL__';\nconst LabelTypeFull = '__LABEL__@1';\n\nexport function deriveLabels<T>(\n values: T[],\n specExtractor: (obj: T) => SpecExtractorResult,\n ops: LabelDerivationOps = {},\n): RecordsWithLabel<T>[] {\n const importances = new Map<string, number>();\n\n const forceTraceElements = (ops.forceTraceElements !== undefined && ops.forceTraceElements.length > 0)\n ? new Set(ops.forceTraceElements)\n : undefined;\n\n // number of times certain type occurred among all of the\n const numberOfRecordsWithType = new Map<string, number>();\n\n const enrichedRecords = values.map((value) => {\n const extractorResult = specExtractor(value);\n let spec: PObjectSpec;\n let prefixTrace: TraceEntry[] | undefined;\n let suffixTrace: TraceEntry[] | undefined;\n\n // Check if the result is the new structure or just PObjectSpec\n if ('spec' in extractorResult && typeof extractorResult.spec === 'object') {\n // It's the new structure { spec, prefixTrace?, suffixTrace? }\n spec = extractorResult.spec;\n prefixTrace = extractorResult.prefixTrace;\n suffixTrace = extractorResult.suffixTrace;\n } else {\n // It's just PObjectSpec\n spec = extractorResult as PObjectSpec;\n }\n\n const label = readAnnotation(spec, Annotation.Label);\n const traceStr = readAnnotation(spec, Annotation.Trace);\n const baseTrace = (traceStr ? Trace.safeParse(parseJson(traceStr)).data : undefined) ?? [];\n\n const trace = [\n ...(prefixTrace ?? []),\n ...baseTrace,\n ...(suffixTrace ?? []),\n ];\n\n if (label !== undefined) {\n const labelEntry = { label, type: LabelType, importance: -2 };\n if (ops.addLabelAsSuffix) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n\n const fullTrace: FullTrace = [];\n\n const occurrences = new Map<string, number>();\n for (let i = trace.length - 1; i >= 0; --i) {\n const { type: typeName } = trace[i];\n const importance = trace[i].importance ?? 0;\n const occurrenceIndex = (occurrences.get(typeName) ?? 0) + 1;\n occurrences.set(typeName, occurrenceIndex);\n const fullType = `${typeName}@${occurrenceIndex}`;\n numberOfRecordsWithType.set(fullType, (numberOfRecordsWithType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(\n importances.get(fullType) ?? Number.NEGATIVE_INFINITY,\n importance - (trace.length - i) * DistancePenalty,\n ),\n );\n fullTrace.push({ ...trace[i], fullType, occurrenceIndex: occurrenceIndex });\n }\n fullTrace.reverse();\n return {\n value,\n spec,\n label,\n fullTrace,\n };\n });\n\n // excluding repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const mainTypes: string[] = [];\n // repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const secondaryTypes: string[] = [];\n\n const allTypeRecords = [...importances];\n // sorting: most important types go first\n allTypeRecords.sort(([, i1], [, i2]) => i2 - i1);\n\n for (const [typeName] of allTypeRecords) {\n if (typeName.endsWith('@1') || numberOfRecordsWithType.get(typeName) === values.length)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n const calculate = (includedTypes: Set<string>, force: boolean = false) => {\n const result: RecordsWithLabel<T>[] = [];\n for (let i = 0; i < enrichedRecords.length; i++) {\n const r = enrichedRecords[i];\n const includedTrace = r.fullTrace\n .filter((fm) => includedTypes.has(fm.fullType)\n || (forceTraceElements && forceTraceElements.has(fm.type)));\n if (includedTrace.length === 0) {\n if (force)\n result.push({\n label: 'Unlabeled',\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n else return undefined;\n }\n const labelSet = includedTrace\n .map((fm) => fm.label);\n const sep = ops.separator ?? ' / ';\n result.push({\n label: labelSet.join(sep),\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n }\n return result;\n };\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0) throw new Error('Non-empty secondary types list while main types list is empty.');\n return calculate(new Set(LabelTypeFull), true)!;\n }\n\n //\n // includedTypes = 2\n // * *\n // T0 T1 T2 T3 T4 T5\n // *\n // additionalType = 3\n //\n // Resulting set: T0, T1, T3\n //\n let includedTypes = 0;\n let additionalType = -1;\n while (includedTypes < mainTypes.length) {\n const currentSet = new Set<string>();\n if (ops.includeNativeLabel) currentSet.add(LabelTypeFull);\n for (let i = 0; i < includedTypes; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0)\n currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = calculate(currentSet);\n\n // checking if labels uniquely separate our records\n if (candidateResult !== undefined && new Set(candidateResult.map((c) => c.label)).size === values.length) return candidateResult;\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedTypes++;\n additionalType = includedTypes;\n }\n }\n\n return calculate(new Set([...mainTypes, ...secondaryTypes]), true)!;\n}\n"],"names":["TraceEntry","z"],"mappings":";;;;;AAmBO,MAAMA,IAAaC,EAAE,OAAO;AAAA,EACjC,MAAMA,EAAE,OAAM;AAAA,EACd,YAAYA,EAAE,OAAM,EAAG,SAAQ;AAAA,EAC/B,IAAIA,EAAE,OAAM,EAAG,SAAQ;AAAA,EACvB,OAAOA,EAAE,OAAM;AAChB,CAAA;AAIoBA,EAAE,MAAMD,CAAU;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"label.js","sources":["../../../../../../../node_modules/@platforma-sdk/model/src/render/util/label.ts"],"sourcesContent":["import { Annotation, parseJson, readAnnotation, type PObjectSpec } from '@milaboratories/pl-model-common';\nimport { z } from 'zod';\n\nexport type RecordsWithLabel<T> = {\n value: T;\n label: string;\n};\n\nexport type LabelDerivationOps = {\n /** Force inclusion of native column label */\n includeNativeLabel?: boolean;\n /** Separator to use between label parts (\" / \" by default) */\n separator?: string;\n /** If true, label will be added as suffix (at the end of the generated label). By default label added as a prefix. */\n addLabelAsSuffix?: boolean;\n /** Trace elements list that will be forced to be included in the label. */\n forceTraceElements?: string[];\n};\n\nexport const TraceEntry = z.object({\n type: z.string(),\n importance: z.number().optional(),\n id: z.string().optional(),\n label: z.string(),\n});\nexport type TraceEntry = z.infer<typeof TraceEntry>;\ntype FullTraceEntry = TraceEntry & { fullType: string; occurrenceIndex: number };\n\nexport const Trace = z.array(TraceEntry);\nexport type Trace = z.infer<typeof Trace>;\ntype FullTrace = FullTraceEntry[];\n\n// Define the possible return types for the specExtractor function\ntype SpecExtractorResult = PObjectSpec | {\n spec: PObjectSpec;\n prefixTrace?: TraceEntry[];\n suffixTrace?: TraceEntry[];\n};\n\nconst DistancePenalty = 0.001;\n\nconst LabelType = '__LABEL__';\nconst LabelTypeFull = '__LABEL__@1';\n\nexport function deriveLabels<T>(\n values: T[],\n specExtractor: (obj: T) => SpecExtractorResult,\n ops: LabelDerivationOps = {},\n): RecordsWithLabel<T>[] {\n const importances = new Map<string, number>();\n\n const forceTraceElements = (ops.forceTraceElements !== undefined && ops.forceTraceElements.length > 0)\n ? new Set(ops.forceTraceElements)\n : undefined;\n\n // number of times certain type occurred among all of the\n const numberOfRecordsWithType = new Map<string, number>();\n\n const enrichedRecords = values.map((value) => {\n const extractorResult = specExtractor(value);\n let spec: PObjectSpec;\n let prefixTrace: TraceEntry[] | undefined;\n let suffixTrace: TraceEntry[] | undefined;\n\n // Check if the result is the new structure or just PObjectSpec\n if ('spec' in extractorResult && typeof extractorResult.spec === 'object') {\n // It's the new structure { spec, prefixTrace?, suffixTrace? }\n spec = extractorResult.spec;\n prefixTrace = extractorResult.prefixTrace;\n suffixTrace = extractorResult.suffixTrace;\n } else {\n // It's just PObjectSpec\n spec = extractorResult as PObjectSpec;\n }\n\n const label = readAnnotation(spec, Annotation.Label);\n const traceStr = readAnnotation(spec, Annotation.Trace);\n const baseTrace = (traceStr ? Trace.safeParse(parseJson(traceStr)).data : undefined) ?? [];\n\n const trace = [\n ...(prefixTrace ?? []),\n ...baseTrace,\n ...(suffixTrace ?? []),\n ];\n\n if (label !== undefined) {\n const labelEntry = { label, type: LabelType, importance: -2 };\n if (ops.addLabelAsSuffix) trace.push(labelEntry);\n else trace.splice(0, 0, labelEntry);\n }\n\n const fullTrace: FullTrace = [];\n\n const occurrences = new Map<string, number>();\n for (let i = trace.length - 1; i >= 0; --i) {\n const { type: typeName } = trace[i];\n const importance = trace[i].importance ?? 0;\n const occurrenceIndex = (occurrences.get(typeName) ?? 0) + 1;\n occurrences.set(typeName, occurrenceIndex);\n const fullType = `${typeName}@${occurrenceIndex}`;\n numberOfRecordsWithType.set(fullType, (numberOfRecordsWithType.get(fullType) ?? 0) + 1);\n importances.set(\n fullType,\n Math.max(\n importances.get(fullType) ?? Number.NEGATIVE_INFINITY,\n importance - (trace.length - i) * DistancePenalty,\n ),\n );\n fullTrace.push({ ...trace[i], fullType, occurrenceIndex: occurrenceIndex });\n }\n fullTrace.reverse();\n return {\n value,\n spec,\n label,\n fullTrace,\n };\n });\n\n // excluding repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const mainTypes: string[] = [];\n // repeated types (i.e. ..@2, ..@3, etc.) not found in some records\n const secondaryTypes: string[] = [];\n\n const allTypeRecords = [...importances];\n // sorting: most important types go first\n allTypeRecords.sort(([, i1], [, i2]) => i2 - i1);\n\n for (const [typeName] of allTypeRecords) {\n if (typeName.endsWith('@1') || numberOfRecordsWithType.get(typeName) === values.length)\n mainTypes.push(typeName);\n else secondaryTypes.push(typeName);\n }\n\n const calculate = (includedTypes: Set<string>, force: boolean = false) => {\n const result: RecordsWithLabel<T>[] = [];\n for (let i = 0; i < enrichedRecords.length; i++) {\n const r = enrichedRecords[i];\n const includedTrace = r.fullTrace\n .filter((fm) => includedTypes.has(fm.fullType)\n || (forceTraceElements && forceTraceElements.has(fm.type)));\n if (includedTrace.length === 0) {\n if (force)\n result.push({\n label: 'Unlabeled',\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n else return undefined;\n }\n const labelSet = includedTrace\n .map((fm) => fm.label);\n const sep = ops.separator ?? ' / ';\n result.push({\n label: labelSet.join(sep),\n value: r.value,\n } satisfies RecordsWithLabel<T>);\n }\n return result;\n };\n\n if (mainTypes.length === 0) {\n if (secondaryTypes.length !== 0) throw new Error('Non-empty secondary types list while main types list is empty.');\n return calculate(new Set(LabelTypeFull), true)!;\n }\n\n //\n // includedTypes = 2\n // * *\n // T0 T1 T2 T3 T4 T5\n // *\n // additionalType = 3\n //\n // Resulting set: T0, T1, T3\n //\n let includedTypes = 0;\n let additionalType = -1;\n while (includedTypes < mainTypes.length) {\n const currentSet = new Set<string>();\n if (ops.includeNativeLabel) currentSet.add(LabelTypeFull);\n for (let i = 0; i < includedTypes; ++i) currentSet.add(mainTypes[i]);\n if (additionalType >= 0)\n currentSet.add(mainTypes[additionalType]);\n\n const candidateResult = calculate(currentSet);\n\n // checking if labels uniquely separate our records\n if (candidateResult !== undefined && new Set(candidateResult.map((c) => c.label)).size === values.length) return candidateResult;\n\n additionalType++;\n if (additionalType >= mainTypes.length) {\n includedTypes++;\n additionalType = includedTypes;\n }\n }\n\n return calculate(new Set([...mainTypes, ...secondaryTypes]), true)!;\n}\n"],"names":["TraceEntry","z"],"mappings":";;;;;;AAmBO,MAAMA,IAAaC,EAAE,OAAO;AAAA,EACjC,MAAMA,EAAE,OAAM;AAAA,EACd,YAAYA,EAAE,OAAM,EAAG,SAAQ;AAAA,EAC/B,IAAIA,EAAE,OAAM,EAAG,SAAQ;AAAA,EACvB,OAAOA,EAAE,OAAM;AAChB,CAAA;AAIoBA,EAAE,MAAMD,CAAU;","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/graph-maker",
3
- "version": "1.1.170",
3
+ "version": "1.1.172",
4
4
  "type": "module",
5
5
  "main": "dist/lib.js",
6
6
  "types": "dist/lib.d.ts",
@@ -37,10 +37,10 @@
37
37
  "dependencies": {
38
38
  "@ag-grid-community/core": "^32.3.3",
39
39
  "@milaboratories/helpers": "^1.6.15",
40
- "@milaboratories/miplots4": "^1.0.153",
40
+ "@milaboratories/miplots4": "^1.0.154",
41
41
  "@milaboratories/pf-plots": "^1.1.41",
42
42
  "@platforma-sdk/model": "^1.43.29",
43
- "@platforma-sdk/ui-vue": "^1.42.36",
43
+ "@platforma-sdk/ui-vue": "^1.44.15",
44
44
  "@types/d3-hierarchy": "^3.1.7",
45
45
  "@types/d3-scale": "^4.0.8",
46
46
  "@vueuse/core": "^13.1.0",