@milaboratories/graph-maker 1.1.164 → 1.1.166

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/ChartRenderer.tsx"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal } from 'd3-scale';\nimport lodash from 'lodash';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport type { AesItem, ColumnName, DataValue } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getChartEdgeSides } from '../utils/getChartEdgeSides';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type {\n AnnotationColorScales,\n CaptionsSizes,\n ChartDendrograms,\n ChartDimensionsData,\n ChartSizes,\n ChartsScales,\n Cluster,\n DendrogramAesScales,\n LabelAngles,\n Margins,\n} from './components/types';\nimport { CHART_SIDE_ELEMENTS, DEFAULT_AES, LEGEND_OFFSET, MIN_MARGIN, TITLE_LINE } from './constants';\nimport type { GroupedCellsData } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport {\n calculateAnnotationTitleSizes,\n calculateChartSideElementSizes,\n calculateSideElementsBBoxes,\n createContinuousColorScale,\n createDiscreteColorScale,\n} from './utils';\nimport { calculateCaptionTails } from './utils/calculateCaptionTails';\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\nfunction updateLinksHeight(root: HierarchyPointNode<Cluster>, scale: (v: number) => number, coord: 'x' | 'y') {\n function setHeight(d: HierarchyPointNode<Cluster>) {\n d[coord] = scale(d.data.height);\n if (d.children) d.children.forEach(setHeight);\n }\n setHeight(root);\n}\n\n// add shift to move nodes positions with group gaps\nfunction addShiftToLinkCoord(\n root: HierarchyPointNode<Cluster>,\n shift: number,\n coordFrom: 'x' | 'y',\n coordTo = coordFrom\n) {\n function setX(d: HierarchyPointNode<Cluster>) {\n d[coordTo] = d[coordFrom] + shift;\n if (d.children) d.children.forEach(setX);\n }\n setX(root);\n}\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getContinuousColorRange(normalization: HeatmapSettingsImpl['normalization'], colorsCount: number, valueExtent: number[]) {\n let extent = valueExtent;\n if (normalization) {\n if (normalization.colorRange) {\n extent = normalization.colorRange;\n }\n if (normalization.method === 'standardScaling') {\n extent = [-2, 2];\n }\n if (normalization.method === 'meanNormalization') {\n extent = [-0.75, 0.75];\n }\n }\n return getSteps(colorsCount, extent);\n}\n\nfunction getMaxTextLength(keys: string[], labels: Record<string, string>, textMeasurer: TextMeasurer) {\n let maxLabelSize = 0;\n for (const key of keys) {\n if (labels[key] === undefined) continue;\n const l = textMeasurer.getTextWidth(labels[key]);\n if (l > maxLabelSize) maxLabelSize = l;\n }\n return maxLabelSize;\n}\n\nfunction getCaptionHeight(size: number, angle: number) {\n if (angle === 90) {\n return size;\n }\n if (angle === 45) {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0);\n }\n return TITLE_LINE;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptions: 100,\n yAxisCaptions: 100,\n xGroupCaptions: TITLE_LINE,\n yGroupCaptions: TITLE_LINE,\n xCaptionTail: 0,\n yCaptionTail: 0,\n };\n labelAngles: LabelAngles = {\n xAxisLabels: 0,\n yAxisLabels: 0,\n xGroupLabels: 0,\n yGroupLabels: 0,\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n // scales grouped by facet\n x: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n y: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n };\n step: {\n x: Record<string, number>;\n y: Record<string, number>;\n } = { x: {}, y: {} };\n colorScale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string> = scaleLinear<string, string>()\n .domain([0, 1])\n .range(['white', 'black']);\n annotationColorScales: AnnotationColorScales = {};\n dendrogramAesScales: DendrogramAesScales = {};\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\n dendrograms: Record<string, ChartDendrograms> = {};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateMargins(title: HeatmapSettingsImpl['chartSettings']['title'], size: HeatmapSettingsImpl['chartSettings']['size']) {\n this.margins = {\n top: title.show ? TITLE_LINE_HEIGHT + TITLE_MARGIN * 2 : size.outerOffset,\n bottom: size.outerOffset,\n left: size.outerOffset,\n right: this.legend.width + size.outerOffset,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight + this.margins.bottom, this.legend.height);\n }\n\n updateLegendSize(\n valueType: HeatmapSettingsImpl['chartSettings']['valueType'],\n legend: HeatmapSettingsImpl['chartSettings']['legend'],\n annotations: HeatmapSettingsImpl['annotations'],\n columnValue: ColumnName,\n valueExtent: [number, number]\n ) {\n if (!legend.show) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n const legendHeight = this.chartSizes.chartHeight;\n const legendItems: LegendItem[] = [];\n const emptySizes = { width: 0, height: 0, left: 0, top: 0 };\n\n const getDefaultLabels = (values: (string | number)[]) => values.reduce((res: Record<string, string>, v: string | number) => { res[v] = String(v); return res; }, {});\n if (valueType === 'continuous') {\n const scale = this.colorScale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [legendHeight, 0]); //TODO: update during adding log scale for heatmap\n const title = columnValue.label ?? columnValue.value;\n legendItems.push({\n ...emptySizes,\n type: 'continuous',\n id: 'heatmapValue',\n scale,\n values,\n title,\n tickPositionScale\n });\n } else if (valueType === 'discrete') {\n const scale = this.colorScale as ScaleOrdinal<string, string>;\n const title = columnValue.label ?? columnValue.value;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: 'heatmapValue', title, scale, values, labels });\n }\n annotations.forEach(item => {\n const title = item.valueColumn.label ?? item.valueColumn.value;\n if (item.type === 'continuous') {\n const scale = this.annotationColorScales[item.id].scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [legendHeight, 0]); //TODO: update during adding log scale for heatmap\n\n legendItems.push({ ...emptySizes, type: 'continuous', id: item.id, tickPositionScale, title, scale, values });\n }\n if (item.type === 'discrete') {\n const scale = this.annotationColorScales[item.id].scale as ScaleOrdinal<string, string>;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: item.id, title, scale, values, labels });\n }\n });\n\n if (!legendItems.length) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items\n };\n }\n\n updateCaptionsSize(\n groupedCells: GroupedCellsData,\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n facetSettings: HeatmapSettingsImpl['facetSettings']\n ) {\n const textMeasurer = new TextMeasurer('bold 16px Manrope');\n const { xGroupKeys, yGroupKeys, xGroupLabels, yGroupLabels, xKeysByGroups, yKeysByGroups, xLabels, yLabels } = groupedCells.meta;\n this.labelAngles = {\n xAxisLabels: xAxis.axisLabelsAngle,\n yAxisLabels: yAxis.axisLabelsAngle,\n xGroupLabels: xAxis.groupLabelsAngle,\n yGroupLabels: yAxis.groupLabelsAngle,\n };\n\n const maxXLabelSize = xGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(xKeysByGroups[key], xLabels, textMeasurer)), 0);\n const maxYLabelSize = yGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(yKeysByGroups[key], yLabels, textMeasurer)), 0);\n const maxXGroupLabelSize = getMaxTextLength(xGroupKeys, xGroupLabels, textMeasurer);\n const maxYGroupLabelSize = getMaxTextLength(yGroupKeys, yGroupLabels, textMeasurer);\n const { xCaptionTail, yCaptionTail } = calculateCaptionTails(\n this.labelAngles,\n facetSettings,\n this.scales,\n this.step,\n groupedCells,\n textMeasurer\n );\n this.captionsSizes = {\n xCaptionTail,\n yCaptionTail,\n xGroupCaptions: getCaptionHeight(maxXGroupLabelSize, this.labelAngles.xGroupLabels),\n yGroupCaptions: getCaptionHeight(maxYGroupLabelSize, this.labelAngles.yGroupLabels),\n xAxisCaptions: getCaptionHeight(maxXLabelSize, this.labelAngles.xAxisLabels),\n yAxisCaptions: getCaptionHeight(maxYLabelSize, this.labelAngles.yAxisLabels),\n };\n }\n\n updateChartDimensions(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n const { sharedX, sharedY } = facetSettings;\n\n this.chartsDimensions = {};\n\n let currentLeft = 0;\n let currentTop = 0;\n facetKeys.forEach((key, index) => {\n const currentColumn = (index % this.columnsCount) + 1;\n const chartSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const stepX = this.step.x[key];\n const stepY = this.step.y[key];\n const sideElementSizes = calculateChartSideElementSizes(\n xAxis,\n yAxis,\n this.captionsSizes,\n annotations,\n dendrogramX,\n dendrogramY,\n chartSides,\n sharedX,\n sharedY,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n stepX,\n stepY\n );\n const annotationsTitleSizes = calculateAnnotationTitleSizes(annotations, chartSides, sharedX, sharedY);\n function getPadding(side: 'left' | 'right' | 'top' | 'bottom') {\n return Math.max(\n CHART_SIDE_ELEMENTS[side].reduce((res, el) => res + sideElementSizes[side][el], 0),\n annotationsTitleSizes[side],\n size.innerOffset\n );\n }\n const padding = {\n left: getPadding('left'),\n right: getPadding('right'),\n top: getPadding('top'),\n bottom: getPadding('bottom'),\n };\n if (padding.left < this.captionsSizes.xCaptionTail) {\n padding.left = this.captionsSizes.xCaptionTail;\n }\n if (padding.bottom < this.captionsSizes.yCaptionTail) {\n padding.bottom = this.captionsSizes.yCaptionTail;\n }\n const sideElementBBoxes = calculateSideElementsBBoxes(sideElementSizes, this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const outerWidth = this.chartSizes.chartWidth + padding.left + padding.right;\n const outerHeight = this.chartSizes.chartHeight + padding.top + padding.bottom;\n this.chartsDimensions[key] = {\n left: currentLeft,\n top: currentTop,\n inner: { width: this.chartSizes.chartWidth, height: this.chartSizes.chartHeight },\n outer: { width: outerWidth, height: outerHeight },\n padding,\n sideElementBBoxes,\n chartEdgeSides: chartSides,\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n });\n\n // sum of widths of first row\n const chartsWidth = facetKeys\n .slice(0, this.columnsCount)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.width, 0);\n // sum of heights of first column\n const chartsHeight = facetKeys\n .filter((_key, index) => index % this.columnsCount === 0)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.height, 0);\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateChartsSizes(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n groupedCells: GroupedCellsData,\n groupGap: number,\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const firstFacet = groupedCells.meta.facetKeys[0];\n if (cellWidth && facetSettings.sharedX && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].xKeys.length;\n const groupsCount = groupedCells.meta.xGroupKeys.length;\n this.chartSizes.chartWidth = keysCount * cellWidth + groupGap * (groupsCount - 1);\n } else {\n this.chartSizes.chartWidth = width;\n }\n\n if (cellHeight && facetSettings.sharedY && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].yKeys.length;\n const groupsCount = groupedCells.meta.yGroupKeys.length;\n this.chartSizes.chartHeight = keysCount * cellHeight + groupGap * (groupsCount - 1);\n } else {\n this.chartSizes.chartHeight = height;\n }\n }\n\n // update scales for cell positions, x and y for each facet\n updateScales(\n facetKeys: string[],\n groupedCells: GroupedCellsData,\n groupGap: number,\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n size: HeatmapSettingsImpl['chartSettings']['size'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const { meta, facets } = groupedCells;\n const { sharedX, sharedY } = facetSettings;\n const sortX = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => xAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n };\n const sortY = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => yAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n };\n facetKeys.forEach(facetKey => {\n const facetGroup = facets[facetKey];\n const xGroupKeys = customOrder.xGroup ? meta.xGroupKeys : sortX(meta.xGroupKeys);\n const yGroupKeys = customOrder.yGroup ? meta.yGroupKeys : sortY(meta.yGroupKeys);\n const { xKeysByGroups } = sharedX ? meta : facetGroup;\n const { yKeysByGroups } = sharedY ? meta : facetGroup;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const yCounts = yGroupKeys.map(yGroupKey => yKeysByGroups[yGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yCellsCount = yCounts.reduce((sum, count) => sum + count, 0);\n const xStep = sharedX && cellWidth ? cellWidth : (width - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount;\n const yStep = sharedY && cellHeight ? cellHeight : (height - (yCounts.filter(count => count > 0).length - 1) * groupGap) / yCellsCount;\n\n const xPositions: number[] = [];\n const xKeys: string[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = dendrogramX || customOrder.x ? xKeysByGroups[xKey] : sortX(xKeysByGroups[xKey], meta.xLabels);\n xKeys.push(...axisKeys);\n axisKeys.forEach(() => {\n xPositions.push(currentX);\n currentX += xStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentX += groupGap;\n }\n });\n\n const yPositions: number[] = [];\n const yKeys: string[] = [];\n let currentY = 0;\n yGroupKeys.forEach(yKey => {\n const axisKeys = dendrogramY || customOrder.y ? yKeysByGroups[yKey] : sortY(yKeysByGroups[yKey], meta.yLabels);\n yKeys.push(...axisKeys);\n axisKeys.forEach(() => {\n yPositions.push(currentY);\n currentY += yStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentY += groupGap;\n }\n });\n\n this.scales.x[facetKey] = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.scales.y[facetKey] = scaleOrdinal<string, number>().domain(yKeys).range(yPositions);\n this.step.x[facetKey] = xStep;\n this.step.y[facetKey] = yStep;\n });\n }\n\n updateAesScale(\n valueType: 'discrete' | 'continuous',\n valueExtent: [number, number],\n aes: HeatmapSettingsImpl['aes'],\n annotations: HeatmapSettingsImpl['annotations'],\n groupedCellsData: GroupedCellsData,\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization']\n ) {\n if (valueType === 'continuous') {\n if (aes.valueColors) {\n this.colorScale = scaleLinear<string, string>()\n .domain(aes.valuesByColors ?? getContinuousColorRange(normalization, aes.valueColors.length, valueExtent))\n .range(aes.valueColors);\n } else if (aes.colorsList) {\n this.colorScale = scaleLinear<string, string>()\n .domain(getContinuousColorRange(normalization, aes.colorsList.length, valueExtent))\n .range(aes.colorsList);\n }\n } else {\n if (aes.colorsMap) {\n const valueKeys = Object.entries(aes.colorsMap);\n this.colorScale = scaleOrdinal<string, string>()\n .domain(valueKeys.map(v => v[0]))\n .range(valueKeys.map(v => v[1]))\n .unknown('#ccc');\n } else if (aes.colorsList) {\n this.colorScale = createDiscreteColorScale(aes.colorsList, cellUniqValues.map(String));\n }\n }\n\n const { xDataByKeys, yDataByKeys } = groupedCellsData.meta;\n annotations.forEach(item => {\n const { colors, type, axis, valueColumn } = item;\n const data = (axis === 'x' ? xDataByKeys : yDataByKeys)[valueColumn.valueLabels ?? valueColumn.value];\n if (type === 'discrete') {\n const discreteValues = lodash.uniq(Object.values(data).map(String)).sort();\n this.annotationColorScales[item.id] = {\n type: 'discrete',\n scale: createDiscreteColorScale(colors, discreteValues),\n };\n } else {\n const values = Object.values(data).map(Number);\n if (!values.length) {\n return;\n }\n const [min = values[0], max = values[0]] = extent(values);\n this.annotationColorScales[item.id] = {\n type: 'continuous',\n scale: createContinuousColorScale(colors, min, max, 0, 0.5, 1),\n };\n }\n });\n }\n\n updateDendrogram(\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n groups: GroupedCellsData['facets'],\n dendrogramsData: DendrogramsData,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n facetKeys.forEach(facetKey => {\n this.dendrograms[facetKey] = { x: { treesByGroupKey: {}, data: dendrogramX }, y: { treesByGroupKey: {}, data: dendrogramY } };\n const { xKeysByGroups, yKeysByGroups } = groups[facetKey];\n const { hierarchyByGroupX, hierarchyByGroupY } = dendrogramsData[facetKey];\n if (dendrogramX) {\n const maxHeightX = xGroupKeys.reduce((res, xKey) => Math.max(res, hierarchyByGroupX[xKey]?.data.height), 0);\n this.dendrograms[facetKey].x.treesByGroupKey = xGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupX[groupKey];\n const xKeys = xKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([xKeys.length * this.step.x[facetKey], dendrogramX.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramX.position === 'top' ? [0, maxHeightX] : [maxHeightX, 0])\n .range([dendrogramX.size, 0]);\n updateLinksHeight(root, heightScale, 'y');\n addShiftToLinkCoord(root, this.scales.x[facetKey](xKeys[0]), 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].x.data = dendrogramX;\n }\n if (dendrogramY) {\n const maxHeightY = yGroupKeys.reduce((res, yKey) => Math.max(res, hierarchyByGroupY[yKey]?.data.height), 0);\n this.dendrograms[facetKey].y.treesByGroupKey = yGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupY[groupKey];\n const yKeys = yKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([yKeys.length * this.step.y[facetKey], dendrogramY.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramY.position === 'left' ? [0, maxHeightY] : [maxHeightY, 0])\n .range([dendrogramY.size, 0]);\n addShiftToLinkCoord(root, this.scales.y[facetKey](yKeys[0]), 'x', 'y');\n updateLinksHeight(root, heightScale, 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].y.data = dendrogramY;\n }\n });\n }\n\n updateDendrogramAesScales(inheritedAes: HeatmapSettingsImpl['inheritedDendrogramAes']) {\n if (!inheritedAes) {\n return;\n }\n const usedColumns = Object.keys(inheritedAes);\n this.dendrogramAesScales = usedColumns.reduce((res: DendrogramAesScales, columnName) => {\n const aesMap = inheritedAes[columnName];\n const columnValues: string[] = Object.keys(aesMap);\n res[columnName] = scaleOrdinal<string, AesItem, AesItem>()\n .domain(columnValues)\n .range(\n columnValues.map(value => ({\n ...DEFAULT_AES,\n ...aesMap[value],\n }))\n )\n .unknown(DEFAULT_AES);\n return res;\n }, {});\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: HeatmapSettingsImpl['chartSettings'],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n aes: HeatmapSettingsImpl['aes'],\n groupedCellsData: GroupedCellsData,\n annotations: HeatmapSettingsImpl['annotations'],\n valueColumn: ColumnName,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n dendrogramsData: DendrogramsData,\n inheritedDendrogramAes: HeatmapSettingsImpl['inheritedDendrogramAes'],\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization'],\n onTooltipHintSwitch: (v: boolean) => void,\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n cellsRenderingMode: 'canvas' | 'svg'\n ) {\n const { meta, facets } = groupedCellsData;\n const { facetKeys, xGroupKeys, yGroupKeys, valueExtent } = meta;\n const { xAxis, yAxis, title, size, valueType } = chartSettings;\n this.updateChartsSizes(size, facetSettings, groupedCellsData, aes.groupGap);\n this.updateAesScale(valueType, valueExtent, aes, annotations, groupedCellsData, cellUniqValues, normalization);\n this.updateScales(facetKeys, groupedCellsData, aes.groupGap, facetSettings, size, chartSettings.xAxis, chartSettings.yAxis, dendrogramX, dendrogramY, customOrder);\n // caption sizes are needed for chart paddings in chart dimensions\n this.updateCaptionsSize(groupedCellsData, xAxis, yAxis, facetSettings);\n this.updateChartDimensions(\n size,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n facetSettings,\n xAxis,\n yAxis,\n annotations,\n dendrogramX,\n dendrogramY\n );\n this.updateLegendSize(valueType, chartSettings.legend, annotations, valueColumn, valueExtent);\n this.updateMargins(title, size);\n this.updateDendrogram(facetKeys, xGroupKeys, yGroupKeys, facets, dendrogramsData, dendrogramX, dendrogramY);\n this.updateDendrogramAesScales(inheritedDendrogramAes);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n aes={aes}\n annotations={annotations}\n annotationColorScales={this.annotationColorScales}\n captionsSizes={this.captionsSizes}\n cellsMeta={meta}\n columnsCount={this.columnsCount}\n chartsDimensions={this.chartsDimensions}\n chartSettings={chartSettings}\n chartSizes={this.chartSizes}\n colorScale={this.colorScale as (v: unknown) => string}\n dendrogramAesScales={this.dendrogramAesScales}\n dendrograms={this.dendrograms}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n groupedCells={facets}\n labelAngles={this.labelAngles}\n legend={this.legend}\n margins={this.margins}\n scales={this.scales}\n settingsId={settingsId}\n step={this.step}\n xGroupKeys={xGroupKeys}\n yGroupKeys={yGroupKeys}\n onTooltipHintSwitch={onTooltipHintSwitch}\n cellsRenderingMode={cellsRenderingMode}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["COS_PI_4","INCLINE_OFFSET","updateLinksHeight","root","scale","coord","setHeight","d","addShiftToLinkCoord","shift","coordFrom","coordTo","setX","getSteps","count","valueExtent","min","max","steps","i","step","getContinuousColorRange","normalization","colorsCount","extent","getMaxTextLength","keys","labels","textMeasurer","maxLabelSize","key","l","getCaptionHeight","size","angle","TITLE_LINE","ChartRenderer","__publicField","jsx","Fragment","DEFAULT_WIDTH","DEFAULT_HEIGHT","MIN_MARGIN","scaleOrdinal","scaleLinear","_a","node","createRoot","title","TITLE_LINE_HEIGHT","TITLE_MARGIN","valueType","legend","annotations","columnValue","legendHeight","legendItems","emptySizes","getDefaultLabels","values","res","v","getContinuousLegendTicks","tickPositionScale","item","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","groupedCells","xAxis","yAxis","facetSettings","TextMeasurer","xGroupKeys","yGroupKeys","xGroupLabels","yGroupLabels","xKeysByGroups","yKeysByGroups","xLabels","yLabels","maxXLabelSize","maxYLabelSize","maxXGroupLabelSize","maxYGroupLabelSize","xCaptionTail","yCaptionTail","calculateCaptionTails","facetKeys","dendrogramX","dendrogramY","facetCount","maxNRows","maxNCols","sharedX","sharedY","currentLeft","currentTop","index","currentColumn","chartSides","getChartEdgeSides","stepX","stepY","sideElementSizes","calculateChartSideElementSizes","annotationsTitleSizes","calculateAnnotationTitleSizes","getPadding","side","CHART_SIDE_ELEMENTS","el","padding","sideElementBBoxes","calculateSideElementsBBoxes","outerWidth","outerHeight","chartsWidth","sum","chartsHeight","_key","groupGap","width","height","cellWidth","cellHeight","firstFacet","keysCount","groupsCount","customOrder","meta","facets","sortX","arr","a","b","sortY","facetKey","facetGroup","xCounts","G","xGroupKey","yCounts","yGroupKey","xCellsCount","yCellsCount","xStep","yStep","xPositions","xKeys","currentX","xKey","axisKeys","yPositions","yKeys","currentY","yKey","aes","groupedCellsData","cellUniqValues","valueKeys","createDiscreteColorScale","xDataByKeys","yDataByKeys","colors","type","axis","valueColumn","data","discreteValues","lodash","createContinuousColorScale","groups","dendrogramsData","hierarchyByGroupX","hierarchyByGroupY","maxHeightX","groupKey","hierarchy","cluster","heightScale","maxHeightY","inheritedAes","usedColumns","columnName","aesMap","columnValues","value","DEFAULT_AES","dataFrame","settingsId","chartSettings","inheritedDendrogramAes","onTooltipHintSwitch","cellsRenderingMode","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/ChartRenderer.tsx"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal } from 'd3-scale';\nimport lodash from 'lodash';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport type { AesItem, ColumnName, DataValue } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getChartEdgeSides } from '../utils/getChartEdgeSides';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type {\n AnnotationColorScales,\n CaptionsSizes,\n ChartDendrograms,\n ChartDimensionsData,\n ChartSizes,\n ChartsScales,\n Cluster,\n DendrogramAesScales,\n LabelAngles,\n Margins,\n} from './components/types';\nimport { CHART_SIDE_ELEMENTS, DEFAULT_AES, LEGEND_OFFSET, MIN_MARGIN, TITLE_LINE } from './constants';\nimport type { GroupedCellsData } from './getCells';\nimport type { DendrogramsData } from './getDendrograms';\nimport type { HeatmapSettingsImpl } from './HeatmapSettingsImpl';\nimport {\n calculateAnnotationTitleSizes,\n calculateChartSideElementSizes,\n calculateSideElementsBBoxes,\n createContinuousColorScale,\n createDiscreteColorScale,\n createDiscreteRoundColorScale,\n} from './utils';\nimport { calculateCaptionTails } from './utils/calculateCaptionTails';\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\nfunction updateLinksHeight(root: HierarchyPointNode<Cluster>, scale: (v: number) => number, coord: 'x' | 'y') {\n function setHeight(d: HierarchyPointNode<Cluster>) {\n d[coord] = scale(d.data.height);\n if (d.children) d.children.forEach(setHeight);\n }\n setHeight(root);\n}\n\n// add shift to move nodes positions with group gaps\nfunction addShiftToLinkCoord(\n root: HierarchyPointNode<Cluster>,\n shift: number,\n coordFrom: 'x' | 'y',\n coordTo = coordFrom\n) {\n function setX(d: HierarchyPointNode<Cluster>) {\n d[coordTo] = d[coordFrom] + shift;\n if (d.children) d.children.forEach(setX);\n }\n setX(root);\n}\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getContinuousColorRange(normalization: HeatmapSettingsImpl['normalization'], colorsCount: number, valueExtent: number[]) {\n let extent = valueExtent;\n if (normalization) {\n if (normalization.colorRange) {\n extent = normalization.colorRange;\n }\n if (normalization.method === 'standardScaling') {\n extent = [-2, 2];\n }\n if (normalization.method === 'meanNormalization') {\n extent = [-0.75, 0.75];\n }\n }\n return getSteps(colorsCount, extent);\n}\n\nfunction getMaxTextLength(keys: string[], labels: Record<string, string>, textMeasurer: TextMeasurer) {\n let maxLabelSize = 0;\n for (const key of keys) {\n if (labels[key] === undefined) continue;\n const l = textMeasurer.getTextWidth(labels[key]);\n if (l > maxLabelSize) maxLabelSize = l;\n }\n return maxLabelSize;\n}\n\nfunction getCaptionHeight(size: number, angle: number) {\n if (angle === 90) {\n return size;\n }\n if (angle === 45) {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0);\n }\n return TITLE_LINE;\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptions: 100,\n yAxisCaptions: 100,\n xGroupCaptions: TITLE_LINE,\n yGroupCaptions: TITLE_LINE,\n xCaptionTail: 0,\n yCaptionTail: 0,\n };\n labelAngles: LabelAngles = {\n xAxisLabels: 0,\n yAxisLabels: 0,\n xGroupLabels: 0,\n yGroupLabels: 0,\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n // scales grouped by facet\n x: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n y: { null: scaleOrdinal<string, number>().domain(['null']).range([1]) },\n };\n step: {\n x: Record<string, number>;\n y: Record<string, number>;\n } = { x: {}, y: {} };\n colorScale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string> = scaleLinear<string, string>()\n .domain([0, 1])\n .range(['white', 'black']);\n annotationColorScales: AnnotationColorScales = {};\n dendrogramAesScales: DendrogramAesScales = {};\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\n dendrograms: Record<string, ChartDendrograms> = {};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateMargins(title: HeatmapSettingsImpl['chartSettings']['title'], size: HeatmapSettingsImpl['chartSettings']['size']) {\n this.margins = {\n top: title.show ? TITLE_LINE_HEIGHT + TITLE_MARGIN * 2 : size.outerOffset,\n bottom: size.outerOffset,\n left: size.outerOffset,\n right: this.legend.width + size.outerOffset,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight + this.margins.bottom, this.legend.height);\n }\n\n updateLegendSize(\n valueType: HeatmapSettingsImpl['chartSettings']['valueType'],\n legend: HeatmapSettingsImpl['chartSettings']['legend'],\n annotations: HeatmapSettingsImpl['annotations'],\n columnValue: ColumnName,\n valueExtent: [number, number]\n ) {\n if (!legend.show) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n const legendHeight = this.chartSizes.chartHeight;\n const legendItems: LegendItem[] = [];\n const emptySizes = { width: 0, height: 0, left: 0, top: 0 };\n\n const getDefaultLabels = (values: (string | number)[]) => values.reduce((res: Record<string, string>, v: string | number) => { res[v] = String(v); return res; }, {});\n if (valueType === 'continuous') {\n const scale = this.colorScale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [legendHeight, 0]); //TODO: update during adding log scale for heatmap\n const title = columnValue.label ?? columnValue.value;\n legendItems.push({\n ...emptySizes,\n type: 'continuous',\n id: 'heatmapValue',\n scale,\n values,\n title,\n tickPositionScale\n });\n } else if (valueType === 'discrete') {\n const scale = this.colorScale as ScaleOrdinal<string, string>;\n const title = columnValue.label ?? columnValue.value;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: 'heatmapValue', title, scale, values, labels });\n }\n annotations.forEach(item => {\n const title = item.valueColumn.label ?? item.valueColumn.value;\n if (item.type === 'continuous') {\n const scale = this.annotationColorScales[item.id].scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(scale, valueExtent);\n const tickPositionScale = scaleLinear([values[0], values[values.length - 1]], [legendHeight, 0]); //TODO: update during adding log scale for heatmap\n\n legendItems.push({ ...emptySizes, type: 'continuous', id: item.id, tickPositionScale, title, scale, values });\n }\n if (item.type === 'discrete') {\n const scale = this.annotationColorScales[item.id].scale as ScaleOrdinal<string, string>;\n const values = scale.domain();\n const labels = getDefaultLabels(values);\n\n legendItems.push({ ...emptySizes, type: 'discreteColor', id: item.id, title, scale, values, labels });\n }\n });\n\n if (!legendItems.length) {\n this.legend = { width: 0, height: 0, items: [] };\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items\n };\n }\n\n updateCaptionsSize(\n groupedCells: GroupedCellsData,\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n facetSettings: HeatmapSettingsImpl['facetSettings']\n ) {\n const textMeasurer = new TextMeasurer('bold 16px Manrope');\n const { xGroupKeys, yGroupKeys, xGroupLabels, yGroupLabels, xKeysByGroups, yKeysByGroups, xLabels, yLabels } = groupedCells.meta;\n this.labelAngles = {\n xAxisLabels: xAxis.axisLabelsAngle,\n yAxisLabels: yAxis.axisLabelsAngle,\n xGroupLabels: xAxis.groupLabelsAngle,\n yGroupLabels: yAxis.groupLabelsAngle,\n };\n\n const maxXLabelSize = xGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(xKeysByGroups[key], xLabels, textMeasurer)), 0);\n const maxYLabelSize = yGroupKeys.reduce((res, key) => Math.max(res, getMaxTextLength(yKeysByGroups[key], yLabels, textMeasurer)), 0);\n const maxXGroupLabelSize = getMaxTextLength(xGroupKeys, xGroupLabels, textMeasurer);\n const maxYGroupLabelSize = getMaxTextLength(yGroupKeys, yGroupLabels, textMeasurer);\n const { xCaptionTail, yCaptionTail } = calculateCaptionTails(\n this.labelAngles,\n facetSettings,\n this.scales,\n this.step,\n groupedCells,\n textMeasurer\n );\n this.captionsSizes = {\n xCaptionTail,\n yCaptionTail,\n xGroupCaptions: getCaptionHeight(maxXGroupLabelSize, this.labelAngles.xGroupLabels),\n yGroupCaptions: getCaptionHeight(maxYGroupLabelSize, this.labelAngles.yGroupLabels),\n xAxisCaptions: getCaptionHeight(maxXLabelSize, this.labelAngles.xAxisLabels),\n yAxisCaptions: getCaptionHeight(maxYLabelSize, this.labelAngles.yAxisLabels),\n };\n }\n\n updateChartDimensions(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n annotations: HeatmapSettingsImpl['annotations'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n const { sharedX, sharedY } = facetSettings;\n\n this.chartsDimensions = {};\n\n let currentLeft = 0;\n let currentTop = 0;\n facetKeys.forEach((key, index) => {\n const currentColumn = (index % this.columnsCount) + 1;\n const chartSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const stepX = this.step.x[key];\n const stepY = this.step.y[key];\n const sideElementSizes = calculateChartSideElementSizes(\n xAxis,\n yAxis,\n this.captionsSizes,\n annotations,\n dendrogramX,\n dendrogramY,\n chartSides,\n sharedX,\n sharedY,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n stepX,\n stepY\n );\n const annotationsTitleSizes = calculateAnnotationTitleSizes(annotations, chartSides, sharedX, sharedY);\n function getPadding(side: 'left' | 'right' | 'top' | 'bottom') {\n return Math.max(\n CHART_SIDE_ELEMENTS[side].reduce((res, el) => res + sideElementSizes[side][el], 0),\n annotationsTitleSizes[side],\n size.innerOffset\n );\n }\n const padding = {\n left: getPadding('left'),\n right: getPadding('right'),\n top: getPadding('top'),\n bottom: getPadding('bottom'),\n };\n if (padding.left < this.captionsSizes.xCaptionTail) {\n padding.left = this.captionsSizes.xCaptionTail;\n }\n if (padding.bottom < this.captionsSizes.yCaptionTail) {\n padding.bottom = this.captionsSizes.yCaptionTail;\n }\n const sideElementBBoxes = calculateSideElementsBBoxes(sideElementSizes, this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const outerWidth = this.chartSizes.chartWidth + padding.left + padding.right;\n const outerHeight = this.chartSizes.chartHeight + padding.top + padding.bottom;\n this.chartsDimensions[key] = {\n left: currentLeft,\n top: currentTop,\n inner: { width: this.chartSizes.chartWidth, height: this.chartSizes.chartHeight },\n outer: { width: outerWidth, height: outerHeight },\n padding,\n sideElementBBoxes,\n chartEdgeSides: chartSides,\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n });\n\n // sum of widths of first row\n const chartsWidth = facetKeys\n .slice(0, this.columnsCount)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.width, 0);\n // sum of heights of first column\n const chartsHeight = facetKeys\n .filter((_key, index) => index % this.columnsCount === 0)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.height, 0);\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateChartsSizes(\n size: HeatmapSettingsImpl['chartSettings']['size'],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n groupedCells: GroupedCellsData,\n groupGap: number,\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const firstFacet = groupedCells.meta.facetKeys[0];\n if (cellWidth && facetSettings.sharedX && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].xKeys.length;\n const groupsCount = groupedCells.meta.xGroupKeys.length;\n this.chartSizes.chartWidth = keysCount * cellWidth + groupGap * (groupsCount - 1);\n } else {\n this.chartSizes.chartWidth = width;\n }\n\n if (cellHeight && facetSettings.sharedY && firstFacet) {\n const keysCount = groupedCells.facets[firstFacet].yKeys.length;\n const groupsCount = groupedCells.meta.yGroupKeys.length;\n this.chartSizes.chartHeight = keysCount * cellHeight + groupGap * (groupsCount - 1);\n } else {\n this.chartSizes.chartHeight = height;\n }\n }\n\n // update scales for cell positions, x and y for each facet\n updateScales(\n facetKeys: string[],\n groupedCells: GroupedCellsData,\n groupGap: number,\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n size: HeatmapSettingsImpl['chartSettings']['size'],\n xAxis: HeatmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: HeatmapSettingsImpl['chartSettings']['yAxis'],\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const { width, height, cellWidth, cellHeight } = size;\n const { meta, facets } = groupedCells;\n const { sharedX, sharedY } = facetSettings;\n const sortX = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => xAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n };\n const sortY = (arr: string[], labels: Record<string, string> = {}) => {\n return arr.sort((a, b) => yAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', { numeric: true })\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', { numeric: true })\n );\n };\n facetKeys.forEach(facetKey => {\n const facetGroup = facets[facetKey];\n const xGroupKeys = customOrder.xGroup ? meta.xGroupKeys : sortX(meta.xGroupKeys);\n const yGroupKeys = customOrder.yGroup ? meta.yGroupKeys : sortY(meta.yGroupKeys);\n const { xKeysByGroups } = sharedX ? meta : facetGroup;\n const { yKeysByGroups } = sharedY ? meta : facetGroup;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const yCounts = yGroupKeys.map(yGroupKey => yKeysByGroups[yGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yCellsCount = yCounts.reduce((sum, count) => sum + count, 0);\n const xStep = sharedX && cellWidth ? cellWidth : (width - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount;\n const yStep = sharedY && cellHeight ? cellHeight : (height - (yCounts.filter(count => count > 0).length - 1) * groupGap) / yCellsCount;\n\n const xPositions: number[] = [];\n const xKeys: string[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = dendrogramX || customOrder.x ? xKeysByGroups[xKey] : sortX(xKeysByGroups[xKey], meta.xLabels);\n xKeys.push(...axisKeys);\n axisKeys.forEach(() => {\n xPositions.push(currentX);\n currentX += xStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentX += groupGap;\n }\n });\n\n const yPositions: number[] = [];\n const yKeys: string[] = [];\n let currentY = 0;\n yGroupKeys.forEach(yKey => {\n const axisKeys = dendrogramY || customOrder.y ? yKeysByGroups[yKey] : sortY(yKeysByGroups[yKey], meta.yLabels);\n yKeys.push(...axisKeys);\n axisKeys.forEach(() => {\n yPositions.push(currentY);\n currentY += yStep;\n });\n // do not add offset for empty group\n if (axisKeys.length > 0) {\n currentY += groupGap;\n }\n });\n\n this.scales.x[facetKey] = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.scales.y[facetKey] = scaleOrdinal<string, number>().domain(yKeys).range(yPositions);\n this.step.x[facetKey] = xStep;\n this.step.y[facetKey] = yStep;\n });\n }\n\n updateAesScale(\n valueType: 'discrete' | 'continuous',\n valueExtent: [number, number],\n aes: HeatmapSettingsImpl['aes'],\n annotations: HeatmapSettingsImpl['annotations'],\n groupedCellsData: GroupedCellsData,\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization']\n ) {\n if (valueType === 'continuous') {\n if (aes.valueColors) {\n this.colorScale = scaleLinear<string, string>()\n .domain(aes.valuesByColors ?? getContinuousColorRange(normalization, aes.valueColors.length, valueExtent))\n .range(aes.valueColors);\n } else if (aes.colorsList) {\n this.colorScale = scaleLinear<string, string>()\n .domain(getContinuousColorRange(normalization, aes.colorsList.length, valueExtent))\n .range(aes.colorsList);\n }\n } else {\n if (aes.colorsMap) {\n const valueKeys = Object.entries(aes.colorsMap);\n this.colorScale = scaleOrdinal<string, string>()\n .domain(valueKeys.map(v => v[0]))\n .range(valueKeys.map(v => v[1]))\n .unknown('#ccc');\n } else if (aes.colorsList) {\n this.colorScale = createDiscreteColorScale(aes.colorsList, cellUniqValues.map(String));\n }\n }\n\n const { xDataByKeys, yDataByKeys } = groupedCellsData.meta;\n annotations.forEach(item => {\n const { colors, type, axis, valueColumn } = item;\n const data = (axis === 'x' ? xDataByKeys : yDataByKeys)[valueColumn.valueLabels ?? valueColumn.value];\n if (type === 'discrete') {\n const discreteValues = lodash.uniq(Object.values(data).map(String)).sort();\n this.annotationColorScales[item.id] = {\n type: 'discrete',\n scale: createDiscreteRoundColorScale(colors, discreteValues),\n };\n } else {\n const values = Object.values(data).map(Number);\n if (!values.length) {\n return;\n }\n const [min = values[0], max = values[0]] = extent(values);\n this.annotationColorScales[item.id] = {\n type: 'continuous',\n scale: createContinuousColorScale(colors, min, max, 0, 0.5, 1),\n };\n }\n });\n }\n\n updateDendrogram(\n facetKeys: string[],\n xGroupKeys: string[],\n yGroupKeys: string[],\n groups: GroupedCellsData['facets'],\n dendrogramsData: DendrogramsData,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY']\n ) {\n facetKeys.forEach(facetKey => {\n this.dendrograms[facetKey] = { x: { treesByGroupKey: {}, data: dendrogramX }, y: { treesByGroupKey: {}, data: dendrogramY } };\n const { xKeysByGroups, yKeysByGroups } = groups[facetKey];\n const { hierarchyByGroupX, hierarchyByGroupY } = dendrogramsData[facetKey];\n if (dendrogramX) {\n const maxHeightX = xGroupKeys.reduce((res, xKey) => Math.max(res, hierarchyByGroupX[xKey]?.data.height), 0);\n this.dendrograms[facetKey].x.treesByGroupKey = xGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupX[groupKey];\n const xKeys = xKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([xKeys.length * this.step.x[facetKey], dendrogramX.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramX.position === 'top' ? [0, maxHeightX] : [maxHeightX, 0])\n .range([dendrogramX.size, 0]);\n updateLinksHeight(root, heightScale, 'y');\n addShiftToLinkCoord(root, this.scales.x[facetKey](xKeys[0]), 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].x.data = dendrogramX;\n }\n if (dendrogramY) {\n const maxHeightY = yGroupKeys.reduce((res, yKey) => Math.max(res, hierarchyByGroupY[yKey]?.data.height), 0);\n this.dendrograms[facetKey].y.treesByGroupKey = yGroupKeys.reduce((res, groupKey) => {\n const hierarchy = hierarchyByGroupY[groupKey];\n const yKeys = yKeysByGroups[groupKey];\n cluster()\n .separation(() => 1)\n .size([yKeys.length * this.step.y[facetKey], dendrogramY.size])(\n hierarchy as HierarchyNode<unknown>\n );\n const root = hierarchy as HierarchyPointNode<Cluster>;\n const heightScale = scaleLinear()\n .domain(dendrogramY.position === 'left' ? [0, maxHeightY] : [maxHeightY, 0])\n .range([dendrogramY.size, 0]);\n addShiftToLinkCoord(root, this.scales.y[facetKey](yKeys[0]), 'x', 'y');\n updateLinksHeight(root, heightScale, 'x');\n res[groupKey] = root;\n return res;\n }, {} as Record<string, HierarchyPointNode<Cluster>>);\n this.dendrograms[facetKey].y.data = dendrogramY;\n }\n });\n }\n\n updateDendrogramAesScales(inheritedAes: HeatmapSettingsImpl['inheritedDendrogramAes']) {\n if (!inheritedAes) {\n return;\n }\n const usedColumns = Object.keys(inheritedAes);\n this.dendrogramAesScales = usedColumns.reduce((res: DendrogramAesScales, columnName) => {\n const aesMap = inheritedAes[columnName];\n const columnValues: string[] = Object.keys(aesMap);\n res[columnName] = scaleOrdinal<string, AesItem, AesItem>()\n .domain(columnValues)\n .range(\n columnValues.map(value => ({\n ...DEFAULT_AES,\n ...aesMap[value],\n }))\n )\n .unknown(DEFAULT_AES);\n return res;\n }, {});\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: HeatmapSettingsImpl['chartSettings'],\n facetSettings: HeatmapSettingsImpl['facetSettings'],\n aes: HeatmapSettingsImpl['aes'],\n groupedCellsData: GroupedCellsData,\n annotations: HeatmapSettingsImpl['annotations'],\n valueColumn: ColumnName,\n dendrogramX: HeatmapSettingsImpl['dendrogramX'],\n dendrogramY: HeatmapSettingsImpl['dendrogramY'],\n dendrogramsData: DendrogramsData,\n inheritedDendrogramAes: HeatmapSettingsImpl['inheritedDendrogramAes'],\n cellUniqValues: DataValue[],\n normalization: HeatmapSettingsImpl['normalization'],\n onTooltipHintSwitch: (v: boolean) => void,\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n cellsRenderingMode: 'canvas' | 'svg'\n ) {\n const { meta, facets } = groupedCellsData;\n const { facetKeys, xGroupKeys, yGroupKeys, valueExtent } = meta;\n const { xAxis, yAxis, title, size, valueType } = chartSettings;\n this.updateChartsSizes(size, facetSettings, groupedCellsData, aes.groupGap);\n this.updateAesScale(valueType, valueExtent, aes, annotations, groupedCellsData, cellUniqValues, normalization);\n this.updateScales(facetKeys, groupedCellsData, aes.groupGap, facetSettings, size, chartSettings.xAxis, chartSettings.yAxis, dendrogramX, dendrogramY, customOrder);\n // caption sizes are needed for chart paddings in chart dimensions\n this.updateCaptionsSize(groupedCellsData, xAxis, yAxis, facetSettings);\n this.updateChartDimensions(\n size,\n facetKeys,\n xGroupKeys,\n yGroupKeys,\n facetSettings,\n xAxis,\n yAxis,\n annotations,\n dendrogramX,\n dendrogramY\n );\n this.updateLegendSize(valueType, chartSettings.legend, annotations, valueColumn, valueExtent);\n this.updateMargins(title, size);\n this.updateDendrogram(facetKeys, xGroupKeys, yGroupKeys, facets, dendrogramsData, dendrogramX, dendrogramY);\n this.updateDendrogramAesScales(inheritedDendrogramAes);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n aes={aes}\n annotations={annotations}\n annotationColorScales={this.annotationColorScales}\n captionsSizes={this.captionsSizes}\n cellsMeta={meta}\n columnsCount={this.columnsCount}\n chartsDimensions={this.chartsDimensions}\n chartSettings={chartSettings}\n chartSizes={this.chartSizes}\n colorScale={this.colorScale as (v: unknown) => string}\n dendrogramAesScales={this.dendrogramAesScales}\n dendrograms={this.dendrograms}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n groupedCells={facets}\n labelAngles={this.labelAngles}\n legend={this.legend}\n margins={this.margins}\n scales={this.scales}\n settingsId={settingsId}\n step={this.step}\n xGroupKeys={xGroupKeys}\n yGroupKeys={yGroupKeys}\n onTooltipHintSwitch={onTooltipHintSwitch}\n cellsRenderingMode={cellsRenderingMode}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"names":["COS_PI_4","INCLINE_OFFSET","updateLinksHeight","root","scale","coord","setHeight","d","addShiftToLinkCoord","shift","coordFrom","coordTo","setX","getSteps","count","valueExtent","min","max","steps","i","step","getContinuousColorRange","normalization","colorsCount","extent","getMaxTextLength","keys","labels","textMeasurer","maxLabelSize","key","l","getCaptionHeight","size","angle","TITLE_LINE","ChartRenderer","__publicField","jsx","Fragment","DEFAULT_WIDTH","DEFAULT_HEIGHT","MIN_MARGIN","scaleOrdinal","scaleLinear","_a","node","createRoot","title","TITLE_LINE_HEIGHT","TITLE_MARGIN","valueType","legend","annotations","columnValue","legendHeight","legendItems","emptySizes","getDefaultLabels","values","res","v","getContinuousLegendTicks","tickPositionScale","item","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","groupedCells","xAxis","yAxis","facetSettings","TextMeasurer","xGroupKeys","yGroupKeys","xGroupLabels","yGroupLabels","xKeysByGroups","yKeysByGroups","xLabels","yLabels","maxXLabelSize","maxYLabelSize","maxXGroupLabelSize","maxYGroupLabelSize","xCaptionTail","yCaptionTail","calculateCaptionTails","facetKeys","dendrogramX","dendrogramY","facetCount","maxNRows","maxNCols","sharedX","sharedY","currentLeft","currentTop","index","currentColumn","chartSides","getChartEdgeSides","stepX","stepY","sideElementSizes","calculateChartSideElementSizes","annotationsTitleSizes","calculateAnnotationTitleSizes","getPadding","side","CHART_SIDE_ELEMENTS","el","padding","sideElementBBoxes","calculateSideElementsBBoxes","outerWidth","outerHeight","chartsWidth","sum","chartsHeight","_key","groupGap","width","height","cellWidth","cellHeight","firstFacet","keysCount","groupsCount","customOrder","meta","facets","sortX","arr","a","b","sortY","facetKey","facetGroup","xCounts","G","xGroupKey","yCounts","yGroupKey","xCellsCount","yCellsCount","xStep","yStep","xPositions","xKeys","currentX","xKey","axisKeys","yPositions","yKeys","currentY","yKey","aes","groupedCellsData","cellUniqValues","valueKeys","createDiscreteColorScale","xDataByKeys","yDataByKeys","colors","type","axis","valueColumn","data","discreteValues","lodash","createDiscreteRoundColorScale","createContinuousColorScale","groups","dendrogramsData","hierarchyByGroupX","hierarchyByGroupY","maxHeightX","groupKey","hierarchy","cluster","heightScale","maxHeightY","inheritedAes","usedColumns","columnName","aesMap","columnValues","value","DEFAULT_AES","dataFrame","settingsId","chartSettings","inheritedDendrogramAes","onTooltipHintSwitch","cellsRenderingMode","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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","x_google_ignoreList":[0]}
@@ -2,11 +2,11 @@ import { renderToString as F } from "../node_modules/react-dom/server.browser.js
2
2
  import { AbstractChart as L } from "../AbstractChart.js";
3
3
  import { isColumnName as A } from "../utils/index.js";
4
4
  import $ from "./ChartRenderer.js";
5
- import { getCells as K } from "./getCells.js";
6
- import { getDendrograms as M } from "./getDendrograms.js";
5
+ import { getCells as J } from "./getCells.js";
6
+ import { getDendrograms as K } from "./getDendrograms.js";
7
7
  import { HeatmapSettingsImpl as k } from "./HeatmapSettingsImpl.js";
8
- import { MAX_SVG_RENDERED_CELLS_COUNT as P } from "./constants.js";
9
- var W = Object.defineProperty, J = (g, t, e) => t in g ? W(g, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : g[t] = e, X = (g, t, e) => J(g, typeof t != "symbol" ? t + "" : t, e);
8
+ import { MAX_SVG_RENDERED_CELLS_COUNT as M } from "./constants.js";
9
+ var P = Object.defineProperty, W = (g, t, e) => t in g ? P(g, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : g[t] = e, X = (g, t, e) => W(g, typeof t != "symbol" ? t + "" : t, e);
10
10
  class lt extends L {
11
11
  constructor(t, e, a) {
12
12
  super(t, e), X(this, "settings"), X(this, "chartRenderer", new $()), X(this, "onTooltipHintSwitch", () => {
@@ -90,7 +90,7 @@ class lt extends L {
90
90
  NAValueAs: l,
91
91
  keysOrder: p,
92
92
  aggregation: y
93
- } = this.settings, u = K(
93
+ } = this.settings, u = J(
94
94
  this.data,
95
95
  t,
96
96
  e,
@@ -107,7 +107,7 @@ class lt extends L {
107
107
  i.xAxis,
108
108
  i.yAxis,
109
109
  y
110
- ), C = M(u, d, s, m), S = i.valueType === "discrete" ? this.data.getColumnCategories(a.value) : [];
110
+ ), C = K(u, d, s, m), S = i.valueType === "discrete" ? this.data.getColumnCategories(a.value) : [];
111
111
  this.calculatedData = {
112
112
  groupedCellsData: u,
113
113
  dendrogramsData: C,
@@ -147,7 +147,7 @@ class lt extends L {
147
147
  var h;
148
148
  return ((h = l[_.value]) == null ? void 0 : h.length) > 0;
149
149
  })
150
- }, b = this.data.columnNames.length ? this.data.getColumn(this.data.columnNames[0]).length : 0, G = this.settings.cellsRenderingMode ?? (b > P ? "canvas" : "svg");
150
+ }, b = this.data.columnNames.length ? this.data.getColumn(this.data.columnNames[0]).length : 0, G = this.settings.cellsRenderingMode ?? (b > M ? "canvas" : "svg");
151
151
  this.chartRenderer.render(
152
152
  this.data,
153
153
  a,
@@ -1,22 +1,27 @@
1
- import S from "../../node_modules/lodash/lodash.js";
2
- import c from "../../node_modules/d3-scale/src/linear.js";
3
- import j from "../../node_modules/d3-scale/src/ordinal.js";
4
- function l(r, a, e) {
5
- const t = (a - r) / e, o = S.range(r, a - t / 2, t);
6
- return o.push(a), o;
1
+ import k from "../../node_modules/lodash/lodash.js";
2
+ import m from "../../node_modules/d3-scale/src/linear.js";
3
+ import f from "../../node_modules/d3-scale/src/ordinal.js";
4
+ function l(t, o, a) {
5
+ const e = (o - t) / a, n = k.range(t, o - e / 2, e);
6
+ return n.push(o), n;
7
7
  }
8
- function x(r, a) {
9
- const e = l(0, 1, r.length - 1), t = c().domain(e).range(r), o = l(0, 1, a.length - 1).map((i) => t(i));
10
- return j().domain(a).range(o).unknown("#ccc");
8
+ function b(t, o) {
9
+ const a = l(0, 1, t.length - 1), e = m().domain(a).range(t), n = l(0, 1, o.length - 1).map((c) => e(c));
10
+ return f().domain(o).range(n).unknown("#ccc");
11
11
  }
12
- function D(r, a, e, t, o, i) {
13
- const m = l(0, 1, r.length - 1), p = c().domain(m).range(r), u = [t, ...m.filter((n) => n > t && n < o), o], g = [o, ...m.filter((n) => n > o && n < i), i], s = (e - a) / 2, f = u.map((n) => a + s * (n - t) / (o - t)), d = g.map(
14
- (n) => (a + e) / 2 + s * (n - o) / (i - o)
15
- ), h = u.map((n) => p(n)), C = g.map((n) => p(n));
16
- return c().domain(f.concat(d.slice(1))).range(h.concat(C.slice(1)));
12
+ function j(t, o) {
13
+ const a = o.map((e, n) => t[n % t.length]);
14
+ return f().domain(o).range(a).unknown("#ccc");
15
+ }
16
+ function x(t, o, a, e, n, c) {
17
+ const i = l(0, 1, t.length - 1), s = m().domain(i).range(t), u = [e, ...i.filter((r) => r > e && r < n), n], p = [n, ...i.filter((r) => r > n && r < c), c], g = (a - o) / 2, d = u.map((r) => o + g * (r - e) / (n - e)), h = p.map(
18
+ (r) => (o + a) / 2 + g * (r - n) / (c - n)
19
+ ), C = u.map((r) => s(r)), S = p.map((r) => s(r));
20
+ return m().domain(d.concat(h.slice(1))).range(C.concat(S.slice(1)));
17
21
  }
18
22
  export {
19
- D as createContinuousColorScale,
20
- x as createDiscreteColorScale
23
+ x as createContinuousColorScale,
24
+ b as createDiscreteColorScale,
25
+ j as createDiscreteRoundColorScale
21
26
  };
22
27
  //# sourceMappingURL=createColorScales.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createColorScales.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/utils/createColorScales.ts"],"sourcesContent":["import {scaleLinear, scaleOrdinal} from 'd3-scale';\nimport lodash from 'lodash';\n\nfunction range(from: number, to: number, steps: number) {\n const step = (to - from) / steps;\n const res = lodash.range(from, to - step / 2, step);\n res.push(to);\n return res;\n}\n\n// create discrete scale for N colors from M colors\nexport function createDiscreteColorScale(colors: string[], discreteValues: string[]) {\n const steps1 = range(0, 1, colors.length - 1);\n // gradientScale - smooth color scale with equal distance between adjacent colors\n const gradientScale = scaleLinear<string, string>().domain(steps1).range(colors);\n const steps2 = range(0, 1, discreteValues.length - 1);\n const colors2 = steps2.map(step => gradientScale(step));\n return scaleOrdinal<string, string>().domain(discreteValues).range(colors2).unknown('#ccc');\n}\n\n// create continuous scale for N colors by 3 points on gradient\nexport function createContinuousColorScale(\n colors: string[],\n minValue: number,\n maxValue: number,\n point0: number,\n point50: number,\n point100: number\n) {\n const gradientSteps = range(0, 1, colors.length - 1);\n const gradientScale = scaleLinear<string, string>().domain(gradientSteps).range(colors);\n const steps1 = [point0, ...gradientSteps.filter(step => step > point0 && step < point50), point50];\n const steps2 = [point50, ...gradientSteps.filter(step => step > point50 && step < point100), point100];\n const halfDomain = (maxValue - minValue) / 2;\n // move points proportionally, 0%-50% and 50%-100%\n const domain1 = steps1.map(step => minValue + (halfDomain * (step - point0)) / (point50 - point0));\n const domain2 = steps2.map(\n step => (minValue + maxValue) / 2 + (halfDomain * (step - point50)) / (point100 - point50)\n );\n\n const colors1 = steps1.map(step => gradientScale(step));\n const colors2 = steps2.map(step => gradientScale(step));\n\n return scaleLinear<string, string>()\n .domain(domain1.concat(domain2.slice(1)))\n .range(colors1.concat(colors2.slice(1)));\n}\n"],"names":["range","from","to","steps","step","res","lodash","createDiscreteColorScale","colors","discreteValues","steps1","gradientScale","scaleLinear","colors2","scaleOrdinal","createContinuousColorScale","minValue","maxValue","point0","point50","point100","gradientSteps","steps2","halfDomain","domain1","domain2","colors1"],"mappings":";;;AAGA,SAASA,EAAMC,GAAcC,GAAYC,GAAe;AACpD,QAAMC,KAAQF,IAAKD,KAAQE,GACrBE,IAAMC,EAAO,MAAML,GAAMC,IAAKE,IAAO,GAAGA,CAAI;AAClD,SAAAC,EAAI,KAAKH,CAAE,GACJG;AACX;AAGO,SAASE,EAAyBC,GAAkBC,GAA0B;AACjF,QAAMC,IAASV,EAAM,GAAG,GAAGQ,EAAO,SAAS,CAAC,GAEtCG,IAAgBC,EAAAA,EAA8B,OAAOF,CAAM,EAAE,MAAMF,CAAM,GAEzEK,IADSb,EAAM,GAAG,GAAGS,EAAe,SAAS,CAAC,EAC7B,IAAI,CAAAL,MAAQO,EAAcP,CAAI,CAAC;AACtD,SAAOU,EAAAA,EAA+B,OAAOL,CAAc,EAAE,MAAMI,CAAO,EAAE,QAAQ,MAAM;AAC9F;AAGO,SAASE,EACZP,GACAQ,GACAC,GACAC,GACAC,GACAC,GACF;AACE,QAAMC,IAAgBrB,EAAM,GAAG,GAAGQ,EAAO,SAAS,CAAC,GAC7CG,IAAgBC,EAAAA,EAA8B,OAAOS,CAAa,EAAE,MAAMb,CAAM,GAChFE,IAAS,CAACQ,GAAQ,GAAGG,EAAc,OAAO,CAAAjB,MAAQA,IAAOc,KAAUd,IAAOe,CAAO,GAAGA,CAAO,GAC3FG,IAAS,CAACH,GAAS,GAAGE,EAAc,OAAO,CAAAjB,MAAQA,IAAOe,KAAWf,IAAOgB,CAAQ,GAAGA,CAAQ,GAC/FG,KAAcN,IAAWD,KAAY,GAErCQ,IAAUd,EAAO,IAAI,CAAAN,MAAQY,IAAYO,KAAcnB,IAAOc,MAAYC,IAAUD,EAAO,GAC3FO,IAAUH,EAAO;AAAA,IACnB,QAASN,IAAWC,KAAY,IAAKM,KAAcnB,IAAOe,MAAaC,IAAWD;AAAAA,EAAA,GAGhFO,IAAUhB,EAAO,IAAI,CAAAN,MAAQO,EAAcP,CAAI,CAAC,GAChDS,IAAUS,EAAO,IAAI,CAAAlB,MAAQO,EAAcP,CAAI,CAAC;AAEtD,SAAOQ,IACF,OAAOY,EAAQ,OAAOC,EAAQ,MAAM,CAAC,CAAC,CAAC,EACvC,MAAMC,EAAQ,OAAOb,EAAQ,MAAM,CAAC,CAAC,CAAC;AAC/C;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"createColorScales.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/heatmap/utils/createColorScales.ts"],"sourcesContent":["import {scaleLinear, scaleOrdinal} from 'd3-scale';\nimport lodash from 'lodash';\n\nfunction range(from: number, to: number, steps: number) {\n const step = (to - from) / steps;\n const res = lodash.range(from, to - step / 2, step);\n res.push(to);\n return res;\n}\n\n// create discrete scale for N colors from M colors\nexport function createDiscreteColorScale(colors: string[], discreteValues: string[]) {\n const steps1 = range(0, 1, colors.length - 1);\n // gradientScale - smooth color scale with equal distance between adjacent colors\n const gradientScale = scaleLinear<string, string>().domain(steps1).range(colors);\n const steps2 = range(0, 1, discreteValues.length - 1);\n const colors2 = steps2.map(step => gradientScale(step));\n return scaleOrdinal<string, string>().domain(discreteValues).range(colors2).unknown('#ccc');\n}\n// create discrete scale from list of colors using them again from start if colors count more than values count\nexport function createDiscreteRoundColorScale(colors: string[], discreteValues: string[]) {\n const colors2 = discreteValues.map((v, idx) => colors[idx % colors.length]);\n return scaleOrdinal<string, string>().domain(discreteValues).range(colors2).unknown('#ccc');\n}\n\n// create continuous scale for N colors by 3 points on gradient\nexport function createContinuousColorScale(\n colors: string[],\n minValue: number,\n maxValue: number,\n point0: number,\n point50: number,\n point100: number\n) {\n const gradientSteps = range(0, 1, colors.length - 1);\n const gradientScale = scaleLinear<string, string>().domain(gradientSteps).range(colors);\n const steps1 = [point0, ...gradientSteps.filter(step => step > point0 && step < point50), point50];\n const steps2 = [point50, ...gradientSteps.filter(step => step > point50 && step < point100), point100];\n const halfDomain = (maxValue - minValue) / 2;\n // move points proportionally, 0%-50% and 50%-100%\n const domain1 = steps1.map(step => minValue + (halfDomain * (step - point0)) / (point50 - point0));\n const domain2 = steps2.map(\n step => (minValue + maxValue) / 2 + (halfDomain * (step - point50)) / (point100 - point50)\n );\n\n const colors1 = steps1.map(step => gradientScale(step));\n const colors2 = steps2.map(step => gradientScale(step));\n\n return scaleLinear<string, string>()\n .domain(domain1.concat(domain2.slice(1)))\n .range(colors1.concat(colors2.slice(1)));\n}\n"],"names":["range","from","to","steps","step","res","lodash","createDiscreteColorScale","colors","discreteValues","steps1","gradientScale","scaleLinear","colors2","scaleOrdinal","createDiscreteRoundColorScale","v","idx","createContinuousColorScale","minValue","maxValue","point0","point50","point100","gradientSteps","steps2","halfDomain","domain1","domain2","colors1"],"mappings":";;;AAGA,SAASA,EAAMC,GAAcC,GAAYC,GAAe;AACpD,QAAMC,KAAQF,IAAKD,KAAQE,GACrBE,IAAMC,EAAO,MAAML,GAAMC,IAAKE,IAAO,GAAGA,CAAI;AAClD,SAAAC,EAAI,KAAKH,CAAE,GACJG;AACX;AAGO,SAASE,EAAyBC,GAAkBC,GAA0B;AACjF,QAAMC,IAASV,EAAM,GAAG,GAAGQ,EAAO,SAAS,CAAC,GAEtCG,IAAgBC,EAAAA,EAA8B,OAAOF,CAAM,EAAE,MAAMF,CAAM,GAEzEK,IADSb,EAAM,GAAG,GAAGS,EAAe,SAAS,CAAC,EAC7B,IAAI,CAAAL,MAAQO,EAAcP,CAAI,CAAC;AACtD,SAAOU,EAAAA,EAA+B,OAAOL,CAAc,EAAE,MAAMI,CAAO,EAAE,QAAQ,MAAM;AAC9F;AAEO,SAASE,EAA8BP,GAAkBC,GAA0B;AACtF,QAAMI,IAAUJ,EAAe,IAAI,CAACO,GAAGC,MAAQT,EAAOS,IAAMT,EAAO,MAAM,CAAC;AAC1E,SAAOM,EAAAA,EAA+B,OAAOL,CAAc,EAAE,MAAMI,CAAO,EAAE,QAAQ,MAAM;AAC9F;AAGO,SAASK,EACZV,GACAW,GACAC,GACAC,GACAC,GACAC,GACF;AACE,QAAMC,IAAgBxB,EAAM,GAAG,GAAGQ,EAAO,SAAS,CAAC,GAC7CG,IAAgBC,EAAAA,EAA8B,OAAOY,CAAa,EAAE,MAAMhB,CAAM,GAChFE,IAAS,CAACW,GAAQ,GAAGG,EAAc,OAAO,CAAApB,MAAQA,IAAOiB,KAAUjB,IAAOkB,CAAO,GAAGA,CAAO,GAC3FG,IAAS,CAACH,GAAS,GAAGE,EAAc,OAAO,CAAApB,MAAQA,IAAOkB,KAAWlB,IAAOmB,CAAQ,GAAGA,CAAQ,GAC/FG,KAAcN,IAAWD,KAAY,GAErCQ,IAAUjB,EAAO,IAAI,CAAAN,MAAQe,IAAYO,KAActB,IAAOiB,MAAYC,IAAUD,EAAO,GAC3FO,IAAUH,EAAO;AAAA,IACnB,QAASN,IAAWC,KAAY,IAAKM,KAActB,IAAOkB,MAAaC,IAAWD;AAAAA,EAAA,GAGhFO,IAAUnB,EAAO,IAAI,CAAAN,MAAQO,EAAcP,CAAI,CAAC,GAChDS,IAAUY,EAAO,IAAI,CAAArB,MAAQO,EAAcP,CAAI,CAAC;AAEtD,SAAOQ,IACF,OAAOe,EAAQ,OAAOC,EAAQ,MAAM,CAAC,CAAC,CAAC,EACvC,MAAMC,EAAQ,OAAOhB,EAAQ,MAAM,CAAC,CAAC,CAAC;AAC/C;","x_google_ignoreList":[0]}
@@ -253,7 +253,7 @@ function le(t, n, a, o) {
253
253
  }
254
254
  function ce(t, n) {
255
255
  const a = n.columnsData[Object.keys(n.columnsData)[0]].length, o = new Int32Array(a).fill(0), i = t.filter(
256
- (e) => e.selectedFilterRange && (e.selectedFilterRange.min !== void 0 || e.selectedFilterRange.max !== void 0) || e.selectedFilterValues && e.selectedFilterValues.length
256
+ (e) => e.selectedFilterRange && (e.selectedFilterRange.min !== void 0 || e.selectedFilterRange.max !== void 0) || e.selectedFilterValues && e.selectedFilterValues.length || e.type === "subset"
257
257
  );
258
258
  for (let e = 0; e < a; e++) {
259
259
  let r = i.length === 0;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../node_modules/@milaboratories/pf-plots/src/utils.ts"],"sourcesContent":["import { getNormalizedAxesList, LinkerMap, SingleValuePredicateV2, ValueType } from '@milaboratories/pl-model-common';\nimport { TableOuterJoinResult } from './pframe/ColumnsProvider';\nimport type { DataStore, PValue } from './store';\nimport type { ColumnOrAxisIdString } from './spec';\nimport { isAxisId } from './spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString, isColumnId } from './spec';\nimport type { AxisData, ColumnData, InputState, SelectorStateFilter } from './common';\nimport {\n AXIS_NATURE_KEY,\n COLUMN_DOMAIN_KEY,\n COLUMN_LABEL_KEY,\n COLUMN_NAME_KEY, IS_LINKER_COLUMN,\n IS_VIRTUAL_COLUMN,\n MULTIPLIES_BY,\n SUBSET_FILTER_KEY,\n} from './constants';\nimport {\n AxisSpec,\n type PColumnSpec,\n type PObjectId,\n type PTableRecordSingleValueFilterV2,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport { DemoDataStore } from './demoStore';\n\nexport type OptionsInfo = Map<ColumnOrAxisIdString, ColumnData | AxisData>;\nexport function getDefaultInfo(sourceIdStr: ColumnOrAxisIdString): ColumnData | AxisData {\n const item = columnOrAxisIdFromString(sourceIdStr);\n const { name, type } = item;\n if (isColumnId(item)) {\n return {\n kind: 'column',\n name: '',\n label: ' ',\n type: item.type,\n spec: { axesSpec: [], kind: 'PColumn', valueType: item.type, name },\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: item.type === 'String'\n };\n }\n return {\n kind: 'axis',\n name: '',\n label: ' ',\n type: type,\n spec: { type, name },\n mustBeConsumed: false,\n dividable: false,\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: type === 'String',\n isNonHomogenous: false,\n parentSources: [],\n };\n}\n\nexport function getStateCopy<State extends InputState>(state: State): State {\n return {\n type: state.type,\n components: { ...state.components },\n dividedAxes: { ...state.dividedAxes },\n } as State;\n}\n\nfunction normalizeFilterReference(v: number, valueType: ValueType): number {\n if (valueType === 'Int' || valueType === 'Long') {\n return Math.floor(v);\n }\n return v;\n}\nexport function getFilterFromState(state: SelectorStateFilter): PTableRecordSingleValueFilterV2[] {\n const { selectedSource, type, selectedFilterRange, selectedFilterValues } = state;\n const id = columnOrAxisIdFromString(selectedSource);\n if (!id) {\n throw Error('Empty source selected');\n }\n if (type === 'range') {\n const rangeFilters: PTableRecordSingleValueFilterV2[] = [];\n if (selectedFilterRange?.max !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : { type: 'column' as const, id: id.name as PObjectId },\n predicate: {\n operator: 'LessOrEqual',\n reference: normalizeFilterReference(selectedFilterRange.max, id.type)\n },\n })\n }\n if (selectedFilterRange?.min !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : { type: 'column' as const, id: id.name as PObjectId },\n predicate: {\n operator: 'GreaterOrEqual',\n reference: normalizeFilterReference(selectedFilterRange.min, id.type)\n },\n })\n }\n return rangeFilters;\n } else if (type === 'subset') {\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : { type: 'column' as const, id: id.name as PObjectId },\n predicate: {\n operator: 'Not',\n operand: { operator: 'IsNA' }\n },\n },\n ]\n }\n if (typeof selectedFilterValues === 'undefined' || !selectedFilterValues.length) {\n return [];\n }\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : {\n type: 'column' as const,\n id: id.name as PObjectId,\n },\n predicate: {\n operator: 'Or',\n operands: selectedFilterValues.map((v) => {\n const reference = id.type === 'String'\n ? String(v)\n : (Number(v) as string | number);\n return {\n operator: 'Equal',\n reference\n }\n })\n }\n },\n ];\n}\n\nexport function getFiltersFromStates(states: SelectorStateFilter[]): PTableRecordSingleValueFilterV2[] {\n const result: PTableRecordSingleValueFilterV2[] = [];\n for (const state of states) {\n result.push(...getFilterFromState(state));\n }\n return result;\n}\n\nexport function getGlobalId(spec: PColumnSpec): string;\nexport function getGlobalId(spec: AxisSpec): string;\nexport function getGlobalId(spec: AxisSpec | PColumnSpec): string {\n if ('kind' in spec && spec.kind === 'PColumn') {\n const name = spec.name ?? spec.annotations?.[COLUMN_NAME_KEY];\n const domain = spec.domain ?? spec.annotations?.[COLUMN_DOMAIN_KEY];\n return canonicalize({ name, domain })!;\n }\n const name = spec.name;\n const domain = spec.domain;\n return canonicalize({ name, domain })!;\n}\n\nasync function getAxisSpecFromParents(store: DataStore, axisId: AxisId, parentSources: ColumnOrAxisIdString[]) {\n for (const parentSource of parentSources) {\n const parentId = columnOrAxisIdFromString(parentSource);\n if (isColumnId(parentId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(parentId);\n const spec = (columnSpec?.axesSpec ?? []).find(\n s => AxisId.fromAxisSpec(s).toCanonicalString() === axisId.toCanonicalString(),\n );\n if (spec) {\n return spec;\n }\n }\n }\n return null;\n}\n\nconst LABEL_COLUMN_NAME = 'pl7.app/label';\n\nexport async function getColumnOrAxisValueLabelsId(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n): Promise<ColumnId | undefined> {\n const id = columnOrAxisIdFromString(selectedSource);\n if (isColumnId(id)) {\n return undefined;\n }\n async function getAxisGlobalId(axisId: AxisId) {\n const spec = await getAxisSpecFromParents(store, axisId, parentSources);\n return spec ? getGlobalId(spec) : null;\n }\n const labelColumns = await store.pFrameProvider.getColumnsFull([], false, undefined, [LABEL_COLUMN_NAME]);\n const sourceGlobalId = await getAxisGlobalId(id);\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && getGlobalId(spec.axesSpec[0]) === sourceGlobalId;\n });\n return labelColumn ? new ColumnId({ name: labelColumn.columnId, type: labelColumn.spec.valueType }) : undefined;\n}\n\nexport async function getColumnOrAxisSpec(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n) {\n const selectedId = columnOrAxisIdFromString(selectedSource);\n const labelsColumn = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n\n let spec: AxisSpec | PColumnSpec | null;\n if (isColumnId(selectedId)) {\n spec = await store.pFrameProvider.getColumnSpecById(labelsColumn ?? selectedId);\n } else {\n spec = labelsColumn\n ? await store.pFrameProvider.getColumnSpecById(labelsColumn)\n : await getAxisSpecFromParents(store, selectedId, parentSources);\n }\n return spec;\n}\n\nexport async function getColumnOrAxisLabel(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n) {\n const spec = await getColumnOrAxisSpec(store, selectedSource, parentSources);\n if (!spec) {\n return '';\n }\n const label = spec.annotations?.[COLUMN_LABEL_KEY] ?? spec.name;\n return store.labelsModifier(spec.name, label);\n}\n\nexport function axisIsNonHomogenous(spec: AxisSpec) {\n const axisNature = spec.annotations?.[AXIS_NATURE_KEY]?.toLowerCase();\n return Boolean(axisNature) && axisNature !== 'homogenous' && axisNature !== 'homogeneous';\n}\n\nexport function dataColumnPredicateDefault(spec: PColumnSpec) {\n return !spec.name.includes('metadata') && !(spec.annotations?.[IS_VIRTUAL_COLUMN] === 'true') && !(spec.annotations?.[SUBSET_FILTER_KEY] === 'true');\n}\n\nexport async function getAxesSpecsFromSources(store: DataStore, idStrs: ColumnOrAxisIdString[]): Promise<AxisSpec[]> {\n const set = new Set<ColumnOrAxisIdString>();\n const result: AxisSpec[] = [];\n for (const idStr of idStrs) {\n const id = columnOrAxisIdFromString(idStr);\n if (isColumnId(id)) {\n const spec = await store.pFrameProvider.getColumnSpecById(id);\n if (!spec) {\n continue;\n }\n spec.axesSpec.forEach(axisSpec => {\n const id = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!set.has(id)) {\n set.add(id);\n result.push(axisSpec);\n }\n })\n }\n }\n return result;\n}\n\nexport async function createLinkerMap(store: DemoDataStore) {\n const allLinkerColumns = await store.pFrameProvider.getColumnsFull(\n [], false, undefined, undefined,\n { [IS_LINKER_COLUMN]: 'true' },\n );\n\n return LinkerMap.fromColumns(allLinkerColumns);\n}\n\nexport type MultipliesByMap = Map<ColumnOrAxisIdString, Map<ColumnOrAxisIdString, { parentSource: ColumnOrAxisIdString, spec: AxisSpec }>>;\nexport async function createMultipliesByMap(store: DemoDataStore): Promise<MultipliesByMap> {\n const allMultiplyingColumns = await store.pFrameProvider.getColumnsFull(\n [], false, undefined, undefined, undefined, [MULTIPLIES_BY]\n );\n\n const result: MultipliesByMap = new Map();\n\n for (const multiplyingColumn of allMultiplyingColumns) {\n const axes = multiplyingColumn.spec.axesSpec;\n const annotationData = multiplyingColumn.spec?.annotations?.[MULTIPLIES_BY];\n if (axes.length !== 2 || !annotationData) {\n continue;\n }\n const columnIdStr = new ColumnId({ name: multiplyingColumn.columnId, type: multiplyingColumn.spec.valueType }).toCanonicalString();\n try {\n const [multipliesBy] = JSON.parse(annotationData);\n const [axis1, axis2] = axes;\n const id1 = AxisId.fromAxisSpec(axis1).toCanonicalString();\n const id2 = AxisId.fromAxisSpec(axis2).toCanonicalString();\n if (axis1.name === multipliesBy) {\n if (!result.get(id2)) {\n result.set(id2, new Map());\n }\n result.get(id2)!.set(id1, { parentSource: columnIdStr, spec: axis1 })\n } else if (axis2.name === multipliesBy) {\n if (!result.get(id1)) {\n result.set(id1, new Map());\n }\n result.get(id1)!.set(id2, { parentSource: columnIdStr, spec: axis2 });\n }\n } catch (e) {\n console.error(`Wrong format for annotation ${MULTIPLIES_BY}: ${multiplyingColumn.spec?.annotations?.[MULTIPLIES_BY]}`);\n }\n }\n return result;\n}\n\nfunction getLinkerColumnsForAxis(\n secondaryAxisId: AxisId,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n dataInputAxes: AxisSpec[],\n) {\n const axisIdStr = secondaryAxisId.toCanonicalString();\n const dataInputAxesSet = new Set(dataInputAxes.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n const dataInputAxesIds = [...dataInputAxesSet];\n\n // check multipliesBy columns\n const dataAxesIdWithLink = dataInputAxesIds.find((dataInputId) => multipliesByMap.get(dataInputId)?.get(axisIdStr));\n const linkerEl = dataAxesIdWithLink ? multipliesByMap.get(dataAxesIdWithLink)?.get(axisIdStr) : null;\n if (linkerEl) {\n // we need only 1 multipliesBy column to link single axis\n return [columnOrAxisIdFromString(linkerEl.parentSource)];\n }\n\n const normalizedDataAxes = getNormalizedAxesList(dataInputAxes);\n // else check regular linkers\n const axesAvailableWithLinkers = getNormalizedAxesList(\n linkerMap.getReachableByLinkersAxesFromAxes(normalizedDataAxes)\n );\n const axisSpec = axesAvailableWithLinkers.find((spec) => AxisId.fromAxisSpec(spec).toCanonicalString() === axisIdStr);\n\n if (!axisSpec) {\n return [];\n }\n return linkerMap.getLinkerColumnsForAxes({ from: normalizedDataAxes, to: [axisSpec], throwWhenNoLinkExists: false }).map(v => new ColumnId({ name: v.columnId, type: v.spec.valueType }));\n}\nasync function getLinkerColumnsForColumn(\n secondaryColumnId: ColumnId,\n store: DataStore,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n dataInputAxes: AxisSpec[],\n) {\n const secondaryColumnSpec = await store.pFrameProvider.getColumnSpecById(secondaryColumnId);\n if (!secondaryColumnSpec) {\n return [];\n }\n let linkers: ColumnId[] = [];\n const dataInputAxesSet = new Set(dataInputAxes.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n const dataInputAxesIds = [...dataInputAxesSet];\n const rightPartAxes = secondaryColumnSpec.axesSpec.filter((axisSpec) => { // right part from column minus 'fixedAxes'\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (dataInputAxesSet.has(axisId)) {\n return false;\n }\n const dataAxesIdWithLink = dataInputAxesIds.find((dataInputId) => multipliesByMap.get(dataInputId)?.get(axisId));\n const linkerEl = dataAxesIdWithLink ? multipliesByMap.get(dataAxesIdWithLink)?.get(axisId) : null;\n if (linkerEl) {\n linkers.push(columnOrAxisIdFromString(linkerEl.parentSource));\n return false;\n }\n return true;\n });\n\n const from = getNormalizedAxesList(dataInputAxes);\n const to = getNormalizedAxesList(rightPartAxes);\n\n linkers = linkers.concat(linkerMap.getLinkerColumnsForAxes({ from, to, throwWhenNoLinkExists: false }).map(v => new ColumnId({ name: v.columnId, type: v.spec.valueType })));\n return linkers;\n}\nexport async function getLinkerColumnsForSource(\n store: DataStore,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n dataInputAxes: AxisSpec[],\n secondarySource: ColumnOrAxisIdString,\n): Promise<ColumnId[]> {\n const columnOrAxisId = columnOrAxisIdFromString(secondarySource);\n return isColumnId(columnOrAxisId)\n ? getLinkerColumnsForColumn(columnOrAxisId, store, linkerMap, multipliesByMap, dataInputAxes)\n : getLinkerColumnsForAxis(columnOrAxisId, linkerMap, multipliesByMap, dataInputAxes);\n}\n\nexport function getNotAllowedAxes(\n columnSpec: PColumnSpec,\n dataInputAxesList: AxisSpec[], // axes from data-input\n linkerMap: LinkerMap, // composite linkers, without chains\n multipliesByMap: MultipliesByMap,\n): AxisSpec[] {\n const dataInputAxesSet = new Set(dataInputAxesList.map((v) => AxisId.fromAxisSpec(v).toCanonicalString()))\n const dataInputAxesIds = [...dataInputAxesSet];\n\n // check non-linkable axes only from this column\n const allColumnAxes = getNormalizedAxesList(columnSpec.axesSpec);\n // remove from the column axes - axes from data inputs\n const rightPartAxes = allColumnAxes.filter( // axes in data axes list are allowed, check the rest\n (axisSpec: AxisSpec) => !dataInputAxesSet.has(AxisId.fromAxisSpec(axisSpec).toCanonicalString())\n );\n\n const sourceAxes = getNormalizedAxesList(dataInputAxesList);\n const targetAxes = LinkerMap.getAxesRoots(rightPartAxes);\n\n const nonLinkableByLinkerMap = linkerMap.getNonLinkableAxes(sourceAxes, targetAxes); // rest probably reduced\n const filtered = nonLinkableByLinkerMap.filter((axisSpec) => {\n const freeId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return !dataInputAxesIds.some((id) => multipliesByMap.get(id)?.get(freeId) !== undefined);\n });\n return filtered;\n}\n\nexport function createHighlightColumn(highlightSelectedStates: SelectorStateFilter[], data: TableOuterJoinResult) {\n const dataLength = data.columnsData[Object.keys(data.columnsData)[0]].length;\n const highlightColumn = new Int32Array(dataLength).fill(0);\n const notEmptyHighlightStates = highlightSelectedStates.filter(s =>\n s.selectedFilterRange && (s.selectedFilterRange.min !== undefined || s.selectedFilterRange.max !== undefined) ||\n s.selectedFilterValues && s.selectedFilterValues.length\n )\n for (let rowIdx = 0; rowIdx < dataLength; rowIdx++) {\n let res = notEmptyHighlightStates.length === 0; // fill with 1 if nothing selected in highlighting filters\n for (let i = 0; i < notEmptyHighlightStates.length; i++) {\n const { selectedSource, selectedFilterValues, selectedFilterRange, type } = highlightSelectedStates[i];\n const sourceId = columnOrAxisIdFromString(selectedSource);\n const value = (isColumnId(sourceId) ? data.columnsData[selectedSource] : data.axesData[selectedSource])[rowIdx];\n if (selectedFilterValues !== undefined && selectedFilterValues.length) {\n res = res || selectedFilterValues.includes(String(value));\n }\n if (selectedFilterRange !== undefined && (selectedFilterRange.min !== undefined || selectedFilterRange.max !== undefined) && typeof value === 'number') {\n let rangeResult = true;\n if (selectedFilterRange.min !== undefined) {\n rangeResult = rangeResult && value >= selectedFilterRange.min;\n }\n if (selectedFilterRange.max !== undefined) {\n rangeResult = rangeResult && value <= selectedFilterRange.max;\n }\n res = res || rangeResult;\n }\n if (type === 'subset') {\n res = res || (value !== null && value !== undefined);\n }\n }\n if (res) {\n highlightColumn[rowIdx] = 1;\n }\n }\n return highlightColumn as unknown as PValue[];\n}\n"],"names":["getDefaultInfo","sourceIdStr","item","columnOrAxisIdFromString","name","type","isColumnId","getStateCopy","state","normalizeFilterReference","v","valueType","getFilterFromState","selectedSource","selectedFilterRange","selectedFilterValues","id","rangeFilters","isAxisId","getFiltersFromStates","states","result","getGlobalId","spec","_a","COLUMN_NAME_KEY","domain","_b","COLUMN_DOMAIN_KEY","canonicalize","getAxisSpecFromParents","store","axisId","parentSources","parentSource","parentId","columnSpec","AxisId","LABEL_COLUMN_NAME","getColumnOrAxisValueLabelsId","getAxisGlobalId","labelColumns","sourceGlobalId","labelColumn","ColumnId","getColumnOrAxisSpec","selectedId","labelsColumn","getColumnOrAxisLabel","label","COLUMN_LABEL_KEY","axisIsNonHomogenous","axisNature","AXIS_NATURE_KEY","dataColumnPredicateDefault","IS_VIRTUAL_COLUMN","SUBSET_FILTER_KEY","getAxesSpecsFromSources","idStrs","set","idStr","axisSpec","createLinkerMap","allLinkerColumns","IS_LINKER_COLUMN","LinkerMap","createMultipliesByMap","allMultiplyingColumns","MULTIPLIES_BY","multiplyingColumn","axes","annotationData","columnIdStr","multipliesBy","axis1","axis2","id1","id2","_d","_c","getLinkerColumnsForAxis","secondaryAxisId","linkerMap","multipliesByMap","dataInputAxes","axisIdStr","dataAxesIdWithLink","dataInputId","linkerEl","normalizedDataAxes","getNormalizedAxesList","getLinkerColumnsForColumn","secondaryColumnId","secondaryColumnSpec","linkers","dataInputAxesSet","dataInputAxesIds","rightPartAxes","from","to","u","getLinkerColumnsForSource","secondarySource","columnOrAxisId","getNotAllowedAxes","dataInputAxesList","sourceAxes","targetAxes","freeId","createHighlightColumn","highlightSelectedStates","data","dataLength","highlightColumn","notEmptyHighlightStates","s","rowIdx","res","i","sourceId","value","rangeResult"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../node_modules/@milaboratories/pf-plots/src/utils.ts"],"sourcesContent":["import { getNormalizedAxesList, LinkerMap, SingleValuePredicateV2, ValueType } from '@milaboratories/pl-model-common';\nimport { TableOuterJoinResult } from './pframe/ColumnsProvider';\nimport type { DataStore, PValue } from './store';\nimport type { ColumnOrAxisIdString } from './spec';\nimport { isAxisId } from './spec';\nimport { AxisId, ColumnId, columnOrAxisIdFromString, isColumnId } from './spec';\nimport type { AxisData, ColumnData, InputState, SelectorStateFilter } from './common';\nimport {\n AXIS_NATURE_KEY,\n COLUMN_DOMAIN_KEY,\n COLUMN_LABEL_KEY,\n COLUMN_NAME_KEY, IS_LINKER_COLUMN,\n IS_VIRTUAL_COLUMN,\n MULTIPLIES_BY,\n SUBSET_FILTER_KEY,\n} from './constants';\nimport {\n AxisSpec,\n type PColumnSpec,\n type PObjectId,\n type PTableRecordSingleValueFilterV2,\n} from '@milaboratories/pl-model-common';\nimport canonicalize from 'canonicalize';\nimport { DemoDataStore } from './demoStore';\n\nexport type OptionsInfo = Map<ColumnOrAxisIdString, ColumnData | AxisData>;\nexport function getDefaultInfo(sourceIdStr: ColumnOrAxisIdString): ColumnData | AxisData {\n const item = columnOrAxisIdFromString(sourceIdStr);\n const { name, type } = item;\n if (isColumnId(item)) {\n return {\n kind: 'column',\n name: '',\n label: ' ',\n type: item.type,\n spec: { axesSpec: [], kind: 'PColumn', valueType: item.type, name },\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: item.type === 'String'\n };\n }\n return {\n kind: 'axis',\n name: '',\n label: ' ',\n type: type,\n spec: { type, name },\n mustBeConsumed: false,\n dividable: false,\n annotations: undefined,\n isSubsetFilter: false,\n isDiscreteFilter: type === 'String',\n isNonHomogenous: false,\n parentSources: [],\n };\n}\n\nexport function getStateCopy<State extends InputState>(state: State): State {\n return {\n type: state.type,\n components: { ...state.components },\n dividedAxes: { ...state.dividedAxes },\n } as State;\n}\n\nfunction normalizeFilterReference(v: number, valueType: ValueType): number {\n if (valueType === 'Int' || valueType === 'Long') {\n return Math.floor(v);\n }\n return v;\n}\nexport function getFilterFromState(state: SelectorStateFilter): PTableRecordSingleValueFilterV2[] {\n const { selectedSource, type, selectedFilterRange, selectedFilterValues } = state;\n const id = columnOrAxisIdFromString(selectedSource);\n if (!id) {\n throw Error('Empty source selected');\n }\n if (type === 'range') {\n const rangeFilters: PTableRecordSingleValueFilterV2[] = [];\n if (selectedFilterRange?.max !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : { type: 'column' as const, id: id.name as PObjectId },\n predicate: {\n operator: 'LessOrEqual',\n reference: normalizeFilterReference(selectedFilterRange.max, id.type)\n },\n })\n }\n if (selectedFilterRange?.min !== undefined) {\n rangeFilters.push({\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : { type: 'column' as const, id: id.name as PObjectId },\n predicate: {\n operator: 'GreaterOrEqual',\n reference: normalizeFilterReference(selectedFilterRange.min, id.type)\n },\n })\n }\n return rangeFilters;\n } else if (type === 'subset') {\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : { type: 'column' as const, id: id.name as PObjectId },\n predicate: {\n operator: 'Not',\n operand: { operator: 'IsNA' }\n },\n },\n ]\n }\n if (typeof selectedFilterValues === 'undefined' || !selectedFilterValues.length) {\n return [];\n }\n return [\n {\n type: 'bySingleColumnV2' as const,\n column: isAxisId(id) ? { type: 'axis' as const, id: id.toPFrameId() } : {\n type: 'column' as const,\n id: id.name as PObjectId,\n },\n predicate: {\n operator: 'Or',\n operands: selectedFilterValues.map((v) => {\n const reference = id.type === 'String'\n ? String(v)\n : (Number(v) as string | number);\n return {\n operator: 'Equal',\n reference\n }\n })\n }\n },\n ];\n}\n\nexport function getFiltersFromStates(states: SelectorStateFilter[]): PTableRecordSingleValueFilterV2[] {\n const result: PTableRecordSingleValueFilterV2[] = [];\n for (const state of states) {\n result.push(...getFilterFromState(state));\n }\n return result;\n}\n\nexport function getGlobalId(spec: PColumnSpec): string;\nexport function getGlobalId(spec: AxisSpec): string;\nexport function getGlobalId(spec: AxisSpec | PColumnSpec): string {\n if ('kind' in spec && spec.kind === 'PColumn') {\n const name = spec.name ?? spec.annotations?.[COLUMN_NAME_KEY];\n const domain = spec.domain ?? spec.annotations?.[COLUMN_DOMAIN_KEY];\n return canonicalize({ name, domain })!;\n }\n const name = spec.name;\n const domain = spec.domain;\n return canonicalize({ name, domain })!;\n}\n\nasync function getAxisSpecFromParents(store: DataStore, axisId: AxisId, parentSources: ColumnOrAxisIdString[]) {\n for (const parentSource of parentSources) {\n const parentId = columnOrAxisIdFromString(parentSource);\n if (isColumnId(parentId)) {\n const columnSpec = await store.pFrameProvider.getColumnSpecById(parentId);\n const spec = (columnSpec?.axesSpec ?? []).find(\n s => AxisId.fromAxisSpec(s).toCanonicalString() === axisId.toCanonicalString(),\n );\n if (spec) {\n return spec;\n }\n }\n }\n return null;\n}\n\nconst LABEL_COLUMN_NAME = 'pl7.app/label';\n\nexport async function getColumnOrAxisValueLabelsId(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n): Promise<ColumnId | undefined> {\n const id = columnOrAxisIdFromString(selectedSource);\n if (isColumnId(id)) {\n return undefined;\n }\n async function getAxisGlobalId(axisId: AxisId) {\n const spec = await getAxisSpecFromParents(store, axisId, parentSources);\n return spec ? getGlobalId(spec) : null;\n }\n const labelColumns = await store.pFrameProvider.getColumnsFull([], false, undefined, [LABEL_COLUMN_NAME]);\n const sourceGlobalId = await getAxisGlobalId(id);\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && getGlobalId(spec.axesSpec[0]) === sourceGlobalId;\n });\n return labelColumn ? new ColumnId({ name: labelColumn.columnId, type: labelColumn.spec.valueType }) : undefined;\n}\n\nexport async function getColumnOrAxisSpec(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n) {\n const selectedId = columnOrAxisIdFromString(selectedSource);\n const labelsColumn = await getColumnOrAxisValueLabelsId(store, selectedSource, parentSources);\n\n let spec: AxisSpec | PColumnSpec | null;\n if (isColumnId(selectedId)) {\n spec = await store.pFrameProvider.getColumnSpecById(labelsColumn ?? selectedId);\n } else {\n spec = labelsColumn\n ? await store.pFrameProvider.getColumnSpecById(labelsColumn)\n : await getAxisSpecFromParents(store, selectedId, parentSources);\n }\n return spec;\n}\n\nexport async function getColumnOrAxisLabel(\n store: DataStore,\n selectedSource: ColumnOrAxisIdString,\n parentSources: ColumnOrAxisIdString[],\n) {\n const spec = await getColumnOrAxisSpec(store, selectedSource, parentSources);\n if (!spec) {\n return '';\n }\n const label = spec.annotations?.[COLUMN_LABEL_KEY] ?? spec.name;\n return store.labelsModifier(spec.name, label);\n}\n\nexport function axisIsNonHomogenous(spec: AxisSpec) {\n const axisNature = spec.annotations?.[AXIS_NATURE_KEY]?.toLowerCase();\n return Boolean(axisNature) && axisNature !== 'homogenous' && axisNature !== 'homogeneous';\n}\n\nexport function dataColumnPredicateDefault(spec: PColumnSpec) {\n return !spec.name.includes('metadata') && !(spec.annotations?.[IS_VIRTUAL_COLUMN] === 'true') && !(spec.annotations?.[SUBSET_FILTER_KEY] === 'true');\n}\n\nexport async function getAxesSpecsFromSources(store: DataStore, idStrs: ColumnOrAxisIdString[]): Promise<AxisSpec[]> {\n const set = new Set<ColumnOrAxisIdString>();\n const result: AxisSpec[] = [];\n for (const idStr of idStrs) {\n const id = columnOrAxisIdFromString(idStr);\n if (isColumnId(id)) {\n const spec = await store.pFrameProvider.getColumnSpecById(id);\n if (!spec) {\n continue;\n }\n spec.axesSpec.forEach(axisSpec => {\n const id = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (!set.has(id)) {\n set.add(id);\n result.push(axisSpec);\n }\n })\n }\n }\n return result;\n}\n\nexport async function createLinkerMap(store: DemoDataStore) {\n const allLinkerColumns = await store.pFrameProvider.getColumnsFull(\n [], false, undefined, undefined,\n { [IS_LINKER_COLUMN]: 'true' },\n );\n\n return LinkerMap.fromColumns(allLinkerColumns);\n}\n\nexport type MultipliesByMap = Map<ColumnOrAxisIdString, Map<ColumnOrAxisIdString, { parentSource: ColumnOrAxisIdString, spec: AxisSpec }>>;\nexport async function createMultipliesByMap(store: DemoDataStore): Promise<MultipliesByMap> {\n const allMultiplyingColumns = await store.pFrameProvider.getColumnsFull(\n [], false, undefined, undefined, undefined, [MULTIPLIES_BY]\n );\n\n const result: MultipliesByMap = new Map();\n\n for (const multiplyingColumn of allMultiplyingColumns) {\n const axes = multiplyingColumn.spec.axesSpec;\n const annotationData = multiplyingColumn.spec?.annotations?.[MULTIPLIES_BY];\n if (axes.length !== 2 || !annotationData) {\n continue;\n }\n const columnIdStr = new ColumnId({ name: multiplyingColumn.columnId, type: multiplyingColumn.spec.valueType }).toCanonicalString();\n try {\n const [multipliesBy] = JSON.parse(annotationData);\n const [axis1, axis2] = axes;\n const id1 = AxisId.fromAxisSpec(axis1).toCanonicalString();\n const id2 = AxisId.fromAxisSpec(axis2).toCanonicalString();\n if (axis1.name === multipliesBy) {\n if (!result.get(id2)) {\n result.set(id2, new Map());\n }\n result.get(id2)!.set(id1, { parentSource: columnIdStr, spec: axis1 })\n } else if (axis2.name === multipliesBy) {\n if (!result.get(id1)) {\n result.set(id1, new Map());\n }\n result.get(id1)!.set(id2, { parentSource: columnIdStr, spec: axis2 });\n }\n } catch (e) {\n console.error(`Wrong format for annotation ${MULTIPLIES_BY}: ${multiplyingColumn.spec?.annotations?.[MULTIPLIES_BY]}`);\n }\n }\n return result;\n}\n\nfunction getLinkerColumnsForAxis(\n secondaryAxisId: AxisId,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n dataInputAxes: AxisSpec[],\n) {\n const axisIdStr = secondaryAxisId.toCanonicalString();\n const dataInputAxesSet = new Set(dataInputAxes.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n const dataInputAxesIds = [...dataInputAxesSet];\n\n // check multipliesBy columns\n const dataAxesIdWithLink = dataInputAxesIds.find((dataInputId) => multipliesByMap.get(dataInputId)?.get(axisIdStr));\n const linkerEl = dataAxesIdWithLink ? multipliesByMap.get(dataAxesIdWithLink)?.get(axisIdStr) : null;\n if (linkerEl) {\n // we need only 1 multipliesBy column to link single axis\n return [columnOrAxisIdFromString(linkerEl.parentSource)];\n }\n\n const normalizedDataAxes = getNormalizedAxesList(dataInputAxes);\n // else check regular linkers\n const axesAvailableWithLinkers = getNormalizedAxesList(\n linkerMap.getReachableByLinkersAxesFromAxes(normalizedDataAxes)\n );\n const axisSpec = axesAvailableWithLinkers.find((spec) => AxisId.fromAxisSpec(spec).toCanonicalString() === axisIdStr);\n\n if (!axisSpec) {\n return [];\n }\n return linkerMap.getLinkerColumnsForAxes({ from: normalizedDataAxes, to: [axisSpec], throwWhenNoLinkExists: false }).map(v => new ColumnId({ name: v.columnId, type: v.spec.valueType }));\n}\nasync function getLinkerColumnsForColumn(\n secondaryColumnId: ColumnId,\n store: DataStore,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n dataInputAxes: AxisSpec[],\n) {\n const secondaryColumnSpec = await store.pFrameProvider.getColumnSpecById(secondaryColumnId);\n if (!secondaryColumnSpec) {\n return [];\n }\n let linkers: ColumnId[] = [];\n const dataInputAxesSet = new Set(dataInputAxes.map(axisSpec => AxisId.fromAxisSpec(axisSpec).toCanonicalString()));\n const dataInputAxesIds = [...dataInputAxesSet];\n const rightPartAxes = secondaryColumnSpec.axesSpec.filter((axisSpec) => { // right part from column minus 'fixedAxes'\n const axisId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n if (dataInputAxesSet.has(axisId)) {\n return false;\n }\n const dataAxesIdWithLink = dataInputAxesIds.find((dataInputId) => multipliesByMap.get(dataInputId)?.get(axisId));\n const linkerEl = dataAxesIdWithLink ? multipliesByMap.get(dataAxesIdWithLink)?.get(axisId) : null;\n if (linkerEl) {\n linkers.push(columnOrAxisIdFromString(linkerEl.parentSource));\n return false;\n }\n return true;\n });\n\n const from = getNormalizedAxesList(dataInputAxes);\n const to = getNormalizedAxesList(rightPartAxes);\n\n linkers = linkers.concat(linkerMap.getLinkerColumnsForAxes({ from, to, throwWhenNoLinkExists: false }).map(v => new ColumnId({ name: v.columnId, type: v.spec.valueType })));\n return linkers;\n}\nexport async function getLinkerColumnsForSource(\n store: DataStore,\n linkerMap: LinkerMap,\n multipliesByMap: MultipliesByMap,\n dataInputAxes: AxisSpec[],\n secondarySource: ColumnOrAxisIdString,\n): Promise<ColumnId[]> {\n const columnOrAxisId = columnOrAxisIdFromString(secondarySource);\n return isColumnId(columnOrAxisId)\n ? getLinkerColumnsForColumn(columnOrAxisId, store, linkerMap, multipliesByMap, dataInputAxes)\n : getLinkerColumnsForAxis(columnOrAxisId, linkerMap, multipliesByMap, dataInputAxes);\n}\n\nexport function getNotAllowedAxes(\n columnSpec: PColumnSpec,\n dataInputAxesList: AxisSpec[], // axes from data-input\n linkerMap: LinkerMap, // composite linkers, without chains\n multipliesByMap: MultipliesByMap,\n): AxisSpec[] {\n const dataInputAxesSet = new Set(dataInputAxesList.map((v) => AxisId.fromAxisSpec(v).toCanonicalString()))\n const dataInputAxesIds = [...dataInputAxesSet];\n\n // check non-linkable axes only from this column\n const allColumnAxes = getNormalizedAxesList(columnSpec.axesSpec);\n // remove from the column axes - axes from data inputs\n const rightPartAxes = allColumnAxes.filter( // axes in data axes list are allowed, check the rest\n (axisSpec: AxisSpec) => !dataInputAxesSet.has(AxisId.fromAxisSpec(axisSpec).toCanonicalString())\n );\n\n const sourceAxes = getNormalizedAxesList(dataInputAxesList);\n const targetAxes = LinkerMap.getAxesRoots(rightPartAxes);\n\n const nonLinkableByLinkerMap = linkerMap.getNonLinkableAxes(sourceAxes, targetAxes); // rest probably reduced\n const filtered = nonLinkableByLinkerMap.filter((axisSpec) => {\n const freeId = AxisId.fromAxisSpec(axisSpec).toCanonicalString();\n return !dataInputAxesIds.some((id) => multipliesByMap.get(id)?.get(freeId) !== undefined);\n });\n return filtered;\n}\n\nexport function createHighlightColumn(highlightSelectedStates: SelectorStateFilter[], data: TableOuterJoinResult) {\n const dataLength = data.columnsData[Object.keys(data.columnsData)[0]].length;\n const highlightColumn = new Int32Array(dataLength).fill(0);\n const notEmptyHighlightStates = highlightSelectedStates.filter(s =>\n s.selectedFilterRange && (s.selectedFilterRange.min !== undefined || s.selectedFilterRange.max !== undefined) ||\n s.selectedFilterValues && s.selectedFilterValues.length ||\n s.type === 'subset'\n )\n for (let rowIdx = 0; rowIdx < dataLength; rowIdx++) {\n let res = notEmptyHighlightStates.length === 0; // fill with 1 if nothing selected in highlighting filters\n for (let i = 0; i < notEmptyHighlightStates.length; i++) {\n const { selectedSource, selectedFilterValues, selectedFilterRange, type } = highlightSelectedStates[i];\n const sourceId = columnOrAxisIdFromString(selectedSource);\n const value = (isColumnId(sourceId) ? data.columnsData[selectedSource] : data.axesData[selectedSource])[rowIdx];\n if (selectedFilterValues !== undefined && selectedFilterValues.length) {\n res = res || selectedFilterValues.includes(String(value));\n }\n if (selectedFilterRange !== undefined && (selectedFilterRange.min !== undefined || selectedFilterRange.max !== undefined) && typeof value === 'number') {\n let rangeResult = true;\n if (selectedFilterRange.min !== undefined) {\n rangeResult = rangeResult && value >= selectedFilterRange.min;\n }\n if (selectedFilterRange.max !== undefined) {\n rangeResult = rangeResult && value <= selectedFilterRange.max;\n }\n res = res || rangeResult;\n }\n if (type === 'subset') {\n res = res || (value !== null && value !== undefined);\n }\n }\n if (res) {\n highlightColumn[rowIdx] = 1;\n }\n }\n return highlightColumn as unknown as PValue[];\n}\n"],"names":["getDefaultInfo","sourceIdStr","item","columnOrAxisIdFromString","name","type","isColumnId","getStateCopy","state","normalizeFilterReference","v","valueType","getFilterFromState","selectedSource","selectedFilterRange","selectedFilterValues","id","rangeFilters","isAxisId","getFiltersFromStates","states","result","getGlobalId","spec","_a","COLUMN_NAME_KEY","domain","_b","COLUMN_DOMAIN_KEY","canonicalize","getAxisSpecFromParents","store","axisId","parentSources","parentSource","parentId","columnSpec","AxisId","LABEL_COLUMN_NAME","getColumnOrAxisValueLabelsId","getAxisGlobalId","labelColumns","sourceGlobalId","labelColumn","ColumnId","getColumnOrAxisSpec","selectedId","labelsColumn","getColumnOrAxisLabel","label","COLUMN_LABEL_KEY","axisIsNonHomogenous","axisNature","AXIS_NATURE_KEY","dataColumnPredicateDefault","IS_VIRTUAL_COLUMN","SUBSET_FILTER_KEY","getAxesSpecsFromSources","idStrs","set","idStr","axisSpec","createLinkerMap","allLinkerColumns","IS_LINKER_COLUMN","LinkerMap","createMultipliesByMap","allMultiplyingColumns","MULTIPLIES_BY","multiplyingColumn","axes","annotationData","columnIdStr","multipliesBy","axis1","axis2","id1","id2","_d","_c","getLinkerColumnsForAxis","secondaryAxisId","linkerMap","multipliesByMap","dataInputAxes","axisIdStr","dataAxesIdWithLink","dataInputId","linkerEl","normalizedDataAxes","getNormalizedAxesList","getLinkerColumnsForColumn","secondaryColumnId","secondaryColumnSpec","linkers","dataInputAxesSet","dataInputAxesIds","rightPartAxes","from","to","u","getLinkerColumnsForSource","secondarySource","columnOrAxisId","getNotAllowedAxes","dataInputAxesList","sourceAxes","targetAxes","freeId","createHighlightColumn","highlightSelectedStates","data","dataLength","highlightColumn","notEmptyHighlightStates","s","rowIdx","res","i","sourceId","value","rangeResult"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/graph-maker",
3
- "version": "1.1.164",
3
+ "version": "1.1.166",
4
4
  "type": "module",
5
5
  "main": "dist/lib.js",
6
6
  "types": "dist/lib.d.ts",
@@ -37,8 +37,8 @@
37
37
  "dependencies": {
38
38
  "@ag-grid-community/core": "^32.3.3",
39
39
  "@milaboratories/helpers": "^1.6.15",
40
- "@milaboratories/miplots4": "^1.0.149",
41
- "@milaboratories/pf-plots": "^1.1.37",
40
+ "@milaboratories/miplots4": "^1.0.150",
41
+ "@milaboratories/pf-plots": "^1.1.38",
42
42
  "@platforma-sdk/model": "^1.42.36",
43
43
  "@platforma-sdk/ui-vue": "^1.42.36",
44
44
  "@types/d3-hierarchy": "^3.1.7",