@milaboratories/graph-maker 1.1.155 → 1.1.157
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GraphMaker/components/Chart.vue.d.ts.map +1 -1
- package/dist/GraphMaker/components/Chart.vue.js +20 -16
- package/dist/GraphMaker/components/Chart.vue.js.map +1 -1
- package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.d.ts.map +1 -1
- package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js +24 -23
- package/dist/GraphMaker/components/DragAndDrop/DndDoubleChip.vue.js.map +1 -1
- package/dist/GraphMaker/constantsCommon.d.ts +2 -0
- package/dist/GraphMaker/constantsCommon.d.ts.map +1 -1
- package/dist/GraphMaker/constantsCommon.js +29 -27
- package/dist/GraphMaker/constantsCommon.js.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/HeatmapAxesSettingsForm.vue.d.ts.map +1 -1
- package/dist/GraphMaker/forms/AxesSettingsForm/HeatmapAxesSettingsForm.vue.js +215 -148
- package/dist/GraphMaker/forms/AxesSettingsForm/HeatmapAxesSettingsForm.vue.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDendroSettings.d.ts +5 -0
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDendroSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts +1 -0
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeDiscreteSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts +5 -0
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js +24 -24
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeHeatmapSettings.js.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts +2 -0
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotSettings.d.ts.map +1 -1
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.d.ts +2 -0
- package/dist/GraphMaker/utils/createChartSettingsForRender/composeScatterplotUmapSettings.d.ts.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/MiPlots.js +22 -22
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/ChartRenderer.js +160 -156
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/DendroSettingsImpl.js +31 -27
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/DendroSettingsImpl.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Chart.js +53 -53
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/getHierarchyData.js +30 -24
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/getHierarchyData.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/index.js +78 -77
- package/dist/node_modules/@milaboratories/miplots4/dist/dendro/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js +267 -258
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/ChartRenderer.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/HeatmapSettingsImpl.js +59 -54
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/HeatmapSettingsImpl.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js +91 -89
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/Chart.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/components/ChartsGroup.js +17 -17
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js +98 -87
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/getCells.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js +98 -76
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/index.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js +57 -57
- package/dist/node_modules/@milaboratories/miplots4/dist/heatmap/utils/calculateCaptionTails.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/common.js +52 -51
- package/dist/node_modules/@milaboratories/miplots4/dist/types/common.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/dendro.js +13 -8
- package/dist/node_modules/@milaboratories/miplots4/dist/types/dendro.js.map +1 -1
- package/dist/node_modules/@milaboratories/miplots4/dist/types/discrete.js +5 -5
- package/dist/node_modules/@milaboratories/miplots4/dist/types/heatmap.js +19 -11
- package/dist/node_modules/@milaboratories/miplots4/dist/types/heatmap.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/dendro/ChartRenderer.tsx"],"sourcesContent":["import type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal, ScalePower } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport { BLACK } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { DEFAULT_DOT_AES, LEGEND_OFFSET } from '../scatterplot/constants';\nimport type {\n CategoricalAesFromColumn,\n ClickEventData,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n DendroLegendInfo,\n LineShape,\n PointShape,\n} from '../types';\nimport { isCategoricalAes, isContinuousAes } from '../types';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { getContinuousLegendWidth, getDiscreteLegendWidth } from '../utils/getLegendWidth';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { Chart } from './components/Chart';\nimport type { ChartScales, ChartSizes, DotAesItem, LegendData, LegendItem } from './components/types';\nimport {\n COLOR_NULL,\n HEATMAP_LEFT_OFFSET,\n HEIGHT,\n MARGIN,\n MAX_HEATMAP_WIDTH,\n MAX_LEGEND_HEIGHT,\n WIDTH,\n} from './constants';\nimport type { DendroSettingsImpl } from './DendroSettingsImpl';\nimport type { HeatmapData } from './getHeatmapData';\nimport type { TreeNodeData } from './getHierarchyData';\nimport { updateLinksHeight, updateNodesHorizontalPosition } from './getHierarchyData';\n\nfunction createAesGetter<InputType extends string | number | PointShape | LineShape>(\n dataFrame: DataFrame,\n aesItem: InputType | CategoricalAesFromColumn<InputType> | ContinuousAesFromColumn<InputType>\n): (idx: number) => InputType {\n if (isCategoricalAes<InputType>(aesItem)) {\n return (idx: number) => aesItem.valuesMap[String(dataFrame.getColumnValue(aesItem.columnName.value, idx))];\n }\n if (isContinuousAes<InputType>(aesItem)) {\n // size\n const {domain, range} = aesItem;\n const scale: ScalePower<InputType, InputType> = scaleSqrt<InputType, InputType>().domain(domain).range(range);\n return (idx: number) => {\n const v = scale(Number(dataFrame.getColumnValue(aesItem.columnName.value, idx)));\n return Math.max(1, v as number) as InputType;\n };\n }\n return (_: number) => aesItem;\n}\n\nfunction createAesGetters(dataFrame: DataFrame, aes: DendroSettingsImpl['aes']) {\n return {\n nodeShape: createAesGetter<string>(dataFrame, aes.nodeShape),\n nodeColor: createAesGetter<string>(dataFrame, aes.nodeColor),\n nodeSize: createAesGetter<number>(dataFrame, aes.nodeSize),\n lineShape: createAesGetter<string>(dataFrame, aes.lineShape),\n lineColor: createAesGetter<string>(dataFrame, aes.lineColor),\n };\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 getCellHeight(leavesCount: number, scale = 1, minHeight?: number, maxHeight?: number) {\n const valueByNodeCount = (leavesCount < 16 ? 40 : leavesCount < 49 ? 32 : 24) * scale;\n return Math.max(Math.min(valueByNodeCount, maxHeight ?? Infinity), minHeight ?? -Infinity);\n}\n\nclass ChartRenderer {\n component: ReactElement = (<></>);\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n chartSizes: ChartSizes = {\n treeWidth: WIDTH,\n treeHeight: HEIGHT,\n heatmapWidth: 0,\n heatmapHeight: 0,\n totalWidth: WIDTH + WIDTH + MARGIN.LEFT + MARGIN.RIGHT,\n totalHeight: HEIGHT + MARGIN.TOP + MARGIN.BOTTOM,\n labelsOffset: 0,\n };\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n // heatmap scales and step\n heatmapScales: ChartScales = {\n x: scaleOrdinal<string, number>().domain(['null']).range([1]),\n y: scaleOrdinal<string, number>().domain(['null']).range([1]),\n };\n heatmapStep: {x: number; y: number} = {x: 0, y: 0};\n heatmapColorScale: {\n scale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string>;\n getter: (v: DataValue) => string;\n } = {\n scale: scaleOrdinal([]),\n getter: () => 'white',\n };\n heatmapLabels: string[] = [];\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 updateHeatmapScales(\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n size: DendroSettingsImpl['chartSettings']['size']\n ) {\n if (heatmapData === null) {\n this.chartSizes.heatmapWidth = 0;\n return;\n }\n const {xKeysByGroups, xGroupKeys, xKeys, yKeys} = heatmapData;\n const groupGap = 5;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yStep = this.chartSizes.treeHeight / yKeys.length;\n const xStep = Math.min(\n Math.max(\n (MAX_HEATMAP_WIDTH - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount,\n size.minCellWidth\n ),\n size.maxCellWidth\n );\n\n const xPositions: number[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = xKeysByGroups[xKey];\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 this.heatmapScales.x = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.heatmapScales.y = scaleOrdinal<string, number>()\n .domain(yKeys)\n .range(yKeys.map((_key, idx) => idx * yStep));\n this.heatmapStep.x = xStep;\n this.heatmapStep.y = yStep;\n\n const {colorsList, colorsMap} = heatmapSettings.aes;\n if (heatmapSettings.valueType === 'continuous' && colorsList) {\n const scale = scaleLinear<string, string>()\n .domain(getSteps(colorsList.length, heatmapData.meta.valueExtent))\n .range(colorsList);\n this.heatmapColorScale = {\n scale,\n getter: v => scale(v as number),\n };\n }\n if (heatmapSettings.valueType === 'discrete' && colorsMap) {\n const values = Object.keys(colorsMap).filter(key => heatmapData.meta.uniqueValues.has(key));\n this.heatmapColorScale = {\n scale: scaleOrdinal(\n values,\n values.map(v => colorsMap[v])\n ).unknown(COLOR_NULL),\n getter: v => (v ? colorsMap[v] ?? COLOR_NULL : COLOR_NULL),\n };\n }\n if (heatmapSettings.valueType === 'stringSource' && colorsList) {\n const values = [...heatmapData.meta.uniqueValues];\n const scale = scaleOrdinal(\n values,\n values.map((_v, idx) => colorsList[idx % colorsList.length])\n ).unknown(COLOR_NULL);\n this.heatmapColorScale = {\n scale,\n getter: v => (v ? scale(v as string) : COLOR_NULL),\n };\n }\n\n this.chartSizes.heatmapWidth =\n this.heatmapScales.x(heatmapData.xKeys[heatmapData.xKeys.length - 1]) + this.heatmapStep.x;\n }\n\n updateLegendSize(\n legend: DendroSettingsImpl['chartSettings']['legend'],\n legendLabels: DendroLegendInfo,\n aes: DendroSettingsImpl['aes'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings']\n ) {\n if (!legend.show) {\n this.legend = {\n width: 0,\n height: 0,\n items: [],\n };\n return;\n }\n const textMeasurer = new TextMeasurer('600 14px Arial');\n const LINE_HEIGHT = 16;\n const GROUP_OFFSET = 48;\n const TEXT_LEFT_DISCRETE = 20;\n const COLUMN_OFFSET = 24;\n\n function getLegendItemWidth(keys: string[], title: string) {\n return Math.max(\n ...keys.map(text => textMeasurer.getTextWidth(String(text)) + TEXT_LEFT_DISCRETE),\n textMeasurer.getTextWidth(title)\n );\n }\n\n const columns: {\n columnKey: string;\n data: Record<string, DotAesItem>;\n values: string[];\n labels: Record<string, string>;\n }[] = [];\n\n const aesGrouping: ColumnName[] = [aes.nodeColor, aes.nodeShape, aes.lineColor]\n .filter(isCategoricalAes)\n .map(item => (item as CategoricalAesFromColumn<string>).columnName);\n aesGrouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const columnKey = column.label ?? column.value;\n const columnValues = info.values;\n const aesData: Record<string, DotAesItem> = {};\n columnValues.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = info.aesMap[columnValue]?.[key] ?? BLACK;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = info.aesMap[columnValue]?.[key] ?? '21';\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = info.aesMap[columnValue]?.[key] ?? 3;\n }\n });\n });\n\n columns.push({\n columnKey,\n data: aesData,\n values: info.values,\n labels: info.labels,\n });\n });\n const legendItems: LegendItem[] = [];\n let currentColumnWidth = 0;\n let currentColumnHeight = 0;\n let currentLeft = 0;\n let maxHeight = Math.min(this.chartSizes.treeHeight, MAX_LEGEND_HEIGHT);\n\n if (heatmapAnnotation && heatmapData) {\n const type = heatmapSettings.valueType;\n const title = heatmapAnnotation.label ?? heatmapAnnotation.value;\n if (type === 'continuous') {\n const colorScale = this.heatmapColorScale.scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(colorScale, heatmapData.meta.valueExtent, 4);\n const width = getContinuousLegendWidth(values, title);\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'continuous',\n width,\n height: maxHeight,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n } else {\n const colorScale = this.heatmapColorScale.scale as ScaleOrdinal<string, string>;\n const width = getDiscreteLegendWidth(colorScale, title);\n const values = colorScale.domain();\n const height = values.length * LINE_HEIGHT;\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'discrete',\n width,\n height,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n }\n }\n\n columns.map(({columnKey, labels, values, data}) => {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const title = columnKey;\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = values.length * LINE_HEIGHT;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const scale = scaleOrdinal<DotAesItem>()\n .domain(values)\n .range(values.map(value => data[value]));\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnKey, type: 'nodes', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n });\n\n if (isContinuousAes(aes.nodeSize)) {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const {columnName, domain, range} = aes.nodeSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = (scale(Math.max(...values)) * 2 + 4) * values.length;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnName.value, type: 'size', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n }\n\n const legendWidth = currentLeft + currentColumnWidth + 2 * LEGEND_OFFSET;\n const legendHeight = maxHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items: legendItems,\n };\n }\n\n updateChartSizes(\n size: DendroSettingsImpl['chartSettings']['size'],\n heatmapData: HeatmapData | null,\n hierarchy: HierarchyNode<TreeNodeData>\n ) {\n const leavesCount = hierarchy.leaves().length;\n this.chartSizes.treeWidth = heatmapData ? size.width / 2 : size.width;\n\n const height = getCellHeight(leavesCount, size.scale, size.minCellHeight, size.maxCellHeight) * leavesCount;\n\n this.chartSizes.treeHeight = height;\n this.chartSizes.heatmapHeight = height;\n }\n\n updateTotalSizes(heatmapData: HeatmapData | null) {\n this.chartSizes.totalWidth =\n this.chartSizes.treeWidth + this.chartSizes.heatmapWidth + this.legend.width + MARGIN.LEFT + MARGIN.RIGHT;\n if (heatmapData) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n if (this.legend.width > 0) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n this.chartSizes.totalHeight =\n Math.max(this.chartSizes.treeHeight, this.legend.height) + MARGIN.TOP + MARGIN.BOTTOM;\n }\n\n prepareTableLabels(heatmapData: HeatmapData | null) {\n const textMeasurer = new TextMeasurer('bold 14px Arial');\n const ELLIPSIS = '…';\n\n if (this.heatmapStep.x < 12 || !heatmapData) {\n this.heatmapLabels = [];\n return;\n }\n\n const limit = this.heatmapStep.x - 4;\n\n this.heatmapLabels = heatmapData.xKeys.map(x => {\n const label = heatmapData.meta.xLabels[x];\n let size = textMeasurer.getTextWidth(label);\n if (size < limit) {\n return label;\n }\n let curLabel = label;\n let letters = curLabel?.length;\n while (size > limit && letters > 0) {\n letters--;\n curLabel = label?.substring(0, letters) + ELLIPSIS;\n size = textMeasurer.getTextWidth(curLabel);\n }\n\n return letters > 0 ? curLabel : '';\n });\n }\n\n addLabelsWidthToTreeArea(root: HierarchyPointNode<TreeNodeData>, showLeavesLabels: boolean) {\n if (!showLeavesLabels) {\n return;\n }\n const leaves = root.leaves();\n const textMeasurer = new TextMeasurer('bold 14px Manrope');\n\n let offset = 0;\n leaves.forEach(node => {\n if (!node.data.label) {\n return;\n }\n const size = textMeasurer.getTextWidth(node.data.label);\n const diff = node.y + size - this.chartSizes.treeWidth + 8; // 8 - offset between point center and label\n if (diff > offset) {\n offset = diff;\n }\n });\n\n this.chartSizes.treeWidth += offset;\n }\n\n render(\n dataFrame: DataFrame,\n chartSettings: DendroSettingsImpl['chartSettings'],\n hierarchy: HierarchyNode<TreeNodeData>,\n connectionType: DendroSettingsImpl['connectionType'],\n rootPosition: DendroSettingsImpl['rootPosition'],\n edgeInheritance: DendroSettingsImpl['edgeInheritance'],\n showNodes: DendroSettingsImpl['showNodes'],\n showEdges: DendroSettingsImpl['showEdges'],\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'],\n showNodesLabels: DendroSettingsImpl['showNodesLabels'],\n aes: DendroSettingsImpl['aes'],\n labels: DendroSettingsImpl['labels'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n legendLabels: DendroLegendInfo,\n leavesMode: DendroSettingsImpl['leavesMode'],\n onClick: (data: ClickEventData) => void\n ) {\n this.updateChartSizes(chartSettings.size, heatmapData, hierarchy);\n this.updateHeatmapScales(heatmapData, heatmapSettings, chartSettings.size);\n this.updateLegendSize(chartSettings.legend, legendLabels, aes, heatmapAnnotation, heatmapData, heatmapSettings);\n this.prepareTableLabels(heatmapData);\n\n const clusterSize: [number, number] =\n rootPosition === 'top'\n ? [this.chartSizes.treeWidth, this.chartSizes.treeHeight]\n : [this.chartSizes.treeHeight, this.chartSizes.treeWidth];\n cluster<TreeNodeData>()\n .size(clusterSize)\n .separation(() => 1)(hierarchy);\n const root = hierarchy as HierarchyPointNode<TreeNodeData>;\n\n updateLinksHeight(\n root,\n rootPosition === 'top' ? this.chartSizes.treeHeight : this.chartSizes.treeWidth,\n leavesMode === 'alignLeavesToLine'\n );\n updateNodesHorizontalPosition(root);\n\n this.addLabelsWidthToTreeArea(root, showLeavesLabels);\n this.updateTotalSizes(heatmapData);\n\n const aesGetters = createAesGetters(dataFrame, aes);\n const component = (\n <Chart\n chartSizes={this.chartSizes}\n chartSettings={chartSettings}\n nodes={root.descendants()}\n links={root.links()}\n connectionType={connectionType}\n rootPosition={rootPosition}\n edgeInheritance={edgeInheritance}\n showNodes={showNodes}\n showEdges={showEdges}\n showLeavesLabels={showLeavesLabels}\n showNodesLabels={showNodesLabels}\n aesGetters={aesGetters}\n labels={labels}\n heatmapData={heatmapData}\n heatmapScales={this.heatmapScales}\n heatmapStep={this.heatmapStep}\n heatmapColor={this.heatmapColorScale.getter}\n heatmapLabels={this.heatmapLabels}\n legendData={this.legend}\n onClick={onClick}\n />\n );\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":["createAesGetter","dataFrame","aesItem","isCategoricalAes","idx","isContinuousAes","domain","range","scale","scaleSqrt","v","_","createAesGetters","aes","getSteps","count","valueExtent","min","max","steps","i","step","getCellHeight","leavesCount","minHeight","maxHeight","valueByNodeCount","ChartRenderer","__publicField","jsx","Fragment","WIDTH","HEIGHT","MARGIN","scaleOrdinal","_a","node","createRoot","heatmapData","heatmapSettings","size","xKeysByGroups","xGroupKeys","xKeys","yKeys","groupGap","xCounts","xGroupKey","xCellsCount","sum","yStep","xStep","MAX_HEATMAP_WIDTH","xPositions","currentX","xKey","axisKeys","_key","colorsList","colorsMap","scaleLinear","values","key","COLOR_NULL","_v","legend","legendLabels","heatmapAnnotation","textMeasurer","TextMeasurer","LINE_HEIGHT","GROUP_OFFSET","TEXT_LEFT_DISCRETE","COLUMN_OFFSET","getLegendItemWidth","keys","title","text","columns","item","column","info","columnKey","columnValues","aesData","columnValue","DEFAULT_DOT_AES","BLACK","_b","_c","legendItems","currentColumnWidth","currentColumnHeight","currentLeft","MAX_LEGEND_HEIGHT","type","colorScale","getContinuousLegendTicks","legendItem","getContinuousLegendWidth","width","getDiscreteLegendWidth","height","labels","data","value","left","top","columnName","format","res","legendWidth","LEGEND_OFFSET","legendHeight","hierarchy","HEATMAP_LEFT_OFFSET","ELLIPSIS","limit","x","label","curLabel","letters","root","showLeavesLabels","leaves","offset","diff","chartSettings","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showNodesLabels","leavesMode","onClick","clusterSize","cluster","updateLinksHeight","updateNodesHorizontalPosition","aesGetters","component","Chart","message","Error"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/dendro/ChartRenderer.tsx"],"sourcesContent":["import type { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';\nimport { cluster } from 'd3-hierarchy';\nimport type { ScaleLinear, ScaleOrdinal, ScalePower } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport { BLACK } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { DEFAULT_DOT_AES, LEGEND_OFFSET } from '../scatterplot/constants';\nimport type {\n CategoricalAesFromColumn,\n ClickEventData,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n DendroLegendInfo,\n LineShape,\n PointShape,\n} from '../types';\nimport { isCategoricalAes, isContinuousAes } from '../types';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { getContinuousLegendWidth, getDiscreteLegendWidth } from '../utils/getLegendWidth';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { Chart } from './components/Chart';\nimport type { ChartScales, ChartSizes, DotAesItem, LegendData, LegendItem } from './components/types';\nimport {\n COLOR_NULL,\n HEATMAP_LEFT_OFFSET,\n HEIGHT,\n MARGIN,\n MAX_HEATMAP_WIDTH,\n MAX_LEGEND_HEIGHT,\n WIDTH,\n} from './constants';\nimport type { DendroSettingsImpl } from './DendroSettingsImpl';\nimport type { HeatmapData } from './getHeatmapData';\nimport type { TreeNodeData } from './getHierarchyData';\nimport { updateLinksHeight, updateNodesHorizontalPosition } from './getHierarchyData';\n\nfunction createAesGetter<InputType extends string | number | PointShape | LineShape>(\n dataFrame: DataFrame,\n aesItem: InputType | CategoricalAesFromColumn<InputType> | ContinuousAesFromColumn<InputType>\n): (idx: number) => InputType {\n if (isCategoricalAes<InputType>(aesItem)) {\n return (idx: number) => aesItem.valuesMap[String(dataFrame.getColumnValue(aesItem.columnName.value, idx))];\n }\n if (isContinuousAes<InputType>(aesItem)) {\n // size\n const {domain, range} = aesItem;\n const scale: ScalePower<InputType, InputType> = scaleSqrt<InputType, InputType>().domain(domain).range(range);\n return (idx: number) => {\n const v = scale(Number(dataFrame.getColumnValue(aesItem.columnName.value, idx)));\n return Math.max(1, v as number) as InputType;\n };\n }\n return (_: number) => aesItem;\n}\n\nfunction createAesGetters(dataFrame: DataFrame, aes: DendroSettingsImpl['aes']) {\n return {\n nodeShape: createAesGetter<string>(dataFrame, aes.nodeShape),\n nodeColor: createAesGetter<string>(dataFrame, aes.nodeColor),\n nodeSize: createAesGetter<number>(dataFrame, aes.nodeSize),\n lineShape: createAesGetter<string>(dataFrame, aes.lineShape),\n lineColor: createAesGetter<string>(dataFrame, aes.lineColor),\n };\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 getCellHeight(leavesCount: number, scale = 1, minHeight?: number, maxHeight?: number) {\n const valueByNodeCount = (leavesCount < 16 ? 40 : leavesCount < 49 ? 32 : 24) * scale;\n return Math.max(Math.min(valueByNodeCount, maxHeight ?? Infinity), minHeight ?? -Infinity);\n}\n\nclass ChartRenderer {\n component: ReactElement = (<></>);\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n chartSizes: ChartSizes = {\n treeWidth: WIDTH,\n treeHeight: HEIGHT,\n heatmapWidth: 0,\n heatmapHeight: 0,\n totalWidth: WIDTH + WIDTH + MARGIN.LEFT + MARGIN.RIGHT,\n totalHeight: HEIGHT + MARGIN.TOP + MARGIN.BOTTOM,\n labelsOffset: 0,\n marginLeft: MARGIN.LEFT,\n marginRight: MARGIN.RIGHT,\n marginTop: MARGIN.TOP,\n marginBottom: MARGIN.BOTTOM,\n };\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n // heatmap scales and step\n heatmapScales: ChartScales = {\n x: scaleOrdinal<string, number>().domain(['null']).range([1]),\n y: scaleOrdinal<string, number>().domain(['null']).range([1]),\n };\n heatmapStep: {x: number; y: number} = {x: 0, y: 0};\n heatmapColorScale: {\n scale: ScaleLinear<string, string> | ScaleOrdinal<string, string, string>;\n getter: (v: DataValue) => string;\n } = {\n scale: scaleOrdinal([]),\n getter: () => 'white',\n };\n heatmapLabels: string[] = [];\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 updateHeatmapScales(\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n size: DendroSettingsImpl['chartSettings']['size']\n ) {\n if (heatmapData === null) {\n this.chartSizes.heatmapWidth = 0;\n return;\n }\n const {xKeysByGroups, xGroupKeys, xKeys, yKeys} = heatmapData;\n const groupGap = 5;\n // for shared facets max cells counts in group should be used\n const xCounts = xGroupKeys.map(xGroupKey => xKeysByGroups[xGroupKey].length);\n const xCellsCount = xCounts.reduce((sum, count) => sum + count, 0);\n const yStep = this.chartSizes.treeHeight / yKeys.length;\n const xStep = Math.min(\n Math.max(\n (MAX_HEATMAP_WIDTH - (xCounts.filter(count => count > 0).length - 1) * groupGap) / xCellsCount,\n size.minCellWidth\n ),\n size.maxCellWidth\n );\n\n const xPositions: number[] = [];\n let currentX = 0;\n xGroupKeys.forEach(xKey => {\n const axisKeys = xKeysByGroups[xKey];\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 this.heatmapScales.x = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.heatmapScales.y = scaleOrdinal<string, number>()\n .domain(yKeys)\n .range(yKeys.map((_key, idx) => idx * yStep));\n this.heatmapStep.x = xStep;\n this.heatmapStep.y = yStep;\n\n const {colorsList, colorsMap} = heatmapSettings.aes;\n if (heatmapSettings.valueType === 'continuous' && colorsList) {\n const scale = scaleLinear<string, string>()\n .domain(getSteps(colorsList.length, heatmapData.meta.valueExtent))\n .range(colorsList);\n this.heatmapColorScale = {\n scale,\n getter: v => scale(v as number),\n };\n }\n if (heatmapSettings.valueType === 'discrete' && colorsMap) {\n const values = Object.keys(colorsMap).filter(key => heatmapData.meta.uniqueValues.has(key));\n this.heatmapColorScale = {\n scale: scaleOrdinal(\n values,\n values.map(v => colorsMap[v])\n ).unknown(COLOR_NULL),\n getter: v => (v ? colorsMap[v] ?? COLOR_NULL : COLOR_NULL),\n };\n }\n if (heatmapSettings.valueType === 'stringSource' && colorsList) {\n const values = [...heatmapData.meta.uniqueValues];\n const scale = scaleOrdinal(\n values,\n values.map((_v, idx) => colorsList[idx % colorsList.length])\n ).unknown(COLOR_NULL);\n this.heatmapColorScale = {\n scale,\n getter: v => (v ? scale(v as string) : COLOR_NULL),\n };\n }\n\n this.chartSizes.heatmapWidth =\n this.heatmapScales.x(heatmapData.xKeys[heatmapData.xKeys.length - 1]) + this.heatmapStep.x;\n }\n\n updateLegendSize(\n legend: DendroSettingsImpl['chartSettings']['legend'],\n legendLabels: DendroLegendInfo,\n aes: DendroSettingsImpl['aes'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings']\n ) {\n if (!legend.show) {\n this.legend = {\n width: 0,\n height: 0,\n items: [],\n };\n return;\n }\n const textMeasurer = new TextMeasurer('600 14px Arial');\n const LINE_HEIGHT = 16;\n const GROUP_OFFSET = 48;\n const TEXT_LEFT_DISCRETE = 20;\n const COLUMN_OFFSET = 24;\n\n function getLegendItemWidth(keys: string[], title: string) {\n return Math.max(\n ...keys.map(text => textMeasurer.getTextWidth(String(text)) + TEXT_LEFT_DISCRETE),\n textMeasurer.getTextWidth(title)\n );\n }\n\n const columns: {\n columnKey: string;\n data: Record<string, DotAesItem>;\n values: string[];\n labels: Record<string, string>;\n }[] = [];\n\n const aesGrouping: ColumnName[] = [aes.nodeColor, aes.nodeShape, aes.lineColor]\n .filter(isCategoricalAes)\n .map(item => (item as CategoricalAesFromColumn<string>).columnName);\n aesGrouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const columnKey = column.label ?? column.value;\n const columnValues = info.values;\n const aesData: Record<string, DotAesItem> = {};\n columnValues.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = info.aesMap[columnValue]?.[key] ?? BLACK;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = info.aesMap[columnValue]?.[key] ?? '21';\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = info.aesMap[columnValue]?.[key] ?? 3;\n }\n });\n });\n\n columns.push({\n columnKey,\n data: aesData,\n values: info.values,\n labels: info.labels,\n });\n });\n const legendItems: LegendItem[] = [];\n let currentColumnWidth = 0;\n let currentColumnHeight = 0;\n let currentLeft = 0;\n let maxHeight = Math.min(this.chartSizes.treeHeight, MAX_LEGEND_HEIGHT);\n\n if (heatmapAnnotation && heatmapData) {\n const type = heatmapSettings.valueType;\n const title = heatmapAnnotation.label ?? heatmapAnnotation.value;\n if (type === 'continuous') {\n const colorScale = this.heatmapColorScale.scale as ScaleLinear<string, string>;\n const values = getContinuousLegendTicks(colorScale, heatmapData.meta.valueExtent, 4);\n const width = getContinuousLegendWidth(values, title);\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'continuous',\n width,\n height: maxHeight,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n } else {\n const colorScale = this.heatmapColorScale.scale as ScaleOrdinal<string, string>;\n const width = getDiscreteLegendWidth(colorScale, title);\n const values = colorScale.domain();\n const height = values.length * LINE_HEIGHT;\n const legendItem: LegendItem = {\n id: 'heatmapValue',\n type: 'discrete',\n width,\n height,\n left: 0,\n top: 0,\n title,\n scale: colorScale,\n values,\n labels: {},\n };\n legendItems.push(legendItem);\n currentColumnHeight = legendItem.height + GROUP_OFFSET;\n currentColumnWidth = legendItem.width;\n }\n }\n\n columns.map(({columnKey, labels, values, data}) => {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const title = columnKey;\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = values.length * LINE_HEIGHT;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const scale = scaleOrdinal<DotAesItem>()\n .domain(values)\n .range(values.map(value => data[value]));\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnKey, type: 'nodes', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n });\n\n if (isContinuousAes(aes.nodeSize)) {\n if (currentColumnHeight > maxHeight) {\n currentColumnHeight = 0;\n currentLeft += currentColumnWidth + COLUMN_OFFSET;\n }\n const {columnName, domain, range} = aes.nodeSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n const width = getLegendItemWidth(\n values.map(v => labels[v]),\n title\n );\n const height = (scale(Math.max(...values)) * 2 + 4) * values.length;\n if (height > maxHeight) {\n maxHeight = height;\n }\n const left = currentLeft;\n const top = currentColumnHeight;\n legendItems.push({id: columnName.value, type: 'size', width, height, left, top, title, scale, values, labels});\n currentColumnWidth = width;\n currentColumnHeight += height + GROUP_OFFSET;\n }\n\n const legendWidth = currentLeft + currentColumnWidth + 2 * LEGEND_OFFSET;\n const legendHeight = maxHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items: legendItems,\n };\n }\n\n updateChartSizes(\n size: DendroSettingsImpl['chartSettings']['size'],\n heatmapData: HeatmapData | null,\n hierarchy: HierarchyNode<TreeNodeData>\n ) {\n const leavesCount = hierarchy.leaves().length;\n this.chartSizes.treeWidth = heatmapData ? size.width / 2 : size.width;\n\n const height = getCellHeight(leavesCount, size.scale, size.minCellHeight, size.maxCellHeight) * leavesCount;\n\n this.chartSizes.treeHeight = height;\n this.chartSizes.heatmapHeight = height;\n this.chartSizes.marginLeft = size.marginLeft;\n this.chartSizes.marginRight = size.marginRight;\n this.chartSizes.marginBottom = size.marginBottom;\n this.chartSizes.marginTop = size.marginTop;\n }\n\n updateTotalSizes(heatmapData: HeatmapData | null) {\n this.chartSizes.totalWidth =\n this.chartSizes.treeWidth + this.chartSizes.heatmapWidth + this.legend.width + this.chartSizes.marginLeft + this.chartSizes.marginRight;\n if (heatmapData) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n if (this.legend.width > 0) {\n this.chartSizes.totalWidth += HEATMAP_LEFT_OFFSET;\n }\n\n this.chartSizes.totalHeight =\n Math.max(this.chartSizes.treeHeight, this.legend.height) + this.chartSizes.marginTop + this.chartSizes.marginBottom;\n }\n\n prepareTableLabels(heatmapData: HeatmapData | null) {\n const textMeasurer = new TextMeasurer('bold 14px Arial');\n const ELLIPSIS = '…';\n\n if (this.heatmapStep.x < 12 || !heatmapData) {\n this.heatmapLabels = [];\n return;\n }\n\n const limit = this.heatmapStep.x - 4;\n\n this.heatmapLabels = heatmapData.xKeys.map(x => {\n const label = heatmapData.meta.xLabels[x];\n let size = textMeasurer.getTextWidth(label);\n if (size < limit) {\n return label;\n }\n let curLabel = label;\n let letters = curLabel?.length;\n while (size > limit && letters > 0) {\n letters--;\n curLabel = label?.substring(0, letters) + ELLIPSIS;\n size = textMeasurer.getTextWidth(curLabel);\n }\n\n return letters > 0 ? curLabel : '';\n });\n }\n\n addLabelsWidthToTreeArea(root: HierarchyPointNode<TreeNodeData>, showLeavesLabels: boolean) {\n if (!showLeavesLabels) {\n return;\n }\n const leaves = root.leaves();\n const textMeasurer = new TextMeasurer('bold 14px Manrope');\n\n let offset = 0;\n leaves.forEach(node => {\n if (!node.data.label) {\n return;\n }\n const size = textMeasurer.getTextWidth(node.data.label);\n const diff = node.y + size - this.chartSizes.treeWidth + 8; // 8 - offset between point center and label\n if (diff > offset) {\n offset = diff;\n }\n });\n\n this.chartSizes.treeWidth += offset;\n }\n\n render(\n dataFrame: DataFrame,\n chartSettings: DendroSettingsImpl['chartSettings'],\n hierarchy: HierarchyNode<TreeNodeData>,\n connectionType: DendroSettingsImpl['connectionType'],\n rootPosition: DendroSettingsImpl['rootPosition'],\n edgeInheritance: DendroSettingsImpl['edgeInheritance'],\n showNodes: DendroSettingsImpl['showNodes'],\n showEdges: DendroSettingsImpl['showEdges'],\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'],\n showNodesLabels: DendroSettingsImpl['showNodesLabels'],\n aes: DendroSettingsImpl['aes'],\n labels: DendroSettingsImpl['labels'],\n heatmapAnnotation: DendroSettingsImpl['heatmapAnnotation'],\n heatmapData: HeatmapData | null,\n heatmapSettings: DendroSettingsImpl['heatmapSettings'],\n legendLabels: DendroLegendInfo,\n leavesMode: DendroSettingsImpl['leavesMode'],\n onClick: (data: ClickEventData) => void\n ) {\n this.updateChartSizes(chartSettings.size, heatmapData, hierarchy);\n this.updateHeatmapScales(heatmapData, heatmapSettings, chartSettings.size);\n this.updateLegendSize(chartSettings.legend, legendLabels, aes, heatmapAnnotation, heatmapData, heatmapSettings);\n this.prepareTableLabels(heatmapData);\n\n const clusterSize: [number, number] =\n rootPosition === 'top'\n ? [this.chartSizes.treeWidth, this.chartSizes.treeHeight]\n : [this.chartSizes.treeHeight, this.chartSizes.treeWidth];\n cluster<TreeNodeData>()\n .size(clusterSize)\n .separation(() => 1)(hierarchy);\n const root = hierarchy as HierarchyPointNode<TreeNodeData>;\n\n updateLinksHeight(\n root,\n rootPosition === 'top' ? this.chartSizes.treeHeight : this.chartSizes.treeWidth,\n leavesMode === 'alignLeavesToLine'\n );\n updateNodesHorizontalPosition(root);\n\n this.addLabelsWidthToTreeArea(root, showLeavesLabels);\n this.updateTotalSizes(heatmapData);\n\n const aesGetters = createAesGetters(dataFrame, aes);\n const component = (\n <Chart\n chartSizes={this.chartSizes}\n chartSettings={chartSettings}\n nodes={root.descendants()}\n links={root.links()}\n connectionType={connectionType}\n rootPosition={rootPosition}\n edgeInheritance={edgeInheritance}\n showNodes={showNodes}\n showEdges={showEdges}\n showLeavesLabels={showLeavesLabels}\n showNodesLabels={showNodesLabels}\n aesGetters={aesGetters}\n labels={labels}\n heatmapData={heatmapData}\n heatmapScales={this.heatmapScales}\n heatmapStep={this.heatmapStep}\n heatmapColor={this.heatmapColorScale.getter}\n heatmapLabels={this.heatmapLabels}\n legendData={this.legend}\n onClick={onClick}\n />\n );\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":["createAesGetter","dataFrame","aesItem","isCategoricalAes","idx","isContinuousAes","domain","range","scale","scaleSqrt","v","_","createAesGetters","aes","getSteps","count","valueExtent","min","max","steps","i","step","getCellHeight","leavesCount","minHeight","maxHeight","valueByNodeCount","ChartRenderer","__publicField","jsx","Fragment","WIDTH","HEIGHT","MARGIN","scaleOrdinal","_a","node","createRoot","heatmapData","heatmapSettings","size","xKeysByGroups","xGroupKeys","xKeys","yKeys","groupGap","xCounts","xGroupKey","xCellsCount","sum","yStep","xStep","MAX_HEATMAP_WIDTH","xPositions","currentX","xKey","axisKeys","_key","colorsList","colorsMap","scaleLinear","values","key","COLOR_NULL","_v","legend","legendLabels","heatmapAnnotation","textMeasurer","TextMeasurer","LINE_HEIGHT","GROUP_OFFSET","TEXT_LEFT_DISCRETE","COLUMN_OFFSET","getLegendItemWidth","keys","title","text","columns","item","column","info","columnKey","columnValues","aesData","columnValue","DEFAULT_DOT_AES","BLACK","_b","_c","legendItems","currentColumnWidth","currentColumnHeight","currentLeft","MAX_LEGEND_HEIGHT","type","colorScale","getContinuousLegendTicks","legendItem","getContinuousLegendWidth","width","getDiscreteLegendWidth","height","labels","data","value","left","top","columnName","format","res","legendWidth","LEGEND_OFFSET","legendHeight","hierarchy","HEATMAP_LEFT_OFFSET","ELLIPSIS","limit","x","label","curLabel","letters","root","showLeavesLabels","leaves","offset","diff","chartSettings","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showNodesLabels","leavesMode","onClick","clusterSize","cluster","updateLinksHeight","updateNodesHorizontalPosition","aesGetters","component","Chart","message","Error"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,57 +1,61 @@
|
|
|
1
|
-
import { DEFAULT_HEIGHT_SMALL as
|
|
2
|
-
import { CELL_MAX_WIDTH as
|
|
1
|
+
import { DEFAULT_HEIGHT_SMALL as w, DEFAULT_HEIGHT as I, DEFAULT_WIDTH_SMALL as A, BLACK as T } from "../constants.js";
|
|
2
|
+
import { MARGIN as l, CELL_MAX_WIDTH as S, CELL_MIN_WIDTH as b, WIDE_TREE_WIDTH as E } from "./constants.js";
|
|
3
3
|
import "../types/common.js";
|
|
4
4
|
import "../types/discrete.js";
|
|
5
5
|
import "../types/scatterplot.js";
|
|
6
6
|
import "../types/heatmap.js";
|
|
7
|
-
import { DendroSettingsSchema as
|
|
7
|
+
import { DendroSettingsSchema as C } from "../types/dendro.js";
|
|
8
8
|
import "../types/histogram.js";
|
|
9
9
|
import "../types/bubble.js";
|
|
10
|
-
var
|
|
11
|
-
class
|
|
12
|
-
constructor(
|
|
13
|
-
i(this, "type", "dendro"), i(this, "chartSettings"), i(this, "mode"), i(this, "leavesMode"), i(this, "id"), i(this, "parentId"), i(this, "height", null), i(this, "labels"), i(this, "heatmapAnnotation"), i(this, "heatmapAxis"), i(this, "heatmapGroup"), i(this, "heatmapSettings"), i(this, "connectionType", "rectangle"), i(this, "edgeInheritance", "up"), i(this, "rootPosition", "top"), i(this, "showNodes", !0), i(this, "showEdges", !0), i(this, "showLeavesLabels", !0), i(this, "showNodesLabels", !0), i(this, "aes", {
|
|
10
|
+
var z = Object.defineProperty, D = (s, e, t) => e in s ? z(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t, i = (s, e, t) => D(s, typeof e != "symbol" ? e + "" : e, t);
|
|
11
|
+
class F {
|
|
12
|
+
constructor(e) {
|
|
13
|
+
i(this, "type", "dendro"), i(this, "chartSettings"), i(this, "mode"), i(this, "leavesMode"), i(this, "leavesOrder"), i(this, "id"), i(this, "parentId"), i(this, "height", null), i(this, "labels"), i(this, "heatmapAnnotation"), i(this, "heatmapAxis"), i(this, "heatmapGroup"), i(this, "heatmapSettings"), i(this, "connectionType", "rectangle"), i(this, "edgeInheritance", "up"), i(this, "rootPosition", "top"), i(this, "showNodes", !0), i(this, "showEdges", !0), i(this, "showLeavesLabels", !0), i(this, "showNodesLabels", !0), i(this, "aes", {
|
|
14
14
|
nodeShape: "21",
|
|
15
|
-
nodeColor:
|
|
15
|
+
nodeColor: T,
|
|
16
16
|
nodeSize: 3,
|
|
17
17
|
lineShape: "solid",
|
|
18
|
-
lineColor:
|
|
18
|
+
lineColor: T
|
|
19
19
|
});
|
|
20
|
-
var
|
|
21
|
-
|
|
20
|
+
var t, n, a, h, o, r, d, m, u, p, g, v, c, L;
|
|
21
|
+
C.parse(e), this.chartSettings = {
|
|
22
22
|
size: {
|
|
23
|
-
width: ((
|
|
24
|
-
height: ((
|
|
25
|
-
scale: ((
|
|
26
|
-
minCellWidth: ((
|
|
27
|
-
maxCellWidth: ((
|
|
28
|
-
minCellHeight: (
|
|
29
|
-
maxCellHeight: (d =
|
|
23
|
+
width: ((t = e == null ? void 0 : e.size) == null ? void 0 : t.width) ?? (e.facetSettings ? A : E),
|
|
24
|
+
height: ((n = e == null ? void 0 : e.size) == null ? void 0 : n.height) ?? (e.facetSettings ? w : I),
|
|
25
|
+
scale: ((a = e == null ? void 0 : e.size) == null ? void 0 : a.scale) ?? 1,
|
|
26
|
+
minCellWidth: ((h = e == null ? void 0 : e.size) == null ? void 0 : h.minCellWidth) ?? b,
|
|
27
|
+
maxCellWidth: ((o = e == null ? void 0 : e.size) == null ? void 0 : o.maxCellWidth) ?? S,
|
|
28
|
+
minCellHeight: (r = e == null ? void 0 : e.size) == null ? void 0 : r.minCellHeight,
|
|
29
|
+
maxCellHeight: (d = e == null ? void 0 : e.size) == null ? void 0 : d.maxCellHeight,
|
|
30
|
+
marginTop: ((m = e == null ? void 0 : e.size) == null ? void 0 : m.marginTop) ?? l.TOP,
|
|
31
|
+
marginBottom: ((u = e == null ? void 0 : e.size) == null ? void 0 : u.marginBottom) ?? l.BOTTOM,
|
|
32
|
+
marginLeft: ((p = e == null ? void 0 : e.size) == null ? void 0 : p.marginLeft) ?? l.LEFT,
|
|
33
|
+
marginRight: ((g = e == null ? void 0 : e.size) == null ? void 0 : g.marginRight) ?? l.RIGHT
|
|
30
34
|
},
|
|
31
35
|
title: {
|
|
32
36
|
position: "center",
|
|
33
37
|
show: !0,
|
|
34
|
-
...
|
|
35
|
-
name: ((
|
|
38
|
+
...e.title,
|
|
39
|
+
name: ((v = e.title) == null ? void 0 : v.name) ?? "Dendrogram"
|
|
36
40
|
},
|
|
37
41
|
legend: {
|
|
38
42
|
show: !0,
|
|
39
43
|
position: "right",
|
|
40
|
-
...
|
|
44
|
+
...e.legend
|
|
41
45
|
}
|
|
42
|
-
}, this.mode =
|
|
43
|
-
valueType: ((
|
|
46
|
+
}, this.mode = e.mode ?? "normal", this.leavesMode = e.leavesMode ?? "normal", this.leavesOrder = e.leavesOrder ?? null, this.id = e.id, this.parentId = e.parentId, this.height = e.height ?? null, this.labels = e.labels ?? this.id, this.heatmapAnnotation = e.heatmapAnnotation ?? null, this.heatmapAxis = e.heatmapAxis ?? null, this.heatmapGroup = e.heatmapGroup ?? [], this.heatmapSettings = {
|
|
47
|
+
valueType: ((c = e.heatmapSettings) == null ? void 0 : c.valueType) ?? "continuous",
|
|
44
48
|
aes: {
|
|
45
49
|
colorsList: ["#FFF680", "#53D788", "#36739D", "#4A005C"],
|
|
46
|
-
...(
|
|
50
|
+
...(L = e.heatmapSettings) == null ? void 0 : L.aes
|
|
47
51
|
}
|
|
48
|
-
}, this.connectionType =
|
|
52
|
+
}, this.connectionType = e.connectionType ?? this.connectionType, this.edgeInheritance = e.edgeInheritance ?? this.edgeInheritance, this.showNodes = e.showNodes ?? this.showNodes, this.showEdges = e.showEdges ?? this.showEdges, this.showLeavesLabels = e.showLeavesLabels ?? this.showLeavesLabels, this.showNodesLabels = e.showNodesLabels ?? this.showNodesLabels, this.rootPosition = e.rootPosition ?? this.rootPosition, this.aes = {
|
|
49
53
|
...this.aes,
|
|
50
|
-
...
|
|
54
|
+
...e.aes
|
|
51
55
|
};
|
|
52
56
|
}
|
|
53
57
|
}
|
|
54
58
|
export {
|
|
55
|
-
|
|
59
|
+
F as DendroSettingsImpl
|
|
56
60
|
};
|
|
57
61
|
//# sourceMappingURL=DendroSettingsImpl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DendroSettingsImpl.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/dendro/DendroSettingsImpl.ts"],"sourcesContent":["import {BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH_SMALL} from '../constants';\nimport {CELL_MAX_WIDTH, CELL_MIN_WIDTH, WIDE_TREE_WIDTH} from './constants';\nimport type {\n CategoricalAesFromColumn,\n ColumnName,\n ContinuousAesFromColumn,\n DendroSettings,\n LegendPosition,\n LineShape,\n PointShape,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport {DendroSettingsSchema} from '../types';\n\nexport class DendroSettingsImpl implements SettingsInterface {\n readonly type = 'dendro';\n readonly chartSettings: {\n readonly size: {\n width: number;\n height: number;\n scale: number;\n minCellWidth: number;\n maxCellWidth: number;\n minCellHeight?: number;\n maxCellHeight?: number;\n };\n readonly title: {name: string; show: boolean; position: TitlePosition};\n readonly legend: {show: boolean; position: LegendPosition};\n };\n readonly mode: 'normal' | 'useAllNodesAsLeaves';\n readonly leavesMode: 'normal' | 'alignLeavesToLine';\n readonly id: ColumnName;\n readonly parentId: ColumnName;\n readonly height: ColumnName | null = null; // if height is not defined it is not considered in links length calculations\n readonly labels: ColumnName;\n\n readonly heatmapAnnotation: ColumnName | null;\n readonly heatmapAxis: ColumnName | null;\n readonly heatmapGroup: ColumnName[];\n\n readonly heatmapSettings: {\n valueType: 'discrete' | 'continuous' | 'stringSource';\n aes: {\n colorsList?: string[];\n colorsMap?: Record<string, string>;\n };\n };\n\n readonly connectionType: 'rectangle' | 'line' | 'curve' = 'rectangle';\n readonly edgeInheritance: 'up' | 'down' = 'up';\n readonly rootPosition: 'left' | 'top' = 'top';\n readonly showNodes: boolean = true;\n readonly showEdges: boolean = true;\n readonly showLeavesLabels: boolean = true;\n readonly showNodesLabels: boolean = true;\n\n readonly aes: {\n readonly nodeShape: PointShape | CategoricalAesFromColumn<PointShape>;\n readonly nodeColor: string | CategoricalAesFromColumn<string> | ContinuousAesFromColumn<string>;\n readonly nodeSize: number | CategoricalAesFromColumn<number> | ContinuousAesFromColumn<number>;\n\n readonly lineShape: LineShape;\n readonly lineColor: string | CategoricalAesFromColumn<string> | ContinuousAesFromColumn<string>;\n } = {\n
|
|
1
|
+
{"version":3,"file":"DendroSettingsImpl.js","sources":["../../../../../../node_modules/@milaboratories/miplots4/src/dendro/DendroSettingsImpl.ts"],"sourcesContent":["import { BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH_SMALL } from '../constants';\nimport { CELL_MAX_WIDTH, CELL_MIN_WIDTH, MARGIN, WIDE_TREE_WIDTH } from './constants';\nimport type {\n CategoricalAesFromColumn,\n ColumnName,\n ContinuousAesFromColumn,\n DendroSettings,\n LegendPosition,\n LineShape,\n PointShape,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport { DendroSettingsSchema } from '../types';\n\nexport class DendroSettingsImpl implements SettingsInterface {\n readonly type = 'dendro';\n readonly chartSettings: {\n readonly size: {\n width: number;\n height: number;\n scale: number;\n minCellWidth: number;\n maxCellWidth: number;\n minCellHeight?: number;\n maxCellHeight?: number;\n marginTop: number;\n marginBottom: number;\n marginLeft: number;\n marginRight: number;\n };\n readonly title: { name: string; show: boolean; position: TitlePosition };\n readonly legend: { show: boolean; position: LegendPosition };\n };\n readonly mode: 'normal' | 'useAllNodesAsLeaves';\n readonly leavesMode: 'normal' | 'alignLeavesToLine';\n readonly leavesOrder: 'indexAsc' | 'indexDesc' | null;\n readonly id: ColumnName;\n readonly parentId: ColumnName;\n readonly height: ColumnName | null = null; // if height is not defined it is not considered in links length calculations\n readonly labels: ColumnName;\n\n readonly heatmapAnnotation: ColumnName | null;\n readonly heatmapAxis: ColumnName | null;\n readonly heatmapGroup: ColumnName[];\n\n readonly heatmapSettings: {\n valueType: 'discrete' | 'continuous' | 'stringSource';\n aes: {\n colorsList?: string[];\n colorsMap?: Record<string, string>;\n };\n };\n\n readonly connectionType: 'rectangle' | 'line' | 'curve' = 'rectangle';\n readonly edgeInheritance: 'up' | 'down' = 'up';\n readonly rootPosition: 'left' | 'top' = 'top';\n readonly showNodes: boolean = true;\n readonly showEdges: boolean = true;\n readonly showLeavesLabels: boolean = true;\n readonly showNodesLabels: boolean = true;\n\n readonly aes: {\n readonly nodeShape: PointShape | CategoricalAesFromColumn<PointShape>;\n readonly nodeColor: string | CategoricalAesFromColumn<string> | ContinuousAesFromColumn<string>;\n readonly nodeSize: number | CategoricalAesFromColumn<number> | ContinuousAesFromColumn<number>;\n\n readonly lineShape: LineShape;\n readonly lineColor: string | CategoricalAesFromColumn<string> | ContinuousAesFromColumn<string>;\n } = {\n nodeShape: '21',\n nodeColor: BLACK,\n nodeSize: 3,\n lineShape: 'solid',\n lineColor: BLACK,\n };\n\n constructor(settings: DendroSettings) {\n DendroSettingsSchema.parse(settings);\n this.chartSettings = {\n size: {\n width: settings?.size?.width ?? (settings.facetSettings ? DEFAULT_WIDTH_SMALL : WIDE_TREE_WIDTH),\n height: settings?.size?.height ?? (settings.facetSettings ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT),\n scale: settings?.size?.scale ?? 1,\n minCellWidth: settings?.size?.minCellWidth ?? CELL_MIN_WIDTH,\n maxCellWidth: settings?.size?.maxCellWidth ?? CELL_MAX_WIDTH,\n minCellHeight: settings?.size?.minCellHeight,\n maxCellHeight: settings?.size?.maxCellHeight,\n marginTop: settings?.size?.marginTop ?? MARGIN.TOP,\n marginBottom: settings?.size?.marginBottom ?? MARGIN.BOTTOM,\n marginLeft: settings?.size?.marginLeft ?? MARGIN.LEFT,\n marginRight: settings?.size?.marginRight ?? MARGIN.RIGHT,\n },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Dendrogram',\n },\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n };\n\n this.mode = settings.mode ?? 'normal';\n this.leavesMode = settings.leavesMode ?? 'normal';\n this.leavesOrder = settings.leavesOrder ?? null;\n\n this.id = settings.id;\n this.parentId = settings.parentId;\n this.height = settings.height ?? null;\n this.labels = settings.labels ?? this.id;\n // for heatmap\n this.heatmapAnnotation = settings.heatmapAnnotation ?? null;\n this.heatmapAxis = settings.heatmapAxis ?? null;\n this.heatmapGroup = settings.heatmapGroup ?? [];\n this.heatmapSettings = {\n valueType: settings.heatmapSettings?.valueType ?? 'continuous',\n aes: {\n colorsList: ['#FFF680', '#53D788', '#36739D', '#4A005C'],\n ...settings.heatmapSettings?.aes,\n },\n };\n\n this.connectionType = settings.connectionType ?? this.connectionType;\n this.edgeInheritance = settings.edgeInheritance ?? this.edgeInheritance;\n\n this.showNodes = settings.showNodes ?? this.showNodes;\n this.showEdges = settings.showEdges ?? this.showEdges;\n this.showLeavesLabels = settings.showLeavesLabels ?? this.showLeavesLabels;\n this.showNodesLabels = settings.showNodesLabels ?? this.showNodesLabels;\n\n this.rootPosition = settings.rootPosition ?? this.rootPosition;\n\n this.aes = {\n ...this.aes,\n ...settings.aes,\n };\n }\n}\n"],"names":["DendroSettingsImpl","settings","__publicField","BLACK","DendroSettingsSchema","_a","DEFAULT_WIDTH_SMALL","WIDE_TREE_WIDTH","_b","DEFAULT_HEIGHT_SMALL","DEFAULT_HEIGHT","_c","_d","CELL_MIN_WIDTH","_e","CELL_MAX_WIDTH","_f","_g","_h","MARGIN","_i","_j","_k","_l","_m","_n"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,75 +1,75 @@
|
|
|
1
1
|
import { j as t } from "../../node_modules/react/jsx-runtime.js";
|
|
2
|
-
import k, { r as
|
|
2
|
+
import k, { r as l } from "../../_virtual/index.js";
|
|
3
3
|
import Y from "../../common/fonts.js";
|
|
4
|
-
import { USER_UPDATE_EVENT as
|
|
4
|
+
import { USER_UPDATE_EVENT as b, DIMMED_OPACITY as q, HEATMAP_LEFT_OFFSET as m } from "../constants.js";
|
|
5
5
|
import { Heatmap as J } from "./Heatmap.js";
|
|
6
6
|
import { Legend as K } from "./Legend.js";
|
|
7
7
|
import { LinksGroup as D } from "./LinksGroup.js";
|
|
8
|
-
import { NodesGroup as
|
|
9
|
-
function
|
|
8
|
+
import { NodesGroup as T } from "./NodesGroup.js";
|
|
9
|
+
function N(r) {
|
|
10
10
|
if (!r)
|
|
11
11
|
return null;
|
|
12
12
|
const s = /* @__PURE__ */ new Set();
|
|
13
|
-
let
|
|
14
|
-
for (;
|
|
15
|
-
s.add(
|
|
13
|
+
let o = r;
|
|
14
|
+
for (; o; )
|
|
15
|
+
s.add(o.id), o = o.parent;
|
|
16
16
|
return s;
|
|
17
17
|
}
|
|
18
18
|
function oe({
|
|
19
19
|
chartSettings: r,
|
|
20
20
|
chartSizes: s,
|
|
21
|
-
nodes:
|
|
21
|
+
nodes: o,
|
|
22
22
|
links: f,
|
|
23
|
-
connectionType:
|
|
23
|
+
connectionType: C,
|
|
24
24
|
rootPosition: p,
|
|
25
|
-
edgeInheritance:
|
|
25
|
+
edgeInheritance: I,
|
|
26
26
|
showNodes: g,
|
|
27
27
|
showEdges: x,
|
|
28
28
|
showLeavesLabels: F,
|
|
29
|
-
showNodesLabels:
|
|
29
|
+
showNodesLabels: H,
|
|
30
30
|
aesGetters: w,
|
|
31
31
|
labels: P,
|
|
32
32
|
heatmapData: j,
|
|
33
|
-
heatmapScales:
|
|
34
|
-
heatmapStep:
|
|
35
|
-
heatmapColor:
|
|
36
|
-
heatmapLabels:
|
|
37
|
-
legendData:
|
|
38
|
-
onClick:
|
|
33
|
+
heatmapScales: y,
|
|
34
|
+
heatmapStep: G,
|
|
35
|
+
heatmapColor: W,
|
|
36
|
+
heatmapLabels: _,
|
|
37
|
+
legendData: A,
|
|
38
|
+
onClick: M
|
|
39
39
|
}) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
d.current &&
|
|
40
|
+
const U = l.useRef(null), [z, O] = l.useState(null), d = l.useRef(null);
|
|
41
|
+
l.useEffect(() => {
|
|
42
|
+
d.current && O(d.current);
|
|
43
43
|
function e() {
|
|
44
44
|
c(null), u(null);
|
|
45
45
|
}
|
|
46
|
-
function
|
|
47
|
-
Object.entries(
|
|
48
|
-
if (
|
|
49
|
-
const S =
|
|
50
|
-
c(
|
|
46
|
+
function n(i) {
|
|
47
|
+
Object.entries(i.detail).forEach(([R, B]) => {
|
|
48
|
+
if (R === "selectedNode") {
|
|
49
|
+
const S = o.find((V) => V.data.rawIndexes[0] === B) ?? null;
|
|
50
|
+
c(N(S)), u(S);
|
|
51
51
|
}
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
return document.addEventListener("click", e), document.addEventListener(
|
|
55
|
-
document.removeEventListener("click", e), document.removeEventListener(
|
|
54
|
+
return document.addEventListener("click", e), document.addEventListener(b, n), () => {
|
|
55
|
+
document.removeEventListener("click", e), document.removeEventListener(b, n);
|
|
56
56
|
};
|
|
57
57
|
}, []);
|
|
58
|
-
const [a, c] = k.useState(null), [h, u] = k.useState(null),
|
|
59
|
-
connectionType:
|
|
58
|
+
const [a, c] = k.useState(null), [h, u] = k.useState(null), L = a !== null, E = {
|
|
59
|
+
connectionType: C,
|
|
60
60
|
rootPosition: p,
|
|
61
|
-
edgeInheritance:
|
|
61
|
+
edgeInheritance: I,
|
|
62
62
|
aesGetters: w
|
|
63
63
|
}, v = {
|
|
64
64
|
rootPosition: p,
|
|
65
65
|
showLeavesLabels: F,
|
|
66
|
-
showNodesLabels:
|
|
66
|
+
showNodesLabels: H,
|
|
67
67
|
aesGetters: w,
|
|
68
68
|
labels: P,
|
|
69
|
-
onClick:
|
|
69
|
+
onClick: M,
|
|
70
70
|
selectedNodeId: h == null ? void 0 : h.id,
|
|
71
71
|
onSelectedUpdate: (e) => {
|
|
72
|
-
c(
|
|
72
|
+
c(N(e)), u(e);
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
75
|
return /* @__PURE__ */ t.jsxs(
|
|
@@ -77,49 +77,49 @@ function oe({
|
|
|
77
77
|
{
|
|
78
78
|
xmlns: "http://www.w3.org/2000/svg",
|
|
79
79
|
viewBox: `0 0 ${s.totalWidth} ${s.totalHeight}`,
|
|
80
|
-
ref:
|
|
80
|
+
ref: U,
|
|
81
81
|
width: s.totalWidth,
|
|
82
82
|
height: s.totalHeight,
|
|
83
83
|
children: [
|
|
84
84
|
/* @__PURE__ */ t.jsx("defs", { children: Y }),
|
|
85
|
-
/* @__PURE__ */ t.jsxs("g", { transform: `translate(${
|
|
85
|
+
/* @__PURE__ */ t.jsxs("g", { transform: `translate(${s.marginLeft},${s.marginTop})`, fontFamily: "Manrope", children: [
|
|
86
86
|
/* @__PURE__ */ t.jsx("text", { x: "0", y: "-12", fontSize: "20", children: r.title.name }),
|
|
87
|
-
/* @__PURE__ */ t.jsxs("g", { opacity:
|
|
87
|
+
/* @__PURE__ */ t.jsxs("g", { opacity: L ? q : 1, children: [
|
|
88
88
|
x && /* @__PURE__ */ t.jsx(
|
|
89
89
|
D,
|
|
90
90
|
{
|
|
91
91
|
links: f.filter((e) => {
|
|
92
|
-
const { source:
|
|
93
|
-
return !a || !(a.has(
|
|
92
|
+
const { source: n, target: i } = e;
|
|
93
|
+
return !a || !(a.has(n.id ?? "") && a.has(i.id ?? ""));
|
|
94
94
|
}),
|
|
95
95
|
selected: !1,
|
|
96
|
-
...
|
|
96
|
+
...E
|
|
97
97
|
}
|
|
98
98
|
),
|
|
99
99
|
g && /* @__PURE__ */ t.jsx(
|
|
100
|
-
|
|
100
|
+
T,
|
|
101
101
|
{
|
|
102
|
-
nodes:
|
|
102
|
+
nodes: o.filter((e) => !e.data.isFake && !(a != null && a.has(e.id ?? ""))),
|
|
103
103
|
...v
|
|
104
104
|
}
|
|
105
105
|
)
|
|
106
106
|
] }),
|
|
107
|
-
|
|
107
|
+
L && /* @__PURE__ */ t.jsxs("g", { children: [
|
|
108
108
|
x && /* @__PURE__ */ t.jsx(
|
|
109
109
|
D,
|
|
110
110
|
{
|
|
111
111
|
links: f.filter((e) => {
|
|
112
|
-
const { source:
|
|
113
|
-
return a.has(
|
|
112
|
+
const { source: n, target: i } = e;
|
|
113
|
+
return a.has(n.id ?? "") && a.has(i.id ?? "");
|
|
114
114
|
}),
|
|
115
115
|
selected: !0,
|
|
116
|
-
...
|
|
116
|
+
...E
|
|
117
117
|
}
|
|
118
118
|
),
|
|
119
119
|
g && /* @__PURE__ */ t.jsx(
|
|
120
|
-
|
|
120
|
+
T,
|
|
121
121
|
{
|
|
122
|
-
nodes:
|
|
122
|
+
nodes: o.filter((e) => !e.data.isFake && (a == null ? void 0 : a.has(e.id ?? ""))),
|
|
123
123
|
...v
|
|
124
124
|
}
|
|
125
125
|
)
|
|
@@ -128,20 +128,20 @@ function oe({
|
|
|
128
128
|
J,
|
|
129
129
|
{
|
|
130
130
|
heatmapData: j,
|
|
131
|
-
scales:
|
|
132
|
-
step:
|
|
133
|
-
colorScale:
|
|
131
|
+
scales: y,
|
|
132
|
+
step: G,
|
|
133
|
+
colorScale: W,
|
|
134
134
|
chartSizes: s,
|
|
135
|
-
labels:
|
|
135
|
+
labels: _,
|
|
136
136
|
selectedNode: h,
|
|
137
|
-
tooltipsContainer:
|
|
137
|
+
tooltipsContainer: z
|
|
138
138
|
}
|
|
139
139
|
) }),
|
|
140
140
|
r.legend.show && /* @__PURE__ */ t.jsx(
|
|
141
141
|
"g",
|
|
142
142
|
{
|
|
143
143
|
transform: `translate(${s.treeWidth + m + s.heatmapWidth + m},0)`,
|
|
144
|
-
children: /* @__PURE__ */ t.jsx(K, { legendData:
|
|
144
|
+
children: /* @__PURE__ */ t.jsx(K, { legendData: A })
|
|
145
145
|
}
|
|
146
146
|
)
|
|
147
147
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/dendro/components/Chart.tsx"],"sourcesContent":["import type { HierarchyPointLink, HierarchyPointNode } from 'd3-hierarchy';\nimport React, { useEffect, useRef, useState } from 'react';\nimport fonts from '../../common/fonts';\nimport type { ClickEventData, ColumnName, DataValue } from '../../types';\nimport { DIMMED_OPACITY, HEATMAP_LEFT_OFFSET, MARGIN, USER_UPDATE_EVENT } from '../constants';\nimport type { DendroSettingsImpl } from '../DendroSettingsImpl';\nimport type { HeatmapData } from '../getHeatmapData';\nimport type { TreeNodeData } from '../getHierarchyData';\nimport { Heatmap } from './Heatmap';\nimport { Legend } from './Legend';\nimport { LinksGroup } from './LinksGroup';\nimport { NodesGroup } from './NodesGroup';\nimport type { ChartScales, ChartSizes, LegendData } from './types';\n\nfunction getSelectedPath(node: HierarchyPointNode<TreeNodeData> | null) {\n if (!node) {\n return null;\n }\n const set = new Set<string>();\n let current: HierarchyPointNode<TreeNodeData> | null = node;\n while (current) {\n set.add(current.id as string);\n current = current.parent;\n }\n return set;\n}\n\ninterface ChartProps {\n chartSettings: DendroSettingsImpl['chartSettings'];\n chartSizes: ChartSizes;\n nodes: HierarchyPointNode<TreeNodeData>[];\n links: HierarchyPointLink<TreeNodeData>[];\n connectionType: DendroSettingsImpl['connectionType'];\n rootPosition: DendroSettingsImpl['rootPosition'];\n edgeInheritance: DendroSettingsImpl['edgeInheritance'];\n showNodes: DendroSettingsImpl['showNodes'];\n showEdges: DendroSettingsImpl['showEdges'];\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'];\n showNodesLabels: DendroSettingsImpl['showNodesLabels'];\n aesGetters: {\n nodeShape: (idx: number) => string;\n nodeColor: (idx: number) => string;\n nodeSize: (idx: number) => number;\n lineShape: (idx: number) => string;\n lineColor: (idx: number) => string;\n };\n labels: ColumnName;\n heatmapData: HeatmapData | null;\n heatmapScales: ChartScales;\n heatmapStep: {x: number; y: number};\n heatmapColor: (v: DataValue) => string;\n heatmapLabels: string[];\n legendData: LegendData;\n onClick: (data: ClickEventData) => void;\n}\n\nexport function Chart({\n chartSettings,\n chartSizes,\n nodes,\n links,\n connectionType,\n rootPosition,\n edgeInheritance,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n heatmapData,\n heatmapScales,\n heatmapStep,\n heatmapColor,\n heatmapLabels,\n legendData,\n onClick,\n}: ChartProps) {\n const ref = useRef(null);\n const [tooltipsContainer, setTooltipsContainer] = useState<SVGGElement|null>(null);\n const tooltipsRef = useRef<SVGGElement>(null);\n useEffect(() => {\n if (tooltipsRef.current) {\n setTooltipsContainer(tooltipsRef.current);\n }\n function onClick () {\n setSelectedPath(null);\n setSelectedNode(null);\n }\n function onOuterEvent (e: CustomEvent<Record<string, unknown>>) {\n const data = Object.entries(e.detail) as [string, unknown][];\n \n data.forEach(([key, value]) => {\n if (key === 'selectedNode') {\n // TODO: what is value ???? should be row index\n const node = nodes.find((node) => node.data.rawIndexes[0] === value) ?? null;\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n });\n }\n document.addEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.addEventListener(USER_UPDATE_EVENT, onOuterEvent);\n return () => {\n document.removeEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.removeEventListener(USER_UPDATE_EVENT, onOuterEvent);\n };\n }, []);\n\n const [selectedPath, setSelectedPath] = React.useState<Set<string> | null>(null);\n const [selectedNode, setSelectedNode] = React.useState<HierarchyPointNode<TreeNodeData> | null>(null);\n const somethingSelected = selectedPath !== null;\n\n const linksProps = {\n connectionType,\n rootPosition,\n edgeInheritance,\n aesGetters,\n };\n const nodesProps = {\n rootPosition,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n onClick,\n selectedNodeId: selectedNode?.id,\n onSelectedUpdate: (node: HierarchyPointNode<TreeNodeData>) => {\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n };\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n ref={ref}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${MARGIN.LEFT},${MARGIN.TOP})`} fontFamily=\"Manrope\">\n <text x=\"0\" y=\"-12\" fontSize=\"20\">\n {chartSettings.title.name}\n </text>\n <g opacity={somethingSelected ? DIMMED_OPACITY : 1}>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => { // dimmed links if something selected or all links\n const {source, target} = link;\n return (\n !selectedPath ||\n !(selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? ''))\n );\n })}\n selected={false}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && !selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n {somethingSelected && (\n <g>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => {\n const {source, target} = link;\n return selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? '');\n })}\n selected={true}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n )}\n {heatmapData !== null && (\n <g transform={`translate(${chartSizes.treeWidth + HEATMAP_LEFT_OFFSET},0)`}>\n <Heatmap\n heatmapData={heatmapData}\n scales={heatmapScales}\n step={heatmapStep}\n colorScale={heatmapColor}\n chartSizes={chartSizes}\n labels={heatmapLabels}\n selectedNode={selectedNode}\n tooltipsContainer={tooltipsContainer}\n />\n </g>\n )}\n {chartSettings.legend.show && (\n <g\n transform={`translate(${\n chartSizes.treeWidth + HEATMAP_LEFT_OFFSET + chartSizes.heatmapWidth + HEATMAP_LEFT_OFFSET\n },0)`}\n >\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n <g ref={tooltipsRef} />\n </svg>\n );\n}\n"],"names":["getSelectedPath","node","set","current","Chart","chartSettings","chartSizes","nodes","links","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showLeavesLabels","showNodesLabels","aesGetters","labels","heatmapData","heatmapScales","heatmapStep","heatmapColor","heatmapLabels","legendData","onClick","ref","useRef","tooltipsContainer","setTooltipsContainer","useState","tooltipsRef","useEffect","setSelectedPath","setSelectedNode","onOuterEvent","e","key","value","USER_UPDATE_EVENT","selectedPath","React","selectedNode","somethingSelected","linksProps","nodesProps","jsxs","jsx","fonts","MARGIN","DIMMED_OPACITY","LinksGroup","link","source","target","NodesGroup","HEATMAP_LEFT_OFFSET","Heatmap","Legend"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../../../../../node_modules/@milaboratories/miplots4/src/dendro/components/Chart.tsx"],"sourcesContent":["import type { HierarchyPointLink, HierarchyPointNode } from 'd3-hierarchy';\nimport React, { useEffect, useRef, useState } from 'react';\nimport fonts from '../../common/fonts';\nimport type { ClickEventData, ColumnName, DataValue } from '../../types';\nimport { DIMMED_OPACITY, HEATMAP_LEFT_OFFSET, USER_UPDATE_EVENT } from '../constants';\nimport type { DendroSettingsImpl } from '../DendroSettingsImpl';\nimport type { HeatmapData } from '../getHeatmapData';\nimport type { TreeNodeData } from '../getHierarchyData';\nimport { Heatmap } from './Heatmap';\nimport { Legend } from './Legend';\nimport { LinksGroup } from './LinksGroup';\nimport { NodesGroup } from './NodesGroup';\nimport type { ChartScales, ChartSizes, LegendData } from './types';\n\nfunction getSelectedPath(node: HierarchyPointNode<TreeNodeData> | null) {\n if (!node) {\n return null;\n }\n const set = new Set<string>();\n let current: HierarchyPointNode<TreeNodeData> | null = node;\n while (current) {\n set.add(current.id as string);\n current = current.parent;\n }\n return set;\n}\n\ninterface ChartProps {\n chartSettings: DendroSettingsImpl['chartSettings'];\n chartSizes: ChartSizes;\n nodes: HierarchyPointNode<TreeNodeData>[];\n links: HierarchyPointLink<TreeNodeData>[];\n connectionType: DendroSettingsImpl['connectionType'];\n rootPosition: DendroSettingsImpl['rootPosition'];\n edgeInheritance: DendroSettingsImpl['edgeInheritance'];\n showNodes: DendroSettingsImpl['showNodes'];\n showEdges: DendroSettingsImpl['showEdges'];\n showLeavesLabels: DendroSettingsImpl['showLeavesLabels'];\n showNodesLabels: DendroSettingsImpl['showNodesLabels'];\n aesGetters: {\n nodeShape: (idx: number) => string;\n nodeColor: (idx: number) => string;\n nodeSize: (idx: number) => number;\n lineShape: (idx: number) => string;\n lineColor: (idx: number) => string;\n };\n labels: ColumnName;\n heatmapData: HeatmapData | null;\n heatmapScales: ChartScales;\n heatmapStep: {x: number; y: number};\n heatmapColor: (v: DataValue) => string;\n heatmapLabels: string[];\n legendData: LegendData;\n onClick: (data: ClickEventData) => void;\n}\n\nexport function Chart({\n chartSettings,\n chartSizes,\n nodes,\n links,\n connectionType,\n rootPosition,\n edgeInheritance,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n heatmapData,\n heatmapScales,\n heatmapStep,\n heatmapColor,\n heatmapLabels,\n legendData,\n onClick,\n}: ChartProps) {\n const ref = useRef(null);\n const [tooltipsContainer, setTooltipsContainer] = useState<SVGGElement|null>(null);\n const tooltipsRef = useRef<SVGGElement>(null);\n useEffect(() => {\n if (tooltipsRef.current) {\n setTooltipsContainer(tooltipsRef.current);\n }\n function onClick () {\n setSelectedPath(null);\n setSelectedNode(null);\n }\n function onOuterEvent (e: CustomEvent<Record<string, unknown>>) {\n const data = Object.entries(e.detail) as [string, unknown][];\n \n data.forEach(([key, value]) => {\n if (key === 'selectedNode') {\n // TODO: what is value ???? should be row index\n const node = nodes.find((node) => node.data.rawIndexes[0] === value) ?? null;\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n });\n }\n document.addEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.addEventListener(USER_UPDATE_EVENT, onOuterEvent);\n return () => {\n document.removeEventListener('click', onClick);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.removeEventListener(USER_UPDATE_EVENT, onOuterEvent);\n };\n }, []);\n\n const [selectedPath, setSelectedPath] = React.useState<Set<string> | null>(null);\n const [selectedNode, setSelectedNode] = React.useState<HierarchyPointNode<TreeNodeData> | null>(null);\n const somethingSelected = selectedPath !== null;\n\n const linksProps = {\n connectionType,\n rootPosition,\n edgeInheritance,\n aesGetters,\n };\n const nodesProps = {\n rootPosition,\n showLeavesLabels,\n showNodesLabels,\n aesGetters,\n labels,\n onClick,\n selectedNodeId: selectedNode?.id,\n onSelectedUpdate: (node: HierarchyPointNode<TreeNodeData>) => {\n setSelectedPath(getSelectedPath(node));\n setSelectedNode(node);\n }\n };\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n ref={ref}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${chartSizes.marginLeft},${chartSizes.marginTop})`} fontFamily=\"Manrope\">\n <text x=\"0\" y=\"-12\" fontSize=\"20\">\n {chartSettings.title.name}\n </text>\n <g opacity={somethingSelected ? DIMMED_OPACITY : 1}>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => { // dimmed links if something selected or all links\n const {source, target} = link;\n return (\n !selectedPath ||\n !(selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? ''))\n );\n })}\n selected={false}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && !selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n {somethingSelected && (\n <g>\n {showEdges && (\n <LinksGroup\n links={links.filter(link => {\n const {source, target} = link;\n return selectedPath.has(source.id ?? '') && selectedPath.has(target.id ?? '');\n })}\n selected={true}\n {...linksProps}\n />\n )}\n {showNodes && (\n <NodesGroup\n nodes={nodes.filter(node => !node.data.isFake && selectedPath?.has(node.id ?? ''))}\n {...nodesProps}\n />\n )}\n </g>\n )}\n {heatmapData !== null && (\n <g transform={`translate(${chartSizes.treeWidth + HEATMAP_LEFT_OFFSET},0)`}>\n <Heatmap\n heatmapData={heatmapData}\n scales={heatmapScales}\n step={heatmapStep}\n colorScale={heatmapColor}\n chartSizes={chartSizes}\n labels={heatmapLabels}\n selectedNode={selectedNode}\n tooltipsContainer={tooltipsContainer}\n />\n </g>\n )}\n {chartSettings.legend.show && (\n <g\n transform={`translate(${\n chartSizes.treeWidth + HEATMAP_LEFT_OFFSET + chartSizes.heatmapWidth + HEATMAP_LEFT_OFFSET\n },0)`}\n >\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n <g ref={tooltipsRef} />\n </svg>\n );\n}\n"],"names":["getSelectedPath","node","set","current","Chart","chartSettings","chartSizes","nodes","links","connectionType","rootPosition","edgeInheritance","showNodes","showEdges","showLeavesLabels","showNodesLabels","aesGetters","labels","heatmapData","heatmapScales","heatmapStep","heatmapColor","heatmapLabels","legendData","onClick","ref","useRef","tooltipsContainer","setTooltipsContainer","useState","tooltipsRef","useEffect","setSelectedPath","setSelectedNode","onOuterEvent","e","key","value","USER_UPDATE_EVENT","selectedPath","React","selectedNode","somethingSelected","linksProps","nodesProps","jsxs","jsx","fonts","DIMMED_OPACITY","LinksGroup","link","source","target","NodesGroup","HEATMAP_LEFT_OFFSET","Heatmap","Legend"],"mappings":"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","x_google_ignoreList":[0]}
|