@milaboratories/graph-maker 1.1.153 → 1.1.155
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.
- package/dist/GraphMaker/components/AesSettings/FormWrapper.vue.d.ts +2 -0
- package/dist/GraphMaker/components/AesSettings/FormWrapper.vue.d.ts.map +1 -1
- package/dist/GraphMaker/components/AesSettings/FormWrapper.vue.js +18 -16
- package/dist/GraphMaker/components/AesSettings/FormWrapper.vue.js.map +1 -1
- package/dist/GraphMaker/components/Chart.vue.d.ts.map +1 -1
- package/dist/GraphMaker/components/Chart.vue.js +177 -120
- package/dist/GraphMaker/components/Chart.vue.js.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.d.ts.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js +198 -192
- package/dist/GraphMaker/forms/AxesSettingsForm/DiscreteAxesSettingsForm.vue.js.map +1 -1
- package/dist/GraphMaker/store.d.ts.map +1 -1
- package/dist/GraphMaker/store.js +85 -81
- package/dist/GraphMaker/store.js.map +1 -1
- package/dist/GraphMaker/types.d.ts +1 -0
- package/dist/GraphMaker/types.d.ts.map +1 -1
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js +6 -6
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ComponentController.js.map +1 -1
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js +94 -91
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/ControllerBase.js.map +1 -1
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js +2 -2
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/heatmap.js.map +1 -1
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js +50 -49
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot-umap.js.map +1 -1
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js +15 -14
- package/dist/node_modules/@milaboratories/pf-plots/dist/controllers/controllersByChartType/scatterplot.js.map +1 -1
- 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 type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport { DISCRETE_VALUES_KEY, HIGH_CARDINALITY } from '../constants';\nimport { PValue } from '../store';\nimport type { DataStore } from '../store';\nimport type { AxesSet, ColumnOrAxisIdString } from '../spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString } from '../spec';\nimport {\n createLinkerMap,\n createMultipliesByMap,\n dataColumnPredicateDefault,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n MultipliesByMap,\n OptionsInfo,\n} from '../utils';\nimport { ComponentController } from './ComponentController';\nimport { deriveLabels } from '@platforma-sdk/model';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n readonly allowHangingAxes: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) { }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n fullOptionsSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource } of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource, type, selectedFilterValues } of state.components[componentName].selectorStates as SelectorStateFilter[]) {\n if (type === 'equals' && selectedFilterValues?.length === 1) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n }\n return consumedSourcesSet;\n }\n\n async getParentAndHangingAxesByInputs(store: DataStore, state: State, linkerMap: LinkerMap, multipliesByMap: MultipliesByMap): Promise<Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>> {\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n const result: Record<string, { parentsAxes: AxesSet, hangingAxes: AxesSet }> = {};\n for (const [name, componentController] of Object.entries(allControllers)) {\n result[name] = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getParentAndHangingAxes(store, state, linkerMap, multipliesByMap);\n }\n\n return result as Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>;\n }\n\n /** Depends on chart type. */\n getMustBeConsumedAxes(state: State, optionsInfo: OptionsInfo): Set<ColumnOrAxisIdString> {\n return new Set();\n }\n\n /** Axes that go to the \"Drag to build the chart\" section.\n * If some of them is not moved to 'filters', 'tabBy' or 'facetBy' (dimension reducers) chart can't be rendered */\n markMustBeConsumedAxes(\n state: State,\n optionsInfo: OptionsInfo,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n parentAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>\n ) {\n // set of columns and axes that selected in dimension-reducing components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n };\n // Depends on chart type: axes from heatmap data column, to make visible what axes should be moved to x/y; hanging axes from X/Y scatterplot\n const mustBeConsumedAxes = this.getMustBeConsumedAxes(state, optionsInfo);\n for (const idStr of mustBeConsumedAxes) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (!this.allowHangingAxes) {\n // All 'hanging' axes must be moved to dimension reducers (for example, axes that exist in X/Y/Data source column, but not exist in Grouping)\n Object.entries(parentAndHangingAxes).forEach(([name, { hangingAxes }]) => {\n for (const idStr of hangingAxes.keys()) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n });\n }\n\n // Mark all non-homogenous axes\n for (const idStr of fullOptionsSet) {\n const info = optionsInfo.get(idStr);\n if (info?.kind === 'axis' && info.isNonHomogenous && !consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n const info = optionsInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const { selectedSource } of state.components[inputName].selectorStates) {\n const info = optionsInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n }\n\n setColumnLabels(optionsSet: Set<ColumnOrAxisIdString>, optionsInfo: OptionsInfo) {\n const columnIds = [...optionsSet].filter((v) => optionsInfo.get(v)?.kind === 'column');\n const labelsMap = deriveLabels(columnIds, (id: string) => (optionsInfo.get(id) as ColumnData).spec);\n columnIds.forEach((id, idx) => {\n optionsInfo.get(id)!.label = labelsMap[idx].label;\n });\n\n }\n\n /** Calculates information for data-mapping interface: \n * options for every input (basket), \n * information for every option (label, value type, must be consumed etc),\n * information about full data-mapping state (ready to data loading and rendering or not, contains inconsistency or not) */\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n // Two type of linkers: regular ones and \"multiplying\"\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const optionsInfo: OptionsInfo = new Map();\n const fullOptionsSet = new Set<ColumnOrAxisIdString>();\n\n const parentAndHangingAxes = await this.getParentAndHangingAxesByInputs(store, state, linkerMap, multipliesByMap);\n\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n for (const [name, componentController] of Object.entries(allControllers) as ([keyof InputOptionsUnion<State>, ComponentController<State, SimpleComponents<State> | FilterComponents<State>>][])) {\n const componentGuide = await componentController.getOptions(\n store, state,\n linkerMap, multipliesByMap,\n parentAndHangingAxes,\n dataColumnPredicate,\n ignoredNamesSet, fixedSelectedSet\n );\n for (const item of componentGuide.options) {\n fullOptionsSet.add(item.value);\n }\n for (const v of componentGuide.optionsInfo) {\n optionsInfo.set(...v);\n }\n resultComponentsGuide[name] = componentGuide;\n }\n\n this.markMustBeConsumedAxes(state, optionsInfo, fullOptionsSet, parentAndHangingAxes);\n this.setColumnLabels(fullOptionsSet, optionsInfo);\n\n const consistent = this.isConsistent(state, resultComponentsGuide as ComponentsGuide<State['components']>);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => optionsInfo.get(sourceIdStr) ?? getDefaultInfo(sourceIdStr);\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n fullOptionsSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(state, consistent, fullOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({ value: v, label: v }));\n sortValues(values);\n return { values, overflow: false };\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters: PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const { data: dataValues, axesData } = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values: { value: string, label: string }[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n sortValues(values);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n return { values: [], overflow: false };\n }\n\n checkStateConsistency(\n state: State, componentsGuide: ComponentsGuide<State['components']>\n ): Map<keyof State['components'], Record<string, boolean>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n\n for (const component of Object.keys(allControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n allControllers[component].checkStateConsistency(state, componentsGuide[component].options)\n );\n }\n return result;\n }\n\n isConsistent(state: State, componentsGuide: ComponentsGuide<State['components']>): boolean {\n const consistency = this.checkStateConsistency(state, componentsGuide);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n state: State,\n consistent: boolean,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of fullOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n\n const requiredComponents: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n requiredComponents.push(componentName);\n }\n }\n\n return (\n requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n"],"names":["ControllerBase","simpleComponentControllers","filterComponentControllers","__publicField","inputName","state","selectorState","store","nextSelectorStates","currentStates","deletedStates","currentState","s","addedStates","nextState","c","getStateCopy","st","axis","key","value","sourceIdStr","getDefaultInfo","consumedSourcesSet","componentName","selectedSource","type","selectedFilterValues","linkerMap","multipliesByMap","allControllers","result","name","componentController","optionsInfo","fullOptionsSet","parentAndHangingAxes","markMustBeConsumed","id","option","mustBeConsumedAxes","idStr","hangingAxes","info","isHighCardinality","spec","_a","HIGH_CARDINALITY","consumedHighCardinalityAxes","consumed","AxisId","optionsSet","columnIds","v","labelsMap","deriveLabels","idx","fixedIds","dataColumnPredicate","dataColumnPredicateDefault","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","createLinkerMap","createMultipliesByMap","componentGuide","item","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","values","a","b","discreteValuesStr","DISCRETE_VALUES_KEY","discreteValues","axisId","columnOrAxisIdFromString","parentSources","labelsColumnId","getColumnOrAxisValueLabelsId","filters","dataValues","axesData","axisKeys","i","searchInLabelsOrValue","response","columnId","f","componentsGuide","component","consistency","hasFreeDimensions","optionId","requiredComponents"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"ControllerBase.js","sources":["../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/ControllerBase.ts"],"sourcesContent":["import {\n AxisSpec,\n LinkerMap,\n PColumnSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2\n} from '@milaboratories/pl-model-common';\nimport type {\n AxisData,\n ColumnData,\n ComponentGuideFilter,\n ComponentGuideSimple,\n ComponentsGuide,\n DataByColumns,\n FilterComponentControllers,\n FilterComponents,\n InputGuide,\n InputState,\n SelectorState,\n SelectorStateFilter,\n SelectorStateSimple,\n SimpleComponentControllers,\n SimpleComponents,\n} from '../common';\nimport { DISCRETE_VALUES_KEY, HIGH_CARDINALITY } from '../constants';\nimport { PValue } from '../store';\nimport type { DataStore } from '../store';\nimport type { AxesSet, ColumnOrAxisIdString } from '../spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString } from '../spec';\nimport {\n createLinkerMap,\n createMultipliesByMap,\n dataColumnPredicateDefault,\n getColumnOrAxisValueLabelsId,\n getDefaultInfo,\n getStateCopy,\n MultipliesByMap,\n OptionsInfo,\n} from '../utils';\nimport { ComponentController } from './ComponentController';\nimport { deriveLabels } from '@platforma-sdk/model';\n\ntype InputOptionsUnion<State extends InputState> = Record<\n SimpleComponents<State> | FilterComponents<State>,\n ComponentGuideSimple | ComponentGuideFilter\n>;\nexport interface Controller<State extends InputState> {\n calculateOptions(\n store: DataStore,\n state: State,\n fixedIds?: string[],\n dataColumnPredicate?: (spec: PColumnSpec) => boolean\n ): Promise<InputGuide<State>>;\n\n getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string,\n searchQueryByValue?: string,\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }>;\n\n getEmptyInputGuide(state: State): InputGuide<State>;\n\n createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings>;\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorStateFilter[] | SelectorStateSimple[]\n ): State;\n}\n\nexport interface PlotDataAndSettings {\n data: {\n byColumns: DataByColumns,\n axesData?: Record<string, PValue[]>\n };\n settings: Record<string, unknown>;\n}\n\nexport abstract class ControllerBase<State extends InputState> implements Controller<State> {\n readonly ignoredOptionIdNames: string[] = [];\n readonly dataInputs: string[] = [];\n readonly dontAllowUnfilteredHighCardinality: boolean = false;\n readonly allowHangingAxes: boolean = false;\n\n protected constructor(\n readonly simpleComponentControllers: SimpleComponentControllers<State>,\n readonly filterComponentControllers: FilterComponentControllers<State>\n ) { }\n\n addSelected(\n inputName: keyof State['components'],\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).addSelected(state, selectorState);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n deleteSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n selectorState: SelectorStateFilter | SelectorStateSimple\n ) {\n if (inputName in this.simpleComponentControllers) {\n return (\n this.simpleComponentControllers[\n inputName as keyof typeof this.simpleComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n if (inputName in this.filterComponentControllers) {\n return (\n this.filterComponentControllers[\n inputName as keyof typeof this.filterComponentControllers\n ] as ComponentController<State, typeof inputName>\n ).deleteSelected(state, selectorState.selectedSource);\n }\n throw Error(`Unknown input name: ${String(inputName)}`);\n }\n\n changeSelected(\n inputName: keyof State['components'],\n store: DataStore,\n state: State,\n nextSelectorStates: SelectorState[]\n ) {\n const currentStates: SelectorState[] = state.components[inputName].selectorStates;\n const deletedStates = currentStates.filter(currentState => {\n return !nextSelectorStates.find(s => s.selectedSource === currentState.selectedSource);\n });\n const addedStates = nextSelectorStates.filter(nextState => {\n return !currentStates.find(s => s.selectedSource === nextState.selectedSource);\n });\n let nextState = getStateCopy(state);\n deletedStates.forEach(selectorState => {\n nextState = this.deleteSelected(inputName, store, nextState, selectorState);\n });\n addedStates.forEach(selectorState => {\n nextState = this.addSelected(inputName, nextState, selectorState);\n });\n // reorder\n state.components[inputName].selectorStates = nextSelectorStates\n .map(st =>\n (state.components[inputName].selectorStates as SelectorState[]).find(\n s => s.selectedSource === st.selectedSource\n )\n )\n .filter(Boolean) as SelectorStateFilter[] | SelectorStateSimple[];\n return nextState;\n }\n\n switchDividableAxis(state: State, axis: AxisId): State {\n // ***\n // logic for axis dividing/collapsing\n // ***\n return getStateCopy(state);\n }\n\n private createEmptyComponentsGuide(state: State): InputOptionsUnion<State> {\n return Object.fromEntries(\n Object.entries(state.components).map(\n ([key, value]): [string, ComponentGuideSimple | ComponentGuideFilter] => {\n return [\n key,\n {\n options: [],\n optionsInfo: new Map(),\n stateConsistency: {},\n required: false,\n multipleSelectors: false,\n },\n ];\n }\n )\n ) as InputOptionsUnion<State>;\n }\n\n getEmptyInputGuide(state: State): InputGuide<State> {\n return {\n components: this.createEmptyComponentsGuide(state) as ComponentsGuide<State['components']>,\n getSourceInfo: (sourceIdStr: ColumnOrAxisIdString) => getDefaultInfo(sourceIdStr),\n fullOptionsSet: new Set(),\n readyData: false,\n ready: false,\n consistent: true,\n };\n }\n\n getConsumedOptionsSet(state: State) {\n const consumedSourcesSet: Set<ColumnOrAxisIdString> = new Set();\n\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource } of state.components[componentName].selectorStates) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n for (const componentName of Object.keys(this.filterComponentControllers) as FilterComponents<State>[]) {\n if (this.filterComponentControllers[componentName].isDimensionsConsumer) {\n for (const { selectedSource, type, selectedFilterValues } of state.components[componentName].selectorStates as SelectorStateFilter[]) {\n if (type === 'equals' && selectedFilterValues?.length === 1) {\n consumedSourcesSet.add(selectedSource);\n }\n }\n }\n }\n return consumedSourcesSet;\n }\n\n async getParentAndHangingAxesByInputs(store: DataStore, state: State, linkerMap: LinkerMap, multipliesByMap: MultipliesByMap): Promise<Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>> {\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n const result: Record<string, { parentsAxes: AxesSet, hangingAxes: AxesSet }> = {};\n for (const [name, componentController] of Object.entries(allControllers)) {\n result[name] = await (\n componentController as ComponentController<State, SimpleComponents<State> | FilterComponents<State>>\n ).getParentAndHangingAxes(store, state, linkerMap, multipliesByMap);\n }\n\n return result as Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>;\n }\n\n /** Depends on chart type. */\n getMustBeConsumedAxes(state: State, optionsInfo: OptionsInfo): Set<ColumnOrAxisIdString> {\n return new Set();\n }\n\n /** Axes that go to the \"Drag to build the chart\" section.\n * If some of them is not moved to 'filters', 'tabBy' or 'facetBy' (dimension reducers) chart can't be rendered */\n markMustBeConsumedAxes(\n state: State,\n optionsInfo: OptionsInfo,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n parentAndHangingAxes: Record<keyof State['components'], { parentsAxes: AxesSet, hangingAxes: AxesSet }>\n ) {\n // set of columns and axes that selected in dimension-reducing components\n const consumedSourcesSet = this.getConsumedOptionsSet(state);\n\n const markMustBeConsumed = (id: string) => {\n const option = optionsInfo.get(id);\n if (option && option.kind === 'axis') {\n option.mustBeConsumed = true;\n }\n };\n // Depends on chart type: axes from heatmap data column, to make visible what axes should be moved to x/y; hanging axes from X/Y scatterplot\n const mustBeConsumedAxes = this.getMustBeConsumedAxes(state, optionsInfo);\n for (const idStr of mustBeConsumedAxes) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (!this.allowHangingAxes) {\n // All 'hanging' axes must be moved to dimension reducers (for example, axes that exist in X/Y/Data source column, but not exist in Grouping)\n Object.entries(parentAndHangingAxes).forEach(([name, { hangingAxes }]) => {\n for (const idStr of hangingAxes.keys()) {\n if (!consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n });\n }\n\n // Mark all non-homogenous axes\n for (const idStr of fullOptionsSet) {\n const info = optionsInfo.get(idStr);\n if (info?.kind === 'axis' && info.isNonHomogenous && !consumedSourcesSet.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n\n if (this.dontAllowUnfilteredHighCardinality) {\n // Axes marked 'high cardinality' should be in the filter. Or some column that has this axis should be in the filter.\n // If not - they are marked 'mustBeConsumed'.\n // But also they can be anywhere else.\n const isHighCardinality = (spec: AxisSpec) => spec?.annotations?.[HIGH_CARDINALITY] === 'true';\n const consumedHighCardinalityAxes =\n state.components['filters']?.selectorStates.reduce((consumed: Set<string>, s) => {\n if ((s as SelectorStateFilter)?.selectedFilterValues?.length !== 1 && (s as SelectorStateFilter).type !== 'subset') {\n return consumed;\n }\n const info = optionsInfo.get(s.selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => consumed.add(AxisId.fromAxisSpec(spec).toCanonicalString()));\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n consumed.add(AxisId.fromAxisSpec(info.spec).toCanonicalString());\n }\n return consumed;\n }, new Set<string>()) ?? new Set<string>();\n this.dataInputs.forEach(inputName => {\n for (const { selectedSource } of state.components[inputName].selectorStates) {\n const info = optionsInfo.get(selectedSource);\n if (info?.kind === 'column') {\n const axes = info.spec.axesSpec.filter(isHighCardinality);\n axes.forEach(spec => {\n const idStr = AxisId.fromAxisSpec(spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n });\n }\n if (info?.kind === 'axis' && isHighCardinality(info.spec)) {\n const idStr = AxisId.fromAxisSpec(info.spec).toCanonicalString();\n if (!consumedHighCardinalityAxes.has(idStr)) {\n markMustBeConsumed(idStr);\n }\n }\n }\n });\n }\n }\n\n setColumnLabels(optionsSet: Set<ColumnOrAxisIdString>, optionsInfo: OptionsInfo) {\n const columnIds = [...optionsSet].filter((v) => optionsInfo.get(v)?.kind === 'column');\n const labelsMap = deriveLabels(columnIds, (id: string) => (optionsInfo.get(id) as ColumnData).spec);\n columnIds.forEach((id, idx) => {\n optionsInfo.get(id)!.label = labelsMap[idx].label;\n });\n\n }\n\n /** Calculates information for data-mapping interface: \n * options for every input (basket), \n * information for every option (label, value type, must be consumed etc),\n * information about full data-mapping state (ready to data loading and rendering or not, contains inconsistency or not) */\n async calculateOptions(\n store: DataStore,\n state: State,\n fixedIds: string[] = [],\n dataColumnPredicate = dataColumnPredicateDefault\n ): Promise<InputGuide<State>> {\n // creating empty options object corresponding to the provided state\n const resultComponentsGuide: InputOptionsUnion<State> = this.createEmptyComponentsGuide(state);\n\n // for trees block - to ignore treeId and donorId in the interface\n const ignoredNamesSet = new Set<string>(this.ignoredOptionIdNames);\n const fixedSelectedSet = new Set<ColumnOrAxisIdString>(fixedIds);\n\n // Two type of linkers: regular ones and \"multiplying\"\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const optionsInfo: OptionsInfo = new Map();\n const fullOptionsSet = new Set<ColumnOrAxisIdString>();\n\n const parentAndHangingAxes = await this.getParentAndHangingAxesByInputs(store, state, linkerMap, multipliesByMap);\n\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n for (const [name, componentController] of Object.entries(allControllers) as ([keyof InputOptionsUnion<State>, ComponentController<State, SimpleComponents<State> | FilterComponents<State>>][])) {\n const componentGuide = await componentController.getOptions(\n store, state,\n linkerMap, multipliesByMap,\n parentAndHangingAxes,\n dataColumnPredicate,\n ignoredNamesSet, fixedSelectedSet\n );\n for (const item of componentGuide.options) {\n fullOptionsSet.add(item.value);\n }\n for (const v of componentGuide.optionsInfo) {\n optionsInfo.set(...v);\n }\n resultComponentsGuide[name] = componentGuide;\n }\n\n this.markMustBeConsumedAxes(state, optionsInfo, fullOptionsSet, parentAndHangingAxes);\n this.setColumnLabels(fullOptionsSet, optionsInfo);\n\n const consistent = this.isConsistent(state, resultComponentsGuide as ComponentsGuide<State['components']>);\n const getSourceInfo = (sourceIdStr: ColumnOrAxisIdString) => optionsInfo.get(sourceIdStr) ?? getDefaultInfo(sourceIdStr);\n return {\n components: resultComponentsGuide as ComponentsGuide<State['components']>,\n getSourceInfo,\n fullOptionsSet,\n readyData: this.readyDataInputs(state),\n ready: this.readyForPlotBuilding(state, consistent, fullOptionsSet, getSourceInfo),\n consistent,\n };\n }\n\n async getUniqueSourceValuesWithLabels(\n store: DataStore,\n inputGuide: InputGuide<State>,\n selectedSource: ColumnOrAxisIdString,\n limit?: number,\n searchQuery?: string, // search by labels if axis labels exist\n searchQueryValue?: string // search by value, not by label\n ): Promise<{\n values: {\n value: string;\n label: string;\n }[],\n overflow: boolean;\n }> {\n const sortValues = (values: { value: string, label: string }[]) => values.sort((a, b) => a.label.localeCompare(b.label, 'en', { numeric: true }))\n const info = inputGuide.getSourceInfo(selectedSource);\n const discreteValuesStr = info.annotations?.[DISCRETE_VALUES_KEY];\n\n // if column's annotation contains discrete values - take them from it\n try {\n const discreteValues: string[] | null = discreteValuesStr\n ? (JSON.parse(discreteValuesStr) as (string | number)[]).map(v => String(v))\n : null;\n if (discreteValues) {\n const values = discreteValues.map(v => ({ value: v, label: v }));\n sortValues(values);\n return { values, overflow: false };\n }\n } catch (err) {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr} in ${selectedSource}`)\n }\n\n // consider label column for axis\n if (info.kind === 'axis') {\n const axisId = columnOrAxisIdFromString(selectedSource) as AxisId;\n const parentSources = info.parentSources.map(columnOrAxisIdFromString) as ColumnId[];\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, info.parentSources);\n let filters: PTableRecordSingleValueFilterV2[] = [];\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: labelsColumnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQuery\n }\n }];\n }\n if (searchQueryValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchQueryValue\n }\n }];\n }\n const { data: dataValues, axesData } = await store.pFrameProvider.getSingleColumnData(labelsColumnId, filters);\n const axisKeys = axesData[axisId.toCanonicalString()];\n const values: { value: string, label: string }[] = [];\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n sortValues(values);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n }\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [{\n type: 'bySingleColumnV2',\n column: {\n type: 'axis',\n id: axisId.toPFrameId()\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }];\n }\n const response = await store.pFrameProvider.getAxisUniqueValues(axisId, [parentSources[0]], limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n if (info.kind === 'column') {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n const columnId = columnOrAxisIdFromString(selectedSource) as ColumnId;\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue ? [{\n type: 'bySingleColumnV2',\n column: {\n type: 'column',\n id: columnId.name as PObjectId\n },\n predicate: {\n operator: 'StringIContains',\n substring: searchInLabelsOrValue\n }\n }] : [];\n const response = await store.pFrameProvider.getColumnUniqueValues(columnId, limit, filters);\n const values = response.values.map(v => ({ value: String(v), label: String(v) }));\n sortValues(values);\n return { values, overflow: response.overflow };\n }\n return { values: [], overflow: false };\n }\n\n checkStateConsistency(\n state: State, componentsGuide: ComponentsGuide<State['components']>\n ): Map<keyof State['components'], Record<string, boolean>> {\n const result: Map<keyof State['components'], Record<string, boolean>> = new Map();\n const allControllers = { ...this.simpleComponentControllers, ...this.filterComponentControllers };\n\n for (const component of Object.keys(allControllers) as SimpleComponents<State>[]) {\n result.set(\n component as keyof State['components'],\n allControllers[component].checkStateConsistency(state, componentsGuide[component].options)\n );\n }\n return result;\n }\n\n isConsistent(state: State, componentsGuide: ComponentsGuide<State['components']>): boolean {\n const consistency = this.checkStateConsistency(state, componentsGuide);\n for (const value of consistency.values()) {\n if (Object.values(value).some(item => !item)) {\n return false;\n }\n }\n return true;\n }\n\n readyDataInputs(state: State): boolean {\n return this.dataInputs.every(name => state.components[name].selectorStates.length > 0);\n }\n\n readyForPlotBuilding(\n state: State,\n consistent: boolean,\n fullOptionsSet: Set<ColumnOrAxisIdString>,\n getSourceInfo: (id: ColumnOrAxisIdString) => ColumnData | AxisData\n ): boolean {\n if (!consistent || !this.readyDataInputs(state)) {\n return false;\n }\n let hasFreeDimensions: boolean = false;\n for (const optionId of fullOptionsSet) {\n const info = getSourceInfo(optionId);\n if (info && info.kind === 'axis' && info.mustBeConsumed) {\n hasFreeDimensions = true;\n break;\n }\n }\n\n const requiredComponents: (keyof State['components'])[] = [];\n for (const componentName of Object.keys(this.simpleComponentControllers) as SimpleComponents<State>[]) {\n if (this.simpleComponentControllers[componentName].isRequired) {\n requiredComponents.push(componentName);\n }\n }\n\n return (\n requiredComponents.every(name => state.components[name].selectorStates.length > 0) &&\n !hasFreeDimensions\n );\n }\n\n abstract createDataByColumns(store: DataStore, state: State): Promise<PlotDataAndSettings['data']>;\n\n abstract createChartSettings(store: DataStore, state: State): Promise<PlotDataAndSettings['settings']>;\n\n async createDataForPlot(store: DataStore, state: State): Promise<PlotDataAndSettings> {\n return {\n data: await this.createDataByColumns(store, state),\n settings: await this.createChartSettings(store, state),\n };\n }\n}\n"],"names":["ControllerBase","simpleComponentControllers","filterComponentControllers","__publicField","inputName","state","selectorState","store","nextSelectorStates","currentStates","deletedStates","currentState","s","addedStates","nextState","c","getStateCopy","st","axis","key","value","sourceIdStr","getDefaultInfo","consumedSourcesSet","componentName","selectedSource","type","selectedFilterValues","linkerMap","multipliesByMap","allControllers","result","name","componentController","optionsInfo","fullOptionsSet","parentAndHangingAxes","markMustBeConsumed","id","option","mustBeConsumedAxes","idStr","hangingAxes","info","isHighCardinality","spec","_a","HIGH_CARDINALITY","consumedHighCardinalityAxes","consumed","AxisId","optionsSet","columnIds","v","labelsMap","deriveLabels","idx","fixedIds","dataColumnPredicate","dataColumnPredicateDefault","resultComponentsGuide","ignoredNamesSet","fixedSelectedSet","createLinkerMap","createMultipliesByMap","componentGuide","item","consistent","getSourceInfo","inputGuide","limit","searchQuery","searchQueryValue","sortValues","values","a","b","discreteValuesStr","DISCRETE_VALUES_KEY","discreteValues","axisId","columnOrAxisIdFromString","parentSources","labelsColumnId","getColumnOrAxisValueLabelsId","filters","dataValues","axesData","axisKeys","i","searchInLabelsOrValue","response","columnId","f","componentsGuide","component","consistency","hasFreeDimensions","optionId","requiredComponents"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -189,7 +189,7 @@ class oe extends K {
|
|
|
189
189
|
filters: new m({
|
|
190
190
|
componentName: "filters",
|
|
191
191
|
allowedTypes: ["String", "Int", "Long", "Double", "Long"],
|
|
192
|
-
strictlyDependsOnParents: !
|
|
192
|
+
strictlyDependsOnParents: !1,
|
|
193
193
|
parentComponents: ["value"],
|
|
194
194
|
dependsOn: ["value"],
|
|
195
195
|
settings: {
|
|
@@ -202,7 +202,7 @@ class oe extends K {
|
|
|
202
202
|
tabBy: new m({
|
|
203
203
|
componentName: "tabBy",
|
|
204
204
|
allowedTypes: ["String", "Int"],
|
|
205
|
-
strictlyDependsOnParents: !
|
|
205
|
+
strictlyDependsOnParents: !1,
|
|
206
206
|
parentComponents: ["value"],
|
|
207
207
|
dependsOn: ["value"],
|
|
208
208
|
settings: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heatmap.js","sources":["../../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/heatmap.ts"],"sourcesContent":["import {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type {ComponentStateFilter, ComponentStateSimple, DataByColumns, InputStateParent} from '../../common';\nimport {FORMAT} from '../../constants';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n createLinkerMap, createMultipliesByMap, getAxesSpecsFromSources,\n getColumnOrAxisLabel, getColumnOrAxisSpec,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n OptionsInfo,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\nimport type {ColumnsProvider} from '../../pframe/ColumnsProvider';\n\nexport interface HeatmapUIState extends InputStateParent<'heatmap'> {\n type: 'heatmap';\n components: {\n value: ComponentStateSimple;\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n xGroupBy: ComponentStateSimple;\n yGroupBy: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n annotationsX: ComponentStateSimple;\n annotationsY: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialHeatmapState: HeatmapUIState = {\n type: 'heatmap',\n components: {\n value: {type: 'simple', selectorStates: []},\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n xGroupBy: {type: 'simple', selectorStates: []},\n yGroupBy: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n annotationsX: {type: 'simple', selectorStates: []},\n annotationsY: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nfunction isDiscreteData(spec: PColumnSpec | AxisSpec | null) {\n if (!spec) {\n return true;\n }\n if ('kind' in spec && spec.kind === 'PColumn') {\n return spec.valueType === 'String';\n }\n return (spec as AxisSpec).type === 'String';\n}\n\nfunction getMultiSourceColumn(\n data: Awaited<ReturnType<ColumnsProvider['getTableOuterJoin']>>,\n selectedSources: string[]\n) {\n if (!selectedSources.length) {\n return [];\n }\n const selectedIds = selectedSources.map(str => columnOrAxisIdFromString(str));\n const n = Object.values(data.columnsData)[0].length;\n const result: string[] = [];\n for (let i = 0; i < n; i++) {\n const value = selectedIds\n .map(id => {\n const key = id.toCanonicalString();\n return isColumnId(id) ? data.columnsData[key][i] : data.axesData[key][i];\n })\n .join(', ');\n result.push(value);\n }\n return result;\n}\n\nexport class HeatmapStateController extends ControllerBase<HeatmapUIState> {\n dataInputs = ['value'];\n dontAllowUnfilteredHighCardinality = true;\n\n constructor() {\n super(\n {\n value: new ComponentController<HeatmapUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n x: new ComponentController<HeatmapUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n xGroupBy: new ComponentController<HeatmapUIState, 'xGroupBy'>({\n componentName: 'xGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n y: new ComponentController<HeatmapUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n yGroupBy: new ComponentController<HeatmapUIState, 'yGroupBy'>({\n componentName: 'yGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n tooltipContent: new ComponentController<HeatmapUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n facetBy: new ComponentController<HeatmapUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n annotationsX: new ComponentController<HeatmapUIState, 'annotationsX'>({\n componentName: 'annotationsX',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n annotationsY: new ComponentController<HeatmapUIState, 'annotationsY'>({\n componentName: 'annotationsY',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n },\n {\n filters: new ComponentController<HeatmapUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n tabBy: new ComponentController<HeatmapUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n }\n );\n }\n\n getMustBeConsumedAxes(state: HeatmapUIState, optionsInfo: OptionsInfo): Set<string> {\n if (!state.components.value.selectorStates.length) {\n return new Set<string>();\n }\n const sourceId = state.components.value.selectorStates[0].selectedSource;\n const data = optionsInfo.get(sourceId);\n if (!data || data.kind !== 'column') {\n return new Set<string>();\n }\n return new Set(data.spec.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString()))\n }\n\n async createDataByColumns(store: DataStore, state: HeatmapUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [\n state.components.facetBy,\n state.components.annotationsX,\n state.components.annotationsY,\n state.components.x,\n state.components.y,\n state.components.xGroupBy,\n state.components.yGroupBy,\n state.components.tooltipContent,\n ];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerMap,\n multipliesByMap,\n parentAxesList,\n selectedSource\n ));\n }\n\n for (const input of inputs) {\n for (const {selectedSource} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerMap,\n multipliesByMap,\n parentAxesList,\n selectedSource\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [valueColumnId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n dataByColumns.values[valueColumnId.toCanonicalString()] = data.columnsData[valueColumnId.toCanonicalString()];\n\n // x column should contain xGroup axes\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const xKey = xAxes.join(', ');\n dataByColumns.values[xKey] = getMultiSourceColumn(data, xAxes);\n\n // if grouping is not empty x keys will include grouping keys, but grouping keys should be excluded from x labels\n const xVisibleAxes = state.components.x.selectorStates.map(state => state.selectedSource);\n const xAxesLabeled = await Promise.all(\n xVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.xLabelsKey = getMultiSourceColumn(data, xAxesLabeled);\n\n // y column should contain yGroup axes\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const yKey = yAxes.join(', ');\n dataByColumns.values[yKey] = getMultiSourceColumn(data, yAxes);\n\n // column for labels - without grouping data in labels\n const yVisibleAxes = state.components.y.selectorStates.map(state => state.selectedSource);\n const yAxesLabeled = await Promise.all(\n yVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.yLabelsKey = getMultiSourceColumn(data, yAxesLabeled);\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: HeatmapUIState): Promise<Record<string, unknown>> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = [valueColumnIdString];\n const value = {\n type: 'column',\n value: valueColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColumnIdString, []),\n };\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const xKey = xAxes.join(', ');\n\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const yKey = yAxes.join(', ');\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources)\n )?.toCanonicalString() ?? selectorState.selectedSource,\n }))\n );\n const xGroupBy = await Promise.all(\n state.components.xGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const yGroupBy = await Promise.all(\n state.components.yGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const valueSpec = await store.pFrameProvider.getColumnSpecById(valueColumnId);\n const annotationsX = await Promise.all(\n state.components.annotationsX.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'x',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n const annotationsY = await Promise.all(\n state.components.annotationsY.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'y',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n\n const xAxisTitle = (\n await Promise.all(\n state.components.x.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n const yAxisTitle = (\n await Promise.all(\n state.components.y.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const source = selectorState.selectedSource;\n const spec = await getColumnOrAxisSpec(store, source, parentSources);\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, source, parentSources)) || source,\n value: source,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, source, parentSources))?.toCanonicalString() ??\n source,\n format: spec?.annotations?.[FORMAT] ?? '.0%'\n };\n })\n );\n\n return {\n type: 'heatmap',\n valueColumn: value,\n valueType: isDiscreteData(valueSpec) ? 'discrete' : 'continuous',\n xColumn: {\n type: 'column',\n value: xKey,\n label: xAxisTitle,\n valueLabels: 'xLabelsKey',\n },\n yColumn: {\n type: 'column',\n value: yKey,\n label: yAxisTitle,\n valueLabels: 'yLabelsKey',\n },\n facetBy,\n xGroupBy,\n yGroupBy,\n annotations: [...annotationsX, ...annotationsY],\n tooltips: {\n show: true,\n content: tooltipContent,\n },\n };\n }\n}\n"],"names":["InitialHeatmapState","isDiscreteData","spec","getMultiSourceColumn","data","selectedSources","selectedIds","str","columnOrAxisIdFromString","n","result","i","value","id","key","isColumnId","HeatmapStateController","ControllerBase","ComponentController","state","allowedAxes","s","AxisId","__publicField","optionsInfo","sourceId","store","valueColumnIdString","_a","valueColumnId","dataByColumns","canonicalize","linkerMap","createLinkerMap","multipliesByMap","createMultipliesByMap","filterSelectedStates","filters","getFiltersFromStates","filterColumns","parentSources","parentAxesList","getAxesSpecsFromSources","inputs","secondarySources","linkerColumns","selectedSource","getLinkerColumnsForSource","input","labelsColumnId","getColumnOrAxisValueLabelsId","item","xAxes","xKey","xVisibleAxes","xAxesLabeled","yAxes","yKey","yVisibleAxes","yAxesLabeled","getColumnOrAxisLabel","facetBy","selectorState","xGroupBy","yGroupBy","valueSpec","annotationsX","idString","axisSpec","_b","annotationsY","xAxisTitle","yAxisTitle","tooltipContent","source","getColumnOrAxisSpec","FORMAT"],"mappings":";;;;;;;AAmCO,MAAMA,KAAsC;AAAA,EAC/C,MAAM;AAAA,EACN,YAAY;AAAA,IACR,OAAO,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IACxC,GAAG,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IACpC,GAAG,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IACpC,UAAU,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IAC3C,UAAU,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IAC3C,SAAS,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IAC1C,OAAO,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IACxC,SAAS,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IAC1C,cAAc,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IAC/C,cAAc,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAA;AAAA,IAC/C,gBAAgB,EAAC,MAAM,UAAU,gBAAgB,CAAA,EAAE;AAAA,EAAA;AAAA,EAEvD,aAAa,CAAA;AACjB;AAEA,SAASC,EAAeC,GAAqC;AACzD,SAAKA,IAGD,UAAUA,KAAQA,EAAK,SAAS,YACzBA,EAAK,cAAc,WAEtBA,EAAkB,SAAS,WALxB;AAMf;AAEA,SAASC,EACLC,GACAC,GACF;AACM,MAAA,CAACA,EAAgB;AACjB,WAAO,CAAA;AAEX,QAAMC,IAAcD,EAAgB,IAAI,CAAOE,MAAAC,EAAyBD,CAAG,CAAC,GACtEE,IAAI,OAAO,OAAOL,EAAK,WAAW,EAAE,CAAC,EAAE,QACvCM,IAAmB,CAAA;AACzB,WAASC,IAAI,GAAGA,IAAIF,GAAGE,KAAK;AAClB,UAAAC,IAAQN,EACT,IAAI,CAAMO,MAAA;AACD,YAAAC,IAAMD,EAAG,kBAAA;AACf,aAAOE,EAAWF,CAAE,IAAIT,EAAK,YAAYU,CAAG,EAAEH,CAAC,IAAIP,EAAK,SAASU,CAAG,EAAEH,CAAC;AAAA,IAAA,CAC1E,EACA,KAAK,IAAI;AACdD,IAAAA,EAAO,KAAKE,CAAK;AAAA,EAAA;AAEd,SAAAF;AACX;AAEO,MAAMM,WAA+BC,EAA+B;AAAA,EAIvE,cAAc;AACV;AAAA,MACI;AAAA,QACI,OAAO,IAAIC,EAA6C;AAAA,UACpD,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,QAAQ,UAAU,SAAS,QAAQ;AAAA,UACzD,UAAU;AAAA,YACN,iBAAiB;AAAA,YACjB,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,UAAU;AAAA,UAAA;AAAA,QAAA,CAEjB;AAAA,QACD,GAAG,IAAIA,EAAyC;AAAA,UAC5C,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,UAAU,MAAM;AAAA,UACtC,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,UAAU;AAAA,YACN,UAAU;AAAA,YACV,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,YACnB,aAAa;AAAA,YACb,gBAAgB;AAAA,UAAA;AAAA,QAAA,CAEvB;AAAA,QACD,UAAU,IAAIA,EAAgD;AAAA,UAC1D,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,UAAU,MAAM;AAAA,UACtC,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,UAAU;AAAA,YACN,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,YACnB,aAAa;AAAA,YACb,gBAAgB;AAAA,UAAA;AAAA,UAEpB,WAAW,CAAC,GAAG;AAAA,UACf,mBAAmB,CAAChB,GAAMiB,MAAU;AAC1B,kBAAAC,wBAAkB,IAAI;AAAA,cACxB,GAAGD,EAAM,WAAW,EAAE,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,cAC9D,GAAGF,EAAM,WAAW,SAAS,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,YAAA,CACxE;AAED,mBAAI,UAAUnB,KAAQA,EAAK,SAAS,YACzBoB,EAAO,aAAapB,EAAK,QAAQ,EAAE;AAAA,cAAM,CAC5CW,MAAAO,EAAY,IAAIP,EAAG,mBAAmB;AAAA,YAAA,IAGvC;AAAA,UAAA;AAAA,QAAA,CAEd;AAAA,QACD,GAAG,IAAIK,EAAyC;AAAA,UAC5C,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,UAAU,MAAM;AAAA,UACtC,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,UAAU;AAAA,YACN,UAAU;AAAA,YACV,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,YACnB,aAAa;AAAA,YACb,gBAAgB;AAAA,UAAA;AAAA,QAAA,CAEvB;AAAA,QACD,UAAU,IAAIA,EAAgD;AAAA,UAC1D,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,UAAU,MAAM;AAAA,UACtC,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,UAAU;AAAA,YACN,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,YACnB,aAAa;AAAA,YACb,gBAAgB;AAAA,UAAA;AAAA,UAEpB,WAAW,CAAC,GAAG;AAAA,UACf,mBAAmB,CAAChB,GAAMiB,MAAU;AAC1B,kBAAAC,wBAAkB,IAAI;AAAA,cACxB,GAAGD,EAAM,WAAW,EAAE,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,cAC9D,GAAGF,EAAM,WAAW,SAAS,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,YAAA,CACxE;AAED,mBAAI,UAAUnB,KAAQA,EAAK,SAAS,YACzBoB,EAAO,aAAapB,EAAK,QAAQ,EAAE;AAAA,cAAM,CAC5CW,MAAAO,EAAY,IAAIP,EAAG,mBAAmB;AAAA,YAAA,IAGvC;AAAA,UAAA;AAAA,QAAA,CAEd;AAAA,QACD,gBAAgB,IAAIK,EAAsD;AAAA,UACtE,eAAe;AAAA,UACf,cAAc,CAAC,UAAU,OAAO,QAAQ,SAAS,QAAQ;AAAA,UACzD,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,WAAW,CAAC,OAAO;AAAA,UACnB,UAAU;AAAA,YACN,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,mBAAmB;AAAA,UAAA;AAAA,QAAA,CAE1B;AAAA,QACD,SAAS,IAAIA,EAA+C;AAAA,UACxD,eAAe;AAAA,UACf,cAAc,CAAC,UAAU,OAAO,MAAM;AAAA,UACtC,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,WAAW,CAAC,OAAO;AAAA,UACnB,UAAU;AAAA,YACN,aAAa;AAAA,YACb,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,UAAA;AAAA,QAAA,CAE1B;AAAA,QACD,cAAc,IAAIA,EAAoD;AAAA,UAClE,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,QAAQ,UAAU,SAAS,QAAQ;AAAA,UACzD,kBAAkB,CAAC,OAAO;AAAA,UAC1B,UAAU;AAAA,YACN,aAAa;AAAA,YACb,mBAAmB;AAAA,UAAA;AAAA,UAEvB,WAAW,CAAC,GAAG;AAAA,UACf,mBAAmB,CAAChB,GAAMiB,MAAU;AAC1B,kBAAAC,wBAAkB,IAAI;AAAA,cACxB,GAAGD,EAAM,WAAW,EAAE,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,cAC9D,GAAGF,EAAM,WAAW,SAAS,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,YAAA,CACxE;AAED,mBAAI,UAAUnB,KAAQA,EAAK,SAAS,YACzBoB,EAAO,aAAapB,EAAK,QAAQ,EAAE;AAAA,cAAM,CAC5CW,MAAAO,EAAY,IAAIP,EAAG,mBAAmB;AAAA,YAAA,IAGvCO,EAAY,IAAIE,EAAO,aAAapB,CAAgB,EAAE,mBAAmB;AAAA,UAAA;AAAA,QAAA,CAEvF;AAAA,QACD,cAAc,IAAIgB,EAAoD;AAAA,UAClE,eAAe;AAAA,UACf,cAAc,CAAC,OAAO,QAAQ,UAAU,SAAS,QAAQ;AAAA,UACzD,kBAAkB,CAAC,OAAO;AAAA,UAC1B,UAAU;AAAA,YACN,aAAa;AAAA,YACb,mBAAmB;AAAA,UAAA;AAAA,UAEvB,WAAW,CAAC,GAAG;AAAA,UACf,mBAAmB,CAAChB,GAAMiB,MAAU;AAC1B,kBAAAC,wBAAkB,IAAI;AAAA,cACxB,GAAGD,EAAM,WAAW,EAAE,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,cAC9D,GAAGF,EAAM,WAAW,SAAS,eAAe,IAAI,CAAAE,MAAKA,EAAE,cAAc;AAAA,YAAA,CACxE;AAED,mBAAI,UAAUnB,KAAQA,EAAK,SAAS,YACzBoB,EAAO,aAAapB,EAAK,QAAQ,EAAE;AAAA,cAAM,CAC5CW,MAAAO,EAAY,IAAIP,EAAG,mBAAmB;AAAA,YAAA,IAGvCO,EAAY,IAAIE,EAAO,aAAapB,CAAgB,EAAE,mBAAmB;AAAA,UAAA;AAAA,QAAA,CAEvF;AAAA,MAAA;AAAA,MAEL;AAAA,QACI,SAAS,IAAIgB,EAA+C;AAAA,UACxD,eAAe;AAAA,UACf,cAAc,CAAC,UAAU,OAAO,QAAQ,UAAU,MAAM;AAAA,UACxD,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,WAAW,CAAC,OAAO;AAAA,UACnB,UAAU;AAAA,YACN,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,UAAA;AAAA,QAAA,CAE1B;AAAA,QACD,OAAO,IAAIA,EAA6C;AAAA,UACpD,eAAe;AAAA,UACf,cAAc,CAAC,UAAU,KAAK;AAAA,UAC9B,0BAA0B;AAAA,UAC1B,kBAAkB,CAAC,OAAO;AAAA,UAC1B,WAAW,CAAC,OAAO;AAAA,UACnB,UAAU;AAAA,YACN,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,mBAAmB;AAAA,UAAA;AAAA,QAAA,CAE1B;AAAA,MAAA;AAAA,IAAA,GA9LbK,EAAA,MAAA,cAAa,CAAC,OAAO,CAAA,GACrBA,EAAA,MAAA,sCAAqC,EAAA;AAAA,EA+LjC;AAAA,EAGJ,sBAAsBJ,GAAuBK,GAAuC;AAChF,QAAI,CAACL,EAAM,WAAW,MAAM,eAAe;AACvC,aAAA,oBAAW,IAAA;AAEf,UAAMM,IAAWN,EAAM,WAAW,MAAM,eAAe,CAAC,EAAE,gBACpDf,IAAOoB,EAAY,IAAIC,CAAQ;AACrC,WAAI,CAACrB,KAAQA,EAAK,SAAS,+BACZ,IAAA,IAER,IAAI,IAAIA,EAAK,KAAK,SAAS,IAAI,CAACiB,MAAMC,EAAO,aAAaD,CAAC,EAAE,kBAAA,CAAmB,CAAC;AAAA,EAAA;AAAA,EAG5F,MAAM,oBAAoBK,GAAkBP,GAA6D;;AACrG,UAAMQ,KAAsBC,IAAAT,EAAM,WAAW,MAAM,eAAe,CAAC,MAAvC,OAAA,SAAAS,EAA0C;AACtE,QAAI,CAACD;AACD,YAAM,MAAM,2BAA2B;AAErC,UAAAE,IAAgBrB,EAAyBmB,CAAmB;AAC9D,QAAA,CAACZ,EAAWc,CAAa;AACzB,YAAM,MAAM,2BAA2B;AAE3C,UAAMC,IAA+B;AAAA,MACjC,MAAM;AAAA,MACN,IAAIC,EAAaZ,EAAM,UAAU,KAAK;AAAA,MACtC,QAAQ,CAAA;AAAA,IAAA,GAGNa,IAAY,MAAMC,EAAgBP,CAAK,GACvCQ,IAAkB,MAAMC,EAAsBT,CAAK,GAEnDU,IAAuB;AAAA,MACzB,GAAGjB,EAAM,WAAW,QAAQ;AAAA,MAC5B,GAAGA,EAAM,WAAW,MAAM;AAAA,IAAA,GAGxBkB,IAAUC,EAAqBF,CAAoB,GACnDG,IAAgBH,EAAqB,IAAI,CAAKf,MAAAb,EAAyBa,EAAE,cAAc,CAAC,EAAE,OAAON,CAAU,GAE3GyB,IAAgB,CAACb,CAAmB,GACpCc,IAAiB,MAAMC,EAAwBhB,GAAOc,CAAa,GACnEG,IAAS;AAAA,MACXxB,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,MACjBA,EAAM,WAAW;AAAA,IAAA,GAEfyB,IAA0C,IAC1CC,IAA2B,CAAA;AAEtB,eAAA,EAAC,gBAAAC,EAAAA,KAAmBV;AACbS,MAAAA,EAAA,KAAK,GAAG,MAAME;AAAAA,QACxBrB;AAAAA,QACAM;AAAAA,QACAE;AAAAA,QACAO;AAAAA,QACAK;AAAAA,MAAA,CACH;AAGL,eAAWE,KAASL;AAChB,iBAAW,EAAC,gBAAAG,EAAAA,KAAmBE,EAAM,gBAAgB;AAChCJ,QAAAA,EAAA,KAAKpC,EAAyBsC,CAAc,CAAE,GACjDD,EAAA,KAAK,GAAG,MAAME;AAAAA,UACxBrB;AAAAA,UACAM;AAAAA,UACAE;AAAAA,UACAO;AAAAA,UACAK;AAAAA,QAAA,CACH;AACD,cAAMG,IAAiB,MAAMC,EAA6BxB,GAAOoB,GAAgBN,CAAa;AAC1FS,QAAAA,KACAL,EAAiB,KAAKK,CAAc;AAAA,MACxC;AAIF,UAAA7C,IAAO,MAAMsB,EAAM,eAAe;AAAA,MACpC,CAACG,GAAe,GAAGgB,GAAe,GAAGN,CAAa;AAAA,MAClDK;AAAAA,MACAP;AAAAA,MACA;AAAA,IAAA;AAGJO,IAAAA,EAAiB,QAAQ,CAAQO,MAAA;AACvB,YAAArC,IAAMqC,EAAK,kBAAA;AACjBrB,QAAc,OAAOhB,CAAG,IAAIC,EAAWoC,CAAI,IAAI/C,EAAK,YAAYU,CAAG,IAAIV,EAAK,SAASU,CAAG;AAAA,IAAA,CAC3F,GACagB,EAAA,OAAOD,EAAc,mBAAmB,IAAIzB,EAAK,YAAYyB,EAAc,kBAAA,CAAmB;AAG5G,UAAMuB,IAAQjC,EAAM,WAAW,EAAE,eAC5B,OAAOA,EAAM,WAAW,SAAS,cAAc,EAC/C,IAAI,CAAAA,MAASA,EAAM,cAAc,GAChCkC,IAAOD,EAAM,KAAK,IAAI;AAC5BtB,MAAc,OAAOuB,CAAI,IAAIlD,EAAqBC,GAAMgD,CAAK;AAGvD,UAAAE,IAAenC,EAAM,WAAW,EAAE,eAAe,IAAI,CAAAA,MAASA,EAAM,cAAc,GAClFoC,IAAe,MAAM,QAAQ;AAAA,MAC/BD,EAAa;AAAA,QACT,OAAMzC,MAAAA;;AAAO,mBAAAe,IAAA,MAAMsB,EAA6BxB,GAAOb,GAAI2B,CAAa,MAA3D,OAAA,SAAAZ,EAA+D,kBAAA,MAAuBf;AAAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAG3GiB,MAAc,OAAO,aAAa3B,EAAqBC,GAAMmD,CAAY;AAGzE,UAAMC,IAAQrC,EAAM,WAAW,EAAE,eAC5B,OAAOA,EAAM,WAAW,SAAS,cAAc,EAC/C,IAAI,CAAAA,MAASA,EAAM,cAAc,GAChCsC,IAAOD,EAAM,KAAK,IAAI;AAC5B1B,MAAc,OAAO2B,CAAI,IAAItD,EAAqBC,GAAMoD,CAAK;AAGvD,UAAAE,IAAevC,EAAM,WAAW,EAAE,eAAe,IAAI,CAAAA,MAASA,EAAM,cAAc,GAClFwC,IAAe,MAAM,QAAQ;AAAA,MAC/BD,EAAa;AAAA,QACT,OAAM7C,MAAAA;;AAAO,mBAAAe,IAAA,MAAMsB,EAA6BxB,GAAOb,GAAI2B,CAAa,MAA3D,OAAA,SAAAZ,EAA+D,kBAAA,MAAuBf;AAAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAG3G,WAAAiB,EAAc,OAAO,aAAa3B,EAAqBC,GAAMuD,CAAY,GAElE,EAAC,WAAW7B,EAAAA;AAAAA,EAAa;AAAA,EAGpC,MAAM,oBAAoBJ,GAAkBP,GAAyD;;AACjG,UAAMQ,KAAsBC,IAAAT,EAAM,WAAW,MAAM,eAAe,CAAC,MAAvC,OAAA,SAAAS,EAA0C;AACtE,QAAI,CAACD;AACD,YAAM,MAAM,2BAA2B;AAErC,UAAAE,IAAgBrB,EAAyBmB,CAAmB;AAC9D,QAAA,CAACZ,EAAWc,CAAa;AACzB,YAAM,MAAM,2BAA2B;AAGrC,UAAAW,IAAgB,CAACb,CAAmB,GACpCf,IAAQ;AAAA,MACV,MAAM;AAAA,MACN,OAAOe;AAAAA,MACP,OAAO,MAAMiC,EAAqBlC,GAAOC,GAAqB,CAAA,CAAE;AAAA,IAAA,GAM9D0B,IAJQlC,EAAM,WAAW,EAAE,eAC5B,OAAOA,EAAM,WAAW,SAAS,cAAc,EAC/C,IAAI,CAAC,EAAC,gBAAA2B,EAAAA,MAAoBtC,EAAyBsC,CAAc,CAAC,EAClE,IAAI,CAAAjC,MAAMA,EAAG,kBAAA,CAAmB,EAClB,KAAK,IAAI,GAMtB4C,IAJQtC,EAAM,WAAW,EAAE,eAC5B,OAAOA,EAAM,WAAW,SAAS,cAAc,EAC/C,IAAI,CAAC,EAAC,gBAAA2B,EAAAA,MAAoBtC,EAAyBsC,CAAc,CAAC,EAClE,IAAI,CAAAjC,MAAMA,EAAG,mBAAmB,EAClB,KAAK,IAAI,GACtBgD,IAAU,MAAM,QAAQ;AAAA,MAC1B1C,EAAM,WAAW,QAAQ,eAAe,IAAI,OAAM2C,MAAkB;;AAAA,eAAA;AAAA,UAChE,MAAM;AAAA,UACN,SAEQlC,IAAA,MAAMsB,EAA6BxB,GAAOoC,EAAc,gBAAgBtB,CAAa,MAArF,OAAA,SAAAZ,EACD,kBAAA,MAAuBkC,EAAc;AAAA,QAAA;AAAA,MAAA,CAC9C;AAAA,IAAA,GAEAC,IAAW,MAAM,QAAQ;AAAA,MAC3B5C,EAAM,WAAW,SAAS,eAAe,IAAI,OAAM2C,MAAkB;;AAAA,eAAA;AAAA,UACjE,MAAM;AAAA,UACN,OAAO,MAAMF,EAAqBlC,GAAOoC,EAAc,gBAAgBtB,CAAa;AAAA,UACpF,OAAOsB,EAAc;AAAA,UACrB,eACKlC,IAAA,MAAMsB,EAA6BxB,GAAOoC,EAAc,gBAAgBtB,CAAa,MAArF,OAAA,SAAAZ,EAAyF,kBAAA,MAC1FkC,EAAc;AAAA,QAAA;AAAA,MAAA,CACpB;AAAA,IAAA,GAEAE,IAAW,MAAM,QAAQ;AAAA,MAC3B7C,EAAM,WAAW,SAAS,eAAe,IAAI,OAAM2C,MAAkB;;AAAA,eAAA;AAAA,UACjE,MAAM;AAAA,UACN,OAAO,MAAMF,EAAqBlC,GAAOoC,EAAc,gBAAgBtB,CAAa;AAAA,UACpF,OAAOsB,EAAc;AAAA,UACrB,eACKlC,IAAA,MAAMsB,EAA6BxB,GAAOoC,EAAc,gBAAgBtB,CAAa,MAArF,OAAA,SAAAZ,EAAyF,kBAAA,MAC1FkC,EAAc;AAAA,QAAA;AAAA,MAAA,CACpB;AAAA,IAAA,GAEAG,IAAY,MAAMvC,EAAM,eAAe,kBAAkBG,CAAa,GACtEqC,IAAe,MAAM,QAAQ;AAAA,MAC/B/C,EAAM,WAAW,aAAa,eAAe,IAAI,OAAM2C,MAAiB;;AACpE,cAAMK,IAAWL,EAAc,gBACzBjD,IAAKL,EAAyB2D,CAAQ,GACtCjE,IAAsCa,EAAWF,CAAE,IACnD,MAAMa,EAAM,eAAe,kBAAkBb,CAAE,MAC7Ce,IAAAqC,KAAA,OAAA,SAAAA,EAAW,aAAX,OAAA,SAAArC,EAAoC;AAAA,UAClC,CAACwC,MAAuB9C,EAAO,aAAa8C,CAAQ,EAAE,kBAAA,MAAwBD;AAAAA,QAAA,MAC7E;AACJ,eAAA;AAAA,UACH,MAAM;AAAA,UACN,aAAa;AAAA,YACT,MAAM;AAAA,YACN,OAAOA;AAAAA,YACP,OAAO,MAAMP,EAAqBlC,GAAOyC,GAAU3B,CAAa;AAAA,YAChE,eACK6B,IAAA,MAAMnB,EAA6BxB,GAAOyC,GAAU3B,CAAa,MAAjE,OAAA,SAAA6B,EAAqE,kBAAA,MACtEF;AAAAA,UAAA;AAAA,UAER,MAAMlE,EAAeC,CAAI,IAAI,aAAa;AAAA,QAAA;AAAA,MAEjD,CAAA;AAAA,IAAA,GAECoE,IAAe,MAAM,QAAQ;AAAA,MAC/BnD,EAAM,WAAW,aAAa,eAAe,IAAI,OAAM2C,MAAiB;;AACpE,cAAMK,IAAWL,EAAc,gBACzBjD,IAAKL,EAAyB2D,CAAQ,GACtCjE,IAAsCa,EAAWF,CAAE,IACnD,MAAMa,EAAM,eAAe,kBAAkBb,CAAE,MAC7Ce,IAAAqC,KAAA,OAAA,SAAAA,EAAW,aAAX,OAAA,SAAArC,EAAoC;AAAA,UAClC,CAACwC,MAAuB9C,EAAO,aAAa8C,CAAQ,EAAE,kBAAA,MAAwBD;AAAAA,QAAA,MAC7E;AACJ,eAAA;AAAA,UACH,MAAM;AAAA,UACN,aAAa;AAAA,YACT,MAAM;AAAA,YACN,OAAOA;AAAAA,YACP,OAAO,MAAMP,EAAqBlC,GAAOyC,GAAU3B,CAAa;AAAA,YAChE,eACK6B,IAAA,MAAMnB,EAA6BxB,GAAOyC,GAAU3B,CAAa,MAAjE,OAAA,SAAA6B,EAAqE,kBAAA,MACtEF;AAAAA,UAAA;AAAA,UAER,MAAMlE,EAAeC,CAAI,IAAI,aAAa;AAAA,QAAA;AAAA,MAEjD,CAAA;AAAA,IAAA,GAGCqE,KACF,MAAM,QAAQ;AAAA,MACVpD,EAAM,WAAW,EAAE,eAAe;AAAA,QAAI,CAAAA,MAClCyC,EAAqBlC,GAAOP,EAAM,gBAAgBqB,CAAa;AAAA,MAAA;AAAA,IAAA,GAGzE,KAAK,IAAI,GACLgC,KACF,MAAM,QAAQ;AAAA,MACVrD,EAAM,WAAW,EAAE,eAAe;AAAA,QAAI,CAAAA,MAClCyC,EAAqBlC,GAAOP,EAAM,gBAAgBqB,CAAa;AAAA,MAAA;AAAA,IAAA,GAGzE,KAAK,IAAI,GAELiC,IAAiB,MAAM,QAAQ;AAAA,MACjCtD,EAAM,WAAW,eAAe,eAAe,IAAI,OAAM2C,MAAiB;;AACtE,cAAMY,IAASZ,EAAc,gBACvB5D,IAAO,MAAMyE,EAAoBjD,GAAOgD,GAAQlC,CAAa;AAC5D,eAAA;AAAA,UACH,MAAM;AAAA,UACN,OAAQ,MAAMoB,EAAqBlC,GAAOgD,GAAQlC,CAAa,KAAMkC;AAAAA,UACrE,OAAOA;AAAAA,UACP,eACK9C,IAAA,MAAMsB,EAA6BxB,GAAOgD,GAAQlC,CAAa,MAA/D,OAAA,SAAAZ,EAAmE,kBAAA,MACpE8C;AAAAA,UACJ,UAAQL,IAAAnE,KAAA,OAAA,SAAAA,EAAM,gBAAN,OAAA,SAAAmE,EAAoBO,CAAAA,MAAW;AAAA,QAAA;AAAA,MAE9C,CAAA;AAAA,IAAA;AAGE,WAAA;AAAA,MACH,MAAM;AAAA,MACN,aAAahE;AAAAA,MACb,WAAWX,EAAegE,CAAS,IAAI,aAAa;AAAA,MACpD,SAAS;AAAA,QACL,MAAM;AAAA,QACN,OAAOZ;AAAAA,QACP,OAAOkB;AAAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEjB,SAAS;AAAA,QACL,MAAM;AAAA,QACN,OAAOd;AAAAA,QACP,OAAOe;AAAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEjB,SAAAX;AAAAA,MACA,UAAAE;AAAAA,MACA,UAAAC;AAAAA,MACA,aAAa,CAAC,GAAGE,GAAc,GAAGI,CAAY;AAAA,MAC9C,UAAU;AAAA,QACN,MAAM;AAAA,QACN,SAASG;AAAAA,MAAA;AAAA,IAAA;AAAA,EAEjB;AAER;","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"heatmap.js","sources":["../../../../../../../node_modules/@milaboratories/pf-plots/src/controllers/controllersByChartType/heatmap.ts"],"sourcesContent":["import {AxisSpec, PColumnSpec} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport type {ComponentStateFilter, ComponentStateSimple, DataByColumns, InputStateParent} from '../../common';\nimport {FORMAT} from '../../constants';\nimport {ControllerBase, PlotDataAndSettings} from '../ControllerBase';\nimport {ComponentController} from '../ComponentController';\nimport {columnOrAxisIdFromString, isColumnId} from '../../spec';\nimport type {DataStore} from '../../store';\nimport {\n createLinkerMap, createMultipliesByMap, getAxesSpecsFromSources,\n getColumnOrAxisLabel, getColumnOrAxisSpec,\n getColumnOrAxisValueLabelsId,\n getFiltersFromStates, getLinkerColumnsForSource,\n OptionsInfo,\n} from '../../utils';\nimport {AxisId, ColumnId} from '../../spec';\nimport type {ColumnsProvider} from '../../pframe/ColumnsProvider';\n\nexport interface HeatmapUIState extends InputStateParent<'heatmap'> {\n type: 'heatmap';\n components: {\n value: ComponentStateSimple;\n x: ComponentStateSimple;\n y: ComponentStateSimple;\n xGroupBy: ComponentStateSimple;\n yGroupBy: ComponentStateSimple;\n filters: ComponentStateFilter;\n tabBy: ComponentStateFilter;\n facetBy: ComponentStateSimple;\n annotationsX: ComponentStateSimple;\n annotationsY: ComponentStateSimple;\n tooltipContent: ComponentStateSimple;\n };\n}\n\nexport const InitialHeatmapState: HeatmapUIState = {\n type: 'heatmap',\n components: {\n value: {type: 'simple', selectorStates: []},\n x: {type: 'simple', selectorStates: []},\n y: {type: 'simple', selectorStates: []},\n xGroupBy: {type: 'simple', selectorStates: []},\n yGroupBy: {type: 'simple', selectorStates: []},\n filters: {type: 'filter', selectorStates: []},\n tabBy: {type: 'filter', selectorStates: []},\n facetBy: {type: 'simple', selectorStates: []},\n annotationsX: {type: 'simple', selectorStates: []},\n annotationsY: {type: 'simple', selectorStates: []},\n tooltipContent: {type: 'simple', selectorStates: []},\n },\n dividedAxes: {},\n};\n\nfunction isDiscreteData(spec: PColumnSpec | AxisSpec | null) {\n if (!spec) {\n return true;\n }\n if ('kind' in spec && spec.kind === 'PColumn') {\n return spec.valueType === 'String';\n }\n return (spec as AxisSpec).type === 'String';\n}\n\nfunction getMultiSourceColumn(\n data: Awaited<ReturnType<ColumnsProvider['getTableOuterJoin']>>,\n selectedSources: string[]\n) {\n if (!selectedSources.length) {\n return [];\n }\n const selectedIds = selectedSources.map(str => columnOrAxisIdFromString(str));\n const n = Object.values(data.columnsData)[0].length;\n const result: string[] = [];\n for (let i = 0; i < n; i++) {\n const value = selectedIds\n .map(id => {\n const key = id.toCanonicalString();\n return isColumnId(id) ? data.columnsData[key][i] : data.axesData[key][i];\n })\n .join(', ');\n result.push(value);\n }\n return result;\n}\n\nexport class HeatmapStateController extends ControllerBase<HeatmapUIState> {\n dataInputs = ['value'];\n dontAllowUnfilteredHighCardinality = true;\n\n constructor() {\n super(\n {\n value: new ComponentController<HeatmapUIState, 'value'>({\n componentName: 'value',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n settings: {\n isDataComponent: true,\n columnsAllowed: true,\n axesAllowed: false,\n required: true,\n },\n }),\n x: new ComponentController<HeatmapUIState, 'x'>({\n componentName: 'x',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: false,\n },\n }),\n xGroupBy: new ComponentController<HeatmapUIState, 'xGroupBy'>({\n componentName: 'xGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n y: new ComponentController<HeatmapUIState, 'y'>({\n componentName: 'y',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n required: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n }),\n yGroupBy: new ComponentController<HeatmapUIState, 'yGroupBy'>({\n componentName: 'yGroupBy',\n allowedTypes: ['Int', 'String', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n settings: {\n dimensionConsumer: true,\n multipleSelectors: true,\n axesAllowed: true,\n columnsAllowed: true,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return true;\n },\n }),\n tooltipContent: new ComponentController<HeatmapUIState, 'tooltipContent'>({\n componentName: 'tooltipContent',\n allowedTypes: ['String', 'Int', 'Long', 'Float', 'Double'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n multipleSelectors: true,\n },\n }),\n facetBy: new ComponentController<HeatmapUIState, 'facetBy'>({\n componentName: 'facetBy',\n allowedTypes: ['String', 'Int', 'Long'],\n strictlyDependsOnParents: true,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n annotationsX: new ComponentController<HeatmapUIState, 'annotationsX'>({\n componentName: 'annotationsX',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['x'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.x.selectorStates.map(s => s.selectedSource),\n ...state.components.xGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n annotationsY: new ComponentController<HeatmapUIState, 'annotationsY'>({\n componentName: 'annotationsY',\n allowedTypes: ['Int', 'Long', 'Double', 'Float', 'String'],\n parentComponents: ['value'],\n settings: {\n axesAllowed: true,\n multipleSelectors: true,\n },\n dependsOn: ['y'],\n checkSourceBySpec: (spec, state) => {\n const allowedAxes = new Set([\n ...state.components.y.selectorStates.map(s => s.selectedSource),\n ...state.components.yGroupBy.selectorStates.map(s => s.selectedSource),\n ]);\n\n if ('kind' in spec && spec.kind === 'PColumn') {\n return AxisId.fromAxesSpec(spec.axesSpec).every(id =>\n allowedAxes.has(id.toCanonicalString())\n );\n }\n return allowedAxes.has(AxisId.fromAxisSpec(spec as AxisSpec).toCanonicalString());\n },\n }),\n },\n {\n filters: new ComponentController<HeatmapUIState, 'filters'>({\n componentName: 'filters',\n allowedTypes: ['String', 'Int', 'Long', 'Double', 'Long'],\n strictlyDependsOnParents: false,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n multipleSelectors: true,\n },\n }),\n tabBy: new ComponentController<HeatmapUIState, 'tabBy'>({\n componentName: 'tabBy',\n allowedTypes: ['String', 'Int'],\n strictlyDependsOnParents: false,\n parentComponents: ['value'],\n dependsOn: ['value'],\n settings: {\n columnsAllowed: true,\n axesAllowed: true,\n dimensionConsumer: true,\n },\n }),\n }\n );\n }\n\n getMustBeConsumedAxes(state: HeatmapUIState, optionsInfo: OptionsInfo): Set<string> {\n if (!state.components.value.selectorStates.length) {\n return new Set<string>();\n }\n const sourceId = state.components.value.selectorStates[0].selectedSource;\n const data = optionsInfo.get(sourceId);\n if (!data || data.kind !== 'column') {\n return new Set<string>();\n }\n return new Set(data.spec.axesSpec.map((s) => AxisId.fromAxisSpec(s).toCanonicalString()))\n }\n\n async createDataByColumns(store: DataStore, state: HeatmapUIState): Promise<PlotDataAndSettings['data']> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n const dataByColumns: DataByColumns = {\n type: 'columns',\n id: canonicalize(state.components) ?? '',\n values: {},\n };\n\n const linkerMap = await createLinkerMap(store);\n const multipliesByMap = await createMultipliesByMap(store);\n\n const filterSelectedStates = [\n ...state.components.filters.selectorStates,\n ...state.components.tabBy.selectorStates\n ]\n // filters for column/axes data requests\n const filters = getFiltersFromStates(filterSelectedStates);\n const filterColumns = filterSelectedStates.map(s => columnOrAxisIdFromString(s.selectedSource)).filter(isColumnId);\n\n const parentSources = [valueColumnIdString];\n const parentAxesList = await getAxesSpecsFromSources(store, parentSources);\n const inputs = [\n state.components.facetBy,\n state.components.annotationsX,\n state.components.annotationsY,\n state.components.x,\n state.components.y,\n state.components.xGroupBy,\n state.components.yGroupBy,\n state.components.tooltipContent,\n ];\n const secondarySources: (ColumnId | AxisId)[] = []; // primary sources are the only value column\n const linkerColumns:ColumnId[] = [];\n\n for (const {selectedSource} of filterSelectedStates) {\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerMap,\n multipliesByMap,\n parentAxesList,\n selectedSource\n ));\n }\n\n for (const input of inputs) {\n for (const {selectedSource} of input.selectorStates) {\n secondarySources.push(columnOrAxisIdFromString(selectedSource)!);\n linkerColumns.push(...await getLinkerColumnsForSource(\n store,\n linkerMap,\n multipliesByMap,\n parentAxesList,\n selectedSource\n ));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n if (labelsColumnId) {\n secondarySources.push(labelsColumnId);\n }\n }\n }\n\n const data = await store.pFrameProvider.getTableOuterJoin(\n [valueColumnId, ...linkerColumns, ...filterColumns],\n secondarySources,\n filters,\n true\n );\n\n secondarySources.forEach(item => {\n const key = item.toCanonicalString();\n dataByColumns.values[key] = isColumnId(item) ? data.columnsData[key] : data.axesData[key];\n });\n dataByColumns.values[valueColumnId.toCanonicalString()] = data.columnsData[valueColumnId.toCanonicalString()];\n\n // x column should contain xGroup axes\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const xKey = xAxes.join(', ');\n dataByColumns.values[xKey] = getMultiSourceColumn(data, xAxes);\n\n // if grouping is not empty x keys will include grouping keys, but grouping keys should be excluded from x labels\n const xVisibleAxes = state.components.x.selectorStates.map(state => state.selectedSource);\n const xAxesLabeled = await Promise.all(\n xVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.xLabelsKey = getMultiSourceColumn(data, xAxesLabeled);\n\n // y column should contain yGroup axes\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(state => state.selectedSource);\n const yKey = yAxes.join(', ');\n dataByColumns.values[yKey] = getMultiSourceColumn(data, yAxes);\n\n // column for labels - without grouping data in labels\n const yVisibleAxes = state.components.y.selectorStates.map(state => state.selectedSource);\n const yAxesLabeled = await Promise.all(\n yVisibleAxes.map(\n async id => (await getColumnOrAxisValueLabelsId(store, id, parentSources))?.toCanonicalString() ?? id\n )\n );\n dataByColumns.values.yLabelsKey = getMultiSourceColumn(data, yAxesLabeled);\n\n return {byColumns: dataByColumns};\n }\n\n async createChartSettings(store: DataStore, state: HeatmapUIState): Promise<Record<string, unknown>> {\n const valueColumnIdString = state.components.value.selectorStates[0]?.selectedSource;\n if (!valueColumnIdString) {\n throw Error('Value column is not valid');\n }\n const valueColumnId = columnOrAxisIdFromString(valueColumnIdString);\n if (!isColumnId(valueColumnId)) {\n throw Error('Value column is not valid');\n }\n\n const parentSources = [valueColumnIdString];\n const value = {\n type: 'column',\n value: valueColumnIdString,\n label: await getColumnOrAxisLabel(store, valueColumnIdString, []),\n };\n const xAxes = state.components.x.selectorStates\n .concat(state.components.xGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const xKey = xAxes.join(', ');\n\n const yAxes = state.components.y.selectorStates\n .concat(state.components.yGroupBy.selectorStates)\n .map(({selectedSource}) => columnOrAxisIdFromString(selectedSource))\n .map(id => id.toCanonicalString());\n const yKey = yAxes.join(', ');\n const facetBy = await Promise.all(\n state.components.facetBy.selectorStates.map(async selectorState => ({\n type: 'column',\n value:\n (\n await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources)\n )?.toCanonicalString() ?? selectorState.selectedSource,\n }))\n );\n const xGroupBy = await Promise.all(\n state.components.xGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const yGroupBy = await Promise.all(\n state.components.yGroupBy.selectorStates.map(async selectorState => ({\n type: 'column',\n label: await getColumnOrAxisLabel(store, selectorState.selectedSource, parentSources),\n value: selectorState.selectedSource,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, selectorState.selectedSource, parentSources))?.toCanonicalString() ??\n selectorState.selectedSource,\n }))\n );\n const valueSpec = await store.pFrameProvider.getColumnSpecById(valueColumnId);\n const annotationsX = await Promise.all(\n state.components.annotationsX.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'x',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n const annotationsY = await Promise.all(\n state.components.annotationsY.selectorStates.map(async selectorState => {\n const idString = selectorState.selectedSource;\n const id = columnOrAxisIdFromString(idString);\n const spec: PColumnSpec | AxisSpec | null = isColumnId(id)\n ? await store.pFrameProvider.getColumnSpecById(id)\n : ((valueSpec?.axesSpec as AxisSpec[])?.find(\n (axisSpec: AxisSpec) => AxisId.fromAxisSpec(axisSpec).toCanonicalString() === idString\n ) ?? null);\n return {\n axis: 'y',\n valueColumn: {\n type: 'column',\n value: idString,\n label: await getColumnOrAxisLabel(store, idString, parentSources),\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, idString, parentSources))?.toCanonicalString() ??\n idString\n },\n type: isDiscreteData(spec) ? 'discrete' : 'continuous',\n };\n })\n );\n\n const xAxisTitle = (\n await Promise.all(\n state.components.x.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n const yAxisTitle = (\n await Promise.all(\n state.components.y.selectorStates.map(state =>\n getColumnOrAxisLabel(store, state.selectedSource, parentSources)\n )\n )\n ).join(', ');\n\n const tooltipContent = await Promise.all(\n state.components.tooltipContent.selectorStates.map(async selectorState => {\n const source = selectorState.selectedSource;\n const spec = await getColumnOrAxisSpec(store, source, parentSources);\n return {\n type: 'column',\n label: (await getColumnOrAxisLabel(store, source, parentSources)) || source,\n value: source,\n valueLabels:\n (await getColumnOrAxisValueLabelsId(store, source, parentSources))?.toCanonicalString() ??\n source,\n format: spec?.annotations?.[FORMAT] ?? '.0%'\n };\n })\n );\n\n return {\n type: 'heatmap',\n valueColumn: value,\n valueType: isDiscreteData(valueSpec) ? 'discrete' : 'continuous',\n xColumn: {\n type: 'column',\n value: xKey,\n label: xAxisTitle,\n valueLabels: 'xLabelsKey',\n },\n yColumn: {\n type: 'column',\n value: yKey,\n label: yAxisTitle,\n valueLabels: 'yLabelsKey',\n },\n facetBy,\n xGroupBy,\n yGroupBy,\n annotations: [...annotationsX, ...annotationsY],\n tooltips: {\n show: true,\n content: tooltipContent,\n },\n };\n }\n}\n"],"names":["InitialHeatmapState","isDiscreteData","spec","getMultiSourceColumn","data","selectedSources","selectedIds","str","columnOrAxisIdFromString","n","result","i","value","id","key","isColumnId","HeatmapStateController","ControllerBase","ComponentController","state","allowedAxes","s","AxisId","__publicField","optionsInfo","sourceId","store","valueColumnIdString","_a","valueColumnId","dataByColumns","canonicalize","linkerMap","createLinkerMap","multipliesByMap","createMultipliesByMap","filterSelectedStates","filters","getFiltersFromStates","filterColumns","parentSources","parentAxesList","getAxesSpecsFromSources","inputs","secondarySources","linkerColumns","selectedSource","getLinkerColumnsForSource","input","labelsColumnId","getColumnOrAxisValueLabelsId","item","xAxes","xKey","xVisibleAxes","xAxesLabeled","yAxes","yKey","yVisibleAxes","yAxesLabeled","getColumnOrAxisLabel","facetBy","selectorState","xGroupBy","yGroupBy","valueSpec","annotationsX","idString","axisSpec","_b","annotationsY","xAxisTitle","yAxisTitle","tooltipContent","source","getColumnOrAxisSpec","FORMAT"],"mappings":"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","x_google_ignoreList":[0]}
|