From aed35906f46d806d4b815f848c59412eee8fe70e Mon Sep 17 00:00:00 2001 From: plouc Date: Fri, 31 Dec 2021 14:51:52 +0900 Subject: [PATCH] feat(network): add support for canvas annotations --- packages/annotations/src/compute.ts | 3 +-- packages/annotations/src/hooks.ts | 6 ++--- packages/network/src/NetworkCanvas.tsx | 27 +++++++++++++++++-- .../scatterplot/src/ScatterPlotCanvas.tsx | 1 + website/src/data/components/network/props.ts | 2 +- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/annotations/src/compute.ts b/packages/annotations/src/compute.ts index 03be10a3e6..3a4af9f5f1 100644 --- a/packages/annotations/src/compute.ts +++ b/packages/annotations/src/compute.ts @@ -7,7 +7,6 @@ import { } from '@nivo/core' import { defaultProps } from './props' import { - AnnotationSpec, AnnotationPositionGetter, AnnotationDimensionsGetter, BoundAnnotation, @@ -89,7 +88,7 @@ export const getLinkAngle = ( } export const computeAnnotation = ( - annotation: Required> + annotation: BoundAnnotation ): AnnotationInstructions => { const { x, diff --git a/packages/annotations/src/hooks.ts b/packages/annotations/src/hooks.ts index 929e87aa3e..7f6e447622 100644 --- a/packages/annotations/src/hooks.ts +++ b/packages/annotations/src/hooks.ts @@ -4,7 +4,7 @@ import { AnnotationDimensionsGetter, AnnotationMatcher, AnnotationPositionGetter, - AnnotationSpec, + BoundAnnotation, } from './types' /** @@ -35,7 +35,7 @@ export const useAnnotations = ({ export const useComputedAnnotations = ({ annotations, }: { - annotations: Required>[] + annotations: BoundAnnotation[] }) => useMemo( () => @@ -48,5 +48,5 @@ export const useComputedAnnotations = ({ [annotations] ) -export const useComputedAnnotation = (annotation: Required>) => +export const useComputedAnnotation = (annotation: BoundAnnotation) => useMemo(() => computeAnnotation(annotation), [annotation]) diff --git a/packages/network/src/NetworkCanvas.tsx b/packages/network/src/NetworkCanvas.tsx index 96122a915e..b33a9ce7cc 100644 --- a/packages/network/src/NetworkCanvas.tsx +++ b/packages/network/src/NetworkCanvas.tsx @@ -1,9 +1,17 @@ import { useCallback, useRef, useEffect, createElement, MouseEvent } from 'react' import { getDistance, getRelativeCursor, Container, useDimensions, useTheme } from '@nivo/core' import { useTooltip } from '@nivo/tooltip' +import { useComputedAnnotations, renderAnnotationsToCanvas } from '@nivo/annotations' import { canvasDefaultProps } from './defaults' -import { useNetwork } from './hooks' -import { NetworkCanvasProps, InputNode, NodeTooltip, InputLink } from './types' +import { useNetwork, useNodeAnnotations } from './hooks' +import { + NetworkCanvasProps, + InputNode, + ComputedNode, + NodeTooltip, + InputLink, + NetworkSvgProps, +} from './types' type InnerNetworkCanvasProps = Omit< NetworkCanvasProps, @@ -39,6 +47,10 @@ const InnerNetworkCanvas = ({ linkThickness = canvasDefaultProps.linkThickness, linkColor = canvasDefaultProps.linkColor, + annotations = canvasDefaultProps.annotations as NonNullable< + NetworkSvgProps['annotations'] + >, + isInteractive = canvasDefaultProps.isInteractive, nodeTooltip = canvasDefaultProps.nodeTooltip as NodeTooltip, onClick, @@ -70,6 +82,11 @@ const InnerNetworkCanvas = ({ linkColor, }) + const boundAnnotations = useNodeAnnotations(nodes!, annotations) + const computedAnnotations = useComputedAnnotations>({ + annotations: boundAnnotations, + }) + const theme = useTheme() useEffect(() => { @@ -91,6 +108,11 @@ const InnerNetworkCanvas = ({ links.forEach(link => renderLink(ctx, link)) } else if (layer === 'nodes' && nodes !== null) { nodes.forEach(node => renderNode(ctx, node)) + } else if (layer === 'annotations') { + renderAnnotationsToCanvas>(ctx, { + annotations: computedAnnotations as any, + theme, + }) } else if (typeof layer === 'function' && nodes !== null && links !== null) { layer(ctx, { // ...props, @@ -112,6 +134,7 @@ const InnerNetworkCanvas = ({ links, renderNode, renderLink, + computedAnnotations, ]) const getNodeFromMouseEvent = useCallback( diff --git a/packages/scatterplot/src/ScatterPlotCanvas.tsx b/packages/scatterplot/src/ScatterPlotCanvas.tsx index d2863666be..cdaf76005d 100644 --- a/packages/scatterplot/src/ScatterPlotCanvas.tsx +++ b/packages/scatterplot/src/ScatterPlotCanvas.tsx @@ -200,6 +200,7 @@ const InnerScatterPlotCanvas = ({ debugMesh, voronoi, currentNode, + boundAnnotations, ]) const { showTooltipFromEvent, hideTooltip } = useTooltip() diff --git a/website/src/data/components/network/props.ts b/website/src/data/components/network/props.ts index fd858724f8..94a9f635d2 100644 --- a/website/src/data/components/network/props.ts +++ b/website/src/data/components/network/props.ts @@ -311,7 +311,7 @@ const props: ChartProperty[] = [ flavors: allFlavors, createDefaults: { type: 'circle', - match: { id: '0' }, + match: { id: 'Node 0' }, note: 'New annotation', noteX: 160, noteY: 36,