@milaboratories/graph-maker 1.1.150 → 1.1.151

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 (69) hide show
  1. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.d.ts +3 -10
  2. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.d.ts.map +1 -1
  3. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.js +42 -83
  4. package/dist/GraphMaker/components/DragAndDrop/DnDBasketChip.vue.js.map +1 -1
  5. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.d.ts +1 -5
  6. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.d.ts.map +1 -1
  7. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.js +43 -85
  8. package/dist/GraphMaker/components/DragAndDrop/DnDRangeChip.vue.js.map +1 -1
  9. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.d.ts +1 -3
  10. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.d.ts.map +1 -1
  11. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.js +73 -85
  12. package/dist/GraphMaker/components/DragAndDrop/DndBasket.vue.js.map +1 -1
  13. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts +1 -5
  14. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts.map +1 -1
  15. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js +51 -91
  16. package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js.map +1 -1
  17. package/dist/GraphMaker/components/DragAndDrop/types.d.ts +0 -19
  18. package/dist/GraphMaker/components/DragAndDrop/types.d.ts.map +1 -1
  19. package/dist/GraphMaker/constantsCommon.d.ts +0 -1
  20. package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
  21. package/dist/GraphMaker/constantsCommon.js +45 -46
  22. package/dist/GraphMaker/constantsCommon.js.map +1 -1
  23. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.d.ts.map +1 -1
  24. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.js +115 -145
  25. package/dist/GraphMaker/forms/DataMappingForm/DendroForm.vue.js.map +1 -1
  26. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.d.ts.map +1 -1
  27. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.js +95 -125
  28. package/dist/GraphMaker/forms/DataMappingForm/useBaskets.js.map +1 -1
  29. package/dist/GraphMaker/forms/DataMappingForm/utils.d.ts.map +1 -1
  30. package/dist/GraphMaker/forms/DataMappingForm/utils.js +77 -153
  31. package/dist/GraphMaker/forms/DataMappingForm/utils.js.map +1 -1
  32. package/dist/GraphMaker/store.d.ts.map +1 -1
  33. package/dist/GraphMaker/store.js +41 -43
  34. package/dist/GraphMaker/store.js.map +1 -1
  35. package/dist/GraphMaker/utils/loadDefaultSources.d.ts +1 -2
  36. package/dist/GraphMaker/utils/loadDefaultSources.d.ts.map +1 -1
  37. package/dist/GraphMaker/utils/loadDefaultSources.js +43 -47
  38. package/dist/GraphMaker/utils/loadDefaultSources.js.map +1 -1
  39. package/dist/GraphMaker/utils/loadUniqueValuesToSave.d.ts.map +1 -1
  40. package/dist/GraphMaker/utils/loadUniqueValuesToSave.js +34 -36
  41. package/dist/GraphMaker/utils/loadUniqueValuesToSave.js.map +1 -1
  42. package/dist/node_modules/@milaboratories/pf-plots/dist/constants.js +6 -5
  43. package/dist/node_modules/@milaboratories/pf-plots/dist/constants.js.map +1 -1
  44. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js +146 -149
  45. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js.map +1 -1
  46. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js +165 -218
  47. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js.map +1 -1
  48. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js +95 -102
  49. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/bubble.js.map +1 -1
  50. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/dendro.js +145 -156
  51. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/dendro.js.map +1 -1
  52. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/discrete.js +68 -75
  53. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/discrete.js.map +1 -1
  54. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js +154 -159
  55. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js.map +1 -1
  56. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/histogram.js +48 -55
  57. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/histogram.js.map +1 -1
  58. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js +114 -122
  59. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js.map +1 -1
  60. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js +111 -119
  61. package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js.map +1 -1
  62. package/dist/node_modules/@milaboratories/pf-plots/dist/index.js +4 -4
  63. package/dist/node_modules/@milaboratories/pf-plots/dist/pframe/ColumnsProvider.js +70 -69
  64. package/dist/node_modules/@milaboratories/pf-plots/dist/pframe/ColumnsProvider.js.map +1 -1
  65. package/dist/node_modules/@milaboratories/pf-plots/dist/spec.js +2 -2
  66. package/dist/node_modules/@milaboratories/pf-plots/dist/spec.js.map +1 -1
  67. package/dist/node_modules/@milaboratories/pf-plots/dist/utils.js +183 -187
  68. package/dist/node_modules/@milaboratories/pf-plots/dist/utils.js.map +1 -1
  69. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ControllerBase.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts"],"sourcesContent":["import {\n AxisSpec,\n LinkerMap,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2\n} from '@milaboratories/pl-model-common';\nimport {deriveLabels} from '@platforma-sdk/model';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport { DISCRETE_VALUES_KEY, HIGH_CARDINALITY } from '../constants';\nimport { PValue } from '../store';\nimport type { DataStore } from '../store';\nimport type { ColumnOrAxisIdString } from '../spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString, isColumnId } from '../spec';\nimport {\n addSourceInfoToMap,\n createLinkerMap,\n dataColumnPredicateDefault,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n} from '../utils';\nimport { ComponentController } from './ComponentController';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?:number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) {}\n\n get requiredComponents(): (keyof State['components'])[] {\n const components: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n components.push(componentName);\n }\n }\n return components;\n }\n\n get dimensionsConsumerComponents(): (keyof State['components'])[] {\n const components: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n components.push(componentName);\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n components.push(componentName);\n }\n }\n return components;\n }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n async getMustBeConsumedAxes(store: DataStore, state: State): Promise<Set<ColumnOrAxisIdString>> {\n return Promise.resolve(new Set());\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n async getSelectedSourcesInfo(\n store: DataStore,\n state: State,\n labelsMap: Record<string, string>,\n linkerMap: LinkerMap\n ): Promise<Map<ColumnOrAxisIdString, AxisData | ColumnData>> {\n const result: Map<ColumnOrAxisIdString, AxisData> = new Map();\n\n const dataAxes = new Set<string>();\n const dataAxesList: AxisSpec[] = [];\n for (const inputName of this.dataInputs) {\n for (const selectorState of state.components[inputName].selectorStates) {\n const id = columnOrAxisIdFromString(selectorState.selectedSource);\n if (isColumnId(id)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(id);\n if (columnSpec) {\n columnSpec.axesSpec.forEach(axisSpec => {\n const idStr = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!dataAxes.has(idStr)) {\n dataAxes.add(idStr);\n dataAxesList.push(axisSpec);\n }\n });\n }\n }\n }\n }\n for (const [inputName , {selectorStates}] of Object.entries(state.components)) {\n const component = this.simpleComponentControllers[inputName as keyof typeof this.simpleComponentControllers]\n ?? this.filterComponentControllers[inputName as keyof typeof this.filterComponentControllers] as ComponentController<State, typeof inputName>;\n const fixedAxesAllowed = component.settings.columnsWithExtraAxesAllowed;\n for (const {selectedSource} of selectorStates) {\n await addSourceInfoToMap(\n store,\n selectedSource,\n labelsMap[selectedSource],\n result,\n dataAxesList,\n dataAxes,\n fixedAxesAllowed,\n linkerMap\n );\n }\n }\n return result;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n freeOptionsSet: new Set(),\n axesToBeFixedSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n for (const componentName of this.dimensionsConsumerComponents) {\n for (const {selectedSource} of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n return consumedSourcesSet;\n }\n\n async getLabelsMap(store: DataStore, state: State) {\n const availableColumns = await store.pFrameProvider.getColumnsFull(\n this.dataInputs.reduce((res: (ColumnId | AxisId)[], inputName) => {\n const componentState = state.components[inputName];\n const sources = componentState.selectorStates.map(st => columnOrAxisIdFromString(st.selectedSource));\n return res.concat(sources);\n }, []),\n false\n );\n return deriveLabels(availableColumns, el => el.spec).reduce((res: Record<string, string>, el) => {\n const id = new ColumnId({name: el.value.columnId, type: el.value.spec.valueType}).toCanonicalString();\n res[id] = el.label;\n return res;\n }, {});\n }\n\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // set of columns and axes that selected in consumer-dimensions components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n const linkerMap = await createLinkerMap(store)\n\n const labelsMap = await this.getLabelsMap(store, state); // improved labels with name separation for different columns with the same name; for axes - name from spec or labels column\n const selectedColumnsOrAxesInfo = await this.getSelectedSourcesInfo(store, state, labelsMap, linkerMap);\n const optionsInfo: Map<ColumnOrAxisIdString, ColumnData | AxisData> = new Map();\n\n const allControllers = {...this.simpleComponentControllers, ...this.filterComponentControllers};\n const freeOptionsSet = new Set<ColumnOrAxisIdString>();\n for (const [name, componentController] of Object.entries(allControllers)) {\n const options = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getOptions(\n store,\n state,\n labelsMap,\n consumedSourcesSet,\n linkerMap,\n dataColumnPredicate,\n ignoredNamesSet,\n fixedSelectedSet\n );\n if (!this.dataInputs.includes(name as string)) {\n options.options.forEach(item => {\n freeOptionsSet.add(item.value);\n });\n }\n for (const [key, v] of options.optionsInfo) {\n optionsInfo.set(key, v);\n }\n resultComponentsGuide[name as keyof InputOptionsUnion<State>] =\n options as (typeof resultComponentsGuide)[keyof InputOptionsUnion<State>];\n }\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n const selected = selectedColumnsOrAxesInfo.get(id);\n if (selected && selected.kind === 'axis') {\n selected.mustBeConsumed = true;\n }\n };\n // axes from heatmap data column, to make visible what axes should be; hanging axes from scatterplot\n const mustBeConsumedAxes = await this.getMustBeConsumedAxes(store, state);\n for (const id of mustBeConsumedAxes) {\n markMustBeConsumed(id);\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n const info = selectedColumnsOrAxesInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const {selectedSource} of state.components[inputName].selectorStates) {\n const info = selectedColumnsOrAxesInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!freeOptionsSet.has(idStr) && !consumedHighCardinalityAxes.has(idStr)) {\n // return axis to the list of free axis if it is selected somewhere, but nothing with this axis is in the filters\n freeOptionsSet.add(idStr);\n }\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!freeOptionsSet.has(idStr)) {\n freeOptionsSet.add(idStr);\n }\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n\n const axesToBeFixedSet = new Set<ColumnOrAxisIdString>();\n for (const {selectorStates} of Object.values(state.components)) {\n for (const {selectedSource} of selectorStates) {\n const info = selectedColumnsOrAxesInfo.get(selectedSource);\n if (info && info.kind === 'column') {\n info.axesToBeFixed.forEach(axisIdStr => {\n axesToBeFixedSet.add(axisIdStr);\n });\n }\n }\n }\n\n const consistent = await this.isConsistent(store, state, linkerMap);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => {\n const id = columnOrAxisIdFromString(sourceIdStr).toCanonicalString() ?? sourceIdStr;\n return optionsInfo.get(id) ?? selectedColumnsOrAxesInfo.get(id) ?? getDefaultInfo(sourceIdStr);\n };\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n freeOptionsSet,\n axesToBeFixedSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(store, state, consistent, freeOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?:number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values:{value:string, label:string}[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', {numeric: true}))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({value: v, label: v}));\n sortValues(values);\n return {values, overflow: false};\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters:PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const {data: dataValues, axesData} = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values:{value: string, label: string}[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({value: String(axisKeys[i]), label: String(dataValues[i])});\n }\n sortValues(values);\n return {values, overflow: !(limit === undefined || axisKeys.length < limit)};\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({value: String(v), label: String(v)}));\n sortValues(values);\n return {values, overflow: response.overflow};\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters:PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({value: String(v), label: String(v)}));\n sortValues(values);\n return {values, overflow: response.overflow};\n }\n return {values: [], overflow: false};\n }\n\n async checkStateConsistency(\n store: DataStore,\n state: State,\n linkerMap: LinkerMap\n ): Promise<Map<keyof State['components'], Record<string, boolean>>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n for (const component of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n await this.simpleComponentControllers[component].checkStateConsistency(store, state, linkerMap)\n );\n }\n for (const component of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n await this.filterComponentControllers[component].checkStateConsistency(store, state, linkerMap)\n );\n }\n return result;\n }\n\n async isConsistent(store: DataStore, state: State, linkerMap: LinkerMap): Promise<boolean> {\n const consistency = await this.checkStateConsistency(store, state, linkerMap);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n store: DataStore,\n state: State,\n consistent: boolean,\n freeOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of freeOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n let hasNotSelectedAxisToBeFixed: boolean = false;\n for (const {selectorStates} of Object.values(state.components)) {\n for (const {selectedSource, fixedAxes} of selectorStates) {\n const info = getSourceInfo(selectedSource);\n if (\n info &&\n info.kind === 'column' &&\n info.axesToBeFixed.some(\n id => (fixedAxes ?? []).find(el => el.axisSource === id)?.axisValue === undefined\n )\n ) {\n hasNotSelectedAxisToBeFixed = true;\n break;\n }\n }\n if (hasNotSelectedAxisToBeFixed) {\n break;\n }\n }\n return (\n this.requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions &&\n !hasNotSelectedAxisToBeFixed\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n"],"names":["ControllerBase","simpleComponentControllers","filterComponentControllers","__publicField","components","componentName","inputName","state","selectorState","store","nextSelectorStates","currentStates","deletedStates","currentState","s","addedStates","nextState","h","getStateCopy","st","axis","key","value","labelsMap","linkerMap","result","dataAxes","dataAxesList","id","columnOrAxisIdFromString","isColumnId","columnSpec","axisSpec","idStr","AxisId","selectorStates","fixedAxesAllowed","selectedSource","addSourceInfoToMap","sourceIdStr","getDefaultInfo","consumedSourcesSet","availableColumns","res","sources","a","deriveLabels","el","ColumnId","fixedIds","dataColumnPredicate","dataColumnPredicateDefault","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","createLinkerMap","selectedColumnsOrAxesInfo","optionsInfo","allControllers","freeOptionsSet","name","componentController","options","item","v","markMustBeConsumed","option","selected","mustBeConsumedAxes","isHighCardinality","spec","_a","HIGH_CARDINALITY","consumedHighCardinalityAxes","consumed","info","axesToBeFixedSet","axisIdStr","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","values","b","discreteValuesStr","DISCRETE_VALUES_KEY","discreteValues","axisId","parentSources","labelsColumnId","getColumnOrAxisValueLabelsId","filters","dataValues","axesData","axisKeys","i","searchInLabelsOrValue","response","w","columnId","component","consistency","hasFreeDimensions","optionId","hasNotSelectedAxisToBeFixed","fixedAxes","S"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ControllerBase.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts"],"sourcesContent":["import {\n AxisSpec,\n LinkerMap,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2\n} from '@milaboratories/pl-model-common';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport { DISCRETE_VALUES_KEY, HIGH_CARDINALITY } from '../constants';\nimport { PValue } from '../store';\nimport type { DataStore } from '../store';\nimport type { AxesSet, ColumnOrAxisIdString } from '../spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString } from '../spec';\nimport {\n createLinkerMap,\n createMultipliesByMap,\n dataColumnPredicateDefault,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n MultipliesByMap,\n OptionsInfo,\n} from '../utils';\nimport { ComponentController } from './ComponentController';\nimport { deriveLabels } from '@platforma-sdk/model';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n readonly allowHangingAxes: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) { }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n fullOptionsSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const dimensionsConsumerComponents: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n dimensionsConsumerComponents.push(componentName);\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n dimensionsConsumerComponents.push(componentName);\n }\n }\n\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n for (const componentName of dimensionsConsumerComponents) {\n for (const { selectedSource } of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n return consumedSourcesSet;\n }\n\n async getParentAndHangingAxesByInputs(store: DataStore, state: State, linkerMap: LinkerMap, multipliesByMap: MultipliesByMap): Promise<Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>> {\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n const result: Record<string, { parentsAxes: AxesSet, hangingAxes: AxesSet }> = {};\n for (const [name, componentController] of Object.entries(allControllers)) {\n result[name] = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getParentAndHangingAxes(store, state, linkerMap, multipliesByMap);\n }\n\n return result as Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>;\n }\n\n /** Depends on chart type. */\n getMustBeConsumedAxes(state: State, optionsInfo: OptionsInfo): Set<ColumnOrAxisIdString> {\n return new Set();\n }\n\n /** Axes that go to the \"Drag to build the chart\" section.\n * If some of them is not moved to 'filters', 'tabBy' or 'facetBy' (dimension reducers) chart can't be rendered */\n markMustBeConsumedAxes(\n state: State,\n optionsInfo: OptionsInfo,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n parentAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>\n ) {\n // set of columns and axes that selected in dimension-reducing components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n };\n // Depends on chart type: axes from heatmap data column, to make visible what axes should be moved to x/y; hanging axes from X/Y scatterplot\n const mustBeConsumedAxes = this.getMustBeConsumedAxes(state, optionsInfo);\n for (const idStr of mustBeConsumedAxes) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (!this.allowHangingAxes) {\n // All 'hanging' axes must be moved to dimension reducers (for example, axes that exist in X/Y/Data source column, but not exist in Grouping)\n Object.entries(parentAndHangingAxes).forEach(([name, { hangingAxes }]) => {\n for (const idStr of hangingAxes.keys()) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n });\n }\n\n // Mark all non-homogenous axes\n for (const idStr of fullOptionsSet) {\n const info = optionsInfo.get(idStr);\n if (info?.kind === 'axis' && info.isNonHomogenous && !consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n const info = optionsInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const { selectedSource } of state.components[inputName].selectorStates) {\n const info = optionsInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n }\n\n setColumnLabels(optionsSet: Set<ColumnOrAxisIdString>, optionsInfo: OptionsInfo) {\n const columnIds = [...optionsSet].filter((v) => optionsInfo.get(v)?.kind === 'column');\n const labelsMap = deriveLabels(columnIds, (id: string) => (optionsInfo.get(id) as ColumnData).spec);\n columnIds.forEach((id, idx) => {\n optionsInfo.get(id)!.label = labelsMap[idx].label;\n });\n\n }\n\n /** Calculates information for data-mapping interface: \n * options for every input (basket), \n * information for every option (label, value type, must be consumed etc),\n * information about full data-mapping state (ready to data loading and rendering or not, contains inconsistency or not) */\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n // Two type of linkers: regular ones and \"multiplying\"\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const optionsInfo: OptionsInfo = new Map();\n const fullOptionsSet = new Set<ColumnOrAxisIdString>();\n\n const parentAndHangingAxes = await this.getParentAndHangingAxesByInputs(store, state, linkerMap, multipliesByMap);\n\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n for (const [name, componentController] of Object.entries(allControllers) as ([keyof InputOptionsUnion<State>, ComponentController<State, SimpleComponents<State> | FilterComponents<State>>][])) {\n const componentGuide = await componentController.getOptions(\n store, state,\n linkerMap, multipliesByMap,\n parentAndHangingAxes,\n dataColumnPredicate,\n ignoredNamesSet, fixedSelectedSet\n );\n for (const item of componentGuide.options) {\n fullOptionsSet.add(item.value);\n }\n for (const v of componentGuide.optionsInfo) {\n optionsInfo.set(...v);\n }\n resultComponentsGuide[name] = componentGuide;\n }\n\n this.markMustBeConsumedAxes(state, optionsInfo, fullOptionsSet, parentAndHangingAxes);\n this.setColumnLabels(fullOptionsSet, optionsInfo);\n\n const consistent = this.isConsistent(state, resultComponentsGuide as ComponentsGuide<State['components']>);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => optionsInfo.get(sourceIdStr) ?? getDefaultInfo(sourceIdStr);\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n fullOptionsSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(state, consistent, fullOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({ value: v, label: v }));\n sortValues(values);\n return { values, overflow: false };\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters: PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const { data: dataValues, axesData } = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values: { value: string, label: string }[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n sortValues(values);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n return { values: [], overflow: false };\n }\n\n checkStateConsistency(\n state: State, componentsGuide: ComponentsGuide<State['components']>\n ): Map<keyof State['components'], Record<string, boolean>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n\n for (const component of Object.keys(allControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n allControllers[component].checkStateConsistency(state, componentsGuide[component].options)\n );\n }\n return result;\n }\n\n isConsistent(state: State, componentsGuide: ComponentsGuide<State['components']>): boolean {\n const consistency = this.checkStateConsistency(state, componentsGuide);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n state: State,\n consistent: boolean,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of fullOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n\n const requiredComponents: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n requiredComponents.push(componentName);\n }\n }\n\n return (\n requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n"],"names":["ControllerBase","simpleComponentControllers","filterComponentControllers","__publicField","inputName","state","selectorState","store","nextSelectorStates","currentStates","deletedStates","currentState","s","addedStates","nextState","a","getStateCopy","st","axis","key","value","sourceIdStr","getDefaultInfo","dimensionsConsumerComponents","componentName","consumedSourcesSet","selectedSource","linkerMap","multipliesByMap","allControllers","result","name","componentController","optionsInfo","fullOptionsSet","parentAndHangingAxes","markMustBeConsumed","id","option","mustBeConsumedAxes","idStr","hangingAxes","info","isHighCardinality","spec","_a","HIGH_CARDINALITY","consumedHighCardinalityAxes","consumed","AxisId","optionsSet","columnIds","v","labelsMap","deriveLabels","idx","fixedIds","dataColumnPredicate","dataColumnPredicateDefault","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","createLinkerMap","createMultipliesByMap","componentGuide","item","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","values","b","discreteValuesStr","DISCRETE_VALUES_KEY","discreteValues","axisId","columnOrAxisIdFromString","parentSources","labelsColumnId","getColumnOrAxisValueLabelsId","filters","dataValues","axesData","axisKeys","i","searchInLabelsOrValue","response","columnId","f","componentsGuide","component","consistency","hasFreeDimensions","optionId","requiredComponents"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,11 +1,11 @@
1
- import H from "../../_virtual/canonicalize.js";
2
- import { FORMAT as J } from "../../constants.js";
3
- import { ControllerBase as K } from "../ControllerBase.js";
4
- import { ComponentController as w } from "../ComponentController.js";
5
- import { columnOrAxisIdFromString as C, AxisId as G, isColumnId as c } from "../../spec.js";
6
- import { checkSourceBySpecForFilters as Q, createLinkerMap as W, getFiltersFromStates as X, getAxesSpecsFromSources as Y, getLinkerColumnsForSource as N, getColumnOrAxisValueLabelsId as A, getColumnOrAxisLabel as D, getColumnOrAxisSpec as Z } from "../../utils.js";
7
- var _ = Object.defineProperty, $ = (m, e, t) => e in m ? _(m, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : m[e] = t, E = (m, e, t) => $(m, typeof e != "symbol" ? e + "" : e, t);
8
- const se = {
1
+ import E from "../../_virtual/canonicalize.js";
2
+ import { FORMAT as k } from "../../constants.js";
3
+ import { ControllerBase as W } from "../ControllerBase.js";
4
+ import { ComponentController as y } from "../ComponentController.js";
5
+ import { AxisId as K, columnOrAxisIdFromString as w, isColumnId as c } from "../../spec.js";
6
+ import { createLinkerMap as H, createMultipliesByMap as J, getFiltersFromStates as R, getAxesSpecsFromSources as U, getLinkerColumnsForSource as F, getColumnOrAxisValueLabelsId as x, getColumnOrAxisLabel as A, getColumnOrAxisSpec as G } from "../../utils.js";
7
+ var Q = Object.defineProperty, X = (m, e, t) => e in m ? Q(m, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : m[e] = t, j = (m, e, t) => X(m, typeof e != "symbol" ? e + "" : e, t);
8
+ const oe = {
9
9
  type: "bubble",
10
10
  components: {
11
11
  valueSize: { type: "simple", selectorStates: [] },
@@ -19,23 +19,23 @@ const se = {
19
19
  },
20
20
  dividedAxes: {}
21
21
  };
22
- function z(m, e) {
22
+ function P(m, e) {
23
23
  if (!e.length)
24
24
  return [];
25
- const t = e.map((l) => C(l)), v = Object.values(m.columnsData)[0].length, i = [];
25
+ const t = e.map((l) => w(l)), v = Object.values(m.columnsData)[0].length, u = [];
26
26
  for (let l = 0; l < v; l++) {
27
- const u = t.map((p) => {
27
+ const i = t.map((p) => {
28
28
  const d = p.toCanonicalString();
29
29
  return c(p) ? m.columnsData[d][l] : m.axesData[d][l];
30
30
  }).join(", ");
31
- i.push(u);
31
+ u.push(i);
32
32
  }
33
- return i;
33
+ return u;
34
34
  }
35
- class re extends K {
35
+ class le extends W {
36
36
  constructor() {
37
37
  super({
38
- valueSize: new w({
38
+ valueSize: new y({
39
39
  componentName: "valueSize",
40
40
  allowedTypes: ["Int", "Long", "Double", "Float"],
41
41
  strictlyDependsOnParents: !0,
@@ -47,7 +47,7 @@ class re extends K {
47
47
  required: !0
48
48
  }
49
49
  }),
50
- valueColor: new w({
50
+ valueColor: new y({
51
51
  componentName: "valueColor",
52
52
  allowedTypes: ["Int", "Long", "Double", "Float"],
53
53
  strictlyDependsOnParents: !0,
@@ -59,7 +59,7 @@ class re extends K {
59
59
  required: !0
60
60
  }
61
61
  }),
62
- x: new w({
62
+ x: new y({
63
63
  componentName: "x",
64
64
  allowedTypes: ["Int", "String", "Long"],
65
65
  strictlyDependsOnParents: !0,
@@ -72,7 +72,7 @@ class re extends K {
72
72
  columnsAllowed: !1
73
73
  }
74
74
  }),
75
- y: new w({
75
+ y: new y({
76
76
  componentName: "y",
77
77
  allowedTypes: ["Int", "String", "Long"],
78
78
  strictlyDependsOnParents: !0,
@@ -85,7 +85,7 @@ class re extends K {
85
85
  columnsAllowed: !1
86
86
  }
87
87
  }),
88
- tooltipContent: new w({
88
+ tooltipContent: new y({
89
89
  componentName: "tooltipContent",
90
90
  allowedTypes: ["String", "Int", "Long", "Float", "Double"],
91
91
  strictlyDependsOnParents: !0,
@@ -96,7 +96,7 @@ class re extends K {
96
96
  multipleSelectors: !0
97
97
  }
98
98
  }),
99
- facetBy: new w({
99
+ facetBy: new y({
100
100
  componentName: "facetBy",
101
101
  allowedTypes: ["String", "Int", "Long"],
102
102
  strictlyDependsOnParents: !0,
@@ -108,7 +108,7 @@ class re extends K {
108
108
  }
109
109
  })
110
110
  }, {
111
- filters: new w({
111
+ filters: new y({
112
112
  componentName: "filters",
113
113
  allowedTypes: ["String", "Int", "Long", "Double", "Long"],
114
114
  strictlyDependsOnParents: !0,
@@ -118,10 +118,9 @@ class re extends K {
118
118
  axesAllowed: !0,
119
119
  dimensionConsumer: !0,
120
120
  multipleSelectors: !0
121
- },
122
- checkSourceBySpec: Q
121
+ }
123
122
  }),
124
- tabBy: new w({
123
+ tabBy: new y({
125
124
  componentName: "tabBy",
126
125
  allowedTypes: ["String", "Int"],
127
126
  strictlyDependsOnParents: !0,
@@ -132,147 +131,141 @@ class re extends K {
132
131
  dimensionConsumer: !0
133
132
  }
134
133
  })
135
- }), E(this, "dataInputs", ["valueSize", "valueColor"]), E(this, "dontAllowUnfilteredHighCardinality", !0);
134
+ }), j(this, "dataInputs", ["valueSize", "valueColor"]), j(this, "dontAllowUnfilteredHighCardinality", !0);
136
135
  }
137
- async getMustBeConsumedAxes(e, t) {
138
- if (!t.components.valueColor.selectorStates.length)
136
+ getMustBeConsumedAxes(e, t) {
137
+ if (!e.components.valueColor.selectorStates.length)
139
138
  return /* @__PURE__ */ new Set();
140
- const v = t.components.valueColor.selectorStates[0].selectedSource, i = await e.pFrameProvider.getColumnSpecById(C(v));
141
- return i ? new Set(i.axesSpec.map((l) => G.fromAxisSpec(l).toCanonicalString())) : /* @__PURE__ */ new Set();
139
+ const v = e.components.valueColor.selectorStates[0].selectedSource, u = t.get(v);
140
+ return !u || u.kind !== "column" ? /* @__PURE__ */ new Set() : new Set(u.spec.axesSpec.map((l) => K.fromAxisSpec(l).toCanonicalString()));
142
141
  }
143
142
  async createDataByColumns(e, t) {
144
- var v, i;
145
- const l = (v = t.components.valueColor.selectorStates[0]) == null ? void 0 : v.selectedSource, u = (i = t.components.valueSize.selectorStates[0]) == null ? void 0 : i.selectedSource;
146
- if (!l || !u)
143
+ var v, u;
144
+ const l = (v = t.components.valueColor.selectorStates[0]) == null ? void 0 : v.selectedSource, i = (u = t.components.valueSize.selectorStates[0]) == null ? void 0 : u.selectedSource;
145
+ if (!l || !i)
147
146
  throw Error("Value column is not valid");
148
- const p = C(l), d = C(u);
147
+ const p = w(l), d = w(i);
149
148
  if (!p || !d || !c(p) && !c(d))
150
149
  throw Error("Value column is not valid");
151
150
  const s = {
152
151
  type: "columns",
153
- id: H(t.components) ?? "",
152
+ id: E(t.components) ?? "",
154
153
  values: {}
155
- }, h = await W(e), g = [
154
+ }, D = await H(e), L = await J(e), b = [
156
155
  ...t.components.filters.selectorStates,
157
156
  ...t.components.tabBy.selectorStates
158
- ], I = X(g), O = g.map((o) => C(o.selectedSource)).filter(c), x = [p, d].filter(c), f = x.map((o) => o.toCanonicalString()), B = await Y(e, f), F = [
157
+ ], O = R(b), z = b.map((o) => w(o.selectedSource)).filter(c), h = [p, d].filter(c), C = h.map((o) => o.toCanonicalString()), B = await U(e, C), a = [
159
158
  t.components.facetBy,
160
159
  t.components.x,
161
160
  t.components.y,
162
161
  t.components.tooltipContent
163
- ], a = [], y = x.map(() => []), b = [], S = [];
164
- for (const { selectedSource: o, fixedAxes: n } of g)
165
- S.push(...await N(
162
+ ], S = [], g = [];
163
+ for (const { selectedSource: o } of b)
164
+ g.push(...await F(
166
165
  e,
167
- h,
166
+ D,
167
+ L,
168
168
  B,
169
- o,
170
- n
171
- )), y.push(
172
- (n ?? []).map(({ axisIdx: L, axisValue: P }) => ({ idx: L, value: P }))
173
- );
174
- for (const o of F)
175
- for (const { selectedSource: n, fixedAxes: L } of o.selectorStates) {
176
- a.push(C(n)), b.push(
177
- (L ?? []).map(({ axisIdx: U, axisValue: R }) => ({ idx: U, value: R }))
178
- ), S.push(...await N(
169
+ o
170
+ ));
171
+ for (const o of a)
172
+ for (const { selectedSource: r } of o.selectorStates) {
173
+ S.push(w(r)), g.push(...await F(
179
174
  e,
180
- h,
175
+ D,
176
+ L,
181
177
  B,
182
- n,
183
- L
178
+ r
184
179
  ));
185
- const P = await A(e, n, f);
186
- P && a.push(P);
180
+ const T = await x(e, r, C);
181
+ T && S.push(T);
187
182
  }
188
- const r = await e.pFrameProvider.getTableOuterJoin(
189
- [...x, ...S, ...O],
190
- a,
191
- I,
192
- !0,
193
- y,
194
- b
183
+ const n = await e.pFrameProvider.getTableOuterJoin(
184
+ [...h, ...g, ...z],
185
+ S,
186
+ O,
187
+ !0
195
188
  );
196
- a.forEach((o) => {
197
- const n = o.toCanonicalString();
198
- s.values[n] = c(o) ? r.columnsData[n] : r.axesData[n];
199
- }), s.values[l] = c(p) ? r.columnsData[l] : r.axesData[l], s.values[u] = c(d) ? r.columnsData[u] : r.axesData[u];
200
- const j = t.components.x.selectorStates.map((o) => o.selectedSource), V = j.join(", "), k = await Promise.all(j.map(
189
+ S.forEach((o) => {
190
+ const r = o.toCanonicalString();
191
+ s.values[r] = c(o) ? n.columnsData[r] : n.axesData[r];
192
+ }), s.values[l] = c(p) ? n.columnsData[l] : n.axesData[l], s.values[i] = c(d) ? n.columnsData[i] : n.axesData[i];
193
+ const f = t.components.x.selectorStates.map((o) => o.selectedSource), N = f.join(", "), M = await Promise.all(f.map(
201
194
  async (o) => {
202
- var n;
203
- return ((n = await A(e, o, f)) == null ? void 0 : n.toCanonicalString()) ?? o;
195
+ var r;
196
+ return ((r = await x(e, o, C)) == null ? void 0 : r.toCanonicalString()) ?? o;
204
197
  }
205
198
  ));
206
- s.values[V] = z(r, j), s.values.xLabels = z(r, k);
207
- const T = t.components.y.selectorStates.map((o) => o.selectedSource), q = T.join(", "), M = await Promise.all(T.map(
199
+ s.values[N] = P(n, f), s.values.xLabels = P(n, M);
200
+ const I = t.components.y.selectorStates.map((o) => o.selectedSource), V = I.join(", "), q = await Promise.all(I.map(
208
201
  async (o) => {
209
- var n;
210
- return ((n = await A(e, o, f)) == null ? void 0 : n.toCanonicalString()) ?? o;
202
+ var r;
203
+ return ((r = await x(e, o, C)) == null ? void 0 : r.toCanonicalString()) ?? o;
211
204
  }
212
205
  ));
213
- return s.values[q] = z(r, T), s.values.yLabels = z(r, M), { byColumns: s };
206
+ return s.values[V] = P(n, I), s.values.yLabels = P(n, q), { byColumns: s };
214
207
  }
215
208
  async createChartSettings(e, t) {
216
- var v, i;
217
- const l = (v = t.components.valueColor.selectorStates[0]) == null ? void 0 : v.selectedSource, u = (i = t.components.valueSize.selectorStates[0]) == null ? void 0 : i.selectedSource;
218
- if (!l || !u)
209
+ var v, u;
210
+ const l = (v = t.components.valueColor.selectorStates[0]) == null ? void 0 : v.selectedSource, i = (u = t.components.valueSize.selectorStates[0]) == null ? void 0 : u.selectedSource;
211
+ if (!l || !i)
219
212
  throw Error("Value column is not valid");
220
- const p = C(l), d = C(u);
213
+ const p = w(l), d = w(i);
221
214
  if (!c(p) && !c(d))
222
215
  throw Error("Value column is not valid");
223
- const s = [p, d].filter(c).map((a) => a.toCanonicalString()), h = {
216
+ const s = [p, d].filter(c).map((a) => a.toCanonicalString()), D = {
224
217
  type: "column",
225
218
  value: l,
226
- label: await D(e, l, [])
227
- }, g = {
219
+ label: await A(e, l, [])
220
+ }, L = {
228
221
  type: "column",
229
- value: u,
230
- label: await D(e, u, [])
231
- }, I = t.components.x.selectorStates.map(({ selectedSource: a }) => a).join(", "), O = t.components.y.selectorStates.map(({ selectedSource: a }) => a).join(", "), x = await Promise.all(t.components.facetBy.selectorStates.map(async (a) => {
232
- var y;
222
+ value: i,
223
+ label: await A(e, i, [])
224
+ }, b = t.components.x.selectorStates.map(({ selectedSource: a }) => a).join(", "), O = t.components.y.selectorStates.map(({ selectedSource: a }) => a).join(", "), z = await Promise.all(t.components.facetBy.selectorStates.map(async (a) => {
225
+ var S;
233
226
  return {
234
227
  type: "column",
235
- value: ((y = await A(e, a.selectedSource, s)) == null ? void 0 : y.toCanonicalString()) ?? a.selectedSource
228
+ value: ((S = await x(e, a.selectedSource, s)) == null ? void 0 : S.toCanonicalString()) ?? a.selectedSource
236
229
  };
237
- })), f = (await Promise.all(t.components.x.selectorStates.map((a) => D(e, a.selectedSource, s)))).join(", "), B = (await Promise.all(t.components.y.selectorStates.map((a) => D(e, a.selectedSource, s)))).join(", "), F = await Promise.all(
230
+ })), h = (await Promise.all(t.components.x.selectorStates.map((a) => A(e, a.selectedSource, s)))).join(", "), C = (await Promise.all(t.components.y.selectorStates.map((a) => A(e, a.selectedSource, s)))).join(", "), B = await Promise.all(
238
231
  t.components.tooltipContent.selectorStates.map(async (a) => {
239
- var y, b;
240
- const S = a.selectedSource, r = await Z(e, S, s);
232
+ var S, g;
233
+ const n = a.selectedSource, f = await G(e, n, s);
241
234
  return {
242
235
  type: "column",
243
- label: await D(e, S, s) || S,
244
- value: S,
245
- valueLabels: ((y = await A(e, S, s)) == null ? void 0 : y.toCanonicalString()) ?? S,
246
- format: ((b = r == null ? void 0 : r.annotations) == null ? void 0 : b[J]) ?? ".0%"
236
+ label: await A(e, n, s) || n,
237
+ value: n,
238
+ valueLabels: ((S = await x(e, n, s)) == null ? void 0 : S.toCanonicalString()) ?? n,
239
+ format: ((g = f == null ? void 0 : f.annotations) == null ? void 0 : g[k]) ?? ".0%"
247
240
  };
248
241
  })
249
242
  );
250
243
  return {
251
244
  type: "bubble",
252
- valueColor: h,
253
- valueSize: g,
245
+ valueColor: D,
246
+ valueSize: L,
254
247
  xColumn: {
255
248
  type: "column",
256
- value: I,
257
- label: f,
249
+ value: b,
250
+ label: h,
258
251
  valueLabels: "xLabels"
259
252
  },
260
253
  yColumn: {
261
254
  type: "column",
262
255
  value: O,
263
- label: B,
256
+ label: C,
264
257
  valueLabels: "yLabels"
265
258
  },
266
- facetBy: x,
259
+ facetBy: z,
267
260
  tooltips: {
268
261
  show: !0,
269
- content: F
262
+ content: B
270
263
  }
271
264
  };
272
265
  }
273
266
  }
274
267
  export {
275
- re as BubbleStateController,
276
- se as InitialBubbleState
268
+ le as BubbleStateController,
269
+ oe as InitialBubbleState
277
270
  };
278
271
  //# sourceMappingURL=bubble.js.map