d3-org-chart-jc
Version:
Highly customizable org chart, created with d3
255 lines (244 loc) • 11.1 kB
TypeScript
// Type definitions for d3-org-chart 2.6
// Project: https://github.com/bumbeishvili/org-chart#readme
// Definitions by: Adam Jones <https://github.com/domdomegg>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
import { HierarchyNode } from 'd3-hierarchy';
import { Selection } from 'd3-selection';
export as namespace d3;
export type NodeId = string | number;
export type Connection = any;
export interface Point {
x: number;
y: number;
}
export interface Action {
selector: string;
onClick?: (event: Event, node: HierarchyNode<Datum>, state: State<Datum>) => void;
onHover?: (event: Event, node: HierarchyNode<Datum>, state: State<Datum>) => void;
}
// This corresponds to the attrs in d3-org-chart
export interface State<Datum> {
id: string;
firstDraw: boolean;
svgWidth: number;
svgHeight: number;
scaleExtent: [number, number];
container: string;
defaultTextFill: string;
defaultFont: string;
ctx: CanvasRenderingContext2D;
data: Datum[] | null;
duration: number;
setActiveNodeCentered: boolean;
expandLevel: number;
compact: boolean;
rootMargin: number;
nodeDefaultBackground: string;
connections: Connection[];
lastTransform: { x: number; y: number; k: number };
nodeId: (d: Datum) => NodeId;
parentNodeId: (d: Datum) => NodeId;
backgroundColor: 'none';
zoomBehavior: null;
svg: Selection<SVGSVGElement, string, null, undefined>;
actions: Action[];
[key: string]: any;
}
export type Layout = 'left' | 'bottom' | 'right' | 'top';
export interface LayoutBinding<Datum> {
nodeLeftX: (node: HierarchyNode<Datum>) => number;
nodeRightX: (node: HierarchyNode<Datum>) => number;
nodeTopY: (node: HierarchyNode<Datum>) => number;
nodeBottomY: (node: HierarchyNode<Datum>) => number;
nodeJoinX: (node: HierarchyNode<Datum>) => number;
nodeJoinY: (node: HierarchyNode<Datum>) => number;
linkJoinX: (node: HierarchyNode<Datum>) => number;
linkJoinY: (node: HierarchyNode<Datum>) => number;
linkX: (node: HierarchyNode<Datum>) => number;
linkY: (node: HierarchyNode<Datum>) => number;
linkCompactXStart: (node: HierarchyNode<Datum>) => number;
linkCompactYStart: (node: HierarchyNode<Datum>) => number;
compactLinkMidX: (node: HierarchyNode<Datum>, state: State<Datum>) => number;
compactLinkMidY: (node: HierarchyNode<Datum>, state: State<Datum>) => number;
linkParentX: (node: HierarchyNode<Datum>) => number;
linkParentY: (node: HierarchyNode<Datum>) => number;
buttonX: (node: HierarchyNode<Datum>) => number;
buttonY: (node: HierarchyNode<Datum>) => number;
centerTransform: (params: {
root: number;
rootMargin: number;
centerY: number;
scale: number;
centerX: number;
chartWidth: number;
chartHeight: number;
}) => string; // CSS transform
compactDimension: {
sizeColumn: (node: HierarchyNode<Datum>) => number;
sizeRow: (node: HierarchyNode<Datum>) => number;
reverse<T>(a: T[]): T[];
};
nodeFlexSize: (params: {
height: number;
width: number;
siblingsMargin: number;
childrenMargin: number;
state: State<Datum>;
node: HierarchyNode<Datum>;
}) => [number, number];
zoomTransform: (params: { centerY: number; scale: number }) => string; // CSS transform
diagonal: unknown;
swap: (d: Point) => Point; // swaps x and y coordinates
nodeUpdateTransform: (params: { width: number; height: number } & Point) => string;
}
export class OrgChart<Datum> {
constructor();
// Getters and setters, dynamically crreated in the constructor
// TODO: improve unknown types
id(): string;
id(value: string): this;
firstDraw(): boolean;
firstDraw(value: boolean): this;
svgWidth(): number;
svgWidth(value: number): this;
svgHeight(): number;
svgHeight(value: number): this;
container(): string; // CSS selector string, for example "#my-chart"
container(value: string): this;
defaultTextFill(): string; // CSS color, for example "#2C3E50"
defaultTextFill(value: string): this;
defaultFont(): string; // Font name, for example "Helvetica"
defaultFont(value: string): this;
actions(actions: Action[]): this;
ctx(): CanvasRenderingContext2D;
ctx(value: CanvasRenderingContext2D): this;
data(): Datum[] | null;
data(value: Datum[] | null): this;
duration(): number;
duration(value: number): this;
setActiveNodeCentered(): boolean;
setActiveNodeCentered(value: boolean): this;
expandLevel(): number;
expandLevel(value: number): this;
compact(): boolean;
compact(value: boolean): this;
rootMargin(): number;
rootMargin(value: number): this;
nodeDefaultBackground(): string; // CSS color, for example "#2C3E50"
nodeDefaultBackground(value: string): this;
connections(): Connection[];
connections(value: Connection[]): this;
lastTransform(): { k: number } & Point;
lastTransform(value: { k: number } & Point): this;
nodeId(): (node: HierarchyNode<Datum> | Datum) => NodeId; // Given a node, returns an id for equality comparisons
nodeId(value: (node: HierarchyNode<Datum> | Datum) => NodeId): this;
parentNodeId(): (node: HierarchyNode<Datum> | Datum) => NodeId | undefined; // Given a node, returns it's parent id for equality comparisons
parentNodeId(value: (node: HierarchyNode<Datum> | Datum) => NodeId | undefined): this;
backgroundColor(): string; // CSS color, for example "#2C3E50"
backgroundColor(value: string): this;
zoomBehavior(): unknown;
zoomBehavior(value: unknown): this;
defs(): unknown;
defs(value: unknown): this;
connectionsUpdate(): unknown;
connectionsUpdate(value: unknown): this;
linkUpdate(): (node: HierarchyNode<Datum>, index: number, nodes: Array<HierarchyNode<Datum>>) => void;
linkUpdate(value: (node: HierarchyNode<Datum>, index: number, nodes: Array<HierarchyNode<Datum>>) => void): this;
nodeEnter(): (node: HierarchyNode<Datum>, index: number, nodes: Array<HierarchyNode<Datum>>) => void;
nodeEnter(value: (node: HierarchyNode<Datum>, index: number, nodes: Array<HierarchyNode<Datum>>) => void): this;
nodeUpdate(): (node: HierarchyNode<Datum>, index: number, nodes: Array<HierarchyNode<Datum>>) => void;
nodeUpdate(value: (node: HierarchyNode<Datum>, index: number, nodes: Array<HierarchyNode<Datum>>) => void): this;
nodeWidth(): (node: HierarchyNode<Datum>) => number;
nodeWidth(value: (node: HierarchyNode<Datum>) => number): this;
nodeHeight(): (node: HierarchyNode<Datum>) => number;
nodeHeight(value: (node: HierarchyNode<Datum>) => number): this;
siblingsMargin(): (node: HierarchyNode<Datum>) => number;
siblingsMargin(value: (node: HierarchyNode<Datum>) => number): this;
childrenMargin(): (node: HierarchyNode<Datum>) => number;
childrenMargin(value: (node: HierarchyNode<Datum>) => number): this;
neightbourMargin(): (node1: HierarchyNode<Datum>, node2: HierarchyNode<Datum>) => number; // NB: typo to match library
neightbourMargin(value: (node1: HierarchyNode<Datum>, node2: HierarchyNode<Datum>) => number): this;
compactMarginPair(): (node: HierarchyNode<Datum>) => number;
compactMarginPair(value: (node: HierarchyNode<Datum>) => number): this;
compactMarginBetween(): (node: HierarchyNode<Datum>) => number;
compactMarginBetween(value: (node: HierarchyNode<Datum>) => number): this;
onNodeClick(): (event: Event, node: HierarchyNode<Datum>) => void;
onNodeClick(value: (event: Event, node: HierarchyNode<Datum>) => void): this;
linkGroupArc(): unknown;
linkGroupArc(value: unknown): this;
nodeContent(): (
node: HierarchyNode<Datum>,
index: number,
nodes: Array<HierarchyNode<Datum>>,
state: State<Datum>,
) => string; // Return type is HTML content
nodeContent(
value: (
node: HierarchyNode<Datum>,
index: number,
nodes: Array<HierarchyNode<Datum>>,
state: State<Datum>,
) => string,
): this;
layout(): Layout;
layout(value: Layout): this;
buttonContent(): (params: { node: HierarchyNode<Datum>; state: State<Datum> }) => string; // Return type is HTML content
buttonContent(value: (params: { node: HierarchyNode<Datum>; state: State<Datum> }) => string): this;
layoutBindings(): Record<Layout, LayoutBinding<Datum>>;
layoutBindings(value: Record<Layout, LayoutBinding<Datum>>): this;
getChartState(): State<Datum>;
initialZoom(zoomLevel: number): this;
initializeEnterExitUpdatePattern(): void;
getNodeChildren(args: HierarchyNode<Datum>, nodeStore: Datum[]): Datum[];
render(): this;
addNode(node: Datum): this;
removeNode(nodeId: NodeId): this;
calculateCompactFlexDimensions(root: unknown): void;
calculateCompactFlexPositions(root: unknown): void;
update(params: { x0: number; y0: number; width: number; height: number } & Partial<Point>): void;
isEdge(): boolean; // Whether the current browser is Microsoft Edge
hdiagonal(source: Point, target: Point, m: Point): string;
diagonal(source: Point, target: Point, m: Point): string;
restyleForeignObjectElements(): void;
onButtonClick(event: any, node: HierarchyNode<Datum>): void;
setExpansionFlagToChildren(node: HierarchyNode<Datum>, isExpanded: boolean): void;
expandSomeNodes(node: HierarchyNode<Datum>): void;
updateNodesState(): void;
setLayouts(params: { expandNodesFirst?: boolean }): void;
collapse(node: HierarchyNode<Datum>): void;
expand(node: HierarchyNode<Datum>): void;
zoomed(event: any, node: HierarchyNode<Datum>): void;
zoomTreeBounds(params: {
x0: number;
x1: number;
y0: number;
y1: number;
params: { animate?: boolean; scale?: boolean };
}): void;
fit(params?: { animate?: boolean; nodes?: Iterable<HierarchyNode<Datum>>; scale?: boolean }): this;
setExpanded(nodeId: NodeId, isExpanded?: boolean): this;
setCentered(nodeId: NodeId): this;
setHighlighted(nodeId: NodeId): this;
setUpToTheRootHighlighted(nodeId: NodeId): this;
clearHighlighting(): void;
fullscreen(element?: Element): void;
zoomIn(): void;
zoomOut(): void;
toDataUrl(url: string, callback: (result: string | ArrayBuffer) => void): void;
exportImg(params?: { full?: boolean; scale?: number; onLoad?: (s: string) => void; save?: boolean }): void;
exportSvg(): this;
expandAll(): this;
collapseAll(): this;
downloadImage(params?: {
node: SVGElement;
scale?: number;
isSvg?: boolean;
save?: boolean;
onAlreadySerialized?: () => void;
onLoad?: (s: string) => void;
}): void;
getTextWidth(
text: string,
params: { fontSize?: number; fontWeight?: number; defaultFont?: string; ctx: CanvasRenderingContext2D },
): number;
}