@milaboratories/graph-maker 1.1.150 → 1.1.152

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 (98) hide show
  1. package/dist/GraphMaker/components/AesSettings/AesDataMappingDiscrete.vue.d.ts.map +1 -1
  2. package/dist/GraphMaker/components/AesSettings/AesDataMappingDiscrete.vue.js +2 -1
  3. package/dist/GraphMaker/components/AesSettings/AesDataMappingDiscrete.vue.js.map +1 -1
  4. package/dist/GraphMaker/components/Chart.vue.js +3 -3
  5. package/dist/GraphMaker/components/Chart.vue.js.map +1 -1
  6. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.d.ts +3 -12
  7. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.d.ts.map +1 -1
  8. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.js +42 -85
  9. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.js.map +1 -1
  10. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.d.ts +1 -9
  11. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.d.ts.map +1 -1
  12. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.js +44 -89
  13. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.js.map +1 -1
  14. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.d.ts +1 -3
  15. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.d.ts.map +1 -1
  16. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.js +68 -86
  17. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.js.map +1 -1
  18. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts +7 -11
  19. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts.map +1 -1
  20. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js +48 -91
  21. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js.map +1 -1
  22. package/dist/GraphMaker/components/DragAndDrop/types.d.ts +1 -21
  23. package/dist/GraphMaker/components/DragAndDrop/types.d.ts.map +1 -1
  24. package/dist/GraphMaker/components/PlColorSliderThumb.vue.js +18 -18
  25. package/dist/GraphMaker/components/PlColorSliderThumb.vue.js.map +1 -1
  26. package/dist/GraphMaker/constantsCommon.d.ts +0 -1
  27. package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
  28. package/dist/GraphMaker/constantsCommon.js +95 -95
  29. package/dist/GraphMaker/constantsCommon.js.map +1 -1
  30. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.d.ts.map +1 -1
  31. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.js +128 -166
  32. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.js.map +1 -1
  33. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.d.ts.map +1 -1
  34. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.js +93 -131
  35. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.js.map +1 -1
  36. package/dist/GraphMaker/forms/DataMappingForm/utils.d.ts +1 -1
  37. package/dist/GraphMaker/forms/DataMappingForm/utils.d.ts.map +1 -1
  38. package/dist/GraphMaker/forms/DataMappingForm/utils.js +79 -155
  39. package/dist/GraphMaker/forms/DataMappingForm/utils.js.map +1 -1
  40. package/dist/GraphMaker/forms/index.js +2 -2
  41. package/dist/GraphMaker/forms/index.js.map +1 -1
  42. package/dist/GraphMaker/icons/StackedAreaIcon.vue.d.ts +3 -0
  43. package/dist/GraphMaker/icons/StackedAreaIcon.vue.d.ts.map +1 -0
  44. package/dist/GraphMaker/icons/StackedAreaIcon.vue.js +19 -0
  45. package/dist/GraphMaker/icons/StackedAreaIcon.vue.js.map +1 -0
  46. package/dist/GraphMaker/index.vue.js +1 -1
  47. package/dist/GraphMaker/store.d.ts.map +1 -1
  48. package/dist/GraphMaker/store.js +43 -45
  49. package/dist/GraphMaker/store.js.map +1 -1
  50. package/dist/GraphMaker/types.d.ts +1 -1
  51. package/dist/GraphMaker/types.d.ts.map +1 -1
  52. package/dist/GraphMaker/utils/addFixedOptionsToState.js +2 -2
  53. package/dist/GraphMaker/utils/addFixedOptionsToState.js.map +1 -1
  54. package/dist/GraphMaker/utils/createChartSettingsForRender/composeChartSettings.js +25 -25
  55. package/dist/GraphMaker/utils/createChartSettingsForRender/composeChartSettings.js.map +1 -1
  56. package/dist/GraphMaker/utils/loadDefaultSources.d.ts +2 -3
  57. package/dist/GraphMaker/utils/loadDefaultSources.d.ts.map +1 -1
  58. package/dist/GraphMaker/utils/loadDefaultSources.js +47 -51
  59. package/dist/GraphMaker/utils/loadDefaultSources.js.map +1 -1
  60. package/dist/GraphMaker/utils/loadUniqueValuesToSave.d.ts.map +1 -1
  61. package/dist/GraphMaker/utils/loadUniqueValuesToSave.js +39 -41
  62. package/dist/GraphMaker/utils/loadUniqueValuesToSave.js.map +1 -1
  63. package/dist/lib.js +1 -1
  64. package/dist/node_modules/@milaboratories/helpers/dist/objects.js +33 -0
  65. package/dist/node_modules/@milaboratories/helpers/dist/objects.js.map +1 -0
  66. package/dist/node_modules/@milaboratories/helpers/dist/utils.js +12 -0
  67. package/dist/node_modules/@milaboratories/helpers/dist/utils.js.map +1 -0
  68. package/dist/node_modules/@milaboratories/pf-plots/dist/constants.js +6 -5
  69. package/dist/node_modules/@milaboratories/pf-plots/dist/constants.js.map +1 -1
  70. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js +146 -149
  71. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js.map +1 -1
  72. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js +168 -221
  73. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js.map +1 -1
  74. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js +95 -102
  75. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js.map +1 -1
  76. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/dendro.js +145 -156
  77. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/dendro.js.map +1 -1
  78. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/discrete.js +68 -75
  79. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/discrete.js.map +1 -1
  80. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js +154 -159
  81. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js.map +1 -1
  82. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/histogram.js +48 -55
  83. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/histogram.js.map +1 -1
  84. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js +114 -122
  85. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js.map +1 -1
  86. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js +111 -119
  87. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js.map +1 -1
  88. package/dist/node_modules/@milaboratories/pf-plots/dist/index.js +4 -4
  89. package/dist/node_modules/@milaboratories/pf-plots/dist/pframe/ColumnsProvider.js +70 -69
  90. package/dist/node_modules/@milaboratories/pf-plots/dist/pframe/ColumnsProvider.js.map +1 -1
  91. package/dist/node_modules/@milaboratories/pf-plots/dist/spec.js +2 -2
  92. package/dist/node_modules/@milaboratories/pf-plots/dist/spec.js.map +1 -1
  93. package/dist/node_modules/@milaboratories/pf-plots/dist/utils.js +184 -183
  94. package/dist/node_modules/@milaboratories/pf-plots/dist/utils.js.map +1 -1
  95. package/dist/node_modules/@vueuse/shared/index.js.map +1 -1
  96. package/package.json +4 -4
  97. package/dist/node_modules/@milaboratories/helpers/dist/index.js +0 -372
  98. package/dist/node_modules/@milaboratories/helpers/dist/index.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ function c(t) {
2
+ return typeof t == "object" && t !== null;
3
+ }
4
+ function o(t) {
5
+ if (!c(t))
6
+ return !1;
7
+ const e = Object.getPrototypeOf(t);
8
+ return e === null || e === Object.prototype || Object.getPrototypeOf(e) === null;
9
+ }
10
+ function n(t) {
11
+ if (Array.isArray(t)) {
12
+ const e = [];
13
+ for (let r = 0; r < t.length; r++)
14
+ e[r] = n(t[r]);
15
+ return e;
16
+ } else if (o(t)) {
17
+ const e = {};
18
+ return Object.keys(t).forEach((r) => {
19
+ e[r] = n(t[r]);
20
+ }), e;
21
+ } else
22
+ return t;
23
+ }
24
+ function f(t, e, r) {
25
+ return t[e] = r, t;
26
+ }
27
+ export {
28
+ n as deepClone,
29
+ c as isObject,
30
+ o as isPlainObject,
31
+ f as setProp
32
+ };
33
+ //# sourceMappingURL=objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sources":["../../../../../node_modules/@milaboratories/helpers/src/objects.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { PartialBy, PlainObject } from './types';\nimport { isNil } from './utils';\n\n/**\n * Alias to Array.isArray\n */\nexport const isArray = Array.isArray;\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport function isNonPrimitive<V, T extends PlainObject<V> | V[]>(obj: T | unknown): obj is T {\n return obj !== null && typeof obj === 'object';\n}\n\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Checks if the given value is a plain object.\n *\n * A plain object is defined as an object created by the `{}` literal,\n * an object created with `Object.create(null)`, or an object with a\n * prototype that resolves to `Object.prototype`.\n *\n * @param value - The value to check.\n * @returns `true` if the value is a plain object, otherwise `false`.\n *\n * @example\n * ```typescript\n * isPlainObject({}); // true\n * isPlainObject(Object.create(null)); // true\n * isPlainObject(new Date()); // false\n * isPlainObject(null); // false\n * isPlainObject([]); // false\n * ```\n */\nexport function isPlainObject(value: unknown): value is PlainObject {\n if (!isObject(value)) {\n return false;\n }\n\n const prototype: unknown = Object.getPrototypeOf(value);\n\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null);\n}\n\nexport function map<U, T extends Record<string, unknown>>(obj: T, callback: (curr: T[keyof T], key: keyof T) => U) {\n const keys = Object.keys(obj) as Array<keyof T>;\n\n return keys.map((key: keyof T) => {\n return callback(obj[key], key);\n });\n}\n\nfunction definedKeysSize(obj: PlainObject) {\n return Object.values(obj).reduce((length: number, v) => {\n return v !== undefined ? length + 1 : length;\n }, 0);\n}\n\n/**\n * Performs a deep equality check between two values, `a` and `b`, to determine if they are JSON-equivalent.\n *\n * JSON equivalence means that the two values are strictly equal in structure and content, including arrays and plain objects.\n * Non-primitive values that are neither arrays nor plain objects will throw an error.\n *\n * @param a - The first value to compare.\n * @param b - The second value to compare.\n * @returns `true` if the values are JSON-equivalent, otherwise `false`.\n *\n * @throws If the values are non-primitive and not arrays or plain objects.\n *\n * @example\n * ```typescript\n * isJsonEqual(1, 1); // true\n * isJsonEqual({ a: 1 }, { a: 1 }); // true\n * isJsonEqual([1, 2], [1, 2]); // true\n * isJsonEqual({ a: 1 }, { a: 2 }); // false\n * isJsonEqual([1, 2], [2, 1]); // false\n * isJsonEqual(new Date(), new Date()); // Error\n * ```\n */\nexport function isJsonEqual(a: unknown, b: unknown): boolean {\n if (!(isNonPrimitive(a) && isNonPrimitive(b))) {\n return a === b;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n } else {\n return [...a.keys()].every((k) => isJsonEqual(a[k], b[k]));\n }\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n if (definedKeysSize(a) !== definedKeysSize(b)) {\n return false;\n }\n\n return Object.keys(a).every((k) => isJsonEqual(a[k], b[k]));\n }\n\n /* eslint-disable @typescript-eslint/no-base-to-string */\n throw Error(`Cannot compare a ${String(a)} and b ${String(b)}`);\n}\n\n/**\n * Alias to isJsonEqual function\n * @deprecated change to isJsonEqual\n */\nexport const deepEqual = isJsonEqual;\n\nexport function deepClone<T>(obj: T): T {\n if (Array.isArray(obj)) {\n const copy: any[] = [];\n for (let i = 0; i < obj.length; i++) {\n copy[i] = deepClone(obj[i]) as unknown;\n }\n return copy as T;\n } else if (isPlainObject(obj)) {\n const copy: Record<string, any> = {};\n Object.keys(obj).forEach((k) => {\n copy[k] = deepClone(obj[k]);\n });\n return copy as T;\n } else {\n return obj;\n }\n}\n\nexport function shallowClone<T>(obj: T): T {\n if (isNil(obj)) return obj;\n if (Array.isArray(obj)) return obj.slice() as T;\n if (isPlainObject(obj)) return Object.assign({}, obj) as T;\n if (obj instanceof Map) return new Map(obj) as T;\n if (obj instanceof Set) return new Set(obj) as T;\n throw Error(`Not implemented clone strategy for ${JSON.stringify(obj)}`);\n}\n\nexport function shallowDiff<T>(to: T, from: T): Partial<T> {\n const diff: Partial<T> = {};\n\n for (const key in from) {\n if (from[key] !== to[key]) {\n diff[key] = to[key];\n }\n }\n\n return diff;\n}\n\nexport function bindMethods<O extends Record<string, unknown>>(obj: O) {\n Object.entries(obj).forEach(([key, m]) => {\n if (m instanceof Function) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n obj[key as keyof O] = m.bind(obj);\n }\n });\n\n return obj;\n}\n\nexport function setProp<O, K extends keyof O>(obj: O, key: K, value: O[K]) {\n obj[key] = value;\n return obj;\n}\n\nexport function getProp<O, K extends keyof O>(obj: O, key: K): O[K] {\n return obj[key];\n}\n\nexport function shiftProp<O, K extends keyof O>(obj: O, key: K): [O[K], Omit<O, K>] {\n obj = { ...obj };\n const val = obj[key];\n delete obj[key];\n return [val, obj];\n}\n\nexport function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {\n return Object.assign({}, ...keys.map((k) => ({ [k]: obj[k] }))) as Pick<T, K>;\n}\n\nexport function pickValues<T, K extends keyof T>(obj: T, ...keys: K[]) {\n return keys.map((k) => obj[k]);\n}\n\nexport function omit<T, K extends keyof T>(obj: T, ...keys: K[]): Omit<T, K> {\n const o = Object.assign({}, obj) as PartialBy<T, K>;\n keys.forEach((k) => delete o[k]);\n return o;\n}\n\n/**\n * Performs a deep patch of the target object or array using the source object or array.\n *\n * This function recursively merges properties of the source into the target:\n * - If a property in both target and source is a plain object, they are recursively merged.\n * - If a property in both target and source is an array of the same length, the arrays are recursively patched element by element.\n * - Otherwise, the property value in the target is replaced by the corresponding value from the source.\n *\n * The patch is applied in-place to the target object or array, which is also returned for convenience.\n *\n * @typeParam T - The type of the target and source, which must be either a plain object or an array.\n * @param target - The target object or array to be patched. This object/array is modified in-place.\n * @param source - The source object or array providing the new values for the patch.\n * @returns The modified target object or array.\n *\n * @example\n * ```typescript\n * const target = { a: { b: 1 }, c: [1, 2] };\n * const source = { a: { b: 2 }, c: [3, 4], d: 5 };\n * const result = deepPatch(target, source);\n * // target is now: { a: { b: 2 }, c: [3, 4], d: 5 }\n * // result is the same reference as target.\n *\n * const targetArray = [{ a: 1 }, { b: 2 }];\n * const sourceArray = [{ a: 2 }, { b: 3 }];\n * const resultArray = deepPatch(targetArray, sourceArray);\n * // targetArray is now: [{ a: 2 }, { b: 3 }]\n * ```\n */\nexport function deepPatch<T extends PlainObject | unknown[]>(target: T, source: T) {\n const sk = new Set<keyof T>([...Object.keys(target) as (keyof T)[], ...Object.keys(source) as (keyof T)[]]);\n\n sk.forEach((key) => {\n const t = target[key];\n const s = source[key];\n if (isPlainObject(t) && isPlainObject(s)) {\n deepPatch(t, s);\n } else if (isArray(t) && isArray(s) && t.length === s.length) {\n deepPatch(t, s);\n } else {\n target[key] = s;\n }\n });\n\n return target;\n}\n"],"names":["isObject","value","isPlainObject","prototype","deepClone","obj","copy","i","k","setProp","key"],"mappings":"AAeM,SAAUA,EAASC,GAAc;AACrC,SAAO,OAAOA,KAAU,YAAYA,MAAU;AAChD;AAqBM,SAAUC,EAAcD,GAAc;AAC1C,MAAI,CAACD,EAASC,CAAK;AACjB,WAAO;AAGT,QAAME,IAAqB,OAAO,eAAeF,CAAK;AAEtD,SAAQE,MAAc,QAAQA,MAAc,OAAO,aAAa,OAAO,eAAeA,CAAS,MAAM;AACvG;AAqEM,SAAUC,EAAaC,GAAM;AACjC,MAAI,MAAM,QAAQA,CAAG,GAAG;AACtB,UAAMC,IAAc,CAAA;AACpB,aAASC,IAAI,GAAGA,IAAIF,EAAI,QAAQE;AAC9B,MAAAD,EAAKC,CAAC,IAAIH,EAAUC,EAAIE,CAAC,CAAC;AAE5B,WAAOD;AAAA,EACT,WAAWJ,EAAcG,CAAG,GAAG;AAC7B,UAAMC,IAA4B,CAAA;AAClC,kBAAO,KAAKD,CAAG,EAAE,QAAQ,CAACG,MAAK;AAC7B,MAAAF,EAAKE,CAAC,IAAIJ,EAAUC,EAAIG,CAAC,CAAC;AAAA,IAC5B,CAAC,GACMF;AAAA,EACT;AACE,WAAOD;AAEX;AAkCgB,SAAAI,EAA8BJ,GAAQK,GAAQT,GAAW;AACvE,SAAAI,EAAIK,CAAG,IAAIT,GACJI;AACT;","x_google_ignoreList":[0]}
@@ -0,0 +1,12 @@
1
+ function e(n, r, t) {
2
+ return r > n ? r : n > t ? t : n;
3
+ }
4
+ function u(n, r) {
5
+ if (n != null)
6
+ return r(n);
7
+ }
8
+ export {
9
+ e as clamp,
10
+ u as tapIf
11
+ };
12
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +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,4 +1,4 @@
1
- const p = "pl7.app/axisNature", a = "pl7.app/label", s = "pl7.app/columnAsAxis/name", l = "pl7.app/columnAsAxis/domain", E = "pl7.app/isSubset", _ = "pl7.app/isDiscreteFilter", i = "pl7.app/discreteValues", A = "pl7.app/graph/axis/highCardinality", L = "pl7.app/graph/isVirtual", I = "pl7.app/isLinkerColumn", e = "pl7.app/format";
1
+ const p = "pl7.app/axisNature", a = "pl7.app/label", s = "pl7.app/columnAsAxis/name", l = "pl7.app/columnAsAxis/domain", E = "pl7.app/isSubset", _ = "pl7.app/isDiscreteFilter", i = "pl7.app/discreteValues", L = "pl7.app/graph/axis/highCardinality", I = "pl7.app/graph/isVirtual", A = "pl7.app/isLinkerColumn", e = "pl7.app/multipliesBy", t = "pl7.app/format";
2
2
  export {
3
3
  p as AXIS_NATURE_KEY,
4
4
  l as COLUMN_DOMAIN_KEY,
@@ -6,10 +6,11 @@ export {
6
6
  s as COLUMN_NAME_KEY,
7
7
  _ as DISCRETE_FILTER_KEY,
8
8
  i as DISCRETE_VALUES_KEY,
9
- e as FORMAT,
10
- A as HIGH_CARDINALITY,
11
- I as IS_LINKER_COLUMN,
12
- L as IS_VIRTUAL_COLUMN,
9
+ t as FORMAT,
10
+ L as HIGH_CARDINALITY,
11
+ A as IS_LINKER_COLUMN,
12
+ I as IS_VIRTUAL_COLUMN,
13
+ e as MULTIPLIES_BY,
13
14
  E as SUBSET_FILTER_KEY
14
15
  };
15
16
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../../../../node_modules/@milaboratories/pf-plots/src/constants.ts"],"sourcesContent":["export const AXIS_NATURE_KEY = 'pl7.app/axisNature';\nexport const COLUMN_LABEL_KEY = 'pl7.app/label';\n\nexport const COLUMN_NAME_KEY = 'pl7.app/columnAsAxis/name';\nexport const COLUMN_DOMAIN_KEY = 'pl7.app/columnAsAxis/domain';\nexport const SUBSET_FILTER_KEY = 'pl7.app/isSubset';\nexport const DISCRETE_FILTER_KEY = 'pl7.app/isDiscreteFilter';\nexport const DISCRETE_VALUES_KEY = 'pl7.app/discreteValues';\nexport const MIN_VALUE_KEY = 'pl7.app/min';\nexport const MAX_VALUE_KEY = 'pl7.app/max';\n\nexport const HIGH_CARDINALITY = 'pl7.app/graph/axis/highCardinality';\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // duplicate of metadata-column enriched domain keys for compatibility with other column\nexport const IS_LINKER_COLUMN = 'pl7.app/isLinkerColumn';\n\nexport const FORMAT = 'pl7.app/format';\n"],"names":["AXIS_NATURE_KEY","COLUMN_LABEL_KEY","COLUMN_NAME_KEY","COLUMN_DOMAIN_KEY","SUBSET_FILTER_KEY","DISCRETE_FILTER_KEY","DISCRETE_VALUES_KEY","HIGH_CARDINALITY","IS_VIRTUAL_COLUMN","IS_LINKER_COLUMN","FORMAT"],"mappings":"AAAO,MAAMA,IAAkB,sBAClBC,IAAmB,iBAEnBC,IAAkB,6BAClBC,IAAoB,+BACpBC,IAAoB,oBACpBC,IAAsB,4BACtBC,IAAsB,0BAItBC,IAAmB,sCACnBC,IAAoB,2BACpBC,IAAmB,0BAEnBC,IAAS;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"constants.js","sources":["../../../../../node_modules/@milaboratories/pf-plots/src/constants.ts"],"sourcesContent":["export const AXIS_NATURE_KEY = 'pl7.app/axisNature';\nexport const COLUMN_LABEL_KEY = 'pl7.app/label';\n\nexport const COLUMN_NAME_KEY = 'pl7.app/columnAsAxis/name';\nexport const COLUMN_DOMAIN_KEY = 'pl7.app/columnAsAxis/domain';\nexport const SUBSET_FILTER_KEY = 'pl7.app/isSubset';\nexport const DISCRETE_FILTER_KEY = 'pl7.app/isDiscreteFilter';\nexport const DISCRETE_VALUES_KEY = 'pl7.app/discreteValues';\nexport const MIN_VALUE_KEY = 'pl7.app/min';\nexport const MAX_VALUE_KEY = 'pl7.app/max';\n\nexport const HIGH_CARDINALITY = 'pl7.app/graph/axis/highCardinality';\nexport const IS_VIRTUAL_COLUMN = 'pl7.app/graph/isVirtual'; // duplicate of metadata-column enriched domain keys for compatibility with other column\nexport const IS_LINKER_COLUMN = 'pl7.app/isLinkerColumn';\nexport const MULTIPLIES_BY = 'pl7.app/multipliesBy' // \"one-directional\" linker, one value can be linked with few ones, contains list of ids (for example \"[\\\"pl7.app/sampleId\\\"]\")\n\nexport const FORMAT = 'pl7.app/format';\n"],"names":["AXIS_NATURE_KEY","COLUMN_LABEL_KEY","COLUMN_NAME_KEY","COLUMN_DOMAIN_KEY","SUBSET_FILTER_KEY","DISCRETE_FILTER_KEY","DISCRETE_VALUES_KEY","HIGH_CARDINALITY","IS_VIRTUAL_COLUMN","IS_LINKER_COLUMN","MULTIPLIES_BY","FORMAT"],"mappings":"AAAO,MAAMA,IAAkB,sBAClBC,IAAmB,iBAEnBC,IAAkB,6BAClBC,IAAoB,+BACpBC,IAAoB,oBACpBC,IAAsB,4BACtBC,IAAsB,0BAItBC,IAAmB,sCACnBC,IAAoB,2BACpBC,IAAmB,0BACnBC,IAAgB,wBAEhBC,IAAS;","x_google_ignoreList":[0]}
@@ -1,30 +1,31 @@
1
1
  import "../node_modules/@milaboratories/pl-model-common/dist/drivers/blob.js";
2
- import "../node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
2
+ import { getNormalizedAxesList as E } from "../node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/spec/spec.js";
3
3
  import "../_virtual/canonicalize.js";
4
+ import { LinkerMap as U } from "../node_modules/@milaboratories/pl-model-common/dist/drivers/pframe/linker_columns.js";
4
5
  import "../node_modules/@milaboratories/pl-model-common/dist/plid.js";
5
6
  import "../node_modules/@milaboratories/pl-model-common/dist/ref.js";
6
7
  import "../node_modules/@platforma-sdk/model/dist/render/util/label.js";
7
- import { isLabelColumn as H } from "../node_modules/@platforma-sdk/model/dist/components/PlDataTable.js";
8
+ import { isLabelColumn as j } from "../node_modules/@platforma-sdk/model/dist/components/PlDataTable.js";
8
9
  import "../node_modules/@milaboratories/pl-error-like/dist/error_like_shape.js";
9
- import { DISCRETE_FILTER_KEY as L, SUBSET_FILTER_KEY as q, IS_LINKER_COLUMN as G } from "../constants.js";
10
- import { columnOrAxisIdFromString as I, isColumnId as B, AxisId as C } from "../spec.js";
11
- import { getStateCopy as W, getNotAllowedAxes as M, axisMustBeConsumed as X, getColumnOrAxisLabel as R } from "../utils.js";
12
- var J = Object.defineProperty, Q = (f, e, t) => e in f ? J(f, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : f[e] = t, g = (f, e, t) => Q(f, typeof e != "symbol" ? e + "" : e, t);
13
- const V = (f) => {
10
+ import { DISCRETE_FILTER_KEY as F, SUBSET_FILTER_KEY as L, COLUMN_LABEL_KEY as z, IS_LINKER_COLUMN as H } from "../constants.js";
11
+ import { columnOrAxisIdFromString as B, isColumnId as T, AxisId as N, ColumnId as Y } from "../spec.js";
12
+ import { getStateCopy as q, getNotAllowedAxes as $, axisIsNonHomogenous as Z, getColumnOrAxisLabel as V } from "../utils.js";
13
+ var G = Object.defineProperty, J = (S, e, t) => e in S ? G(S, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : S[e] = t, d = (S, e, t) => J(S, typeof e != "symbol" ? e + "" : e, t);
14
+ const Q = (S) => {
14
15
  var e;
15
- return ((e = f == null ? void 0 : f.annotations) == null ? void 0 : e[G]) === "true";
16
- }, _ = class K {
16
+ return ((e = S == null ? void 0 : S.annotations) == null ? void 0 : e[H]) === "true";
17
+ }, M = class R {
17
18
  constructor({
18
19
  componentName: e,
19
20
  allowedTypes: t,
20
21
  settings: n,
21
- strictlyDependsOnParents: i,
22
- dependsOn: s = [],
23
- parentComponents: c = [],
24
- annotations: l = {},
25
- checkSourceBySpec: u
22
+ strictlyDependsOnParents: s,
23
+ dependsOn: i = [],
24
+ parentComponents: l = [],
25
+ annotations: p = {},
26
+ checkSourceBySpec: o
26
27
  }) {
27
- g(this, "componentName"), g(this, "allowedTypes"), g(this, "settings"), g(this, "dependsOn"), g(this, "parentComponents"), g(this, "strictlyDependsOnParents"), g(this, "annotations"), g(this, "checkSourceBySpec"), this.componentName = e, this.allowedTypes = [...t], this.settings = { ...K.DefaultSettings, ...n }, this.dependsOn = [...s], this.parentComponents = [...c], this.strictlyDependsOnParents = i ?? !0, this.annotations = { ...l }, u && (this.checkSourceBySpec = u);
28
+ d(this, "componentName"), d(this, "allowedTypes"), d(this, "settings"), d(this, "dependsOn"), d(this, "parentComponents"), d(this, "strictlyDependsOnParents"), d(this, "annotations"), d(this, "checkSourceBySpec"), this.componentName = e, this.allowedTypes = [...t], this.settings = { ...R.DefaultSettings, ...n }, this.dependsOn = [...i], this.parentComponents = [...l], this.strictlyDependsOnParents = s ?? !0, this.annotations = { ...p }, o && (this.checkSourceBySpec = o);
28
29
  }
29
30
  get isRequired() {
30
31
  return this.settings.required;
@@ -33,162 +34,158 @@ const V = (f) => {
33
34
  return this.settings.dimensionConsumer;
34
35
  }
35
36
  addSelected(e, t) {
36
- const n = W(e);
37
+ const n = q(e);
37
38
  return n.components[this.componentName].selectorStates.push(t), n;
38
39
  }
39
40
  deleteSelected(e, t) {
40
- const n = W(e);
41
- return n.components[this.componentName].selectorStates = n.components[this.componentName].selectorStates.filter((i) => i.selectedSource !== t), n;
41
+ const n = q(e);
42
+ return n.components[this.componentName].selectorStates = n.components[this.componentName].selectorStates.filter((s) => s.selectedSource !== t), n;
42
43
  }
43
- async checkStateConsistency(e, t, n) {
44
- const i = t.components[this.componentName], { parentAxes: s, parentAxesList: c } = await this.getAllowedAxes(e, t);
45
- function l(r) {
46
- const d = C.fromAxisSpec(r).toCanonicalString();
47
- return s.has(d);
48
- }
49
- const u = await Promise.all(
50
- i.selectorStates.map(async ({ selectedSource: r }) => {
51
- const d = I(r);
52
- if (B(d)) {
53
- const o = await e.pFrameProvider.getColumnSpecById(d);
54
- return o ? this.parentComponents.length === 0 ? !0 : this.strictlyDependsOnParents && !this.settings.columnsWithExtraAxesAllowed && !this.settings.isDataComponent ? o.axesSpec.every((p) => l(p)) : this.settings.columnsWithExtraAxesAllowed && !this.settings.isDataComponent ? o.axesSpec.some((p) => l(p)) ? !0 : M(o, c, s, n).length < o.axesSpec.length : s.size === 0 || o.axesSpec.some((p) => l(p)) : !1;
55
- }
56
- return s.has(r);
57
- })
58
- );
59
- return i.selectorStates.reduce(
60
- (r, d, o) => (r[d.selectedSource] = u[o], r),
61
- {}
62
- );
63
- }
64
- async getProducingAxes(e, t) {
65
- const n = t.components[this.componentName].selectorStates.map((s) => I(s.selectedSource)).filter((s) => B(s)), i = /* @__PURE__ */ new Set();
66
- return (await Promise.all(
67
- n.map((s) => e.pFrameProvider.getColumnSpecById(s))
68
- )).forEach((s) => {
69
- s && s.axesSpec.forEach((c) => {
70
- i.add(C.fromAxisSpec(c).toCanonicalString());
71
- });
72
- }), i;
73
- }
74
- getParentSelectedSources(e, t) {
75
- return this.parentComponents.reduce((n, i) => {
76
- const s = t.components[i].selectorStates.map(
77
- (c) => I(c.selectedSource)
44
+ getParentSelectedSources(e) {
45
+ return this.parentComponents.reduce((t, n) => {
46
+ const s = e.components[n].selectorStates.map(
47
+ (i) => B(i.selectedSource)
78
48
  );
79
- return n.push(...s), n;
49
+ return t.push(...s), t;
80
50
  }, []);
81
51
  }
82
- async getParentAxes(e, t) {
83
- var n;
84
- const i = this.getParentSelectedSources(e, t), s = /* @__PURE__ */ new Set();
85
- for (const c of i)
86
- if (B(c)) {
87
- const l = await e.pFrameProvider.getColumnSpecById(c);
88
- (n = l == null ? void 0 : l.axesSpec) == null || n.forEach((u) => {
89
- const r = C.fromAxisSpec(u);
90
- s.add(r.toCanonicalString());
91
- });
52
+ async getParentsAxes(e, t) {
53
+ const n = this.getParentSelectedSources(t), s = /* @__PURE__ */ new Map();
54
+ for (const i of n)
55
+ if (T(i)) {
56
+ const l = await e.pFrameProvider.getColumnSpecById(i);
57
+ for (const p of (l == null ? void 0 : l.axesSpec) ?? []) {
58
+ const o = N.fromAxisSpec(p).toCanonicalString();
59
+ s.has(o) || s.set(o, { parentSource: i.toCanonicalString(), spec: p });
60
+ }
92
61
  }
93
62
  return s;
94
63
  }
95
- async getAllowedAxes(e, t) {
96
- var n, i;
97
- const s = this.getParentSelectedSources(e, t), c = /* @__PURE__ */ new Set(), l = [], u = /* @__PURE__ */ new Map();
98
- for (const r of s)
99
- if (B(r)) {
100
- const d = await e.pFrameProvider.getColumnSpecById(r);
101
- for (const o of (d == null ? void 0 : d.axesSpec) ?? []) {
102
- const p = C.fromAxisSpec(o).toCanonicalString();
103
- if (c.has(p))
104
- continue;
105
- c.add(p), l.push(o);
106
- const v = X(o);
107
- u.set(p, {
108
- kind: "axis",
109
- name: o.name,
110
- label: await R(e, p, [
111
- r.toCanonicalString()
112
- ]),
113
- type: o.type,
114
- mustBeConsumed: v,
115
- dividable: !1,
116
- spec: o,
117
- annotations: o.annotations,
118
- isSubsetFilter: ((n = o.annotations) == null ? void 0 : n[q]) === "true",
119
- isDiscreteFilter: o.type === "String" || ((i = o.annotations) == null ? void 0 : i[L]) === "true",
120
- parentSources: [r.toCanonicalString()]
121
- });
122
- }
64
+ async getParentAndHangingAxes(e, t, n, s) {
65
+ const i = await this.getParentsAxes(e, t), l = /* @__PURE__ */ new Map();
66
+ if (!this.settings.isDataComponent) {
67
+ const p = t.components[this.componentName].selectorStates.map((o) => o.selectedSource);
68
+ for (const o of p) {
69
+ const u = B(o);
70
+ if (!T(u))
71
+ continue;
72
+ const m = await e.pFrameProvider.getColumnSpecById(u);
73
+ if (!m)
74
+ continue;
75
+ const g = $(m, Array.from(i.values()).map((a) => a.spec), n, s);
76
+ for (const a of g)
77
+ l.set(N.fromAxisSpec(a).toCanonicalString(), { parentSource: o, spec: a });
78
+ }
79
+ }
80
+ return { parentsAxes: i, hangingAxes: l };
81
+ }
82
+ /** Get axes to check available columns compatibility: all parents axes + available with these parent axes linker axes */
83
+ getColumnSourceAxes(e, t, n) {
84
+ const s = /* @__PURE__ */ new Map(), { parentsAxes: i } = e[this.componentName];
85
+ for (const o of i)
86
+ s.set(...o);
87
+ if (this.settings.isDataComponent)
88
+ return s;
89
+ const l = E(Array.from(i.values()).map((o) => o.spec)), p = E(t.getReachableByLinkersAxesFromAxes(l));
90
+ for (const o of p) {
91
+ const u = U.getLinkerKeyFromAxisSpec(o), m = t.data.get(u), g = Array.from((m == null ? void 0 : m.linkWith.keys()) ?? []), a = m == null ? void 0 : m.linkWith.get(g[0]);
92
+ if (a) {
93
+ const C = N.fromAxisSpec(o).toCanonicalString(), x = new Y({ name: a.columnId, type: a.spec.valueType }).toCanonicalString();
94
+ s.set(C, { parentSource: x, spec: o });
123
95
  }
124
- return { parentAxes: c, parentAxesList: l, optionsInfo: u };
96
+ }
97
+ for (const [o] of i) {
98
+ const u = n.get(o), m = Array.from((u == null ? void 0 : u.keys()) ?? []);
99
+ if (u && m.length)
100
+ for (const g of m) {
101
+ const a = u.get(g), C = N.fromAxisSpec(a.spec).toCanonicalString();
102
+ s.set(C, { parentSource: a.parentSource, spec: a.spec });
103
+ }
104
+ }
105
+ return s;
125
106
  }
126
- async getOptions(e, t, n, i, s, c, l = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set()) {
127
- var r, d, o;
128
- const p = this.settings.multipleSelectors, v = this.settings.required, O = await this.checkStateConsistency(e, t, s);
129
- if (this.dependsOn.length && this.dependsOn.some((h) => t.components[h].selectorStates.length === 0))
130
- return { multipleSelectors: p, required: v, stateConsistency: O, options: [], optionsInfo: /* @__PURE__ */ new Map() };
131
- if (this.strictlyDependsOnParents && !this.settings.isDataComponent && this.parentComponents.some((h) => t.components[h].selectorStates.length === 0))
132
- return { multipleSelectors: p, required: v, stateConsistency: O, options: [], optionsInfo: /* @__PURE__ */ new Map() };
133
- const j = this.getParentSelectedSources(e, t), U = (await e.pFrameProvider.getColumns([], !1, this.allowedTypes, void 0, this.annotations)).filter((h) => !i.has(h.toCanonicalString())), { parentAxes: D, parentAxesList: Y, optionsInfo: F } = await this.getAllowedAxes(e, t), z = t.components[this.componentName], N = [];
134
- if (this.settings.axesAllowed)
135
- for (const h of D) {
136
- const y = I(h), S = F.get(y.toCanonicalString()), w = this.allowedTypes.includes(S.spec.type), a = Object.entries(this.annotations).every(
137
- ([E, m]) => {
138
- var x;
139
- return ((x = S.spec.annotations) == null ? void 0 : x[E]) === m;
107
+ /** Allowed: all axes from parent (data) inputs + hanging axes from another (not data) inputs + axes from linkers;
108
+ * these are all axes that can be in a compatible columns + hanging axes.
109
+ */
110
+ getAllowedAxes(e, t, n) {
111
+ const s = this.getColumnSourceAxes(e, t, n);
112
+ for (const [i, l] of Object.entries(e))
113
+ if (i !== this.componentName)
114
+ for (const p of l.hangingAxes)
115
+ s.set(...p);
116
+ return s;
117
+ }
118
+ checkStateConsistency(e, t) {
119
+ return e.components[this.componentName].selectorStates.reduce((n, s) => (n[s.selectedSource] = t.some((i) => i.value === s.selectedSource), n), {});
120
+ }
121
+ async getOptions(e, t, n, s, i, l, p = /* @__PURE__ */ new Set(), o = /* @__PURE__ */ new Set()) {
122
+ var u, m, g, a, C;
123
+ const x = this.settings.multipleSelectors, b = this.settings.required, v = /* @__PURE__ */ new Map();
124
+ if (this.dependsOn.length && this.dependsOn.some((f) => t.components[f].selectorStates.length === 0))
125
+ return { multipleSelectors: x, required: b, stateConsistency: this.checkStateConsistency(t, []), options: [], optionsInfo: v };
126
+ if (this.strictlyDependsOnParents && !this.settings.isDataComponent && this.parentComponents.some((f) => t.components[f].selectorStates.length === 0))
127
+ return { multipleSelectors: x, required: b, stateConsistency: this.checkStateConsistency(t, []), options: [], optionsInfo: v };
128
+ const O = [];
129
+ if (this.settings.axesAllowed) {
130
+ const f = this.getAllowedAxes(i, n, s);
131
+ for (const [y, { spec: c, parentSource: A }] of f.entries()) {
132
+ const w = B(y), r = Z(c), I = this.allowedTypes.includes(c.type), k = Object.entries(this.annotations).every(
133
+ ([K, W]) => {
134
+ var P;
135
+ return ((P = c.annotations) == null ? void 0 : P[K]) === W;
140
136
  }
141
- ), A = this.checkSourceBySpec ? this.checkSourceBySpec(S.spec, t) : !0, T = !this.settings.homogeneous || !(S != null && S.mustBeConsumed), b = !i.has(h), P = l.has(y.name) || u.has(y.toCanonicalString()), k = z.selectorStates.some((E) => E.selectedSource === h);
142
- w && a && A && T && b && !P && !k && N.push({ value: h });
137
+ ), D = this.checkSourceBySpec ? this.checkSourceBySpec(c, t) : !0, h = !this.settings.homogeneous || !r, _ = p.has(w.name) || o.has(y);
138
+ v.set(y, {
139
+ kind: "axis",
140
+ name: c.name,
141
+ label: await V(e, y, [A]),
142
+ type: c.type,
143
+ mustBeConsumed: !1,
144
+ dividable: !1,
145
+ spec: c,
146
+ annotations: c.annotations,
147
+ isNonHomogenous: r,
148
+ isSubsetFilter: ((u = c.annotations) == null ? void 0 : u[L]) === "true",
149
+ isDiscreteFilter: c.type === "String" || ((m = c.annotations) == null ? void 0 : m[F]) === "true",
150
+ parentSources: [A]
151
+ }), I && k && D && h && !_ && O.push({ value: y });
143
152
  }
153
+ }
144
154
  if (this.settings.columnsAllowed) {
145
- const h = !this.settings.columnsWithExtraAxesAllowed && this.strictlyDependsOnParents;
146
- for (const y of U) {
147
- const S = y.toCanonicalString(), w = I(S), a = await e.pFrameProvider.getColumnSpecById(w);
148
- if (!a)
155
+ const f = await e.pFrameProvider.getColumns([], !1, this.allowedTypes, void 0, this.annotations), y = !this.settings.columnsWithExtraAxesAllowed && this.strictlyDependsOnParents, c = this.getColumnSourceAxes(i, n, s);
156
+ for (const A of f) {
157
+ const w = A.toCanonicalString(), r = await e.pFrameProvider.getColumnSpecById(A);
158
+ if (!r)
149
159
  continue;
150
- const A = M(
151
- a,
152
- Y,
153
- D,
154
- s
155
- ).map((m) => C.fromAxisSpec(m).toCanonicalString()), T = new Set(A);
160
+ const I = i[this.componentName].parentsAxes, k = r.axesSpec.map((h) => N.fromAxisSpec(h).toCanonicalString());
156
161
  if (
157
162
  // do not add to available options label columns, or columns that are not fit by custom spec condition, or columns that are not fit by condition for data inputs
158
- H(a) || V(a) || this.checkSourceBySpec && !this.checkSourceBySpec(a, t) || this.settings.isDataComponent && !c(a) || h && A.length > 0 || j.length && A.length > 0 && !a.axesSpec.some((m) => {
159
- const x = C.fromAxisSpec(m).toCanonicalString();
160
- return D.has(x);
161
- })
163
+ j(r) || Q(r) || this.checkSourceBySpec && !this.checkSourceBySpec(r, t) || this.settings.isDataComponent && !l(r) || y && c.size && k.some((h) => !c.has(h)) || I.size && !(k.some((h) => I.has(h)) || k.every((h) => c.has(h)))
162
164
  )
163
165
  continue;
164
- const b = ((r = a == null ? void 0 : a.axesSpec) == null ? void 0 : r.map((m) => C.fromAxisSpec(m).toCanonicalString())) ?? [], P = {};
165
- if (this.settings.columnsWithExtraAxesAllowed && b.forEach((m, x) => {
166
- T.has(m) && (P[m] = x);
167
- }), a) {
168
- const m = n[S] ?? await R(e, y.toCanonicalString(), []), x = {
169
- kind: "column",
170
- name: a.name,
171
- label: m,
172
- type: a.valueType,
173
- spec: a,
174
- annotations: a.annotations,
175
- isSubsetFilter: ((d = a.annotations) == null ? void 0 : d[q]) === "true",
176
- isDiscreteFilter: a.valueType === "String" || ((o = a.annotations) == null ? void 0 : o[L]) === "true",
177
- axesToBeFixed: A,
178
- axesToBeFixedIndexes: P
179
- };
180
- F.set(w.toCanonicalString(), x);
181
- }
182
- const k = l.has(w.name) || u.has(w.toCanonicalString()), E = t.components[this.componentName].selectorStates.some(
183
- (m) => m.selectedSource === S
184
- );
185
- !k && !E && N.push({ value: S });
166
+ const D = {
167
+ kind: "column",
168
+ name: r.name,
169
+ label: ((g = r.annotations) == null ? void 0 : g[z]) ?? r.name,
170
+ type: r.valueType,
171
+ spec: r,
172
+ annotations: r.annotations,
173
+ isSubsetFilter: ((a = r.annotations) == null ? void 0 : a[L]) === "true",
174
+ isDiscreteFilter: r.valueType === "String" || ((C = r.annotations) == null ? void 0 : C[F]) === "true"
175
+ };
176
+ v.set(w, D), p.has(A.name) || o.has(w) || O.push({ value: w });
186
177
  }
187
178
  }
188
- return { multipleSelectors: p, required: v, stateConsistency: O, options: N, optionsInfo: F };
179
+ return {
180
+ multipleSelectors: x,
181
+ required: b,
182
+ stateConsistency: this.checkStateConsistency(t, O),
183
+ options: O,
184
+ optionsInfo: v
185
+ };
189
186
  }
190
187
  };
191
- g(_, "DefaultSettings", {
188
+ d(M, "DefaultSettings", {
192
189
  isDataComponent: !1,
193
190
  multipleSelectors: !1,
194
191
  required: !1,
@@ -198,8 +195,8 @@ g(_, "DefaultSettings", {
198
195
  columnsWithExtraAxesAllowed: !0,
199
196
  dimensionConsumer: !1
200
197
  });
201
- let le = _;
198
+ let me = M;
202
199
  export {
203
- le as ComponentController
200
+ me as ComponentController
204
201
  };
205
202
  //# sourceMappingURL=ComponentController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentController.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ComponentController.ts"],"sourcesContent":["import {isLabelColumn} from '@platforma-sdk/model';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideSimple,\n ComponentState,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n} from '../common';\nimport {\n DISCRETE_FILTER_KEY,\n IS_LINKER_COLUMN,\n SUBSET_FILTER_KEY,\n} from '../constants';\nimport type {DataStore} from '../store';\nimport type {ColumnId, ColumnOrAxisIdString} from '../spec';\nimport {AxisId, columnOrAxisIdFromString, isColumnId} from '../spec';\nimport type {AxisSpec, LinkerMap, PColumnSpec, ValueType} from '@milaboratories/pl-model-common';\nimport {axisMustBeConsumed, getColumnOrAxisLabel, getNotAllowedAxes, getStateCopy} from '../utils';\n\nconst isLinkerColumn = (columnSpec:PColumnSpec) => columnSpec?.annotations?.[IS_LINKER_COLUMN] === 'true';\n\ninterface ComponentControllerSettings {\n isDataComponent: boolean; // X, Y, Data source etc.\n multipleSelectors: boolean; // more than 1 selected column in input\n required: boolean;\n homogeneous: boolean;\n axesAllowed: boolean;\n columnsAllowed: boolean;\n columnsWithExtraAxesAllowed: boolean; // can contain column with extra axes with fixed values\n dimensionConsumer: boolean; // remove extra dimension from data-mapping after selecting a heterogeneous axis\n}\n\ninterface FieldControllerOptions<State extends InputState, Field extends keyof State['components']> {\n componentName: Field;\n allowedTypes: ValueType[];\n checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean; // for more complicated logic than type is in allowed types and annotation exists\n annotations?: Record<string, string>;\n parentComponents?: (keyof State['components'])[];\n dependsOn?: (keyof State['components'])[];\n strictlyDependsOnParents?: boolean;\n ignoredOptionIds?: string[];\n settings: Partial<ComponentControllerSettings>;\n}\n\nexport class ComponentController<State extends InputState, Field extends keyof State['components']> {\n private static DefaultSettings: ComponentControllerSettings = {\n isDataComponent: false,\n multipleSelectors: false,\n required: false,\n homogeneous: false,\n axesAllowed: false,\n columnsAllowed: true,\n columnsWithExtraAxesAllowed: true,\n dimensionConsumer: false,\n };\n\n readonly componentName: Field;\n readonly allowedTypes: ValueType[];\n readonly settings: ComponentControllerSettings;\n private readonly dependsOn: (keyof State['components'])[];\n private readonly parentComponents: (keyof State['components'])[];\n private readonly strictlyDependsOnParents: boolean;\n private readonly annotations: Record<string, string>;\n private readonly checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean;\n\n constructor({\n componentName,\n allowedTypes,\n settings,\n strictlyDependsOnParents,\n dependsOn = [],\n parentComponents = [],\n annotations = {},\n checkSourceBySpec,\n }: FieldControllerOptions<State, Field>) {\n this.componentName = componentName;\n this.allowedTypes = [...allowedTypes];\n this.settings = {...ComponentController.DefaultSettings, ...settings};\n this.dependsOn = [...dependsOn];\n this.parentComponents = [...parentComponents]; // corresponding data components for meta or X for Y in scatterplot\n this.strictlyDependsOnParents = strictlyDependsOnParents ?? true; // meta-inputs are strictly-depending on parents, X by Y (Y by X) - don't\n this.annotations = {...annotations};\n if (checkSourceBySpec) {\n this.checkSourceBySpec = checkSourceBySpec;\n }\n }\n\n get isRequired(): boolean {\n return this.settings.required;\n }\n\n get isDimensionsConsumer(): boolean {\n return this.settings.dimensionConsumer;\n }\n\n addSelected(state: State, selectorState: SelectorStateSimple | SelectorStateFilter) {\n const nextState = getStateCopy(state);\n nextState.components[this.componentName].selectorStates.push(selectorState as SelectorStateFilter);\n\n // ***\n // here should be logic for possibly parent qualifications updating\n // ***\n\n return nextState;\n }\n\n deleteSelected(state: State, selectedSourceStr: ColumnOrAxisIdString) {\n const nextState = getStateCopy(state);\n // ***\n // here should be logic for removing unnecessary qualifications (it can appear when some sources are deleted)\n // ***\n nextState.components[this.componentName].selectorStates = (\n nextState.components[this.componentName].selectorStates as SelectorState[]\n ).filter(item => item.selectedSource !== selectedSourceStr);\n return nextState;\n }\n\n async checkStateConsistency(\n store: DataStore,\n state: State,\n linkerMap: LinkerMap\n ): Promise<Record<string, boolean>> {\n const componentState = state.components[this.componentName as keyof InputState];\n const {parentAxes, parentAxesList} = await this.getAllowedAxes(store, state);\n \n function isAxisInSet(a: AxisSpec) {\n const id = AxisId.fromAxisSpec(a).toCanonicalString();\n return parentAxes.has(id);\n }\n\n const consistencyData = await Promise.all(\n componentState.selectorStates.map(async ({selectedSource}) => {\n const sourceId = columnOrAxisIdFromString(selectedSource);\n // if column selected - check all axes of column\n if (isColumnId(sourceId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(sourceId);\n if (!columnSpec) {\n // if column is not in store - current store and selected column are not consistent\n return false;\n }\n\n const parents = this.parentComponents;\n if (parents.length === 0) {\n return true;\n }\n if ((this.strictlyDependsOnParents && !this.settings.columnsWithExtraAxesAllowed) && !this.settings.isDataComponent) {\n return columnSpec.axesSpec.every(a => isAxisInSet(a));\n } else if (this.settings.columnsWithExtraAxesAllowed && !this.settings.isDataComponent) {\n if (columnSpec.axesSpec.some(a => isAxisInSet(a))) {\n return true;\n }\n\n const notAllowed = getNotAllowedAxes(columnSpec, parentAxesList, parentAxes, linkerMap);\n return notAllowed.length < columnSpec.axesSpec.length;\n } else {\n return parentAxes.size === 0 || columnSpec.axesSpec.some(a => isAxisInSet(a));\n }\n }\n return parentAxes.has(selectedSource);\n })\n );\n return (componentState.selectorStates as (SelectorStateSimple | SelectorStateFilter)[]).reduce(\n (res: Record<string, boolean>, item, idx) => {\n res[item.selectedSource] = consistencyData[idx];\n return res;\n },\n {}\n );\n }\n\n async getProducingAxes(store: DataStore, state: State) {\n const componentState = state.components[this.componentName as keyof InputState];\n const selectedHereIds = componentState.selectorStates.map(s => columnOrAxisIdFromString(s.selectedSource));\n const selectedHereColumnIds = selectedHereIds.filter(id => isColumnId(id));\n\n const axes = new Set<ColumnOrAxisIdString>();\n\n const infoList = await Promise.all(\n selectedHereColumnIds.map(id => {\n return store.pFrameProvider.getColumnSpecById(id);\n })\n );\n\n infoList.forEach(columnSpec => {\n if (columnSpec) {\n columnSpec.axesSpec.forEach(axisSpec => {\n axes.add(AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n });\n }\n });\n return axes;\n }\n\n getParentSelectedSources(store: DataStore, state: State): (ColumnId | AxisId)[] {\n const selectedSources = this.parentComponents.reduce((res: (ColumnId | AxisId)[], item) => {\n const selectedHere = state.components[item].selectorStates.map(s =>\n columnOrAxisIdFromString(s.selectedSource)\n );\n res.push(...selectedHere);\n return res;\n }, []);\n\n // ***\n // consider parent qualifications without selected here\n // ***\n return selectedSources;\n }\n\n async getParentAxes(store: DataStore, state: State) {\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const axes = new Set<ColumnOrAxisIdString>();\n\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n columnSpec?.axesSpec?.forEach(spec => {\n const id = AxisId.fromAxisSpec(spec);\n axes.add(id.toCanonicalString());\n });\n }\n }\n return axes;\n }\n\n async getAllowedAxes(store: DataStore, state: State) {\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const parentAxes = new Set<ColumnOrAxisIdString>();\n const parentAxesList:AxisSpec[] = [];\n const optionsInfo: Map<string, AxisData | ColumnData> = new Map();\n\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n for (const spec of columnSpec?.axesSpec ?? []) {\n const id = AxisId.fromAxisSpec(spec);\n const idStr = id.toCanonicalString();\n if (parentAxes.has(idStr)) {\n continue;\n }\n parentAxes.add(idStr);\n parentAxesList.push(spec);\n const mustBeConsumed = axisMustBeConsumed(spec); // request unique values only for non-homogenous axes\n optionsInfo.set(idStr, {\n kind: 'axis',\n name: spec.name,\n label: await getColumnOrAxisLabel(store, idStr, [\n source.toCanonicalString(),\n ]),\n type: spec.type,\n mustBeConsumed,\n dividable: false,\n spec,\n annotations: spec.annotations,\n isSubsetFilter: spec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n spec.type === 'String' || spec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [source.toCanonicalString()],\n });\n }\n }\n }\n\n return {parentAxes, parentAxesList, optionsInfo};\n }\n\n async getOptions(\n store: DataStore,\n state: State,\n labelsMap: Record<string, string>,\n consumedSourcesSet: Set<ColumnOrAxisIdString>,\n linkerMap: LinkerMap,\n dataColumnPredicate: (spec: PColumnSpec) => boolean,\n ignoredNamesSet: Set<string> = new Set(),\n fixedSelectedSet: Set<ColumnOrAxisIdString> = new Set()\n ): Promise<ComponentGuideSimple> {\n const multipleSelectors = this.settings.multipleSelectors;\n const required = this.settings.required;\n const stateConsistency = await this.checkStateConsistency(store, state, linkerMap);\n\n if (this.dependsOn.length && this.dependsOn.some(dep => state.components[dep].selectorStates.length === 0)) {\n return {multipleSelectors, required, stateConsistency, options: [], optionsInfo: new Map()};\n }\n\n if (\n this.strictlyDependsOnParents &&\n !this.settings.isDataComponent &&\n this.parentComponents.some(name => state.components[name].selectorStates.length === 0)\n ) {\n return {multipleSelectors, required, stateConsistency, options: [], optionsInfo: new Map()};\n }\n\n const parentSelectedSources = this.getParentSelectedSources(store, state);\n const allowedColumns = (\n await store.pFrameProvider.getColumns([], false, this.allowedTypes, undefined, this.annotations)\n ).filter(item => !consumedSourcesSet.has(item.toCanonicalString()));\n\n const {parentAxes, parentAxesList, optionsInfo} = await this.getAllowedAxes(store, state);\n\n const thisState: ComponentState = state.components[this.componentName];\n const options: SourceOption[] = [];\n if (this.settings.axesAllowed) {\n for (const idStr of parentAxes) {\n const id = columnOrAxisIdFromString(idStr) as AxisId;\n const axisData = optionsInfo.get(id.toCanonicalString()) as AxisData;\n\n const typeOK = this.allowedTypes.includes(axisData.spec.type);\n const annotationsOK = Object.entries(this.annotations).every(\n ([k, v]) => axisData.spec.annotations?.[k] === v\n );\n const checkBySpecOK = this.checkSourceBySpec ? this.checkSourceBySpec(axisData.spec, state) : true;\n const axisNatureOK = !this.settings.homogeneous || !axisData?.mustBeConsumed;\n const decreasingDimensionsOK = !consumedSourcesSet.has(idStr);\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(id.toCanonicalString());\n const selectedHere = thisState.selectorStates.some(item => item.selectedSource === idStr);\n\n if (typeOK && annotationsOK && checkBySpecOK && axisNatureOK && decreasingDimensionsOK && !ignored && !selectedHere) {\n options.push({value: idStr});\n }\n }\n }\n\n if (this.settings.columnsAllowed) {\n const strictlyCompatible = !this.settings.columnsWithExtraAxesAllowed && this.strictlyDependsOnParents;\n for (const columnId of allowedColumns) {\n const columnIdString = columnId.toCanonicalString();\n const id = columnOrAxisIdFromString(columnIdString);\n\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (!columnSpec) {\n continue;\n }\n const extraAxesIds = getNotAllowedAxes(\n columnSpec,\n parentAxesList,\n parentAxes,\n linkerMap\n ).map((axisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString());\n\n const extraAxesSet = new Set(extraAxesIds);\n if (\n // do not add to available options label columns, or columns that are not fit by custom spec condition, or columns that are not fit by condition for data inputs\n isLabelColumn(columnSpec) || isLinkerColumn(columnSpec) ||\n (this.checkSourceBySpec && !this.checkSourceBySpec(columnSpec, state)) ||\n (this.settings.isDataComponent && !dataColumnPredicate(columnSpec)) ||\n strictlyCompatible && extraAxesIds.length > 0 ||\n parentSelectedSources.length && extraAxesIds.length > 0 && !columnSpec.axesSpec.some((axisSpec) => {\n const axisIdStr = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return parentAxes.has(axisIdStr);\n })\n ) {\n continue;\n }\n const axesIds = columnSpec?.axesSpec?.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()) ?? [];\n const extraAxesIndexes:Record<string, number> = {};\n if (this.settings.columnsWithExtraAxesAllowed) {\n axesIds.forEach((id, idx) => {\n if (extraAxesSet.has(id)) {\n extraAxesIndexes[id] = idx;\n }\n });\n }\n if (columnSpec) {\n const label =\n labelsMap[columnIdString] ??\n (await getColumnOrAxisLabel(store, columnId.toCanonicalString(), []));\n const columnInfo: ColumnData = {\n kind: 'column',\n name: columnSpec.name,\n label,\n type: columnSpec.valueType,\n spec: columnSpec,\n annotations: columnSpec.annotations,\n isSubsetFilter: columnSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n columnSpec.valueType === 'String' ||\n columnSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n axesToBeFixed: extraAxesIds,\n axesToBeFixedIndexes: extraAxesIndexes,\n };\n optionsInfo.set(id.toCanonicalString(), columnInfo);\n }\n\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(id.toCanonicalString());\n const selectedHere = state.components[this.componentName].selectorStates.some(\n item => item.selectedSource === columnIdString\n );\n if (!ignored && !selectedHere) {\n options.push({value: columnIdString});\n }\n }\n }\n return {multipleSelectors, required, stateConsistency, options, optionsInfo};\n }\n}\n"],"names":["isLinkerColumn","columnSpec","_a","IS_LINKER_COLUMN","_ComponentController","componentName","allowedTypes","settings","strictlyDependsOnParents","dependsOn","parentComponents","annotations","checkSourceBySpec","__publicField","state","selectorState","nextState","getStateCopy","selectedSourceStr","item","store","linkerMap","componentState","parentAxes","parentAxesList","isAxisInSet","a","id","AxisId","consistencyData","selectedSource","sourceId","columnOrAxisIdFromString","isColumnId","C","getNotAllowedAxes","res","idx","selectedHereColumnIds","n","s","axes","axisSpec","selectedHere","parentSelectedSources","source","spec","optionsInfo","idStr","mustBeConsumed","axisMustBeConsumed","getColumnOrAxisLabel","SUBSET_FILTER_KEY","_b","DISCRETE_FILTER_KEY","labelsMap","consumedSourcesSet","dataColumnPredicate","ignoredNamesSet","fixedSelectedSet","multipleSelectors","required","stateConsistency","dep","name","allowedColumns","thisState","options","axisData","typeOK","annotationsOK","k","v","checkBySpecOK","axisNatureOK","decreasingDimensionsOK","ignored","strictlyCompatible","columnId","columnIdString","extraAxesIds","extraAxesSet","isLabelColumn","axisIdStr","axesIds","extraAxesIndexes","label","columnInfo","_c","ComponentController"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ComponentController.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ComponentController.ts"],"sourcesContent":["import { getNormalizedAxesList, isLabelColumn } from '@platforma-sdk/model';\nimport type {\n ColumnData,\n ComponentGuideSimple,\n ComponentState,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SourceOption,\n} from '../common';\nimport {\n COLUMN_LABEL_KEY,\n DISCRETE_FILTER_KEY,\n IS_LINKER_COLUMN,\n SUBSET_FILTER_KEY,\n} from '../constants';\nimport type { DataStore } from '../store';\nimport { AxesSet, ColumnId, ColumnOrAxisIdString } from '../spec';\nimport { AxisId, columnOrAxisIdFromString, isColumnId } from '../spec';\nimport { AxisSpec, LinkerMap, PColumnSpec, ValueType } from '@milaboratories/pl-model-common';\nimport { axisIsNonHomogenous, getColumnOrAxisLabel, getNotAllowedAxes, getStateCopy, MultipliesByMap } from '../utils';\n\nconst isLinkerColumn = (columnSpec: PColumnSpec) => columnSpec?.annotations?.[IS_LINKER_COLUMN] === 'true';\n\ninterface ComponentControllerSettings {\n isDataComponent: boolean; // X, Y, Data source etc.\n multipleSelectors: boolean; // more than 1 selected column in input\n required: boolean;\n homogeneous: boolean;\n axesAllowed: boolean;\n columnsAllowed: boolean;\n columnsWithExtraAxesAllowed: boolean; // can contain column with extra axes with fixed values\n dimensionConsumer: boolean; // remove extra dimension from data-mapping after selecting a heterogeneous axis\n}\n\ninterface FieldControllerOptions<State extends InputState, Field extends keyof State['components']> {\n componentName: Field;\n allowedTypes: ValueType[];\n checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean; // for more complicated logic than type is in allowed types and annotation exists\n annotations?: Record<string, string>;\n parentComponents?: (keyof State['components'])[];\n dependsOn?: (keyof State['components'])[];\n strictlyDependsOnParents?: boolean;\n ignoredOptionIds?: string[];\n settings: Partial<ComponentControllerSettings>;\n}\n\nexport class ComponentController<State extends InputState, Field extends keyof State['components']> {\n private static DefaultSettings: ComponentControllerSettings = {\n isDataComponent: false,\n multipleSelectors: false,\n required: false,\n homogeneous: false,\n axesAllowed: false,\n columnsAllowed: true,\n columnsWithExtraAxesAllowed: true,\n dimensionConsumer: false,\n };\n\n readonly componentName: Field;\n readonly allowedTypes: ValueType[];\n readonly settings: ComponentControllerSettings;\n private readonly dependsOn: (keyof State['components'])[];\n private readonly parentComponents: (keyof State['components'])[];\n private readonly strictlyDependsOnParents: boolean;\n private readonly annotations: Record<string, string>;\n private readonly checkSourceBySpec?: (spec: AxisSpec | PColumnSpec, state: State) => boolean;\n\n constructor({\n componentName,\n allowedTypes,\n settings,\n strictlyDependsOnParents,\n dependsOn = [],\n parentComponents = [],\n annotations = {},\n checkSourceBySpec,\n }: FieldControllerOptions<State, Field>) {\n this.componentName = componentName;\n this.allowedTypes = [...allowedTypes];\n this.settings = { ...ComponentController.DefaultSettings, ...settings };\n this.dependsOn = [...dependsOn];\n this.parentComponents = [...parentComponents]; // corresponding data components for meta or X for Y in scatterplot\n this.strictlyDependsOnParents = strictlyDependsOnParents ?? true; // meta-inputs are strictly-depending on parents, X by Y (Y by X) - don't\n this.annotations = { ...annotations };\n if (checkSourceBySpec) {\n this.checkSourceBySpec = checkSourceBySpec;\n }\n }\n\n get isRequired(): boolean {\n return this.settings.required;\n }\n\n get isDimensionsConsumer(): boolean {\n return this.settings.dimensionConsumer;\n }\n\n addSelected(state: State, selectorState: SelectorStateSimple | SelectorStateFilter) {\n const nextState = getStateCopy(state);\n nextState.components[this.componentName].selectorStates.push(selectorState as SelectorStateFilter);\n\n // ***\n // here should be logic for possibly parent qualifications updating\n // ***\n\n return nextState;\n }\n\n deleteSelected(state: State, selectedSourceStr: ColumnOrAxisIdString) {\n const nextState = getStateCopy(state);\n // ***\n // here should be logic for removing unnecessary qualifications (it can appear when some sources are deleted)\n // ***\n nextState.components[this.componentName].selectorStates = (\n nextState.components[this.componentName].selectorStates as SelectorState[]\n ).filter(item => item.selectedSource !== selectedSourceStr);\n return nextState;\n }\n\n getParentSelectedSources(state: State): (ColumnId | AxisId)[] {\n const selectedSources = this.parentComponents.reduce((res: (ColumnId | AxisId)[], item) => {\n const selectedHere = state.components[item].selectorStates.map(s =>\n columnOrAxisIdFromString(s.selectedSource)\n );\n res.push(...selectedHere);\n return res;\n }, []);\n\n // ***\n // consider parent qualifications without selected here\n // ***\n return selectedSources;\n }\n\n async getParentsAxes(store: DataStore, state: State) {\n const parentSelectedSources = this.getParentSelectedSources(state);\n const parentAxes = new Map<ColumnOrAxisIdString, { parentSource: ColumnOrAxisIdString, spec: AxisSpec }>();\n for (const source of parentSelectedSources) {\n if (isColumnId(source)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(source);\n for (const spec of columnSpec?.axesSpec ?? []) {\n const id = AxisId.fromAxisSpec(spec);\n const idStr = id.toCanonicalString();\n if (parentAxes.has(idStr)) {\n continue;\n }\n parentAxes.set(idStr, { parentSource: source.toCanonicalString(), spec });\n }\n }\n }\n\n return parentAxes;\n }\n\n async getParentAndHangingAxes(store: DataStore, state: State, linkerMap: LinkerMap, multipliesByMap: MultipliesByMap): Promise<{\n parentsAxes: AxesSet,\n hangingAxes: AxesSet,\n }> {\n const parentsAxes = await this.getParentsAxes(store, state);\n const hangingAxes: AxesSet = new Map();\n\n if (!this.settings.isDataComponent) {\n const thisState: ComponentState = state.components[this.componentName];\n const selectedHereSources = thisState.selectorStates.map((v) => v.selectedSource);\n for (const source of selectedHereSources) {\n const id = columnOrAxisIdFromString(source);\n if (!isColumnId(id)) {\n continue;\n }\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (!columnSpec) {\n continue;\n }\n const extraAxesSpecs = getNotAllowedAxes(columnSpec, Array.from(parentsAxes.values()).map(v => v.spec), linkerMap, multipliesByMap);\n\n for (const spec of extraAxesSpecs) {\n hangingAxes.set(AxisId.fromAxisSpec(spec).toCanonicalString(), { parentSource: source, spec });\n }\n }\n }\n\n return { parentsAxes, hangingAxes };\n }\n\n /** Get axes to check available columns compatibility: all parents axes + available with these parent axes linker axes */\n getColumnSourceAxes(\n allParentsAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n ): AxesSet {\n const result = new Map();\n const { parentsAxes } = allParentsAndHangingAxes[this.componentName];\n\n for (const v of parentsAxes) {\n result.set(...v);\n }\n\n if (this.settings.isDataComponent) {\n return result;\n }\n\n // normalized list concider axes parents (not component parents)\n const normalizedAxes = getNormalizedAxesList(Array.from(parentsAxes.values()).map((v) => v.spec));\n const axesAvailableWithLinkers = getNormalizedAxesList(linkerMap.getReachableByLinkersAxesFromAxes(normalizedAxes));\n\n for (const axisSpec of axesAvailableWithLinkers) {\n const key = LinkerMap.getLinkerKeyFromAxisSpec(axisSpec);\n const linkerRecord = linkerMap.data.get(key);\n const linked = Array.from(linkerRecord?.linkWith.keys() ?? []);\n const linkerColumn = linkerRecord?.linkWith.get(linked[0]);\n\n if (linkerColumn) {\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n const linkerColumnId = new ColumnId({ name: linkerColumn.columnId, type: linkerColumn.spec.valueType }).toCanonicalString();\n result.set(axisId, { parentSource: linkerColumnId, spec: axisSpec });\n }\n }\n\n for (const [id] of parentsAxes) {\n const multipliesByNode = multipliesByMap.get(id);\n const multipliesByKeys = Array.from(multipliesByNode?.keys() ?? []);\n if (multipliesByNode && multipliesByKeys.length) {\n for (const key of multipliesByKeys) {\n const el = multipliesByNode.get(key)!;\n const axisId = AxisId.fromAxisSpec(el.spec).toCanonicalString()\n result.set(axisId, { parentSource: el.parentSource, spec: el.spec });\n }\n }\n }\n\n return result;\n }\n\n /** Allowed: all axes from parent (data) inputs + hanging axes from another (not data) inputs + axes from linkers;\n * these are all axes that can be in a compatible columns + hanging axes.\n */\n getAllowedAxes(\n allParentsAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n ): AxesSet {\n const result = this.getColumnSourceAxes(allParentsAndHangingAxes, linkerMap, multipliesByMap);\n\n for (const [input, data] of Object.entries(allParentsAndHangingAxes)) {\n if (input === this.componentName) {\n continue;\n }\n for (const v of data.hangingAxes) {\n result.set(...v);\n }\n }\n return result;\n }\n\n checkStateConsistency(state: State, options: SourceOption[]) {\n const thisState: ComponentState = state.components[this.componentName];\n\n return thisState.selectorStates.reduce((res, v) => {\n res[v.selectedSource] = options.some(op => op.value === v.selectedSource);\n return res;\n }, {} as Record<string, boolean>);\n }\n\n\n async getOptions(\n store: DataStore,\n state: State,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n allParentAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>, // hanging axes from all the inputs\n dataColumnPredicate: (spec: PColumnSpec) => boolean,\n ignoredNamesSet: Set<string> = new Set(),\n fixedSelectedSet: Set<ColumnOrAxisIdString> = new Set()\n ): Promise<ComponentGuideSimple> {\n const multipleSelectors = this.settings.multipleSelectors;\n const required = this.settings.required;\n const optionsInfo = new Map();\n\n if (this.dependsOn.length && this.dependsOn.some(dep => state.components[dep].selectorStates.length === 0)) {\n return { multipleSelectors, required, stateConsistency: this.checkStateConsistency(state, []), options: [], optionsInfo };\n }\n\n if (\n this.strictlyDependsOnParents &&\n !this.settings.isDataComponent &&\n this.parentComponents.some(name => state.components[name].selectorStates.length === 0)\n ) {\n return { multipleSelectors, required, stateConsistency: this.checkStateConsistency(state, []), options: [], optionsInfo };\n }\n\n const options: SourceOption[] = [];\n if (this.settings.axesAllowed) {\n const allowedAxes = this.getAllowedAxes(allParentAndHangingAxes, linkerMap, multipliesByMap);\n for (const [idStr, { spec, parentSource }] of allowedAxes.entries()) {\n const id = columnOrAxisIdFromString(idStr) as AxisId;\n\n const isNonHomogenous = axisIsNonHomogenous(spec);\n\n const typeOK = this.allowedTypes.includes(spec.type);\n const annotationsOK = Object.entries(this.annotations).every(\n ([k, v]) => spec.annotations?.[k] === v\n );\n const checkBySpecOK = this.checkSourceBySpec ? this.checkSourceBySpec(spec, state) : true;\n const axisNatureOK = !this.settings.homogeneous || !isNonHomogenous;\n const ignored = ignoredNamesSet.has(id.name) || fixedSelectedSet.has(idStr);\n\n optionsInfo.set(idStr, {\n kind: 'axis',\n name: spec.name,\n label: await getColumnOrAxisLabel(store, idStr, [parentSource]),\n type: spec.type,\n mustBeConsumed: false,\n dividable: false,\n spec,\n annotations: spec.annotations,\n isNonHomogenous,\n isSubsetFilter: spec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter: spec.type === 'String' || spec.annotations?.[DISCRETE_FILTER_KEY] === 'true',\n parentSources: [parentSource],\n });\n\n if (typeOK && annotationsOK && checkBySpecOK && axisNatureOK && !ignored) {\n options.push({ value: idStr });\n }\n }\n }\n\n if (this.settings.columnsAllowed) {\n const allowedColumns = await store.pFrameProvider.getColumns([], false, this.allowedTypes, undefined, this.annotations);\n const strictlyCompatible = !this.settings.columnsWithExtraAxesAllowed && this.strictlyDependsOnParents;\n const columnSourceAxes = this.getColumnSourceAxes(allParentAndHangingAxes, linkerMap, multipliesByMap);\n\n for (const columnId of allowedColumns) {\n const columnIdString = columnId.toCanonicalString();\n\n const columnSpec = await store.pFrameProvider.getColumnSpecById(columnId);\n if (!columnSpec) {\n continue;\n }\n const parentsAxes = allParentAndHangingAxes[this.componentName].parentsAxes;\n const columnAxesIds = columnSpec.axesSpec.map((spec) => AxisId.fromAxisSpec(spec).toCanonicalString());\n if (\n // do not add to available options label columns, or columns that are not fit by custom spec condition, or columns that are not fit by condition for data inputs\n isLabelColumn(columnSpec) || isLinkerColumn(columnSpec) ||\n (this.checkSourceBySpec && !this.checkSourceBySpec(columnSpec, state)) ||\n (this.settings.isDataComponent && !dataColumnPredicate(columnSpec)) ||\n strictlyCompatible && columnSourceAxes.size && columnAxesIds.some((id) => !columnSourceAxes.has(id)) ||\n parentsAxes.size && !(columnAxesIds.some((id) => parentsAxes.has(id)) || columnAxesIds.every((id) => columnSourceAxes.has(id)))\n ) {\n continue;\n }\n\n const columnInfo: ColumnData = {\n kind: 'column',\n name: columnSpec.name,\n label: columnSpec.annotations?.[COLUMN_LABEL_KEY] ?? columnSpec.name,\n type: columnSpec.valueType,\n spec: columnSpec,\n annotations: columnSpec.annotations,\n isSubsetFilter: columnSpec.annotations?.[SUBSET_FILTER_KEY] === 'true',\n isDiscreteFilter:\n columnSpec.valueType === 'String' ||\n columnSpec.annotations?.[DISCRETE_FILTER_KEY] === 'true'\n };\n optionsInfo.set(columnIdString, columnInfo);\n\n const ignored = ignoredNamesSet.has(columnId.name) || fixedSelectedSet.has(columnIdString);\n if (!ignored) {\n options.push({ value: columnIdString });\n }\n }\n }\n return {\n multipleSelectors,\n required,\n stateConsistency: this.checkStateConsistency(state, options),\n options,\n optionsInfo\n };\n }\n}\n"],"names":["isLinkerColumn","columnSpec","_a","IS_LINKER_COLUMN","_ComponentController","componentName","allowedTypes","settings","strictlyDependsOnParents","dependsOn","parentComponents","annotations","checkSourceBySpec","__publicField","state","selectorState","nextState","getStateCopy","selectedSourceStr","item","res","selectedHere","s","columnOrAxisIdFromString","store","parentSelectedSources","parentAxes","source","isColumnId","spec","idStr","AxisId","linkerMap","multipliesByMap","parentsAxes","hangingAxes","selectedHereSources","v","id","extraAxesSpecs","getNotAllowedAxes","allParentsAndHangingAxes","result","normalizedAxes","getNormalizedAxesList","axesAvailableWithLinkers","axisSpec","key","LinkerMap","linkerRecord","linked","linkerColumn","axisId","linkerColumnId","ColumnId","multipliesByNode","multipliesByKeys","el","input","data","options","op","allParentAndHangingAxes","dataColumnPredicate","ignoredNamesSet","fixedSelectedSet","multipleSelectors","required","optionsInfo","dep","name","allowedAxes","parentSource","isNonHomogenous","axisIsNonHomogenous","typeOK","annotationsOK","k","checkBySpecOK","axisNatureOK","ignored","getColumnOrAxisLabel","SUBSET_FILTER_KEY","_b","DISCRETE_FILTER_KEY","allowedColumns","strictlyCompatible","columnSourceAxes","columnId","columnIdString","columnAxesIds","isLabelColumn","columnInfo","_c","COLUMN_LABEL_KEY","_d","_e","ComponentController"],"mappings":"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","x_google_ignoreList":[0]}