@milaboratories/miplots4 1.0.140 → 1.0.142
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/dendro/ChartRenderer.d.ts.map +1 -1
- package/dist/dendro/ChartRenderer.js +144 -140
- package/dist/dendro/ChartRenderer.js.map +1 -1
- package/dist/dendro/DendroSettingsImpl.d.ts +5 -0
- package/dist/dendro/DendroSettingsImpl.d.ts.map +1 -1
- package/dist/dendro/DendroSettingsImpl.js +53 -48
- package/dist/dendro/DendroSettingsImpl.js.map +1 -1
- package/dist/dendro/components/Chart.js +74 -74
- package/dist/dendro/components/Chart.js.map +1 -1
- package/dist/dendro/components/types.d.ts +4 -0
- package/dist/dendro/components/types.d.ts.map +1 -1
- package/dist/dendro/getHierarchyData.d.ts +3 -2
- package/dist/dendro/getHierarchyData.d.ts.map +1 -1
- package/dist/dendro/getHierarchyData.js +31 -25
- package/dist/dendro/getHierarchyData.js.map +1 -1
- package/dist/dendro/index.d.ts.map +1 -1
- package/dist/dendro/index.js +24 -23
- package/dist/dendro/index.js.map +1 -1
- package/dist/scatterplot/utils/createLegendInfo.js +18 -18
- package/dist/scatterplot/utils/createLegendInfo.js.map +1 -1
- package/dist/types/dendro.d.ts +23 -0
- package/dist/types/dendro.d.ts.map +1 -1
- package/dist/types/dendro.js +13 -8
- package/dist/types/dendro.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.js","sources":["../../../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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"}
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../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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"}
|
|
@@ -8,6 +8,10 @@ export interface ChartSizes {
|
|
|
8
8
|
totalWidth: number;
|
|
9
9
|
totalHeight: number;
|
|
10
10
|
labelsOffset: number;
|
|
11
|
+
marginLeft: number;
|
|
12
|
+
marginRight: number;
|
|
13
|
+
marginTop: number;
|
|
14
|
+
marginBottom: number;
|
|
11
15
|
}
|
|
12
16
|
export interface ChartScales {
|
|
13
17
|
x: ScaleOrdinal<string, number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IACxB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IACxD,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AACD,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACtD,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AACD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;CACtD;AACD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AACD,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAEvG,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,IAAI,GAAG;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,SAAS,CAAC;CACpB,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dendro/components/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IACxB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IACxD,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AACD,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACtD,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AACD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;CACtD;AACD,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AACD,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,eAAe,CAAC;AAEvG,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,IAAI,GAAG;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,SAAS,CAAC;CACpB,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { HierarchyPointNode } from 'd3-hierarchy';
|
|
1
|
+
import { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy';
|
|
2
2
|
import { DataFrame } from '../DataFrame';
|
|
3
|
+
import { DendroSettingsImpl } from './DendroSettingsImpl';
|
|
3
4
|
export type TreeNodeData = {
|
|
4
5
|
id: string;
|
|
5
6
|
parentId: string | null;
|
|
@@ -8,7 +9,7 @@ export type TreeNodeData = {
|
|
|
8
9
|
isFake: boolean;
|
|
9
10
|
rawIndexes: number[];
|
|
10
11
|
};
|
|
11
|
-
export declare function getHierarchy(dataFrame: DataFrame, idKey: string, parentIdKey: string, heightIdKey: string | null, labelIdKey: string | null, useAllNodesAsLeaves?: boolean):
|
|
12
|
+
export declare function getHierarchy(dataFrame: DataFrame, idKey: string, parentIdKey: string, heightIdKey: string | null, labelIdKey: string | null, leavesOrder: DendroSettingsImpl['leavesOrder'], useAllNodesAsLeaves?: boolean): HierarchyNode<TreeNodeData>;
|
|
12
13
|
export declare function updateLinksHeight(root: HierarchyPointNode<TreeNodeData>, chartHeight: number, alignLeavesToLine?: boolean): void;
|
|
13
14
|
export declare function updateNodesHorizontalPosition(root: HierarchyPointNode<TreeNodeData>): void;
|
|
14
15
|
//# sourceMappingURL=getHierarchyData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getHierarchyData.d.ts","sourceRoot":"","sources":["../../src/dendro/getHierarchyData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAY,MAAM,cAAc,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"getHierarchyData.d.ts","sourceRoot":"","sources":["../../src/dendro/getHierarchyData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,kBAAkB,EAAY,MAAM,cAAc,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAWF,wBAAgB,YAAY,CACxB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,WAAW,EAAE,kBAAkB,CAAC,aAAa,CAAC,EAC9C,mBAAmB,UAAQ,+BAiD9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,UAAQ,QAkBvH;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,kBAAkB,CAAC,YAAY,CAAC,QAMnF"}
|
|
@@ -1,52 +1,58 @@
|
|
|
1
|
-
import { l as
|
|
1
|
+
import { l as I } from "../node_modules/lodash/lodash.js";
|
|
2
2
|
import g from "../node_modules/d3-hierarchy/src/stratify.js";
|
|
3
|
-
import
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
const
|
|
3
|
+
import L from "../node_modules/d3-array/src/max.js";
|
|
4
|
+
function m(t, i) {
|
|
5
|
+
t.sort((u, r) => {
|
|
6
|
+
const a = u.leaves().reduce((n, s) => Math.min(n, s.data.rawIndexes[0]), 1 / 0), o = r.leaves().reduce((n, s) => Math.min(n, s.data.rawIndexes[0]), 1 / 0);
|
|
7
|
+
return i === "indexAsc" ? a - o : o - a;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function k(t, i, u, r, a, o, n = !1) {
|
|
11
|
+
const s = I.groupBy(t.rowIndexes, (e) => t.getColumnValue(i, e)), c = Object.keys(s).map((e) => {
|
|
12
|
+
const f = s[e], h = f[0], x = t.getColumnValue(u, h), b = a ? I.uniq(f.map((C) => t.getColumnValue(a, C))).join(", ") : null, q = r ? Number(t.getColumnValue(r, h)) : 1;
|
|
7
13
|
return {
|
|
8
14
|
id: String(e),
|
|
9
|
-
parentId:
|
|
10
|
-
label:
|
|
11
|
-
height:
|
|
15
|
+
parentId: x === null ? null : String(x),
|
|
16
|
+
label: b,
|
|
17
|
+
height: q,
|
|
12
18
|
isFake: !1,
|
|
13
|
-
rawIndexes:
|
|
19
|
+
rawIndexes: f
|
|
14
20
|
// save source row data to avoid any modifications
|
|
15
21
|
};
|
|
16
|
-
}),
|
|
17
|
-
if (!
|
|
18
|
-
return
|
|
19
|
-
const
|
|
22
|
+
}), l = g().id((e) => e.id).parentId((e) => e.parentId)(c);
|
|
23
|
+
if (!n)
|
|
24
|
+
return o && m(l, o), l;
|
|
25
|
+
const w = new Set(l.leaves().map((e) => e.id)), y = c.filter((e) => !w.has(e.id)).map((e) => ({
|
|
20
26
|
id: `${e.id}_extra`,
|
|
21
27
|
parentId: e.id,
|
|
22
28
|
height: 0,
|
|
23
29
|
label: null,
|
|
24
30
|
isFake: !0,
|
|
25
31
|
rawIndexes: e.rawIndexes
|
|
26
|
-
})),
|
|
27
|
-
return
|
|
32
|
+
})), R = c.concat(y), p = g().id((e) => e.id).parentId((e) => e.parentId)(R);
|
|
33
|
+
return o && m(p, o), p;
|
|
28
34
|
}
|
|
29
|
-
function
|
|
35
|
+
function E(t, i, u = !1) {
|
|
30
36
|
t.data.height = 0;
|
|
31
37
|
function r(n) {
|
|
32
38
|
return n.data.height;
|
|
33
39
|
}
|
|
34
|
-
function
|
|
35
|
-
return r(n) + (n.children ?
|
|
40
|
+
function a(n) {
|
|
41
|
+
return r(n) + (n.children ? L(n.children, a) : 0);
|
|
36
42
|
}
|
|
37
|
-
function
|
|
38
|
-
n.y = !n.children &&
|
|
43
|
+
function o(n, s, d) {
|
|
44
|
+
n.y = !n.children && u ? i : (s += r(n)) * d, n.children && n.children.forEach((c) => o(c, s, d));
|
|
39
45
|
}
|
|
40
|
-
|
|
46
|
+
o(t, 0, i / a(t));
|
|
41
47
|
}
|
|
42
|
-
function
|
|
48
|
+
function H(t) {
|
|
43
49
|
t.descendants().forEach((i) => {
|
|
44
50
|
!i.children && i.data.isFake && i.parent && (i.parent.x = i.x);
|
|
45
51
|
});
|
|
46
52
|
}
|
|
47
53
|
export {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
k as getHierarchy,
|
|
55
|
+
E as updateLinksHeight,
|
|
56
|
+
H as updateNodesHorizontalPosition
|
|
51
57
|
};
|
|
52
58
|
//# sourceMappingURL=getHierarchyData.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getHierarchyData.js","sources":["../../src/dendro/getHierarchyData.ts"],"sourcesContent":["import { max as d3max } from 'd3-array';\nimport { type HierarchyPointNode, stratify } from 'd3-hierarchy';\nimport { groupBy, uniq } from 'lodash';\nimport type { DataFrame } from '../DataFrame';\n\nexport type TreeNodeData = {\n id: string;\n parentId: string | null;\n height: number;\n label: string | null;\n isFake: boolean; // true for additional nodes for mode with all nodes used as leaves\n rawIndexes: number[];\n};\n\nexport function getHierarchy(\n dataFrame: DataFrame,\n idKey: string,\n parentIdKey: string,\n heightIdKey: string | null,\n labelIdKey: string | null,\n useAllNodesAsLeaves = false\n) {\n const groupedByNodeId = groupBy(dataFrame.rowIndexes, idx => dataFrame.getColumnValue(idKey, idx));\n const uniqueKeys = Object.keys(groupedByNodeId);\n\n const uniqueNodeRows: TreeNodeData[] = uniqueKeys\n .map((key) => {\n const indexes = groupedByNodeId[key];\n const first = indexes[0]; // some values must be the same for every row with the same NodeId, we can take them from any row of group\n const parentId = dataFrame.getColumnValue(parentIdKey, first);\n const label = labelIdKey ? uniq(indexes.map(idx => dataFrame.getColumnValue(labelIdKey, idx))).join(', ') : null;\n const height = heightIdKey ? Number(dataFrame.getColumnValue(heightIdKey, first)) : 1;\n return ({\n id: String(key),\n parentId: parentId === null ? null : String(parentId),\n label,\n height,\n isFake: false,\n rawIndexes: indexes, // save source row data to avoid any modifications\n } as TreeNodeData);\n });\n const tree = stratify<TreeNodeData>()\n .id(d => d.id)\n .parentId(d => d.parentId)(uniqueNodeRows);\n if (!useAllNodesAsLeaves) {\n return tree;\n }\n // for tree layout with every node aligned by side rows\n const leavesIdSet = new Set(tree.leaves().map(node => node.id));\n const noLeafRows = uniqueNodeRows.filter(row => !leavesIdSet.has(row.id));\n const extraRows = noLeafRows.map(row => ({\n id: `${row.id}_extra`,\n parentId: row.id,\n height: 0,\n label: null,\n isFake: true,\n rawIndexes: row.rawIndexes,\n }));\n const expandedRows = uniqueNodeRows.concat(extraRows);\n
|
|
1
|
+
{"version":3,"file":"getHierarchyData.js","sources":["../../src/dendro/getHierarchyData.ts"],"sourcesContent":["import { max as d3max } from 'd3-array';\nimport type { HierarchyNode } from 'd3-hierarchy';\nimport { type HierarchyPointNode, stratify } from 'd3-hierarchy';\nimport { groupBy, uniq } from 'lodash';\nimport type { DataFrame } from '../DataFrame';\nimport type { DendroSettingsImpl } from './DendroSettingsImpl';\n\nexport type TreeNodeData = {\n id: string;\n parentId: string | null;\n height: number;\n label: string | null;\n isFake: boolean; // true for additional nodes for mode with all nodes used as leaves\n rawIndexes: number[];\n};\n\n// make first leaves with first index in data\nfunction sortTree(tree: HierarchyNode<TreeNodeData>, direction: 'indexAsc' | 'indexDesc') {\n tree.sort((a, b) => {\n const aMinIdx = a.leaves().reduce((res, leaf) => Math.min(res, leaf.data.rawIndexes[0]), Infinity);\n const bMinIdx = b.leaves().reduce((res, leaf) => Math.min(res, leaf.data.rawIndexes[0]), Infinity);\n return direction === 'indexAsc' ? aMinIdx - bMinIdx : bMinIdx - aMinIdx;\n });\n}\n\nexport function getHierarchy(\n dataFrame: DataFrame,\n idKey: string,\n parentIdKey: string,\n heightIdKey: string | null,\n labelIdKey: string | null,\n leavesOrder: DendroSettingsImpl['leavesOrder'],\n useAllNodesAsLeaves = false\n) {\n const groupedByNodeId = groupBy(dataFrame.rowIndexes, idx => dataFrame.getColumnValue(idKey, idx));\n const uniqueKeys = Object.keys(groupedByNodeId);\n\n const uniqueNodeRows: TreeNodeData[] = uniqueKeys\n .map((key) => {\n const indexes = groupedByNodeId[key];\n const first = indexes[0]; // some values must be the same for every row with the same NodeId, we can take them from any row of group\n const parentId = dataFrame.getColumnValue(parentIdKey, first);\n const label = labelIdKey ? uniq(indexes.map(idx => dataFrame.getColumnValue(labelIdKey, idx))).join(', ') : null;\n const height = heightIdKey ? Number(dataFrame.getColumnValue(heightIdKey, first)) : 1;\n return ({\n id: String(key),\n parentId: parentId === null ? null : String(parentId),\n label,\n height,\n isFake: false,\n rawIndexes: indexes, // save source row data to avoid any modifications\n } as TreeNodeData);\n });\n const tree = stratify<TreeNodeData>()\n .id(d => d.id)\n .parentId(d => d.parentId)(uniqueNodeRows);\n if (!useAllNodesAsLeaves) {\n if (leavesOrder) {\n sortTree(tree, leavesOrder);\n }\n return tree;\n }\n // for tree layout with every node aligned by side rows\n const leavesIdSet = new Set(tree.leaves().map(node => node.id));\n const noLeafRows = uniqueNodeRows.filter(row => !leavesIdSet.has(row.id));\n const extraRows = noLeafRows.map(row => ({\n id: `${row.id}_extra`,\n parentId: row.id,\n height: 0,\n label: null,\n isFake: true,\n rawIndexes: row.rawIndexes,\n }));\n const expandedRows = uniqueNodeRows.concat(extraRows);\n const expandedTree = stratify<TreeNodeData>()\n .id(d => d.id)\n .parentId(d => d.parentId)(expandedRows);\n if (leavesOrder) {\n sortTree(expandedTree, leavesOrder);\n }\n return expandedTree;\n}\n\nexport function updateLinksHeight(root: HierarchyPointNode<TreeNodeData>, chartHeight: number, alignLeavesToLine = false) {\n root.data.height = 0;\n function heightGetter(d: HierarchyPointNode<TreeNodeData>) {\n return d.data.height;\n }\n\n function maxLength(d: HierarchyPointNode<TreeNodeData>): number {\n return heightGetter(d) + (d.children ? (d3max(d.children, maxLength) as number) : 0);\n }\n\n function setHeight(d: HierarchyPointNode<TreeNodeData>, y0: number, k: number) {\n d.y = !d.children && alignLeavesToLine ? chartHeight : (y0 += heightGetter(d)) * k;\n if (d.children) {\n d.children.forEach(d => setHeight(d, y0, k));\n }\n }\n\n setHeight(root, 0, chartHeight / maxLength(root));\n}\n\nexport function updateNodesHorizontalPosition(root: HierarchyPointNode<TreeNodeData>) {\n root.descendants().forEach((d: HierarchyPointNode<TreeNodeData>) => {\n if (!d.children && d.data.isFake && d.parent) {\n d.parent.x = d.x;\n }\n });\n}\n"],"names":["sortTree","tree","direction","a","b","aMinIdx","res","leaf","bMinIdx","getHierarchy","dataFrame","idKey","parentIdKey","heightIdKey","labelIdKey","leavesOrder","useAllNodesAsLeaves","groupedByNodeId","groupBy","idx","uniqueNodeRows","key","indexes","first","parentId","label","uniq","height","stratify","d","leavesIdSet","node","extraRows","row","expandedRows","expandedTree","updateLinksHeight","root","chartHeight","alignLeavesToLine","heightGetter","maxLength","d3max","setHeight","y0","k","updateNodesHorizontalPosition"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dendro/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAKR,cAAc,EAGd,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAGjB,MAAM,UAAU,CAAC;AAClB,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiEvD,qBAAa,WAAY,SAAQ,aAAa;IAC1C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAmB;IAC1D,aAAa,gBAAuB;IAEpC,cAAc,EAAE;QACZ,UAAU,EAAE,UAAU,CAAC;QACvB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACvC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;QAChC,YAAY,EAAE,gBAAgB,CAAC;KAClC,GAAG,IAAI,CAAQ;gBAEJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,mBAAmB;IAS1F,KAAK,CAAC,IAAI,EAAE,WAAW;IAevB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc;IAyB/D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAO9C,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB;IAoBlG,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IAUpE,WAAW;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dendro/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAKR,cAAc,EAGd,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAGjB,MAAM,UAAU,CAAC;AAClB,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiEvD,qBAAa,WAAY,SAAQ,aAAa;IAC1C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAmB;IAC1D,aAAa,gBAAuB;IAEpC,cAAc,EAAE;QACZ,UAAU,EAAE,UAAU,CAAC;QACvB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QACvC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;QAChC,YAAY,EAAE,gBAAgB,CAAC;KAClC,GAAG,IAAI,CAAQ;gBAEJ,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,mBAAmB;IAS1F,KAAK,CAAC,IAAI,EAAE,WAAW;IAevB,OAAO;IAIP,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc;IAyB/D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAO9C,MAAM,IAAI,MAAM;IAKhB,mCAAmC,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB;IAoBlG,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IAUpE,WAAW;IAuBX,gBAAgB;IAOhB,YAAY;CAyCf"}
|
package/dist/dendro/index.js
CHANGED
|
@@ -20,22 +20,22 @@ function D(l, h) {
|
|
|
20
20
|
return L.uniqBy(u, (r) => r.columnName.value).reduce((r, p) => {
|
|
21
21
|
const { columnName: n } = p, o = l.getColumnCategories(n.value, !1), m = (a) => String(
|
|
22
22
|
(n.valueLabels ? l.getColumnValue(n.valueLabels, l.getColumnCategoryRowIndex(n.value, a)) : E) ?? a
|
|
23
|
-
),
|
|
24
|
-
return g(e) && n.value === e.columnName.value && (
|
|
25
|
-
|
|
26
|
-
})), g(t) && n.value === t.columnName.value && (
|
|
27
|
-
|
|
28
|
-
})), g(s) && n.value === s.columnName.value && (
|
|
29
|
-
|
|
23
|
+
), d = /* @__PURE__ */ new Set(), i = o.reduce((a, f) => (a[f] || (a[f] = {}), a), {});
|
|
24
|
+
return g(e) && n.value === e.columnName.value && (d.add("dotFill"), o.forEach((a) => {
|
|
25
|
+
i[a].dotFill = e.valuesMap[a];
|
|
26
|
+
})), g(t) && n.value === t.columnName.value && (d.add("dotShape"), o.forEach((a) => {
|
|
27
|
+
i[a].dotShape = t.valuesMap[a];
|
|
28
|
+
})), g(s) && n.value === s.columnName.value && (d.add("lineColor"), o.forEach((a) => {
|
|
29
|
+
i[a].lineColor = s.valuesMap[a];
|
|
30
30
|
})), r[n.value] = {
|
|
31
31
|
values: o.sort(),
|
|
32
|
-
usedAes: [...
|
|
33
|
-
aesMap:
|
|
32
|
+
usedAes: [...d],
|
|
33
|
+
aesMap: i,
|
|
34
34
|
labels: o.reduce((a, f) => (a[f] = m(f), a), {})
|
|
35
35
|
}, r;
|
|
36
36
|
}, {});
|
|
37
37
|
}
|
|
38
|
-
class
|
|
38
|
+
class V extends y {
|
|
39
39
|
constructor(e, t, s) {
|
|
40
40
|
super(e, t);
|
|
41
41
|
v(this, "settings");
|
|
@@ -72,12 +72,12 @@ class z extends y {
|
|
|
72
72
|
return this._updateChart(), S(this.chartRenderer.component);
|
|
73
73
|
}
|
|
74
74
|
_needUpdateCalculatedDataBySettings(e, t) {
|
|
75
|
-
var m,
|
|
75
|
+
var m, d;
|
|
76
76
|
const { mode: s, id: u, parentId: c, heatmapAnnotation: r, heatmapAxis: p, heatmapGroup: n } = t;
|
|
77
|
-
function o(
|
|
78
|
-
return
|
|
77
|
+
function o(i, a) {
|
|
78
|
+
return i.length !== a.length || i.some((f, b) => f.value !== a[b].value);
|
|
79
79
|
}
|
|
80
|
-
return e.mode !== s || e.id.value !== u.value || e.parentId.value !== c.value || ((m = e.heatmapAnnotation) == null ? void 0 : m.value) !== (r == null ? void 0 : r.value) || ((
|
|
80
|
+
return e.mode !== s || e.id.value !== u.value || e.parentId.value !== c.value || ((m = e.heatmapAnnotation) == null ? void 0 : m.value) !== (r == null ? void 0 : r.value) || ((d = e.heatmapAxis) == null ? void 0 : d.value) !== (p == null ? void 0 : p.value) || o(e.heatmapGroup, n);
|
|
81
81
|
}
|
|
82
82
|
_needUpdateCalculatedDataByData(e, t) {
|
|
83
83
|
const s = Object.keys(e.data), u = Object.keys(t.data);
|
|
@@ -87,19 +87,20 @@ class z extends y {
|
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
_updateData() {
|
|
90
|
-
const { mode: e, id: t, parentId: s, aes: u, heatmapAnnotation: c, heatmapAxis: r, heatmapGroup: p, heatmapSettings: n, height: o, labels: m } = this.settings, i = I(
|
|
90
|
+
const { mode: e, id: t, parentId: s, aes: u, heatmapAnnotation: c, heatmapAxis: r, heatmapGroup: p, heatmapSettings: n, height: o, labels: m, leavesOrder: d } = this.settings, i = I(
|
|
91
91
|
this.data,
|
|
92
92
|
t.value,
|
|
93
93
|
s.value,
|
|
94
94
|
(o == null ? void 0 : o.value) ?? null,
|
|
95
95
|
m.valueLabels ?? m.value ?? null,
|
|
96
|
+
d,
|
|
96
97
|
e === "useAllNodesAsLeaves"
|
|
97
|
-
),
|
|
98
|
+
), a = N(this.data, n.valueType, c, r, p, t, i), f = D(this.data, u);
|
|
98
99
|
this.calculatedData = {
|
|
99
100
|
chartSizes: this.chartRenderer.chartSizes,
|
|
100
101
|
hierarchy: i,
|
|
101
|
-
heatmapData:
|
|
102
|
-
legendLabels:
|
|
102
|
+
heatmapData: a,
|
|
103
|
+
legendLabels: f
|
|
103
104
|
};
|
|
104
105
|
}
|
|
105
106
|
_updateAesInData() {
|
|
@@ -119,8 +120,8 @@ class z extends y {
|
|
|
119
120
|
showLeavesLabels: n,
|
|
120
121
|
showNodesLabels: o,
|
|
121
122
|
aes: m,
|
|
122
|
-
labels:
|
|
123
|
-
heatmapSettings:
|
|
123
|
+
labels: d,
|
|
124
|
+
heatmapSettings: i,
|
|
124
125
|
leavesMode: a
|
|
125
126
|
} = this.settings;
|
|
126
127
|
this.chartRenderer.render(
|
|
@@ -135,10 +136,10 @@ class z extends y {
|
|
|
135
136
|
n,
|
|
136
137
|
o,
|
|
137
138
|
m,
|
|
138
|
-
|
|
139
|
+
d,
|
|
139
140
|
e,
|
|
140
141
|
this.calculatedData.heatmapData,
|
|
141
|
-
|
|
142
|
+
i,
|
|
142
143
|
this.calculatedData.legendLabels,
|
|
143
144
|
a,
|
|
144
145
|
this.onClick
|
|
@@ -146,6 +147,6 @@ class z extends y {
|
|
|
146
147
|
}
|
|
147
148
|
}
|
|
148
149
|
export {
|
|
149
|
-
|
|
150
|
+
V as ChartDendro
|
|
150
151
|
};
|
|
151
152
|
//# sourceMappingURL=index.js.map
|
package/dist/dendro/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/dendro/index.ts"],"sourcesContent":["import type { HierarchyNode } from 'd3-hierarchy';\nimport { uniqBy } from 'lodash';\nimport { renderToString } from 'react-dom/server';\nimport { undefined } from 'zod';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport type {\n AesItem,\n AesRecord,\n CategoricalAesFromColumn,\n Category,\n ClickEventData,\n ColumnName,\n ContinuousAesFromColumn,\n DendroEventHandlers,\n DendroLegendInfo,\n DendroSettings,\n LineShape,\n PointShape\n} from '../types';\nimport ChartRenderer from './ChartRenderer';\nimport type { ChartSizes } from './components/types';\nimport { USER_UPDATE_EVENT } from './constants';\nimport { DendroSettingsImpl } from './DendroSettingsImpl';\nimport type { HeatmapData } from './getHeatmapData';\nimport { getHeatmapData } from './getHeatmapData';\nimport type { TreeNodeData } from './getHierarchyData';\nimport { getHierarchy } from './getHierarchyData';\n\nfunction isCategoricalAes<InputType extends string | number | PointShape | LineShape>(\n item: InputType | CategoricalAesFromColumn<InputType> | ContinuousAesFromColumn<InputType>\n): item is CategoricalAesFromColumn<InputType> {\n if (typeof item !== 'object') {\n return false;\n }\n return 'valuesMap' in item;\n}\nfunction getLegendLabelsMap(data: DataFrame, aes: DendroSettingsImpl['aes']): DendroLegendInfo {\n const {nodeColor, nodeShape, lineColor} = aes;\n const aesGrouping: CategoricalAesFromColumn<string | PointShape>[] = [nodeColor, nodeShape, lineColor].filter(\n isCategoricalAes\n );\n const uniqueColumns = uniqBy(aesGrouping, item => item.columnName.value);\n return uniqueColumns.reduce((res: DendroLegendInfo, item) => {\n const {columnName} = item;\n const categories = data.getColumnCategories(columnName.value, false);\n const getValueLabel = (category: Category) => String(\n (columnName.valueLabels\n ? data.getColumnValue(columnName.valueLabels, data.getColumnCategoryRowIndex(columnName.value, category))\n : undefined\n ) ?? category\n );\n\n const usedAes = new Set<keyof AesItem>();\n const aesMap: AesRecord = categories.reduce((res: AesRecord, category) => {\n if (!res[category]) {\n res[category] = {} as AesItem;\n }\n return res;\n }, {});\n if (isCategoricalAes(nodeColor) && columnName.value === nodeColor.columnName.value) {\n usedAes.add('dotFill');\n categories.forEach(category => {\n aesMap[category]['dotFill'] = nodeColor.valuesMap[category];\n });\n }\n if (isCategoricalAes(nodeShape) && columnName.value === nodeShape.columnName.value) {\n usedAes.add('dotShape');\n categories.forEach(category => {\n aesMap[category]['dotShape'] = nodeShape.valuesMap[category];\n });\n }\n if (isCategoricalAes(lineColor) && columnName.value === lineColor.columnName.value) {\n usedAes.add('lineColor');\n categories.forEach(category => {\n aesMap[category]['lineColor'] = lineColor.valuesMap[category];\n });\n }\n res[columnName.value] = {\n values: categories.sort(),\n usedAes: [...usedAes],\n aesMap,\n labels: categories.reduce((res: Record<string, string>, category) => {\n res[category] = getValueLabel(category);\n return res;\n }, {}),\n };\n return res;\n }, {});\n}\n\nexport class ChartDendro extends AbstractChart {\n settings: DendroSettingsImpl;\n onClick: (data: ClickEventData) => void = () => undefined;\n chartRenderer = new ChartRenderer();\n\n calculatedData: {\n chartSizes: ChartSizes;\n hierarchy: HierarchyNode<TreeNodeData>;\n heatmapData: HeatmapData | null;\n legendLabels: DendroLegendInfo;\n } | null = null;\n\n constructor(data: DataFrame, settings: DendroSettings, eventHandlers?: DendroEventHandlers) {\n super(data, settings);\n\n this.settings = new DendroSettingsImpl(settings);\n if (eventHandlers) {\n this.onClick = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: DendroSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new DendroSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(field: string, value: unknown) {\n if (document) {\n const event = new CustomEvent(USER_UPDATE_EVENT, {detail: {[field]: value}});\n document.dispatchEvent(event);\n }\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: DendroSettingsImpl, settings: DendroSettingsImpl) {\n const {mode, id, parentId, heatmapAnnotation, heatmapAxis, heatmapGroup} = settings;\n\n function compareColumnGroups(columns1: ColumnName[], columns2: ColumnName[]) {\n return (\n columns1.length !== columns2.length ||\n columns1.some((column, idx) => column.value !== columns2[idx].value)\n );\n }\n\n return (\n prevSettings.mode !== mode ||\n prevSettings.id.value !== id.value ||\n prevSettings.parentId.value !== parentId.value ||\n prevSettings.heatmapAnnotation?.value !== heatmapAnnotation?.value ||\n prevSettings.heatmapAxis?.value !== heatmapAxis?.value ||\n compareColumnGroups(prevSettings.heatmapGroup, heatmapGroup)\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {mode, id, parentId, aes, heatmapAnnotation, heatmapAxis, heatmapGroup, heatmapSettings, height, labels} = this.settings;\n const hierarchy = getHierarchy(\n this.data,\n id.value,\n parentId.value,\n height?.value ?? null,\n labels.valueLabels ?? labels.value ?? null,\n mode === 'useAllNodesAsLeaves'\n );\n const heatmapData = getHeatmapData(this.data, heatmapSettings.valueType, heatmapAnnotation, heatmapAxis, heatmapGroup, id, hierarchy);\n\n const legendLabels = getLegendLabelsMap(this.data, aes);\n\n this.calculatedData = {\n chartSizes: this.chartRenderer.chartSizes,\n hierarchy,\n heatmapData,\n legendLabels,\n };\n }\n\n _updateAesInData() {\n if (!this.calculatedData) {\n return;\n }\n this.calculatedData.legendLabels = getLegendLabelsMap(this.data, this.settings.aes);\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {\n heatmapAnnotation,\n chartSettings,\n connectionType,\n edgeInheritance,\n rootPosition,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aes,\n labels,\n heatmapSettings,\n leavesMode\n } = this.settings;\n\n this.chartRenderer.render(\n this.data,\n chartSettings,\n this.calculatedData.hierarchy,\n connectionType,\n rootPosition,\n edgeInheritance,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aes,\n labels,\n heatmapAnnotation,\n this.calculatedData.heatmapData,\n heatmapSettings,\n this.calculatedData.legendLabels,\n leavesMode,\n this.onClick\n );\n }\n}\n"],"names":["isCategoricalAes","item","getLegendLabelsMap","data","aes","nodeColor","nodeShape","lineColor","aesGrouping","uniqBy","res","columnName","categories","getValueLabel","category","undefined","usedAes","aesMap","ChartDendro","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","DendroSettingsImpl","node","err","previousSettings","previousData","field","value","event","USER_UPDATE_EVENT","renderToString","prevSettings","mode","id","parentId","heatmapAnnotation","heatmapAxis","heatmapGroup","compareColumnGroups","columns1","columns2","column","idx","_a","_b","prevData","prevKeys","keys","key","heatmapSettings","height","labels","hierarchy","getHierarchy","heatmapData","getHeatmapData","legendLabels","chartSettings","connectionType","edgeInheritance","rootPosition","showNodes","showEdges","showLeavesLabels","showNodesLabels","leavesMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/dendro/index.ts"],"sourcesContent":["import type { HierarchyNode } from 'd3-hierarchy';\nimport { uniqBy } from 'lodash';\nimport { renderToString } from 'react-dom/server';\nimport { undefined } from 'zod';\nimport { AbstractChart } from '../AbstractChart';\nimport type { DataFrame } from '../DataFrame';\nimport type {\n AesItem,\n AesRecord,\n CategoricalAesFromColumn,\n Category,\n ClickEventData,\n ColumnName,\n ContinuousAesFromColumn,\n DendroEventHandlers,\n DendroLegendInfo,\n DendroSettings,\n LineShape,\n PointShape\n} from '../types';\nimport ChartRenderer from './ChartRenderer';\nimport type { ChartSizes } from './components/types';\nimport { USER_UPDATE_EVENT } from './constants';\nimport { DendroSettingsImpl } from './DendroSettingsImpl';\nimport type { HeatmapData } from './getHeatmapData';\nimport { getHeatmapData } from './getHeatmapData';\nimport type { TreeNodeData } from './getHierarchyData';\nimport { getHierarchy } from './getHierarchyData';\n\nfunction isCategoricalAes<InputType extends string | number | PointShape | LineShape>(\n item: InputType | CategoricalAesFromColumn<InputType> | ContinuousAesFromColumn<InputType>\n): item is CategoricalAesFromColumn<InputType> {\n if (typeof item !== 'object') {\n return false;\n }\n return 'valuesMap' in item;\n}\nfunction getLegendLabelsMap(data: DataFrame, aes: DendroSettingsImpl['aes']): DendroLegendInfo {\n const {nodeColor, nodeShape, lineColor} = aes;\n const aesGrouping: CategoricalAesFromColumn<string | PointShape>[] = [nodeColor, nodeShape, lineColor].filter(\n isCategoricalAes\n );\n const uniqueColumns = uniqBy(aesGrouping, item => item.columnName.value);\n return uniqueColumns.reduce((res: DendroLegendInfo, item) => {\n const {columnName} = item;\n const categories = data.getColumnCategories(columnName.value, false);\n const getValueLabel = (category: Category) => String(\n (columnName.valueLabels\n ? data.getColumnValue(columnName.valueLabels, data.getColumnCategoryRowIndex(columnName.value, category))\n : undefined\n ) ?? category\n );\n\n const usedAes = new Set<keyof AesItem>();\n const aesMap: AesRecord = categories.reduce((res: AesRecord, category) => {\n if (!res[category]) {\n res[category] = {} as AesItem;\n }\n return res;\n }, {});\n if (isCategoricalAes(nodeColor) && columnName.value === nodeColor.columnName.value) {\n usedAes.add('dotFill');\n categories.forEach(category => {\n aesMap[category]['dotFill'] = nodeColor.valuesMap[category];\n });\n }\n if (isCategoricalAes(nodeShape) && columnName.value === nodeShape.columnName.value) {\n usedAes.add('dotShape');\n categories.forEach(category => {\n aesMap[category]['dotShape'] = nodeShape.valuesMap[category];\n });\n }\n if (isCategoricalAes(lineColor) && columnName.value === lineColor.columnName.value) {\n usedAes.add('lineColor');\n categories.forEach(category => {\n aesMap[category]['lineColor'] = lineColor.valuesMap[category];\n });\n }\n res[columnName.value] = {\n values: categories.sort(),\n usedAes: [...usedAes],\n aesMap,\n labels: categories.reduce((res: Record<string, string>, category) => {\n res[category] = getValueLabel(category);\n return res;\n }, {}),\n };\n return res;\n }, {});\n}\n\nexport class ChartDendro extends AbstractChart {\n settings: DendroSettingsImpl;\n onClick: (data: ClickEventData) => void = () => undefined;\n chartRenderer = new ChartRenderer();\n\n calculatedData: {\n chartSizes: ChartSizes;\n hierarchy: HierarchyNode<TreeNodeData>;\n heatmapData: HeatmapData | null;\n legendLabels: DendroLegendInfo;\n } | null = null;\n\n constructor(data: DataFrame, settings: DendroSettings, eventHandlers?: DendroEventHandlers) {\n super(data, settings);\n\n this.settings = new DendroSettingsImpl(settings);\n if (eventHandlers) {\n this.onClick = eventHandlers[0];\n }\n }\n\n mount(node: HTMLElement) {\n try {\n this.chartRenderer.init(node);\n this._updateData();\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n unmount() {\n this.chartRenderer.clear();\n }\n\n updateSettingsAndData(data: DataFrame, settings: DendroSettings) {\n try {\n const previousSettings = this.settings;\n const previousData = this.data;\n this.settings = new DendroSettingsImpl(settings);\n this.data = data;\n if (\n this._needUpdateCalculatedDataBySettings(previousSettings, this.settings) ||\n this._needUpdateCalculatedDataByData(previousData, this.data)\n ) {\n this._updateData();\n } else {\n this._updateAesInData();\n }\n this._updateChart();\n this.hasError = false;\n } catch (err) {\n this.hasError = true;\n if (err instanceof Error) {\n this.chartRenderer.renderError(err.message as string);\n console.error(err);\n }\n }\n }\n\n updateChartState(field: string, value: unknown) {\n if (document) {\n const event = new CustomEvent(USER_UPDATE_EVENT, {detail: {[field]: value}});\n document.dispatchEvent(event);\n }\n }\n\n export(): string {\n this._updateChart();\n return renderToString(this.chartRenderer.component);\n }\n\n _needUpdateCalculatedDataBySettings(prevSettings: DendroSettingsImpl, settings: DendroSettingsImpl) {\n const {mode, id, parentId, heatmapAnnotation, heatmapAxis, heatmapGroup} = settings;\n\n function compareColumnGroups(columns1: ColumnName[], columns2: ColumnName[]) {\n return (\n columns1.length !== columns2.length ||\n columns1.some((column, idx) => column.value !== columns2[idx].value)\n );\n }\n\n return (\n prevSettings.mode !== mode ||\n prevSettings.id.value !== id.value ||\n prevSettings.parentId.value !== parentId.value ||\n prevSettings.heatmapAnnotation?.value !== heatmapAnnotation?.value ||\n prevSettings.heatmapAxis?.value !== heatmapAxis?.value ||\n compareColumnGroups(prevSettings.heatmapGroup, heatmapGroup)\n );\n }\n\n _needUpdateCalculatedDataByData(prevData: DataFrame, data: DataFrame) {\n const prevKeys = Object.keys(prevData.data);\n const keys = Object.keys(data.data);\n return (\n prevData.id !== data.id ||\n prevKeys.length !== keys.length ||\n prevKeys.some(key => prevData.data[key].length !== data.data[key]?.length)\n );\n }\n\n _updateData() {\n const {mode, id, parentId, aes, heatmapAnnotation, heatmapAxis, heatmapGroup, heatmapSettings, height, labels, leavesOrder} = this.settings;\n const hierarchy = getHierarchy(\n this.data,\n id.value,\n parentId.value,\n height?.value ?? null,\n labels.valueLabels ?? labels.value ?? null,\n leavesOrder,\n mode === 'useAllNodesAsLeaves'\n );\n const heatmapData = getHeatmapData(this.data, heatmapSettings.valueType, heatmapAnnotation, heatmapAxis, heatmapGroup, id, hierarchy);\n\n const legendLabels = getLegendLabelsMap(this.data, aes);\n\n this.calculatedData = {\n chartSizes: this.chartRenderer.chartSizes,\n hierarchy,\n heatmapData,\n legendLabels,\n };\n }\n\n _updateAesInData() {\n if (!this.calculatedData) {\n return;\n }\n this.calculatedData.legendLabels = getLegendLabelsMap(this.data, this.settings.aes);\n }\n\n _updateChart() {\n if (!this.calculatedData) {\n return;\n }\n const {\n heatmapAnnotation,\n chartSettings,\n connectionType,\n edgeInheritance,\n rootPosition,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aes,\n labels,\n heatmapSettings,\n leavesMode\n } = this.settings;\n\n this.chartRenderer.render(\n this.data,\n chartSettings,\n this.calculatedData.hierarchy,\n connectionType,\n rootPosition,\n edgeInheritance,\n showNodes,\n showEdges,\n showLeavesLabels,\n showNodesLabels,\n aes,\n labels,\n heatmapAnnotation,\n this.calculatedData.heatmapData,\n heatmapSettings,\n this.calculatedData.legendLabels,\n leavesMode,\n this.onClick\n );\n }\n}\n"],"names":["isCategoricalAes","item","getLegendLabelsMap","data","aes","nodeColor","nodeShape","lineColor","aesGrouping","uniqBy","res","columnName","categories","getValueLabel","category","undefined","usedAes","aesMap","ChartDendro","AbstractChart","settings","eventHandlers","__publicField","ChartRenderer","DendroSettingsImpl","node","err","previousSettings","previousData","field","value","event","USER_UPDATE_EVENT","renderToString","prevSettings","mode","id","parentId","heatmapAnnotation","heatmapAxis","heatmapGroup","compareColumnGroups","columns1","columns2","column","idx","_a","_b","prevData","prevKeys","keys","key","heatmapSettings","height","labels","leavesOrder","hierarchy","getHierarchy","heatmapData","getHeatmapData","legendLabels","chartSettings","connectionType","edgeInheritance","rootPosition","showNodes","showEdges","showLeavesLabels","showNodesLabels","leavesMode"],"mappings":"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"}
|
|
@@ -11,45 +11,45 @@ const I = /* @__PURE__ */ (() => {
|
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
13
|
})();
|
|
14
|
-
function v(t,
|
|
14
|
+
function v(t, f, d) {
|
|
15
15
|
I.clear();
|
|
16
|
-
const u = d && Object.keys(d).length > 0, l =
|
|
16
|
+
const u = d && Object.keys(d).length > 0, l = f.dotFill, e = l && l.length > 0, n = f.lineColor, C = n && n.length > 0;
|
|
17
17
|
return (g, i) => {
|
|
18
18
|
var o;
|
|
19
|
-
const
|
|
20
|
-
return i === "dotFill" && e ? l[I.getIndex(t, g) % l.length] ??
|
|
19
|
+
const a = u ? (o = d[g]) == null ? void 0 : o[i] : void 0;
|
|
20
|
+
return i === "dotFill" && e ? l[I.getIndex(t, g) % l.length] ?? a : i === "lineColor" && C ? n[I.getIndex(t, g) % n.length] ?? a : a;
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
function A(t) {
|
|
24
24
|
return typeof t == "object" && "type" in t && t.type === "grouping";
|
|
25
25
|
}
|
|
26
|
-
function F(t,
|
|
27
|
-
return
|
|
28
|
-
const e = l.columnName, n = l.order, C = (o) => e.valueLabels ? t.getColumnValueCategory(e.valueLabels, o) : void 0,
|
|
26
|
+
function F(t, f, d) {
|
|
27
|
+
return f.reduce((u, l) => {
|
|
28
|
+
const e = l.columnName, n = l.order, C = (o) => e.valueLabels ? t.getColumnValueCategory(e.valueLabels, o) : void 0, h = /* @__PURE__ */ new Set(), g = {};
|
|
29
29
|
d.forEach((o) => {
|
|
30
|
-
o.aes && Object.entries(o.aes).forEach(([
|
|
31
|
-
A(r) && r.value === e.value && (
|
|
30
|
+
o.aes && Object.entries(o.aes).forEach(([c, r]) => {
|
|
31
|
+
A(r) && r.value === e.value && (h.add(c), g[c] = r.palette);
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
|
-
let i = {},
|
|
35
|
-
if (
|
|
36
|
-
const o = t.getColumnCategories(e.value);
|
|
34
|
+
let i = {}, a = [];
|
|
35
|
+
if (h.has("dotFill") || h.has("dotShape")) {
|
|
36
|
+
const o = t.getColumnCategories(e.value, !1);
|
|
37
37
|
if (o.length < x) {
|
|
38
38
|
i = o.reduce((r, s) => {
|
|
39
39
|
const p = t.getColumnCategoryRowIndex(e.value, s);
|
|
40
40
|
return r[s] = C(p) ?? s, r;
|
|
41
41
|
}, i);
|
|
42
|
-
const
|
|
43
|
-
|
|
42
|
+
const c = o.reduce((r, s) => (r[s] = (n == null ? void 0 : n.indexOf(s)) ?? -1, r), {});
|
|
43
|
+
a = o.sort((r, s) => {
|
|
44
44
|
var p;
|
|
45
|
-
return
|
|
45
|
+
return c[r] !== c[s] ? c[r] - c[s] : ((p = i[r]) == null ? void 0 : p.localeCompare(i[s] ?? "", "en", { numeric: !0 })) ?? 0;
|
|
46
46
|
});
|
|
47
47
|
} else
|
|
48
|
-
|
|
48
|
+
a = o;
|
|
49
49
|
}
|
|
50
50
|
return u[e.value] = {
|
|
51
|
-
values:
|
|
52
|
-
usedAes: [...
|
|
51
|
+
values: a,
|
|
52
|
+
usedAes: [...h],
|
|
53
53
|
aesMap: v(e, g, l.inheritedAes),
|
|
54
54
|
labels: i
|
|
55
55
|
}, u;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLegendInfo.js","sources":["../../../src/scatterplot/utils/createLegendInfo.ts"],"sourcesContent":["import { MAX_SHOWN_UNIQUE_VALUES_IN_LABELS } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport type {AesRecord} from '../../types';\nimport type {\n AesItem,\n Category,\n ColumnName,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n ScatterplotLayer,\n ScatterplotLegendInfo\n} from '../../types';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\n\nconst categoryIndexer = (() => {\n const map = new Map<string, Map<Category, number>>();\n const clear = () => map.clear();\n const getIndex = (columnName: ColumnName, category: Category): number => {\n let categoryMap = map.get(columnName.value);\n if (categoryMap === undefined) {\n categoryMap = new Map();\n map.set(columnName.value, categoryMap);\n }\n let index = categoryMap.get(category);\n if (index === undefined) {\n index = categoryMap.size;\n categoryMap.set(category, index);\n }\n return index;\n };\n\n return {\n clear,\n getIndex,\n };\n})();\n\nexport function addPalettesToAesMapping(\n columnName: ColumnName,\n usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>>,\n inheritedAes?: AesRecord\n) {\n categoryIndexer.clear();\n const hasInheritedAes = inheritedAes && Object.keys(inheritedAes).length > 0;\n const dotFill = usedAesFromPalettes['dotFill'];\n const hasDotFill = dotFill && dotFill.length > 0;\n const lineColor = usedAesFromPalettes['lineColor'];\n const hasLineColor = lineColor && lineColor.length > 0;\n const getAesField = (category: Category, field: keyof AesItem) => {\n const inheritedResult = hasInheritedAes ? inheritedAes[category]?.[field] : undefined;\n \n if (field === 'dotFill' && hasDotFill) {\n return dotFill[categoryIndexer.getIndex(columnName, category) % dotFill.length] ?? inheritedResult;\n }\n if (field === 'lineColor' && hasLineColor) {\n return lineColor[categoryIndexer.getIndex(columnName, category) % lineColor.length] ?? inheritedResult;\n }\n \n return inheritedResult;\n };\n\n return getAesField;\n}\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\nexport function createLegendInfo(\n data: DataFrame,\n grouping: ScatterplotSettingsImpl['grouping'],\n layers: ScatterplotLayer[],\n): ScatterplotLegendInfo {\n return grouping.reduce((res: ScatterplotLegendInfo, groupingElement) => {\n // TODO: remove String conversion\n const column = groupingElement.columnName;\n const order = groupingElement.order;\n const getValueLabel = (index: number) => {\n return column.valueLabels\n ? data.getColumnValueCategory(column.valueLabels, index)\n : undefined;\n };\n\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n \n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === column.value)) return;\n \n usedAes.add(key as keyof AesItem);\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n });\n });\n let labels: Record<Category, string> = {};\n let values: Category[] = [];\n if (usedAes.has('dotFill') || usedAes.has('dotShape')) {\n const categories = data.getColumnCategories(column.value);\n if (categories.length < MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n labels = categories.reduce((res, category) => {\n const index = data.getColumnCategoryRowIndex(column.value, category);\n res[category] = getValueLabel(index) ?? category;\n return res;\n }, labels);\n const sortWeights = categories.reduce((res, v) => {\n res[v] = order?.indexOf(v) ?? -1;\n return res;\n }, {} as Record<string, number>);\n values = categories.sort((a, b) => {\n if (sortWeights[a] !== sortWeights[b]) {\n return sortWeights[a] - sortWeights[b];\n }\n return labels[a]?.localeCompare(labels[b] ?? '', 'en', {numeric: true}) ?? 0;\n });\n } else {\n values = categories;\n }\n }\n res[column.value] = {\n values,\n usedAes: [...usedAes],\n aesMap: addPalettesToAesMapping(column, usedAesFromPalettes, groupingElement.inheritedAes),\n labels,\n };\n return res;\n }, {});\n}"],"names":["categoryIndexer","map","columnName","category","categoryMap","index","addPalettesToAesMapping","usedAesFromPalettes","inheritedAes","hasInheritedAes","dotFill","hasDotFill","lineColor","hasLineColor","field","inheritedResult","_a","isInheritMapping","value","createLegendInfo","data","grouping","layers","res","groupingElement","column","order","getValueLabel","usedAes","layer","key","labels","values","categories","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","sortWeights","v","a","b"],"mappings":";AAcA,MAAMA,IAAmB,uBAAM;AAC3B,QAAMC,wBAAU,IAAA;AAgBhB,SAAO;AAAA,IACH,OAhBU,MAAMA,EAAI,MAAA;AAAA,IAiBpB,UAhBa,CAACC,GAAwBC,MAA+B;AACrE,UAAIC,IAAcH,EAAI,IAAIC,EAAW,KAAK;AAC1C,MAAIE,MAAgB,WAChBA,wBAAkB,IAAA,GAClBH,EAAI,IAAIC,EAAW,OAAOE,CAAW;AAEzC,UAAIC,IAAQD,EAAY,IAAID,CAAQ;AACpC,aAAIE,MAAU,WACVA,IAAQD,EAAY,MACpBA,EAAY,IAAID,GAAUE,CAAK,IAE5BA;AAAA,IACX;AAAA,EAII;AAER,GAAA;AAEO,SAASC,EACZJ,GACAK,GACAC,GACF;AACE,EAAAR,EAAgB,MAAA;AAChB,QAAMS,IAAkBD,KAAgB,OAAO,KAAKA,CAAY,EAAE,SAAS,GACrEE,IAAUH,EAAoB,SAC9BI,IAAaD,KAAWA,EAAQ,SAAS,GACzCE,IAAYL,EAAoB,WAChCM,IAAeD,KAAaA,EAAU,SAAS;AAcrD,SAboB,CAACT,GAAoBW,MAAyB;;AAC9D,UAAMC,IAAkBN,KAAkBO,IAAAR,EAAaL,CAAQ,MAArB,gBAAAa,EAAyBF,KAAS;AAE5E,WAAIA,MAAU,aAAaH,IAChBD,EAAQV,EAAgB,SAASE,GAAYC,CAAQ,IAAIO,EAAQ,MAAM,KAAKK,IAEnFD,MAAU,eAAeD,IAClBD,EAAUZ,EAAgB,SAASE,GAAYC,CAAQ,IAAIS,EAAU,MAAM,KAAKG,IAGpFA;AAAA,EACX;AAGJ;AAEA,SAASE,EAA8CC,GAA6F;AAChJ,SAAO,OAAOA,KAAU,YAAY,UAAUA,KAASA,EAAM,SAAS;AAC1E;AACO,SAASC,EACZC,GACAC,GACAC,GACqB;AACrB,SAAOD,EAAS,OAAO,CAACE,GAA4BC,MAAoB;AAEpE,UAAMC,IAASD,EAAgB,YACzBE,IAAQF,EAAgB,OACxBG,IAAgB,CAACtB,MACZoB,EAAO,cACZL,EAAK,uBAAuBK,EAAO,aAAapB,CAAK,IACrD,QAGAuB,wBAAc,IAAA,GACdrB,IAA+D,CAAA;AACrE,IAAAe,EAAO,QAAQ,CAAAO,MAAS;AACpB,MAAKA,EAAM,OAEX,OAAO,QAAQA,EAAM,GAAG,EAAE,QAAQ,CAAC,CAACC,GAAKZ,CAAK,MAAM;AAChD,QAAMD,EAAiBC,CAAK,KAAKA,EAAM,UAAUO,EAAO,UAExDG,EAAQ,IAAIE,CAAoB,GAChCvB,EAAoBuB,CAAoB,IAAIZ,EAAM;AAAA,MACtD,CAAC;AAAA,IACL,CAAC;AACD,QAAIa,IAAmC,CAAA,GACnCC,IAAqB,CAAA;AACzB,QAAIJ,EAAQ,IAAI,SAAS,KAAKA,EAAQ,IAAI,UAAU,GAAG;AACnD,YAAMK,IAAab,EAAK,oBAAoBK,EAAO,
|
|
1
|
+
{"version":3,"file":"createLegendInfo.js","sources":["../../../src/scatterplot/utils/createLegendInfo.ts"],"sourcesContent":["import { MAX_SHOWN_UNIQUE_VALUES_IN_LABELS } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport type {AesRecord} from '../../types';\nimport type {\n AesItem,\n Category,\n ColumnName,\n ContinuousAesFromColumn,\n InheritAesScatterplot,\n ScatterplotLayer,\n ScatterplotLegendInfo\n} from '../../types';\nimport type { ScatterplotSettingsImpl } from '../ScatterplotSettingsImpl';\n\nconst categoryIndexer = (() => {\n const map = new Map<string, Map<Category, number>>();\n const clear = () => map.clear();\n const getIndex = (columnName: ColumnName, category: Category): number => {\n let categoryMap = map.get(columnName.value);\n if (categoryMap === undefined) {\n categoryMap = new Map();\n map.set(columnName.value, categoryMap);\n }\n let index = categoryMap.get(category);\n if (index === undefined) {\n index = categoryMap.size;\n categoryMap.set(category, index);\n }\n return index;\n };\n\n return {\n clear,\n getIndex,\n };\n})();\n\nexport function addPalettesToAesMapping(\n columnName: ColumnName,\n usedAesFromPalettes: Partial<Record<keyof AesItem, string[]>>,\n inheritedAes?: AesRecord\n) {\n categoryIndexer.clear();\n const hasInheritedAes = inheritedAes && Object.keys(inheritedAes).length > 0;\n const dotFill = usedAesFromPalettes['dotFill'];\n const hasDotFill = dotFill && dotFill.length > 0;\n const lineColor = usedAesFromPalettes['lineColor'];\n const hasLineColor = lineColor && lineColor.length > 0;\n const getAesField = (category: Category, field: keyof AesItem) => {\n const inheritedResult = hasInheritedAes ? inheritedAes[category]?.[field] : undefined;\n \n if (field === 'dotFill' && hasDotFill) {\n return dotFill[categoryIndexer.getIndex(columnName, category) % dotFill.length] ?? inheritedResult;\n }\n if (field === 'lineColor' && hasLineColor) {\n return lineColor[categoryIndexer.getIndex(columnName, category) % lineColor.length] ?? inheritedResult;\n }\n \n return inheritedResult;\n };\n\n return getAesField;\n}\n\nfunction isInheritMapping<T extends (string | number)>(value:T | InheritAesScatterplot | ContinuousAesFromColumn<T>):value is InheritAesScatterplot {\n return typeof value === 'object' && 'type' in value && value.type === 'grouping';\n}\nexport function createLegendInfo(\n data: DataFrame,\n grouping: ScatterplotSettingsImpl['grouping'],\n layers: ScatterplotLayer[],\n): ScatterplotLegendInfo {\n return grouping.reduce((res: ScatterplotLegendInfo, groupingElement) => {\n // TODO: remove String conversion\n const column = groupingElement.columnName;\n const order = groupingElement.order;\n const getValueLabel = (index: number) => {\n return column.valueLabels\n ? data.getColumnValueCategory(column.valueLabels, index)\n : undefined;\n };\n\n const usedAes = new Set<keyof AesItem>();\n const usedAesFromPalettes:Partial<Record<keyof AesItem, string[]>> = {}; // if there is palette in mapping then\n layers.forEach(layer => {\n if (!layer.aes) return;\n \n Object.entries(layer.aes).forEach(([key, value]) => {\n if (!(isInheritMapping(value) && value.value === column.value)) return;\n \n usedAes.add(key as keyof AesItem);\n usedAesFromPalettes[key as keyof AesItem] = value.palette;\n });\n });\n let labels: Record<Category, string> = {};\n let values: Category[] = [];\n if (usedAes.has('dotFill') || usedAes.has('dotShape')) {\n const categories = data.getColumnCategories(column.value, false);\n if (categories.length < MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n labels = categories.reduce((res, category) => {\n const index = data.getColumnCategoryRowIndex(column.value, category);\n res[category] = getValueLabel(index) ?? category;\n return res;\n }, labels);\n const sortWeights = categories.reduce((res, v) => {\n res[v] = order?.indexOf(v) ?? -1;\n return res;\n }, {} as Record<string, number>);\n values = categories.sort((a, b) => {\n if (sortWeights[a] !== sortWeights[b]) {\n return sortWeights[a] - sortWeights[b];\n }\n return labels[a]?.localeCompare(labels[b] ?? '', 'en', {numeric: true}) ?? 0;\n });\n } else {\n values = categories;\n }\n }\n res[column.value] = {\n values,\n usedAes: [...usedAes],\n aesMap: addPalettesToAesMapping(column, usedAesFromPalettes, groupingElement.inheritedAes),\n labels,\n };\n return res;\n }, {});\n}"],"names":["categoryIndexer","map","columnName","category","categoryMap","index","addPalettesToAesMapping","usedAesFromPalettes","inheritedAes","hasInheritedAes","dotFill","hasDotFill","lineColor","hasLineColor","field","inheritedResult","_a","isInheritMapping","value","createLegendInfo","data","grouping","layers","res","groupingElement","column","order","getValueLabel","usedAes","layer","key","labels","values","categories","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","sortWeights","v","a","b"],"mappings":"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"}
|