@unovis/ts 1.5.0-alpha.5 → 1.5.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sources":["../../../../src/components/graph/modules/layout.ts"],"sourcesContent":["import { min, max, group } from 'd3-array'\nimport type { SimulationNodeDatum } from 'd3-force'\nimport type { ElkNode } from 'elkjs/lib/elk.bundled.js'\nimport type { graphlib, Node } from 'dagre'\n\n// Core\nimport { GraphDataModel } from 'data-models/graph'\n\n// Utils\nimport { without, clamp, groupBy, unique, sortBy, getString, getNumber, getValue, merge, isFunction, isNil } from 'utils/data'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\n\n// Local Types\nimport { GraphNode, GraphLink, GraphForceSimulationNode } from '../types'\n\n// Config\nimport { GraphConfigInterface } from '../config'\n\n// Helpers\nimport { getMaxNodeSize, configuredNodeSize, getNodeSize, getAverageNodeSize } from './node/helper'\nimport {\n DEFAULT_ELK_SETTINGS,\n adjustElkHierarchyCoordinates,\n positionNonConnectedNodes,\n toElkHierarchy,\n GraphElkHierarchyNode,\n} from './layout-helpers'\n\nexport function applyLayoutCircular<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, nodeSize } = config\n\n const activeWidth = width\n const activeHeight = height\n\n // Handle layout nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n const yRatio = activeHeight / maxNodeSize\n const yScaling = yRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / yRatio : 1\n const xRatio = activeWidth / maxNodeSize\n const xScaling = xRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / xRatio : 1\n const scaling = Math.max(xScaling, yScaling)\n\n layoutNodes.forEach((d, i) => {\n const rX = scaling * activeWidth / 2\n const rY = scaling * activeHeight / 2 // maxNodeSize * layoutNodes.length / 4\n const angle = 2 * i * Math.PI / layoutNodes.length\n d.x = activeWidth / 2 + rX * Math.cos(angle)\n d.y = activeHeight / 2 + rY * Math.sin(angle)\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport function applyLayoutParallel<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number,\n orientation?: string\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const {\n layoutNonConnectedAside, layoutGroupOrder, layoutParallelSortConnectionsByGroup, layoutParallelNodesPerColumn,\n layoutParallelSubGroupsPerRow, nodeSize, layoutNodeGroup, layoutParallelNodeSubGroup, layoutParallelGroupSpacing,\n } = config\n\n const activeWidth = width - configuredNodeSize(nodeSize)\n const activeHeight = height - configuredNodeSize(nodeSize) - (nonConnectedNodes.length ? configuredNodeSize(nodeSize) * 5 : 0)\n\n // Handle connected nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const groupNames = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => {\n const groupNodes = layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName)\n const groupedBySubgroup = groupBy(groupNodes, d => getString(d, layoutParallelNodeSubGroup, d._index))\n const subgroups = Object.keys(groupedBySubgroup).map(name => ({\n nodes: groupedBySubgroup[name],\n name,\n }))\n\n return {\n name: groupName,\n nodes: groupNodes,\n subgroups,\n }\n })\n\n // Sort\n const group = groups.find(g => g.name === layoutParallelSortConnectionsByGroup)\n if (group) {\n const sortMap: Record<string, number> = {}\n let idx = 0\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(node => {\n node.links.forEach(link => {\n const linkTargetId = link?.target._id\n sortMap[linkTargetId] = idx\n idx = idx + 1\n })\n })\n })\n\n without(groups, group).forEach(g => {\n g.subgroups.forEach(subgroup => {\n subgroup.nodes.sort((a, b) => {\n return (sortMap[a._id] || 0) - (sortMap[b._id] || 0)\n })\n })\n })\n }\n\n const maxN = max(groups, d => d.nodes?.length)\n const labelApprxHeight = 40\n const labelMargin = 10\n const subgroupMargin = 40\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n\n if (orientation === 'horizontal') {\n const minHorizontalStep = 2 * maxNodeSize + labelMargin\n const maxHorizontalStep = 3.5 * maxNodeSize + labelMargin\n const horizontalStep = clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 4 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize + labelApprxHeight + labelMargin\n\n let y0 = (groups.length < 2) ? height / 2 : 0\n groups.forEach(group => {\n let x0 = 0\n let dy = 0\n let subgroupMaxWidth = 0\n let groupWidth = 0\n let groupHeight = 0\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupRows = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let x = x0\n let y = y0 + dy\n subgroup.nodes.forEach(d => {\n x = x + horizontalStep\n d.x = x\n d.y = y\n groupWidth = Math.max(groupWidth, x)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n y += subgroupNodeStep\n x = x0\n }\n })\n\n const subgroupWidth = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep\n const subgroupHeight = subgroupRows * subgroupNodeStep\n subgroupMaxWidth = Math.max(subgroupMaxWidth, subgroupWidth)\n dy = dy + subgroupHeight + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dy = 0\n x0 = x0 + subgroupMaxWidth + subgroupMargin\n subgroupMaxWidth = 0\n }\n\n groupHeight = Math.max(groupHeight, y)\n // x0 += Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep + subgroupMargin\n })\n\n // Center group horizontally\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.x -= groupWidth / 2\n })\n })\n groupWidth = 0\n\n // Update y0 for the next group\n y0 = groupHeight + verticalStep\n })\n } else {\n const minHorizontalStep = 6 * maxNodeSize + labelMargin\n const maxHorizontalStep = 10 * maxNodeSize + labelMargin\n const horizontalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 2.0 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize * 2.0\n\n let x0 = (groups.length < 2) ? width / 2 : 0\n groups.forEach(group => {\n let y0 = 0\n let dx = 0 // Horizontal shift inside the group (column)\n let subgroupMaxHeight = 0\n let groupWidth = 0\n let groupHeight = 0\n\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupColumns = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let y = y0\n let x = x0 + dx\n subgroup.nodes.forEach(d => {\n y = y + verticalStep\n d.x = x\n d.y = y\n groupHeight = Math.max(groupHeight, y)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n x += subgroupNodeStep\n y = y0\n }\n })\n\n const subgroupHeight = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * verticalStep\n const subgroupWidth = subgroupColumns * subgroupNodeStep\n subgroupMaxHeight = Math.max(subgroupMaxHeight, subgroupHeight)\n dx = dx + subgroupWidth + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dx = 0\n y0 = y0 + subgroupMaxHeight + subgroupMargin\n subgroupMaxHeight = 0\n }\n\n groupWidth = Math.max(groupWidth, x)\n })\n\n // Center group vertically\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.y -= groupHeight / 2\n })\n })\n groupHeight = 0\n\n // Update x0 for the next group\n x0 = groupWidth + horizontalStep\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n\nexport async function applyLayoutDagre<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n const { nodeSize, layoutNonConnectedAside, dagreLayoutSettings, nodeStrokeWidth, nodeLabel } = config\n\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { Graph } = await import('@unovis/graphlibrary')\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { layout } = await import('@unovis/dagre-layout')\n\n // https://github.com/dagrejs/dagre/wiki\n const dagreGraph = new Graph() as graphlib.Graph<GraphNode<N, L>>\n\n // Set an object for the graph label\n dagreGraph.setGraph(dagreLayoutSettings)\n\n // Default to assigning a new object as a label for each new edge.\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n const labelApprxHeight = 40\n const nds = (layoutNonConnectedAside ? connectedNodes : nodes)\n nds.forEach(node => {\n dagreGraph.setNode(`${node._index}`, {\n label: getString(node, nodeLabel, node._index),\n width: getNumber(node, nodeSize, node._index) * 1.5 + getNumber(node, nodeStrokeWidth, node._index),\n height: labelApprxHeight + getNumber(node, nodeSize, node._index) * 1.5,\n originalNode: node,\n })\n })\n\n // Add edges to the graph.\n links.forEach(link => {\n dagreGraph.setEdge(\n `${link.source._index}`,\n `${link.target._index}`\n )\n })\n\n // Calculate the layout\n layout(dagreGraph)\n\n // Apply coordinates to the graph\n dagreGraph.nodes().forEach(d => {\n const node = dagreGraph.node(d) as Node<GraphNode<N, L>> & { originalNode: GraphNode<N, L>}\n node.originalNode.x = node.x // width * d.x / dagreGraph._label.width\n node.originalNode.y = node.y // height * d.y / dagreGraph._label.height\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxNodeSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxNodeSize * 3, maxNodeSize * 2.25, Math.max(graphWidth, width), 0)\n }\n}\n\nexport function applyLayoutConcentric<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, layoutGroupOrder, nodeSize, layoutNodeGroup } = config\n\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n\n const groupNames: string[] = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => ({\n name: groupName,\n nodes: layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName),\n }))\n\n // Handle connected nodes\n let r = 2 * getAverageNodeSize(groups[0]?.nodes ?? [], nodeSize)\n const widthToHeightRatio = width / height\n\n groups.forEach((group, i) => {\n const avgNodeSize = getAverageNodeSize(group.nodes, nodeSize)\n const requiredRadius = 1.1 * avgNodeSize * group.nodes.length / Math.PI\n if (r < requiredRadius) r = requiredRadius\n\n group.nodes.forEach((node, j) => {\n // If the first (central) group has only one node\n if (i === 0 && group.nodes.length === 1) {\n node.x = width / 2\n node.y = height / 2\n } else {\n let dAngle = 0\n if (i === 0 && group.nodes.length === 3) dAngle = Math.PI / 6\n if (i === 0 && group.nodes.length === 4) dAngle = Math.PI / 4\n const angle = 2 * j * Math.PI / group.nodes.length + i * Math.PI / 12 + dAngle\n node.x = width / 2 + r * Math.cos(angle) * widthToHeightRatio\n node.y = height / 2 + r * Math.sin(angle)\n }\n })\n\n const groupSpacing = avgNodeSize * 3\n r += groupSpacing\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, graphWidth, minX)\n }\n}\n\nexport async function applyLayoutForce<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { layoutNonConnectedAside, forceLayoutSettings, nodeSize } = config\n\n const { forceSimulation, forceLink, forceManyBody, forceX, forceY, forceCollide } = await import('d3-force')\n\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n\n // Apply fx and fy to nodes if present before running the simulation\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n d.fx = isNil(d._state.fx) ? undefined : d._state.fx\n d.fy = isNil(d._state.fy) ? undefined : d._state.fy\n })\n } else {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n delete d._state.fx\n delete d._state.fy\n })\n }\n\n const simulation = forceSimulation(layoutNonConnectedAside ? connectedNodes : nodes)\n .force('link', forceLink(links)\n .id((d) => String((d as GraphNode<N, L>)._id))\n .distance((l, i) => isFunction(forceLayoutSettings.linkDistance) ? forceLayoutSettings.linkDistance(l, i) : forceLayoutSettings.linkDistance)\n .strength((l, i) => isFunction(forceLayoutSettings.linkStrength) ? forceLayoutSettings.linkStrength(l, i) : forceLayoutSettings.linkStrength)\n )\n .force('charge', forceManyBody().strength((d, i) => {\n if (isFunction(forceLayoutSettings.charge)) {\n return forceLayoutSettings.charge(d as GraphNode<N, L>, i)\n } else {\n const linkCount = links.reduce((count, l) => count + Number((l.source === d) || (l.target === d)), 0)\n return forceLayoutSettings.charge * Math.sqrt(linkCount)\n }\n }))\n .force('x', forceX().strength(forceLayoutSettings.forceXStrength))\n .force('y', forceY().strength(forceLayoutSettings.forceYStrength))\n .force('collide', forceCollide<SimulationNodeDatum & N>().radius((d, i) => getNodeSize(d, nodeSize, i)).iterations(1))\n .stop()\n\n // See https://bl.ocks.org/mbostock/1667139, https://github.com/d3/d3-force/blob/master/README.md#simulation_tick\n const numIterations = forceLayoutSettings.numIterations ?? Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay()))\n for (let i = 0, n = numIterations; i < n; ++i) {\n simulation.tick()\n }\n\n // Fix node positions if requested\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach(d => {\n d._state.fx = d.x\n d._state.fy = d.y\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 6, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport async function applyELKLayout<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const ELK = (await import('elkjs/lib/elk.bundled.js')).default\n const elk = new ELK()\n\n const labelApprxHeight = 30\n const nodes = datamodel.nodes.map(n => ({\n ...n,\n id: n._id,\n width: getNumber(n, config.nodeSize, n._index) + getNumber(n, config.nodeStrokeWidth, n._index),\n height: getNumber(n, config.nodeSize, n._index) + labelApprxHeight,\n }))\n\n let elkNodes: (GraphNode<N, L> | GraphElkHierarchyNode<N, L>)[]\n if (config.layoutElkNodeGroups) {\n const groupingFunctions = config.layoutElkNodeGroups\n .map(accessor => (d: GraphNode<N, L>) => getString(d, accessor, d._index)) as [(d: GraphNode<N, L>) => string]\n const grouped = group(nodes, ...groupingFunctions)\n elkNodes = toElkHierarchy(grouped, config.layoutElkSettings)\n } else {\n elkNodes = nodes\n }\n\n const rootNodeId = 'root'\n const elkGraph: ElkNode = {\n id: rootNodeId,\n layoutOptions: merge(DEFAULT_ELK_SETTINGS, getValue(rootNodeId, config.layoutElkSettings)),\n children: elkNodes as ElkNode[],\n edges: datamodel.links.map(l => ({\n id: l._id,\n sources: [l.source._id],\n targets: [l.target._id],\n })),\n }\n\n const layout = await elk.layout(elkGraph)\n adjustElkHierarchyCoordinates(layout)\n\n nodes.forEach((node, i) => {\n const found = datamodel.nodes.find(n => n._id === node.id)\n if (!found) return\n\n found.x = node.x\n found.y = node.y\n })\n\n // Handle non-connected nodes\n if (config.layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(datamodel.nonConnectedNodes, config.nodeSize)\n const maxY = max<number>(datamodel.connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(datamodel.nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout.js","sources":["../../../../src/components/graph/modules/layout.ts"],"sourcesContent":["import { min, max, group } from 'd3-array'\nimport type { SimulationNodeDatum } from 'd3-force'\nimport type { ElkNode } from 'elkjs/lib/elk.bundled.js'\nimport type { graphlib, Node } from 'dagre'\n\n// Core\nimport { GraphDataModel } from 'data-models/graph'\n\n// Utils\nimport { without, clamp, groupBy, unique, sortBy, getString, getNumber, getValue, merge, isFunction, isNil } from 'utils/data'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\n\n// Local Types\nimport { GraphNode, GraphLink, GraphForceSimulationNode } from '../types'\n\n// Config\nimport { GraphConfigInterface } from '../config'\n\n// Helpers\nimport { getMaxNodeSize, configuredNodeSize, getNodeSize, getAverageNodeSize } from './node/helper'\nimport {\n DEFAULT_ELK_SETTINGS,\n adjustElkHierarchyCoordinates,\n positionNonConnectedNodes,\n toElkHierarchy,\n GraphElkHierarchyNode,\n} from './layout-helpers'\n\nexport function applyLayoutCircular<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, nodeSize } = config\n\n const activeWidth = width\n const activeHeight = height\n\n // Handle layout nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n const yRatio = activeHeight / maxNodeSize\n const yScaling = yRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / yRatio : 1\n const xRatio = activeWidth / maxNodeSize\n const xScaling = xRatio < layoutNodes.length / 2 ? layoutNodes.length / 2 / xRatio : 1\n const scaling = Math.max(xScaling, yScaling)\n\n layoutNodes.forEach((d, i) => {\n const rX = scaling * activeWidth / 2\n const rY = scaling * activeHeight / 2 // maxNodeSize * layoutNodes.length / 4\n const angle = 2 * i * Math.PI / layoutNodes.length\n d.x = activeWidth / 2 + rX * Math.cos(angle)\n d.y = activeHeight / 2 + rY * Math.sin(angle)\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport function applyLayoutParallel<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number,\n orientation?: string\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const {\n layoutNonConnectedAside, layoutGroupOrder, layoutParallelSortConnectionsByGroup, layoutParallelNodesPerColumn,\n layoutParallelSubGroupsPerRow, nodeSize, layoutNodeGroup, layoutParallelNodeSubGroup, layoutParallelGroupSpacing,\n } = config\n\n const activeWidth = width - configuredNodeSize(nodeSize)\n const activeHeight = height - configuredNodeSize(nodeSize) - (nonConnectedNodes.length ? configuredNodeSize(nodeSize) * 5 : 0)\n\n // Handle connected nodes\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n const groupNames = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => {\n const groupNodes = layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName)\n const groupedBySubgroup = groupBy(groupNodes, d => getString(d, layoutParallelNodeSubGroup, d._index))\n const subgroups = Object.keys(groupedBySubgroup).map(name => ({\n nodes: groupedBySubgroup[name],\n name,\n }))\n\n return {\n name: groupName,\n nodes: groupNodes,\n subgroups,\n }\n })\n\n // Sort\n const group = groups.find(g => g.name === layoutParallelSortConnectionsByGroup)\n if (group) {\n const sortMap: Record<string, number> = {}\n let idx = 0\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(node => {\n node.links.forEach(link => {\n const linkTargetId = link?.target._id\n sortMap[linkTargetId] = idx\n idx = idx + 1\n })\n })\n })\n\n without(groups, group).forEach(g => {\n g.subgroups.forEach(subgroup => {\n subgroup.nodes.sort((a, b) => {\n return (sortMap[a._id] || 0) - (sortMap[b._id] || 0)\n })\n })\n })\n }\n\n const maxN = max(groups, d => d.nodes?.length)\n const labelApprxHeight = 40\n const labelMargin = 10\n const subgroupMargin = 40\n const maxNodeSize = getMaxNodeSize(layoutNodes, nodeSize)\n\n if (orientation === 'horizontal') {\n const minHorizontalStep = 2 * maxNodeSize + labelMargin\n const maxHorizontalStep = 3.5 * maxNodeSize + labelMargin\n const horizontalStep = clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 4 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize + labelApprxHeight + labelMargin\n\n let y0 = (groups.length < 2) ? height / 2 : 0\n groups.forEach(group => {\n let x0 = 0\n let dy = 0\n let subgroupMaxWidth = 0\n let groupWidth = 0\n let groupHeight = 0\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupRows = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let x = x0\n let y = y0 + dy\n subgroup.nodes.forEach(d => {\n x = x + horizontalStep\n d.x = x\n d.y = y\n groupWidth = Math.max(groupWidth, x)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n y += subgroupNodeStep\n x = x0\n }\n })\n\n const subgroupWidth = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep\n const subgroupHeight = subgroupRows * subgroupNodeStep\n subgroupMaxWidth = Math.max(subgroupMaxWidth, subgroupWidth)\n dy = dy + subgroupHeight + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dy = 0\n x0 = x0 + subgroupMaxWidth + subgroupMargin\n subgroupMaxWidth = 0\n }\n\n groupHeight = Math.max(groupHeight, y)\n // x0 += Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * horizontalStep + subgroupMargin\n })\n\n // Center group horizontally\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.x -= groupWidth / 2\n })\n })\n groupWidth = 0\n\n // Update y0 for the next group\n y0 = groupHeight + verticalStep\n })\n } else {\n const minHorizontalStep = 6 * maxNodeSize + labelMargin\n const maxHorizontalStep = 10 * maxNodeSize + labelMargin\n const horizontalStep = (maxNodeSize + layoutParallelGroupSpacing) || clamp(activeWidth / (maxN - 1), minHorizontalStep, maxHorizontalStep)\n\n const maxVerticalStep = maxNodeSize * 2.0 + labelApprxHeight\n const minVerticalStep = maxNodeSize * 1.5 + labelApprxHeight\n const verticalStep = clamp(activeHeight / (groups.length - 1), minVerticalStep, maxVerticalStep)\n const subgroupNodeStep = maxNodeSize * 2.0\n\n let x0 = (groups.length < 2) ? width / 2 : 0\n groups.forEach(group => {\n let y0 = 0\n let dx = 0 // Horizontal shift inside the group (column)\n let subgroupMaxHeight = 0\n let groupWidth = 0\n let groupHeight = 0\n\n let k = 0\n group.subgroups.forEach(subgroup => {\n const subgroupColumns = Math.ceil(subgroup.nodes.length / layoutParallelNodesPerColumn)\n let n = 0\n let y = y0\n let x = x0 + dx\n subgroup.nodes.forEach(d => {\n y = y + verticalStep\n d.x = x\n d.y = y\n groupHeight = Math.max(groupHeight, y)\n\n n = n + 1\n if (n >= layoutParallelNodesPerColumn) {\n n = 0\n x += subgroupNodeStep\n y = y0\n }\n })\n\n const subgroupHeight = Math.min(subgroup.nodes.length, layoutParallelNodesPerColumn) * verticalStep\n const subgroupWidth = subgroupColumns * subgroupNodeStep\n subgroupMaxHeight = Math.max(subgroupMaxHeight, subgroupHeight)\n dx = dx + subgroupWidth + subgroupMargin\n k = k + 1\n if (k >= layoutParallelSubGroupsPerRow) {\n k = 0\n dx = 0\n y0 = y0 + subgroupMaxHeight + subgroupMargin\n subgroupMaxHeight = 0\n }\n\n groupWidth = Math.max(groupWidth, x)\n })\n\n // Center group vertically\n group.subgroups.forEach(subgroup => {\n subgroup.nodes.forEach(d => {\n d.y -= groupHeight / 2\n })\n })\n groupHeight = 0\n\n // Update x0 for the next group\n x0 = groupWidth + horizontalStep\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n\nexport async function applyLayoutDagre<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n const { nodeSize, layoutNonConnectedAside, dagreLayoutSettings, nodeStrokeWidth, nodeLabel } = config\n\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { Graph } = await import('@unovis/graphlibrary')\n // eslint-disable-next-line @typescript-eslint/naming-convention,@typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { layout } = await import('@unovis/dagre-layout')\n\n // https://github.com/dagrejs/dagre/wiki\n const dagreGraph = new Graph() as graphlib.Graph<GraphNode<N, L>>\n\n // Set an object for the graph label\n dagreGraph.setGraph(dagreLayoutSettings)\n\n // Default to assigning a new object as a label for each new edge.\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n // Add nodes to the graph. The first argument is the node id. The second is\n // metadata about the node. In this case we're going to add labels to each of\n // our nodes.\n const labelApprxHeight = 40\n const nds = (layoutNonConnectedAside ? connectedNodes : nodes)\n nds.forEach(node => {\n dagreGraph.setNode(`${node._index}`, {\n label: getString(node, nodeLabel, node._index),\n width: getNumber(node, nodeSize, node._index) * 1.5 + getNumber(node, nodeStrokeWidth, node._index),\n height: labelApprxHeight + getNumber(node, nodeSize, node._index) * 1.5,\n originalNode: node,\n })\n })\n\n // Add edges to the graph.\n links.forEach(link => {\n dagreGraph.setEdge(\n `${link.source._index}`,\n `${link.target._index}`\n )\n })\n\n // Calculate the layout\n layout(dagreGraph)\n\n // Apply coordinates to the graph\n dagreGraph.nodes().forEach(d => {\n const node = dagreGraph.node(d) as Node<GraphNode<N, L>> & { originalNode: GraphNode<N, L>}\n node.originalNode.x = node.x // width * d.x / dagreGraph._label.width\n node.originalNode.y = node.y // height * d.y / dagreGraph._label.height\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxNodeSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxNodeSize * 3, maxNodeSize * 2.25, Math.max(graphWidth, width), 0)\n }\n}\n\nexport function applyLayoutConcentric<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number,\n height: number\n): void {\n const { nonConnectedNodes, connectedNodes, nodes } = datamodel\n const { layoutNonConnectedAside, layoutGroupOrder, nodeSize, layoutNodeGroup } = config\n\n const layoutNodes = layoutNonConnectedAside ? connectedNodes : nodes\n\n const groupNames: string[] = unique(layoutNodes.map(d => getString(d, layoutNodeGroup, d._index)))\n const groupNamesSorted: string[] = sortBy(groupNames, d => layoutGroupOrder.indexOf(d))\n\n const groups = groupNamesSorted.map(groupName => ({\n name: groupName,\n nodes: layoutNodes.filter(d => getString(d, layoutNodeGroup, d._index) === groupName),\n }))\n\n // Handle connected nodes\n let r = 2 * getAverageNodeSize(groups[0]?.nodes ?? [], nodeSize)\n const widthToHeightRatio = width / height\n\n groups.forEach((group, i) => {\n const avgNodeSize = getAverageNodeSize(group.nodes, nodeSize)\n const requiredRadius = 1.1 * avgNodeSize * group.nodes.length / Math.PI\n if (r < requiredRadius) r = requiredRadius\n\n group.nodes.forEach((node, j) => {\n // If the first (central) group has only one node\n if (i === 0 && group.nodes.length === 1) {\n node.x = width / 2\n node.y = height / 2\n } else {\n let dAngle = 0\n if (i === 0 && group.nodes.length === 3) dAngle = Math.PI / 6\n if (i === 0 && group.nodes.length === 4) dAngle = Math.PI / 4\n const angle = 2 * j * Math.PI / group.nodes.length + i * Math.PI / 12 + dAngle\n node.x = width / 2 + r * Math.cos(angle) * widthToHeightRatio\n node.y = height / 2 + r * Math.sin(angle)\n }\n })\n\n const groupSpacing = avgNodeSize * 3\n r += groupSpacing\n })\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, graphWidth, minX)\n }\n}\n\nexport async function applyLayoutForce<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const { layoutNonConnectedAside, forceLayoutSettings, nodeSize } = config\n\n const { forceSimulation, forceLink, forceManyBody, forceX, forceY, forceCollide } = await import('d3-force')\n\n const { nonConnectedNodes, connectedNodes, nodes, links } = datamodel\n\n\n // Apply fx and fy to nodes if present before running the simulation\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n d.fx = isNil(d._state.fx) ? undefined : d._state.fx\n d.fy = isNil(d._state.fy) ? undefined : d._state.fy\n })\n } else {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n delete d._state.fx\n delete d._state.fy\n })\n }\n\n const simulation = forceSimulation(layoutNonConnectedAside ? connectedNodes : nodes)\n .force('link', forceLink(links)\n .id((d) => String((d as GraphNode<N, L>)._id))\n .distance((l, i) => isFunction(forceLayoutSettings.linkDistance) ? forceLayoutSettings.linkDistance(l, i) : forceLayoutSettings.linkDistance)\n .strength((l, i) => isFunction(forceLayoutSettings.linkStrength) ? forceLayoutSettings.linkStrength(l, i) : forceLayoutSettings.linkStrength)\n )\n .force('charge', forceManyBody().strength((d, i) => {\n if (isFunction(forceLayoutSettings.charge)) {\n return forceLayoutSettings.charge(d as GraphNode<N, L>, i)\n } else {\n const linkCount = links.reduce((count, l) => count + Number((l.source === d) || (l.target === d)), 0)\n return forceLayoutSettings.charge * Math.sqrt(linkCount)\n }\n }))\n .force('x', forceX().strength(forceLayoutSettings.forceXStrength))\n .force('y', forceY().strength(forceLayoutSettings.forceYStrength))\n .force('collide', forceCollide<SimulationNodeDatum & N>().radius((d, i) => getNodeSize(d, nodeSize, i)).iterations(1))\n .stop()\n\n // See https://bl.ocks.org/mbostock/1667139, https://github.com/d3/d3-force/blob/master/README.md#simulation_tick\n const numIterations = forceLayoutSettings.numIterations ?? Math.ceil(Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay()))\n for (let i = 0, n = numIterations; i < n; ++i) {\n simulation.tick()\n }\n\n // Fix node positions to `_state` if requested.\n // And remove fx and fy from the node datum if present to make sure the nodes are not fixed\n // if the layout was changed to a different layout and then back to force\n if (forceLayoutSettings.fixNodePositionAfterSimulation) {\n nodes.forEach((d: GraphForceSimulationNode<N, L>) => {\n delete d.fx\n delete d.fy\n d._state.fx = d.x\n d._state.fy = d.y\n })\n }\n\n // Handle non-connected nodes\n if (layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(nonConnectedNodes, nodeSize)\n const maxY = max<number>(connectedNodes.map(d => d.y))\n const maxX = max<number>(connectedNodes.map(d => d.x))\n const minX = min<number>(connectedNodes.map(d => d.x))\n const graphWidth = maxX - minX\n positionNonConnectedNodes(nonConnectedNodes, maxY + maxSize * 6, maxSize * 2.25, Math.max(graphWidth, width), minX)\n }\n}\n\nexport async function applyELKLayout<N extends GraphInputNode, L extends GraphInputLink> (\n datamodel: GraphDataModel<N, L, GraphNode<N, L>, GraphLink<N, L>>,\n config: GraphConfigInterface<N, L>,\n width: number\n): Promise<void> {\n const ELK = (await import('elkjs/lib/elk.bundled.js')).default\n const elk = new ELK()\n\n const labelApprxHeight = 30\n const nodes = datamodel.nodes.map(n => ({\n ...n,\n id: n._id,\n width: getNumber(n, config.nodeSize, n._index) + getNumber(n, config.nodeStrokeWidth, n._index),\n height: getNumber(n, config.nodeSize, n._index) + labelApprxHeight,\n }))\n\n let elkNodes: (GraphNode<N, L> | GraphElkHierarchyNode<N, L>)[]\n if (config.layoutElkNodeGroups) {\n const groupingFunctions = config.layoutElkNodeGroups\n .map(accessor => (d: GraphNode<N, L>) => getString(d, accessor, d._index)) as [(d: GraphNode<N, L>) => string]\n const grouped = group(nodes, ...groupingFunctions)\n elkNodes = toElkHierarchy(grouped, config.layoutElkSettings)\n } else {\n elkNodes = nodes\n }\n\n const rootNodeId = 'root'\n const elkGraph: ElkNode = {\n id: rootNodeId,\n layoutOptions: merge(DEFAULT_ELK_SETTINGS, getValue(rootNodeId, config.layoutElkSettings)),\n children: elkNodes as ElkNode[],\n edges: datamodel.links.map(l => ({\n id: l._id,\n sources: [l.source._id],\n targets: [l.target._id],\n })),\n }\n\n const layout = await elk.layout(elkGraph)\n adjustElkHierarchyCoordinates(layout)\n\n nodes.forEach((node, i) => {\n const found = datamodel.nodes.find(n => n._id === node.id)\n if (!found) return\n\n found.x = node.x\n found.y = node.y\n })\n\n // Handle non-connected nodes\n if (config.layoutNonConnectedAside) {\n const maxSize = getMaxNodeSize(datamodel.nonConnectedNodes, config.nodeSize)\n const maxY = max<number>(datamodel.connectedNodes.map(d => d.y)) || 0\n const maxX = max<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const minX = min<number>(datamodel.connectedNodes.map(d => d.x)) || 0\n const graphWidth = (maxX - minX) || width\n positionNonConnectedNodes(datamodel.nonConnectedNodes, maxY + maxSize * 3, maxSize * 2.25, Math.max(graphWidth, width))\n }\n}\n"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ function createNodes(selection, config, duration, scale = 1) {
30
30
  .attr('opacity', 0);
31
31
  // If there's a custom render function, use it
32
32
  if (config.nodeEnterCustomRenderFunction) {
33
- config.nodeEnterCustomRenderFunction(d, element, config, duration, scale);
33
+ config.nodeEnterCustomRenderFunction(d, group, config, duration, scale);
34
34
  }
35
35
  else { // Default node rendering
36
36
  const shape = getString(d, config.nodeShape, d._index);
@@ -82,7 +82,8 @@ function updateNodes(selection, config, duration, scale = 1) {
82
82
  // If there's a custom render function, use it
83
83
  if (config.nodeUpdateCustomRenderFunction) {
84
84
  selection.each((d, i, elements) => {
85
- config.nodeUpdateCustomRenderFunction(d, elements[i], config, duration, scale);
85
+ const g = select(elements[i]);
86
+ config.nodeUpdateCustomRenderFunction(d, g, config, duration, scale);
86
87
  });
87
88
  return nodeGroupsUpdate;
88
89
  }
@@ -267,7 +268,8 @@ function removeNodes(selection, config, duration, scale = 1) {
267
268
  // If there's a custom render function, use it
268
269
  if (config.nodeExitCustomRenderFunction) {
269
270
  selection.each((d, i, elements) => {
270
- config.nodeExitCustomRenderFunction(d, elements[i], config, duration, scale);
271
+ const g = select(elements[i]);
272
+ config.nodeExitCustomRenderFunction(d, g, config, duration, scale);
271
273
  });
272
274
  }
273
275
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/graph/modules/node/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { arc } from 'd3-shape'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\nimport { TrimMode } from 'types/text'\n\n// Utils\nimport { trimString } from 'utils/text'\nimport { polygon } from 'utils/path'\nimport { smartTransition } from 'utils/d3'\nimport { getBoolean, getNumber, getString, getValue, throttle } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { isStringSvg } from 'utils/svg'\n\n// Local Types\nimport { GraphNode, GraphCircleLabel, GraphNodeAnimationState, GraphNodeAnimatedElement, GraphNodeShape } from '../../types'\n\n// Config\nimport { GraphConfigInterface } from '../../config'\n\n// Helpers\nimport {\n arcTween,\n polyTween,\n setLabelRect,\n getX,\n getY,\n getSideLabelTextColor,\n getNodeColor,\n getNodeIconColor,\n getNodeSize,\n LABEL_RECT_VERTICAL_PADDING,\n isInternalHref,\n} from './helper'\nimport { appendShape, updateShape } from '../shape'\nimport { ZoomLevel } from '../zoom-levels'\n\n// Styles\nimport * as generalSelectors from '../../style'\nimport * as nodeSelectors from './style'\n\nconst SIDE_LABEL_DEFAULT_RADIUS = 10\n\nexport interface GraphNodeSVGGElement extends SVGGElement {\n nodeShape?: string;\n nodeIcon?: string;\n}\n\nexport function createNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n duration: number,\n scale = 1\n): void {\n selection.each((d, i, elements) => {\n const element = elements[i] as GraphNodeSVGGElement\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n group\n .attr('transform', (d: GraphNode<N, L>, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeEnterPosition, i)\n const scale = getNumber(d, config.nodeEnterScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .attr('opacity', 0)\n\n // If there's a custom render function, use it\n if (config.nodeEnterCustomRenderFunction) {\n config.nodeEnterCustomRenderFunction(d, element, config, duration, scale)\n } else { // Default node rendering\n const shape = getString(d, config.nodeShape, d._index) as GraphNodeShape\n // Todo: The 'nodeShape' and `nodeIcon` storing logic below it a temporary solution,\n // we need a cleaner implementation\n element.nodeShape = shape\n appendShape(group, shape, nodeSelectors.node, nodeSelectors.customNode, d._index)\n appendShape(group, shape, nodeSelectors.nodeSelection, nodeSelectors.customNode, d._index)\n group.append('path').attr('class', nodeSelectors.nodeGauge)\n group.append('g').attr('class', nodeSelectors.nodeIcon)\n\n group.append('g')\n .attr('class', nodeSelectors.sideLabelsGroup)\n\n group.append('text')\n .attr('class', nodeSelectors.nodeBottomIcon)\n }\n\n // Label\n const label = group.append('g').attr('class', nodeSelectors.label)\n label.append('rect').attr('class', nodeSelectors.labelBackground)\n\n const labelText = label.append('text')\n .attr('class', nodeSelectors.labelText)\n .attr('dy', '0.32em')\n labelText.append('tspan').attr('class', nodeSelectors.labelTextContent)\n labelText.append('tspan')\n .attr('class', nodeSelectors.subLabelTextContent)\n .attr('dy', '1.1em')\n .attr('x', '0')\n })\n}\n\nexport function updateNodeSelectedGreyout<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>\n): void {\n const { nodeDisabled } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> = select(elements[i])\n const isGreyout = getBoolean(d, nodeDisabled, d._index) || d._state.greyout\n\n group.classed(nodeSelectors.greyedOutNode, isGreyout)\n .classed(nodeSelectors.draggable, !config.disableDrag)\n\n const nodeSelectionOutline = group.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.nodeSelection}`)\n nodeSelectionOutline.classed(nodeSelectors.nodeSelectionActive, d._state.selected)\n\n group.selectAll<SVGTextElement, GraphCircleLabel>(`.${nodeSelectors.sideLabel}`)\n .style('fill', (l) => isGreyout ? null : getSideLabelTextColor(l, selection.node()))\n\n group.selectAll<SVGRectElement, GraphCircleLabel>(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', (l) => isGreyout ? null : l.color)\n })\n}\n\nexport function updateNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n duration: number,\n scale = 1\n): Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> | Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> {\n const {\n nodeGaugeAnimDuration, nodeStrokeWidth, nodeShape, nodeSize, nodeGaugeValue, nodeGaugeFill,\n nodeIcon, nodeIconSize, nodeLabel, nodeLabelTrim, nodeLabelTrimMode, nodeLabelTrimLength,\n nodeSubLabel, nodeSubLabelTrim, nodeSubLabelTrimMode, nodeSubLabelTrimLength,\n nodeSideLabels, nodeStroke, nodeFill, nodeBottomIcon,\n } = config\n\n const nodeGroupsUpdate = smartTransition(selection, duration)\n .attr('transform', d => `translate(${getX(d)}, ${getY(d)}) scale(1)`)\n .attr('opacity', 1)\n\n // If there's a custom render function, use it\n if (config.nodeUpdateCustomRenderFunction) {\n selection.each((d, i, elements) => {\n config.nodeUpdateCustomRenderFunction(d, elements[i], config, duration, scale)\n })\n\n return nodeGroupsUpdate\n }\n\n // Default node rendering\n // Re-create nodes to update shapes if they were changed\n selection.each((d, i, elements) => {\n const element = elements[i] as GraphNodeSVGGElement\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n const shape = getString(d, nodeShape, d._index)\n\n if (element.nodeShape !== shape) {\n group.select(`.${nodeSelectors.node}`).remove()\n appendShape(group, nodeShape, nodeSelectors.node, nodeSelectors.customNode, d._index, `.${nodeSelectors.nodeSelection}`)\n group.select(`.${nodeSelectors.nodeSelection}`).remove()\n appendShape(group, shape, nodeSelectors.nodeSelection, null, d._index, `.${nodeSelectors.nodeGauge}`)\n element.nodeShape = shape\n }\n })\n\n // Update nodes themselves\n selection.each((d, i, elements) => {\n const groupElement = elements[i] as GraphNodeSVGGElement\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> = select(groupElement)\n const node: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> = group.select(`.${nodeSelectors.node}`)\n const nodeArc = group.select<GraphNodeAnimatedElement<SVGElement>>(`.${nodeSelectors.nodeGauge}`)\n const icon = group.select<SVGTextElement>(`.${nodeSelectors.nodeIcon}`)\n const sideLabelsGroup = group.select<SVGGElement>(`.${nodeSelectors.sideLabelsGroup}`)\n const label = group.select<SVGGElement>(`.${nodeSelectors.label}`)\n const labelTextContent = label.select<SVGTextElement>(`.${nodeSelectors.labelTextContent}`)\n const sublabelTextContent = label.select<SVGTextElement>(`.${nodeSelectors.subLabelTextContent}`)\n const bottomIcon = group.select<SVGTextElement>(`.${nodeSelectors.nodeBottomIcon}`)\n const nodeSelectionOutline = group.select<SVGGElement>(`.${nodeSelectors.nodeSelection}`)\n const nodeSizeValue = getNodeSize(d, nodeSize, d._index)\n const arcGenerator = arc<GraphNodeAnimationState>()\n .innerRadius(state => state.nodeSize / 2 - state.borderWidth / 2)\n .outerRadius(state => state.nodeSize / 2 + state.borderWidth / 2)\n .startAngle(0 * (Math.PI / 180))\n // eslint-disable-next-line dot-notation\n .endAngle(a => a['endAngle'])\n\n group\n .classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n .classed(nodeSelectors.nodeIsDragged, (d: GraphNode<N, L>) => d._state.isDragged)\n\n // Update Group\n group\n .classed(nodeSelectors.nodePolygon, () => {\n const shape = getString(d, nodeShape, d._index)\n return shape === GraphNodeShape.Triangle || shape === GraphNodeShape.Hexagon || shape === GraphNodeShape.Square\n })\n\n // Update Node\n node\n .call(updateShape, nodeShape, nodeSize, d._index)\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index) ?? 0)\n .style('fill', getNodeColor(d, nodeFill, d._index))\n .style('stroke', getColor(d, nodeStroke, d._index, true) ?? null)\n\n const nodeBBox = (node.node() as SVGGraphicsElement).getBBox()\n\n nodeArc\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index))\n .style('display', !getNumber(d, nodeGaugeValue, d._index) ? 'none' : null)\n .style('fill', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke-opacity', d => getString(d, nodeShape, d._index) === GraphNodeShape.Circle ? 0 : null)\n\n nodeArc\n .transition()\n .duration(nodeGaugeAnimDuration)\n .attrTween('d', (\n d,\n j,\n arr\n ) => {\n switch (getString(d, nodeShape, d._index)) {\n case GraphNodeShape.Circle: return arcTween(d, config, arcGenerator, arr[j])\n case GraphNodeShape.Hexagon: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Square: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Triangle: return polyTween(d, config, polygon, arr[j])\n default: return null\n }\n })\n\n // Set Node Selection\n updateShape(nodeSelectionOutline, nodeShape, nodeSize, d._index)\n\n // Update Node Icon\n const prevNodeIconValue = groupElement.nodeIcon\n const nodeIconValue = getString(d, nodeIcon, d._index)\n const nodeIconSizeValue = getNumber(d, nodeIconSize, d._index) ?? 2.5 * Math.sqrt(nodeSizeValue)\n const nodeIconColor = getNodeIconColor(d, nodeFill, d._index, selection.node())\n const shouldRenderUseElement = isInternalHref(nodeIconValue)\n\n if (prevNodeIconValue !== nodeIconValue) {\n // If the icon has changed, we remove all children and re-render\n icon.selectAll('*').remove()\n // If the icon is a href, we need to append a <use> element. If it's a text we append the `<text>` element.\n icon.append(shouldRenderUseElement ? 'use' : 'text')\n groupElement.nodeIcon = nodeIconValue\n }\n\n if (shouldRenderUseElement) {\n icon.select('use')\n .attr('href', nodeIconValue)\n .attr('x', -nodeIconSizeValue / 2)\n .attr('y', -nodeIconSizeValue / 2)\n .attr('width', nodeIconSizeValue)\n .attr('height', nodeIconSizeValue)\n .style('fill', nodeIconColor)\n } else {\n icon.select('text')\n .style('font-size', `${nodeIconSizeValue}px`)\n .attr('dy', '0.1em')\n .style('fill', nodeIconColor)\n .html(nodeIconValue)\n }\n\n // Side Labels\n const sideLabelsData = getValue<GraphNode<N, L>, GraphCircleLabel[]>(d, nodeSideLabels, d._index) || []\n const sideLabels = sideLabelsGroup.selectAll<SVGGElement, GraphCircleLabel>('g').data(sideLabelsData)\n const sideLabelsEnter = sideLabels.enter().append('g')\n .attr('class', nodeSelectors.sideLabelGroup)\n sideLabelsEnter.append('circle')\n .attr('class', nodeSelectors.sideLabelBackground)\n .attr('r', l => l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)\n sideLabelsEnter.append('text')\n .attr('class', nodeSelectors.sideLabel)\n\n const sideLabelsUpdate = sideLabels.merge(sideLabelsEnter)\n .style('cursor', l => l.cursor ?? null)\n\n // Side label text\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabel}`).html(d => d.text)\n .attr('dy', '0.1em')\n .style('fill', l => l.textColor ?? getSideLabelTextColor(l, selection.node()))\n .style('font-size', l => l.fontSize ?? `${(2 + (l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)) / Math.pow(l.text.toString().length, 0.3)}px`)\n // Side label circle background\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', l => l.color)\n\n sideLabelsUpdate.attr('transform', (l, j) => {\n if (sideLabelsData.length === 1) return `translate(${nodeSizeValue / 2.5}, ${-nodeSizeValue / 2.5})`\n const r = 1.05 * nodeSizeValue / 2\n const angle = j * 1.15 * 2 * Math.atan2(l.radius ?? SIDE_LABEL_DEFAULT_RADIUS, r) - Math.PI / 3\n return `translate(${r * Math.cos(angle)}, ${r * Math.sin(angle)})`\n })\n\n sideLabels.exit().remove()\n\n // Set label and sub-label text\n const labelText = getString(d, nodeLabel, d._index)\n const sublabelText = getString(d, nodeSubLabel, d._index)\n const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index)\n ? trimString(labelText, getNumber(d, nodeLabelTrimLength, d._index), getValue(d, nodeLabelTrimMode as TrimMode, d._index))\n : labelText\n const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index)\n ? trimString(sublabelText, getNumber(d, nodeSubLabelTrimLength, d._index), getValue(d, nodeSubLabelTrimMode as TrimMode, d._index))\n : sublabelText\n\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n group\n .on('mouseenter', () => {\n labelTextContent.text(labelText)\n sublabelTextContent.text(sublabelText)\n setLabelRect(label, labelText, nodeSelectors.labelText)\n group.raise()\n })\n .on('mouseleave', () => {\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n setLabelRect(label, labelTextTrimmed, nodeSelectors.labelText)\n })\n\n // Position label\n const labelFontSize = parseFloat(window.getComputedStyle(groupElement).getPropertyValue('--vis-graph-node-label-font-size')) || 12\n const labelMargin = LABEL_RECT_VERTICAL_PADDING + 1.25 * labelFontSize ** 1.03\n const nodeHeight = isStringSvg((getString(d, nodeShape, d._index)) as GraphNodeShape) ? nodeBBox.height : nodeSizeValue\n label.attr('transform', `translate(0, ${nodeHeight / 2 + labelMargin})`)\n if (scale >= ZoomLevel.Level3) setLabelRect(label, getString(d, nodeLabel, d._index), nodeSelectors.labelText)\n\n // Bottom Icon\n bottomIcon.html(getString(d, nodeBottomIcon, d._index))\n .attr('transform', `translate(0, ${nodeHeight / 2})`)\n })\n\n updateNodeSelectedGreyout(selection, config)\n\n return nodeGroupsUpdate\n}\n\nexport function removeNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n duration: number,\n scale = 1\n): void {\n smartTransition(selection, duration / 2)\n .attr('opacity', 0)\n .attr('transform', (d, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeExitPosition, i)\n const scale = getNumber(d, config.nodeExitScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .remove()\n\n // If there's a custom render function, use it\n if (config.nodeExitCustomRenderFunction) {\n selection.each((d, i, elements) => {\n config.nodeExitCustomRenderFunction(d, elements[i], config, duration, scale)\n })\n }\n}\n\nfunction setLabelBackgroundRect<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>\n): void {\n const { nodeLabel } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, N, SVGGElement, N> = select(elements[i])\n const label: Selection<SVGGElement, N, SVGGElement, N> = group.select(`.${nodeSelectors.label}`)\n setLabelRect(label, getString(d, nodeLabel, i), nodeSelectors.labelText)\n })\n}\n\nconst setLabelBackgroundRectThrottled = throttle(setLabelBackgroundRect, 1000) as typeof setLabelBackgroundRect\n\nexport function zoomNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n scale: number\n): void {\n selection.classed(generalSelectors.zoomOutLevel1, scale < ZoomLevel.Level1)\n selection.classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n\n selection.selectAll(`${nodeSelectors.sideLabelBackground}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.35)})`)\n selection.selectAll(`.${nodeSelectors.sideLabel}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.45)})`)\n\n if (scale >= ZoomLevel.Level3 && !config.nodeEnterCustomRenderFunction) selection.call(setLabelBackgroundRectThrottled, config)\n}\n\nexport const zoomNodesThrottled = throttle(zoomNodes, 500)\n"],"names":["nodeSelectors.node","nodeSelectors.customNode","nodeSelectors.nodeSelection","nodeSelectors.nodeGauge","nodeSelectors.nodeIcon","nodeSelectors.sideLabelsGroup","nodeSelectors.nodeBottomIcon","label","nodeSelectors.label","nodeSelectors.labelBackground","labelText","nodeSelectors.labelText","nodeSelectors.labelTextContent","nodeSelectors.subLabelTextContent","nodeSelectors.greyedOutNode","nodeSelectors.draggable","nodeSelectors.nodeSelectionActive","nodeSelectors.sideLabel","nodeSelectors.sideLabelBackground","nodeIcon","nodeBottomIcon","node","sideLabelsGroup","labelTextContent","generalSelectors.zoomOutLevel2","nodeSelectors.nodeIsDragged","nodeSelectors.nodePolygon","nodeSelectors.sideLabelGroup","generalSelectors.zoomOutLevel1"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/graph/modules/node/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { arc } from 'd3-shape'\n\n// Types\nimport { GraphInputLink, GraphInputNode } from 'types/graph'\nimport { TrimMode } from 'types/text'\n\n// Utils\nimport { trimString } from 'utils/text'\nimport { polygon } from 'utils/path'\nimport { smartTransition } from 'utils/d3'\nimport { getBoolean, getNumber, getString, getValue, throttle } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { isStringSvg } from 'utils/svg'\n\n// Local Types\nimport { GraphNode, GraphCircleLabel, GraphNodeAnimationState, GraphNodeAnimatedElement, GraphNodeShape } from '../../types'\n\n// Config\nimport { GraphConfigInterface } from '../../config'\n\n// Helpers\nimport {\n arcTween,\n polyTween,\n setLabelRect,\n getX,\n getY,\n getSideLabelTextColor,\n getNodeColor,\n getNodeIconColor,\n getNodeSize,\n LABEL_RECT_VERTICAL_PADDING,\n isInternalHref,\n} from './helper'\nimport { appendShape, updateShape } from '../shape'\nimport { ZoomLevel } from '../zoom-levels'\n\n// Styles\nimport * as generalSelectors from '../../style'\nimport * as nodeSelectors from './style'\n\nconst SIDE_LABEL_DEFAULT_RADIUS = 10\n\nexport interface GraphNodeSVGGElement extends SVGGElement {\n nodeShape?: string;\n nodeIcon?: string;\n}\n\nexport function createNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n duration: number,\n scale = 1\n): void {\n selection.each((d, i, elements) => {\n const element = elements[i] as GraphNodeSVGGElement\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n group\n .attr('transform', (d: GraphNode<N, L>, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeEnterPosition, i)\n const scale = getNumber(d, config.nodeEnterScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .attr('opacity', 0)\n\n // If there's a custom render function, use it\n if (config.nodeEnterCustomRenderFunction) {\n config.nodeEnterCustomRenderFunction(d, group, config, duration, scale)\n } else { // Default node rendering\n const shape = getString(d, config.nodeShape, d._index) as GraphNodeShape\n // Todo: The 'nodeShape' and `nodeIcon` storing logic below it a temporary solution,\n // we need a cleaner implementation\n element.nodeShape = shape\n appendShape(group, shape, nodeSelectors.node, nodeSelectors.customNode, d._index)\n appendShape(group, shape, nodeSelectors.nodeSelection, nodeSelectors.customNode, d._index)\n group.append('path').attr('class', nodeSelectors.nodeGauge)\n group.append('g').attr('class', nodeSelectors.nodeIcon)\n\n group.append('g')\n .attr('class', nodeSelectors.sideLabelsGroup)\n\n group.append('text')\n .attr('class', nodeSelectors.nodeBottomIcon)\n }\n\n // Label\n const label = group.append('g').attr('class', nodeSelectors.label)\n label.append('rect').attr('class', nodeSelectors.labelBackground)\n\n const labelText = label.append('text')\n .attr('class', nodeSelectors.labelText)\n .attr('dy', '0.32em')\n labelText.append('tspan').attr('class', nodeSelectors.labelTextContent)\n labelText.append('tspan')\n .attr('class', nodeSelectors.subLabelTextContent)\n .attr('dy', '1.1em')\n .attr('x', '0')\n })\n}\n\nexport function updateNodeSelectedGreyout<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>\n): void {\n const { nodeDisabled } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> = select(elements[i])\n const isGreyout = getBoolean(d, nodeDisabled, d._index) || d._state.greyout\n\n group.classed(nodeSelectors.greyedOutNode, isGreyout)\n .classed(nodeSelectors.draggable, !config.disableDrag)\n\n const nodeSelectionOutline = group.selectAll<SVGGElement, GraphNode<N, L>>(`.${nodeSelectors.nodeSelection}`)\n nodeSelectionOutline.classed(nodeSelectors.nodeSelectionActive, d._state.selected)\n\n group.selectAll<SVGTextElement, GraphCircleLabel>(`.${nodeSelectors.sideLabel}`)\n .style('fill', (l) => isGreyout ? null : getSideLabelTextColor(l, selection.node()))\n\n group.selectAll<SVGRectElement, GraphCircleLabel>(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', (l) => isGreyout ? null : l.color)\n })\n}\n\nexport function updateNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n duration: number,\n scale = 1\n): Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> | Transition<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> {\n const {\n nodeGaugeAnimDuration, nodeStrokeWidth, nodeShape, nodeSize, nodeGaugeValue, nodeGaugeFill,\n nodeIcon, nodeIconSize, nodeLabel, nodeLabelTrim, nodeLabelTrimMode, nodeLabelTrimLength,\n nodeSubLabel, nodeSubLabelTrim, nodeSubLabelTrimMode, nodeSubLabelTrimLength,\n nodeSideLabels, nodeStroke, nodeFill, nodeBottomIcon,\n } = config\n\n const nodeGroupsUpdate = smartTransition(selection, duration)\n .attr('transform', d => `translate(${getX(d)}, ${getY(d)}) scale(1)`)\n .attr('opacity', 1)\n\n // If there's a custom render function, use it\n if (config.nodeUpdateCustomRenderFunction) {\n selection.each((d, i, elements) => {\n const g = select<SVGGElement, GraphNode<N, L>>(elements[i])\n config.nodeUpdateCustomRenderFunction(d, g, config, duration, scale)\n })\n\n return nodeGroupsUpdate\n }\n\n // Default node rendering\n // Re-create nodes to update shapes if they were changed\n selection.each((d, i, elements) => {\n const element = elements[i] as GraphNodeSVGGElement\n const group = select<SVGGElement, GraphNode<N, L>>(element)\n const shape = getString(d, nodeShape, d._index)\n\n if (element.nodeShape !== shape) {\n group.select(`.${nodeSelectors.node}`).remove()\n appendShape(group, nodeShape, nodeSelectors.node, nodeSelectors.customNode, d._index, `.${nodeSelectors.nodeSelection}`)\n group.select(`.${nodeSelectors.nodeSelection}`).remove()\n appendShape(group, shape, nodeSelectors.nodeSelection, null, d._index, `.${nodeSelectors.nodeGauge}`)\n element.nodeShape = shape\n }\n })\n\n // Update nodes themselves\n selection.each((d, i, elements) => {\n const groupElement = elements[i] as GraphNodeSVGGElement\n const group: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> = select(groupElement)\n const node: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown> = group.select(`.${nodeSelectors.node}`)\n const nodeArc = group.select<GraphNodeAnimatedElement<SVGElement>>(`.${nodeSelectors.nodeGauge}`)\n const icon = group.select<SVGTextElement>(`.${nodeSelectors.nodeIcon}`)\n const sideLabelsGroup = group.select<SVGGElement>(`.${nodeSelectors.sideLabelsGroup}`)\n const label = group.select<SVGGElement>(`.${nodeSelectors.label}`)\n const labelTextContent = label.select<SVGTextElement>(`.${nodeSelectors.labelTextContent}`)\n const sublabelTextContent = label.select<SVGTextElement>(`.${nodeSelectors.subLabelTextContent}`)\n const bottomIcon = group.select<SVGTextElement>(`.${nodeSelectors.nodeBottomIcon}`)\n const nodeSelectionOutline = group.select<SVGGElement>(`.${nodeSelectors.nodeSelection}`)\n const nodeSizeValue = getNodeSize(d, nodeSize, d._index)\n const arcGenerator = arc<GraphNodeAnimationState>()\n .innerRadius(state => state.nodeSize / 2 - state.borderWidth / 2)\n .outerRadius(state => state.nodeSize / 2 + state.borderWidth / 2)\n .startAngle(0 * (Math.PI / 180))\n // eslint-disable-next-line dot-notation\n .endAngle(a => a['endAngle'])\n\n group\n .classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n .classed(nodeSelectors.nodeIsDragged, (d: GraphNode<N, L>) => d._state.isDragged)\n\n // Update Group\n group\n .classed(nodeSelectors.nodePolygon, () => {\n const shape = getString(d, nodeShape, d._index)\n return shape === GraphNodeShape.Triangle || shape === GraphNodeShape.Hexagon || shape === GraphNodeShape.Square\n })\n\n // Update Node\n node\n .call(updateShape, nodeShape, nodeSize, d._index)\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index) ?? 0)\n .style('fill', getNodeColor(d, nodeFill, d._index))\n .style('stroke', getColor(d, nodeStroke, d._index, true) ?? null)\n\n const nodeBBox = (node.node() as SVGGraphicsElement).getBBox()\n\n nodeArc\n .attr('stroke-width', getNumber(d, nodeStrokeWidth, d._index))\n .style('display', !getNumber(d, nodeGaugeValue, d._index) ? 'none' : null)\n .style('fill', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke', getNodeColor(d, nodeGaugeFill, d._index))\n .style('stroke-opacity', d => getString(d, nodeShape, d._index) === GraphNodeShape.Circle ? 0 : null)\n\n nodeArc\n .transition()\n .duration(nodeGaugeAnimDuration)\n .attrTween('d', (\n d,\n j,\n arr\n ) => {\n switch (getString(d, nodeShape, d._index)) {\n case GraphNodeShape.Circle: return arcTween(d, config, arcGenerator, arr[j])\n case GraphNodeShape.Hexagon: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Square: return polyTween(d, config, polygon, arr[j])\n case GraphNodeShape.Triangle: return polyTween(d, config, polygon, arr[j])\n default: return null\n }\n })\n\n // Set Node Selection\n updateShape(nodeSelectionOutline, nodeShape, nodeSize, d._index)\n\n // Update Node Icon\n const prevNodeIconValue = groupElement.nodeIcon\n const nodeIconValue = getString(d, nodeIcon, d._index)\n const nodeIconSizeValue = getNumber(d, nodeIconSize, d._index) ?? 2.5 * Math.sqrt(nodeSizeValue)\n const nodeIconColor = getNodeIconColor(d, nodeFill, d._index, selection.node())\n const shouldRenderUseElement = isInternalHref(nodeIconValue)\n\n if (prevNodeIconValue !== nodeIconValue) {\n // If the icon has changed, we remove all children and re-render\n icon.selectAll('*').remove()\n // If the icon is a href, we need to append a <use> element. If it's a text we append the `<text>` element.\n icon.append(shouldRenderUseElement ? 'use' : 'text')\n groupElement.nodeIcon = nodeIconValue\n }\n\n if (shouldRenderUseElement) {\n icon.select('use')\n .attr('href', nodeIconValue)\n .attr('x', -nodeIconSizeValue / 2)\n .attr('y', -nodeIconSizeValue / 2)\n .attr('width', nodeIconSizeValue)\n .attr('height', nodeIconSizeValue)\n .style('fill', nodeIconColor)\n } else {\n icon.select('text')\n .style('font-size', `${nodeIconSizeValue}px`)\n .attr('dy', '0.1em')\n .style('fill', nodeIconColor)\n .html(nodeIconValue)\n }\n\n // Side Labels\n const sideLabelsData = getValue<GraphNode<N, L>, GraphCircleLabel[]>(d, nodeSideLabels, d._index) || []\n const sideLabels = sideLabelsGroup.selectAll<SVGGElement, GraphCircleLabel>('g').data(sideLabelsData)\n const sideLabelsEnter = sideLabels.enter().append('g')\n .attr('class', nodeSelectors.sideLabelGroup)\n sideLabelsEnter.append('circle')\n .attr('class', nodeSelectors.sideLabelBackground)\n .attr('r', l => l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)\n sideLabelsEnter.append('text')\n .attr('class', nodeSelectors.sideLabel)\n\n const sideLabelsUpdate = sideLabels.merge(sideLabelsEnter)\n .style('cursor', l => l.cursor ?? null)\n\n // Side label text\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabel}`).html(d => d.text)\n .attr('dy', '0.1em')\n .style('fill', l => l.textColor ?? getSideLabelTextColor(l, selection.node()))\n .style('font-size', l => l.fontSize ?? `${(2 + (l.radius ?? SIDE_LABEL_DEFAULT_RADIUS)) / Math.pow(l.text.toString().length, 0.3)}px`)\n // Side label circle background\n sideLabelsUpdate.select(`.${nodeSelectors.sideLabelBackground}`)\n .style('fill', l => l.color)\n\n sideLabelsUpdate.attr('transform', (l, j) => {\n if (sideLabelsData.length === 1) return `translate(${nodeSizeValue / 2.5}, ${-nodeSizeValue / 2.5})`\n const r = 1.05 * nodeSizeValue / 2\n const angle = j * 1.15 * 2 * Math.atan2(l.radius ?? SIDE_LABEL_DEFAULT_RADIUS, r) - Math.PI / 3\n return `translate(${r * Math.cos(angle)}, ${r * Math.sin(angle)})`\n })\n\n sideLabels.exit().remove()\n\n // Set label and sub-label text\n const labelText = getString(d, nodeLabel, d._index)\n const sublabelText = getString(d, nodeSubLabel, d._index)\n const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index)\n ? trimString(labelText, getNumber(d, nodeLabelTrimLength, d._index), getValue(d, nodeLabelTrimMode as TrimMode, d._index))\n : labelText\n const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index)\n ? trimString(sublabelText, getNumber(d, nodeSubLabelTrimLength, d._index), getValue(d, nodeSubLabelTrimMode as TrimMode, d._index))\n : sublabelText\n\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n group\n .on('mouseenter', () => {\n labelTextContent.text(labelText)\n sublabelTextContent.text(sublabelText)\n setLabelRect(label, labelText, nodeSelectors.labelText)\n group.raise()\n })\n .on('mouseleave', () => {\n labelTextContent.text(labelTextTrimmed)\n sublabelTextContent.text(sublabelTextTrimmed)\n setLabelRect(label, labelTextTrimmed, nodeSelectors.labelText)\n })\n\n // Position label\n const labelFontSize = parseFloat(window.getComputedStyle(groupElement).getPropertyValue('--vis-graph-node-label-font-size')) || 12\n const labelMargin = LABEL_RECT_VERTICAL_PADDING + 1.25 * labelFontSize ** 1.03\n const nodeHeight = isStringSvg((getString(d, nodeShape, d._index)) as GraphNodeShape) ? nodeBBox.height : nodeSizeValue\n label.attr('transform', `translate(0, ${nodeHeight / 2 + labelMargin})`)\n if (scale >= ZoomLevel.Level3) setLabelRect(label, getString(d, nodeLabel, d._index), nodeSelectors.labelText)\n\n // Bottom Icon\n bottomIcon.html(getString(d, nodeBottomIcon, d._index))\n .attr('transform', `translate(0, ${nodeHeight / 2})`)\n })\n\n updateNodeSelectedGreyout(selection, config)\n\n return nodeGroupsUpdate\n}\n\nexport function removeNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n duration: number,\n scale = 1\n): void {\n smartTransition(selection, duration / 2)\n .attr('opacity', 0)\n .attr('transform', (d, i) => {\n const configuredPosition = getValue<GraphNode<N, L>, [number, number] | undefined>(d, config.nodeExitPosition, i)\n const scale = getNumber(d, config.nodeExitScale, i) ?? 0\n const x = configuredPosition?.[0] ?? getX(d)\n const y = configuredPosition?.[1] ?? getY(d)\n return `translate(${x}, ${y}) scale(${scale})`\n })\n .remove()\n\n // If there's a custom render function, use it\n if (config.nodeExitCustomRenderFunction) {\n selection.each((d, i, elements) => {\n const g = select<SVGGElement, GraphNode<N, L>>(elements[i])\n config.nodeExitCustomRenderFunction(d, g, config, duration, scale)\n })\n }\n}\n\nfunction setLabelBackgroundRect<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>\n): void {\n const { nodeLabel } = config\n\n selection.each((d, i, elements) => {\n const group: Selection<SVGGElement, N, SVGGElement, N> = select(elements[i])\n const label: Selection<SVGGElement, N, SVGGElement, N> = group.select(`.${nodeSelectors.label}`)\n setLabelRect(label, getString(d, nodeLabel, i), nodeSelectors.labelText)\n })\n}\n\nconst setLabelBackgroundRectThrottled = throttle(setLabelBackgroundRect, 1000) as typeof setLabelBackgroundRect\n\nexport function zoomNodes<N extends GraphInputNode, L extends GraphInputLink> (\n selection: Selection<SVGGElement, GraphNode<N, L>, SVGGElement, unknown>,\n config: GraphConfigInterface<N, L>,\n scale: number\n): void {\n selection.classed(generalSelectors.zoomOutLevel1, scale < ZoomLevel.Level1)\n selection.classed(generalSelectors.zoomOutLevel2, scale < ZoomLevel.Level2)\n\n selection.selectAll(`${nodeSelectors.sideLabelBackground}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.35)})`)\n selection.selectAll(`.${nodeSelectors.sideLabel}`)\n .attr('transform', `scale(${1 / Math.pow(scale, 0.45)})`)\n\n if (scale >= ZoomLevel.Level3 && !config.nodeEnterCustomRenderFunction) selection.call(setLabelBackgroundRectThrottled, config)\n}\n\nexport const zoomNodesThrottled = throttle(zoomNodes, 500)\n"],"names":["nodeSelectors.node","nodeSelectors.customNode","nodeSelectors.nodeSelection","nodeSelectors.nodeGauge","nodeSelectors.nodeIcon","nodeSelectors.sideLabelsGroup","nodeSelectors.nodeBottomIcon","label","nodeSelectors.label","nodeSelectors.labelBackground","labelText","nodeSelectors.labelText","nodeSelectors.labelTextContent","nodeSelectors.subLabelTextContent","nodeSelectors.greyedOutNode","nodeSelectors.draggable","nodeSelectors.nodeSelectionActive","nodeSelectors.sideLabel","nodeSelectors.sideLabelBackground","nodeIcon","nodeBottomIcon","node","sideLabelsGroup","labelTextContent","generalSelectors.zoomOutLevel2","nodeSelectors.nodeIsDragged","nodeSelectors.nodePolygon","nodeSelectors.sideLabelGroup","generalSelectors.zoomOutLevel1"],"mappings":"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"}
@@ -13,11 +13,15 @@ export interface TooltipConfigInterface {
13
13
  allowHover?: boolean;
14
14
  /** Horizontal placement of the tooltip. Default: `Position.Auto` */
15
15
  horizontalPlacement?: Position | string | undefined;
16
- /** Horizontal shift of the tooltip in pixels. Default: `0` */
16
+ /** Horizontal shift of the tooltip in pixels. Works only with
17
+ * `horizontalPlacement` set to `Position.Left` or `Position.Right`.
18
+ * Default: `0` */
17
19
  horizontalShift?: number;
18
20
  /** Vertical placement of the tooltip. Default: `Position.Top` */
19
21
  verticalPlacement?: Position | string | undefined;
20
- /** Vertical shift of the tooltip in pixels. Default: `0` */
22
+ /** Vertical shift of the tooltip in pixels. Works only with
23
+ * `verticalPlacement` set to `Position.Top` or `Position.Bottom`.
24
+ * Default: `0` */
21
25
  verticalShift?: number;
22
26
  /** Defines the content of the tooltip and hovering over which elements should trigger it.
23
27
  * An object containing properties in the following format:
@@ -56,5 +60,7 @@ export interface TooltipConfigInterface {
56
60
  attributes?: {
57
61
  [attr: string]: string | number | boolean;
58
62
  };
63
+ /** Custom class name for the tooltip. Default: `undefined` */
64
+ className?: string;
59
65
  }
60
66
  export declare const TooltipDefaultConfig: TooltipConfigInterface;
@@ -12,6 +12,7 @@ const TooltipDefaultConfig = {
12
12
  verticalShift: 0,
13
13
  attributes: {},
14
14
  triggers: {},
15
+ className: undefined,
15
16
  };
16
17
 
17
18
  export { TooltipDefaultConfig };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/tooltip/config.ts"],"sourcesContent":["/* eslint-disable no-irregular-whitespace */\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\nexport interface TooltipConfigInterface {\n /** An array of visualization components to interact with. Default: `[]` */\n components?: ComponentCore<unknown>[];\n /** Container to where the Tooltip component should be inserted. Default: `undefined` */\n container?: HTMLElement;\n /** Follow the mouse cursor. If `true`, the tooltip can't be hovered over\n * even when `allowHover` is set to `true`. Default: `true` */\n followCursor?: boolean;\n /** Allow the tooltip to be hovered over and interacted with when `followCursor` is set to `false`.\n * Default: `true` */\n allowHover?: boolean;\n /** Horizontal placement of the tooltip. Default: `Position.Auto` */\n horizontalPlacement?: Position | string | undefined;\n /** Horizontal shift of the tooltip in pixels. Default: `0` */\n horizontalShift?: number;\n /** Vertical placement of the tooltip. Default: `Position.Top` */\n verticalPlacement?: Position | string | undefined;\n /** Vertical shift of the tooltip in pixels. Default: `0` */\n verticalShift?: number;\n /** Defines the content of the tooltip and hovering over which elements should trigger it.\n * An object containing properties in the following format:\n *\n * ```\n * {\n *  [selectorString]: (d: unknown) => string | HTMLElement\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  [Area.selectors.area]: (d: AreaDatum[]) => `<div>${d.value.toString()}</div>\n * }\n * ```\n */\n triggers?: {\n [selector: string]: ((data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null | void) | undefined | null;\n };\n /** Custom DOM attributes for the tooltip. Useful when you need to refer to a specific tooltip instance\n * by using a CSS selector. Attributes configuration object has the following structure:\n *\n * ```\n * {\n *  [attributeName]: attribute value\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  'type': 'area-tooltip',\n *  'value': 42\n * }\n * ```\n */\n attributes?: { [attr: string]: string | number | boolean };\n}\n\nexport const TooltipDefaultConfig: TooltipConfigInterface = {\n components: [],\n container: undefined,\n followCursor: true,\n allowHover: true,\n horizontalPlacement: Position.Auto,\n horizontalShift: 0,\n verticalPlacement: Position.Top,\n verticalShift: 0,\n attributes: {},\n triggers: {},\n}\n\n"],"names":[],"mappings":";;AAGA;AA2Da,MAAA,oBAAoB,GAA2B;AAC1D,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,UAAU,EAAE,IAAI;IAChB,mBAAmB,EAAE,QAAQ,CAAC,IAAI;AAClC,IAAA,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE,QAAQ,CAAC,GAAG;AAC/B,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,QAAQ,EAAE,EAAE;;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/tooltip/config.ts"],"sourcesContent":["/* eslint-disable no-irregular-whitespace */\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\nexport interface TooltipConfigInterface {\n /** An array of visualization components to interact with. Default: `[]` */\n components?: ComponentCore<unknown>[];\n /** Container to where the Tooltip component should be inserted. Default: `undefined` */\n container?: HTMLElement;\n /** Follow the mouse cursor. If `true`, the tooltip can't be hovered over\n * even when `allowHover` is set to `true`. Default: `true` */\n followCursor?: boolean;\n /** Allow the tooltip to be hovered over and interacted with when `followCursor` is set to `false`.\n * Default: `true` */\n allowHover?: boolean;\n /** Horizontal placement of the tooltip. Default: `Position.Auto` */\n horizontalPlacement?: Position | string | undefined;\n /** Horizontal shift of the tooltip in pixels. Works only with\n * `horizontalPlacement` set to `Position.Left` or `Position.Right`.\n * Default: `0` */\n horizontalShift?: number;\n /** Vertical placement of the tooltip. Default: `Position.Top` */\n verticalPlacement?: Position | string | undefined;\n /** Vertical shift of the tooltip in pixels. Works only with\n * `verticalPlacement` set to `Position.Top` or `Position.Bottom`.\n * Default: `0` */\n verticalShift?: number;\n /** Defines the content of the tooltip and hovering over which elements should trigger it.\n * An object containing properties in the following format:\n *\n * ```\n * {\n *  [selectorString]: (d: unknown) => string | HTMLElement\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  [Area.selectors.area]: (d: AreaDatum[]) => `<div>${d.value.toString()}</div>\n * }\n * ```\n */\n triggers?: {\n [selector: string]: ((data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null | void) | undefined | null;\n };\n /** Custom DOM attributes for the tooltip. Useful when you need to refer to a specific tooltip instance\n * by using a CSS selector. Attributes configuration object has the following structure:\n *\n * ```\n * {\n *  [attributeName]: attribute value\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  'type': 'area-tooltip',\n *  'value': 42\n * }\n * ```\n */\n attributes?: { [attr: string]: string | number | boolean };\n /** Custom class name for the tooltip. Default: `undefined` */\n className?: string;\n}\n\nexport const TooltipDefaultConfig: TooltipConfigInterface = {\n components: [],\n container: undefined,\n followCursor: true,\n allowHover: true,\n horizontalPlacement: Position.Auto,\n horizontalShift: 0,\n verticalPlacement: Position.Top,\n verticalShift: 0,\n attributes: {},\n triggers: {},\n className: undefined,\n}\n\n"],"names":[],"mappings":";;AAGA;AAiEa,MAAA,oBAAoB,GAA2B;AAC1D,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,SAAS,EAAE,SAAS;AACpB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,UAAU,EAAE,IAAI;IAChB,mBAAmB,EAAE,QAAQ,CAAC,IAAI;AAClC,IAAA,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE,QAAQ,CAAC,GAAG;AAC/B,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,SAAS,EAAE,SAAS;;;;;"}
@@ -13,8 +13,7 @@ class Tooltip {
13
13
  this._setContainerPositionThrottled = throttle(this._setContainerPosition, 500);
14
14
  this._isShown = false;
15
15
  this.element = document.createElement('div');
16
- this.div = select(this.element)
17
- .attr('class', root);
16
+ this.div = select(this.element).attr('class', root);
18
17
  this.setConfig(config);
19
18
  this.components = this.config.components;
20
19
  // Set up MutationObserver to automatically re-position the tooltip
@@ -101,7 +100,9 @@ class Tooltip {
101
100
  const verticalPlacement = config.verticalPlacement === Position.Auto
102
101
  ? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)
103
102
  : config.verticalPlacement;
104
- // dx and dy variables shift the tooltip from the default position (above the cursor, centred horizontally)
103
+ // Todo: Get rid of the hardcoded margin in version 2.0
104
+ // Can be simply replaced with `verticalShift` and `horizontalShift`
105
+ // but it'll be a breaking change
105
106
  const margin = 5;
106
107
  const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift
107
108
  : horizontalPlacement === Position.Center ? -tooltipWidth / 2
@@ -109,6 +110,7 @@ class Tooltip {
109
110
  const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift
110
111
  : verticalPlacement === Position.Center ? -tooltipHeight / 2
111
112
  : -margin - config.verticalShift - tooltipHeight;
113
+ // translateX and translateY variables shift the tooltip from the default position (above the cursor, centred horizontally)
112
114
  const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight);
113
115
  this._applyPosition(top, left, tooltipHeight);
114
116
  }
@@ -118,6 +120,9 @@ class Tooltip {
118
120
  // i.e. to re-position the tooltip if the content has been changed
119
121
  // by something else and it was captured by the MutationObserver
120
122
  this._hoveredElement = hoveredElement;
123
+ // Todo: Get rid of the hardcoded margin in version 2.0
124
+ // Can be simply replaced with `verticalShift` and `horizontalShift`
125
+ // but it'll be a breaking change
121
126
  const margin = 5;
122
127
  const tooltipWidth = this.element.offsetWidth;
123
128
  const tooltipHeight = this.element.offsetHeight;
@@ -139,10 +144,10 @@ class Tooltip {
139
144
  let translateX = 0;
140
145
  switch (horizontalPlacement) {
141
146
  case Position.Left:
142
- translateX = -tooltipWidth - margin;
147
+ translateX = -tooltipWidth - margin - config.horizontalShift;
143
148
  break;
144
149
  case Position.Right:
145
- translateX = hoveredElementRect.width + margin;
150
+ translateX = hoveredElementRect.width + margin + config.horizontalShift;
146
151
  break;
147
152
  case Position.Center:
148
153
  default:
@@ -159,11 +164,11 @@ class Tooltip {
159
164
  translateY += (tooltipHeight + hoveredElementRect.height) / 2;
160
165
  break;
161
166
  case Position.Bottom:
162
- translateY += tooltipHeight + hoveredElementRect.height + margin;
167
+ translateY += tooltipHeight + hoveredElementRect.height + margin + config.verticalShift;
163
168
  break;
164
169
  case Position.Top:
165
170
  default:
166
- translateY += -margin;
171
+ translateY += -margin - config.verticalShift;
167
172
  break;
168
173
  }
169
174
  const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight);
@@ -173,7 +178,8 @@ class Tooltip {
173
178
  return this._container === document.body;
174
179
  }
175
180
  render(html) {
176
- const { config } = this;
181
+ var _a;
182
+ const { config, prevConfig } = this;
177
183
  if (html instanceof HTMLElement) {
178
184
  const node = this.div.select(':first-child').node();
179
185
  if (node !== html)
@@ -183,7 +189,12 @@ class Tooltip {
183
189
  this.div.html(html);
184
190
  }
185
191
  this.div
192
+ .classed((_a = config.className) !== null && _a !== void 0 ? _a : '', Boolean(config.className))
186
193
  .classed(nonInteractive, !config.allowHover || config.followCursor);
194
+ // Remove the previous class name if it was set
195
+ if ((prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.className) && prevConfig.className !== config.className) {
196
+ this.div.classed(prevConfig.className, false);
197
+ }
187
198
  this.display();
188
199
  }
189
200
  _applyPosition(x, y, tooltipHeight) {