An Organisation Chart displays hierarchical relationships between people, departments, or entities as a tree of connected cards.
Simple Organisation Chart Copy Link
import {
AgChartOptions,
AgCharts,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgChartOptions = {
title: {
text: "Company Organisation",
},
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
node: {
clickToExpand: false,
image: {
key: "avatar",
height: 50,
width: 50,
position: "left",
},
title: {
key: "name",
},
subtitle: {
key: "job",
},
labels: [
{
key: "location",
},
],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
The Org Chart is designed to display a single series and is created using the organization series type.
The data passed in should be an array of nodes, with each node containing a unique identifier field, and a second field that references the identifier of its parent node. The root node should have a null value for its parentId.
{
series: [
{
type: 'organization',
idKey: 'id',
parentIdKey: 'parentId',
node: {
title: { key: 'name' },
subtitle: { key: 'job' },
image: { key: 'avatar' },
labels: [{ key: 'location' }],
},
},
],
}In this configuration:
idKeyandparentIdKeydefine parent-child relationships. These default to'id'and'parentId'respectively.titleandsubtitledisplay the primary and secondary card text with the values from the provided data fields. The keys default to'title'and'subtitle'respectively.imagedisplays an image sourced from the data field specified bykey. The key defaults to'image'.labelsallow adding additional text rows below the subtitle, each mapping a data field viakey.
Text Copy Link
Each node can display a title, subtitle as well as an array of labels.
import {
AgChartOptions,
AgCharts,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
node: {
image: { key: "avatar", position: "left", height: 50, width: 50 },
title: { key: "name", textAlign: "left", fontSize: 16 },
subtitle: { key: "job", textAlign: "left", fontStyle: "italic" },
labels: [
{ key: "location", textAlign: "left" },
{
key: "status",
textAlign: "right",
itemStyler: ({ datum }) => {
const isRemote = datum.status === "Remote";
return {
fill: isRemote ? "#fff3e0" : "#e8f5e9",
stroke: isRemote ? "#ff9800" : "#4caf50",
color: isRemote ? "#e65100" : "#2e7d32",
cornerRadius: 8,
padding: 4,
fontWeight: "bold",
};
},
},
],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
node: {
image: { key: 'avatar', position: 'left', height: 50, width: 50 },
title: { key: 'name', textAlign: 'left', fontSize: 16 },
subtitle: { key: 'job', textAlign: 'left', fontStyle: 'italic' },
labels: [
{ key: 'location', textAlign: 'left' },
{
key: 'status',
textAlign: 'right',
itemStyler: ({ datum }) => ({
fill: datum.status === 'Remote' ? '#fff3e0' : '#e8f5e9',
stroke: datum.status === 'Remote' ? '#ff9800' : '#4caf50',
color: datum.status === 'Remote' ? '#e65100' : '#2e7d32',
cornerRadius: 8,
padding: 4,
fontWeight: 'bold',
}),
},
],
},
},
],
}In this configuration:
titleandsubtitledisplay the primary and secondary text with their ownkey,textAlign, and font styles.labelsis an array with each entry mapping a data field to a label stacked vertically below the subtitle.- An
itemStyleris used to add a pill-style background to the 'status' label, with the fill and stroke colour determined by the label value.
See the API Reference for the available styling options for each text element.
Image Copy Link
Each node can display an optional image by referencing a data field containing an image URL.
import {
AgChartOptions,
AgCharts,
AgOrganizationSeriesOptions,
AgOrganizationSeriesOptionsNodeImagePosition,
AgStandaloneChartOptions,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgStandaloneChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
node: {
image: {
key: "avatar",
height: 50,
width: 50,
position: "left",
cornerRadius: 25,
},
title: { key: "name" },
subtitle: { key: "job" },
labels: [{ key: "location" }],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function changePosition(event: Event) {
const position = (event.target as HTMLInputElement)
.value as AgOrganizationSeriesOptionsNodeImagePosition;
(options.series![0] as AgOrganizationSeriesOptions).node!.image!.position =
position;
chart.update(options);
}
function changeCornerRadius(event: any) {
const value = Number(event.target.value);
document.getElementById("cornerRadiusValue")!.innerHTML = String(value);
(
options.series![0] as AgOrganizationSeriesOptions
).node!.image!.cornerRadius = value;
chart.update(options);
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).changePosition = changePosition;
(<any>window).changeCornerRadius = changeCornerRadius;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
node: {
image: {
key: 'avatar',
cornerRadius: 25,
width: 50,
height: 50,
position: 'left',
},
},
},
],
}In this configuration:
keymaps to a data field containing an image URL.positionplaces the image within the card ('top','bottom','left', or'right').- The image position dictates the layout of the text within the card.
widthandheightcontrol the image dimensions.cornerRadiusrounds the image corners, allowing rounded rectangles or circles.
Direction Copy Link
import {
AgCharts,
AgOrganizationSeriesOptions,
AgStandaloneChartOptions,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgStandaloneChartOptions = {
title: {
text: "Company Organisation",
},
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
direction: "horizontal",
reverse: false,
node: {
clickToExpand: false,
image: {
key: "avatar",
height: 50,
width: 50,
position: "left",
},
title: {
key: "name",
},
subtitle: {
key: "job",
},
labels: [
{
key: "location",
},
],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function directionChange(event: Event) {
const direction = (event.target as HTMLInputElement).value as
| "horizontal"
| "vertical";
(options.series![0] as AgOrganizationSeriesOptions).direction = direction;
chart.update(options);
}
function toggleReverse() {
const series = options.series![0] as AgOrganizationSeriesOptions;
series.reverse = !series.reverse;
const button = document.getElementById("reverseToggle") as HTMLButtonElement;
button.setAttribute("aria-pressed", String(series.reverse));
chart.update(options);
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).directionChange = directionChange;
(<any>window).toggleReverse = toggleReverse;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
direction: 'horizontal',
reverse: false,
},
],
} Stacked Layout Copy Link
The 'stacked' layout lists a node's children in a single indented column beneath their parent, starting at a given depth. This stops wide hierarchies growing wider at their lower levels.
import {
AgCharts,
AgOrganizationSeriesOptions,
AgStandaloneChartOptions,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgStandaloneChartOptions = {
title: {
text: "Company Organisation",
},
data: getData(),
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
layout: {
type: "stacked",
stackFromDepth: 4,
linkIndentation: 26,
nodeIndentation: 26,
},
node: {
// clickToExpand: false,
image: {
key: "avatar",
height: 50,
width: 50,
position: "left",
},
title: {
key: "name",
},
subtitle: {
key: "job",
},
labels: [
{
key: "location",
},
],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function updateLinkIndentation(event: any) {
const value = Number(event.target?.value);
(options.series![0] as AgOrganizationSeriesOptions).layout!.linkIndentation =
value;
document.getElementById("linkIndentationValue")!.innerHTML = String(value);
chart.update(options);
}
function updateNodeIndentation(event: any) {
const value = Number(event.target?.value);
(options.series![0] as AgOrganizationSeriesOptions).layout!.nodeIndentation =
value;
document.getElementById("nodeIndentationValue")!.innerHTML = String(value);
chart.update(options);
}
function updateStackFromDepth(event: any) {
const value = Number(event.target?.value);
(options.series![0] as AgOrganizationSeriesOptions).layout!.stackFromDepth =
value;
document.getElementById("stackFromDepthValue")!.innerHTML = String(value);
chart.update(options);
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).updateLinkIndentation = updateLinkIndentation;
(<any>window).updateNodeIndentation = updateNodeIndentation;
(<any>window).updateStackFromDepth = updateStackFromDepth;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "Melissa Vazquez",
parentId: "Nathan Jones",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Nathan Jones",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
layout: {
type: 'stacked',
stackFromDepth: 4,
linkIndentation: 26,
nodeIndentation: 26,
},
},
],
}In this example:
stackFromDepthis the first depth to be stacked, with levels above it keeping the tree layout. The root node, 'Ashley Rivers', is at depth1, so in this case stacking starts at the fourth level, with the reports under 'Nathan Jones' listed in a column.linkIndentationindents the connector lines from the parent's leading edge. Every connector from a parent shares this line, so it reads as a single trunk running down the stack.nodeIndentationindents each child card from the connector lines.- Stacking follows direction, with children listed downwards and indented right for a vertical direction, or listed right and indented downwards for a horizontal one.
Expander Copy Link
The expander is displayed on nodes with children and is used to collapse and expand subtrees.
import {
AgCharts,
AgOrganizationSeriesOptions,
AgStandaloneChartOptions,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule]);
const options: AgStandaloneChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
node: {
title: { key: "name" },
subtitle: { key: "job" },
},
expander: {
text: {
showAllChildren: true,
showDirectChildren: true,
},
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function setShowAllChildren(showAllChildren: boolean) {
(
options.series![0] as AgOrganizationSeriesOptions
).expander!.text!.showAllChildren = showAllChildren;
chart.update(options);
}
function setShowDirectChildren(showDirectChildren: boolean) {
(
options.series![0] as AgOrganizationSeriesOptions
).expander!.text!.showDirectChildren = showDirectChildren;
chart.update(options);
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).setShowAllChildren = setShowAllChildren;
(<any>window).setShowDirectChildren = setShowDirectChildren;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
},
];
}
{
series: [
{
type: 'organization',
expander: {
text: {
showAllChildren: true,
showDirectChildren: true,
},
},
},
],
}In this example:
showAllChildrenincludes the total count of all descendants in the expander text.showDirectChildrenincludes the count of direct children in the expander text.- A
formattercan be used instead, for full control over the expander text. The params includeallChildren,directChildren,depthandisCollapsedalongside the datum.
See the API Reference for more details.
Customisation Copy Link
Node Styling Copy Link
import {
AgChartOptions,
AgCharts,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
node: {
width: 180,
// height: 120,
cornerRadius: 12,
image: {
key: "avatar",
position: "left",
height: 50,
width: 50,
cornerRadius: 25,
},
itemStyler: ({ datum }) => {
if (datum.department === "Executive")
return {
fill: "#76B2DC",
fillOpacity: 0.2,
stroke: "#1B65BF",
strokeWidth: 2,
};
if (datum.department === "Technology")
return {
fill: "#7AE281",
fillOpacity: 0.2,
stroke: "#327C35",
strokeWidth: 2,
};
if (datum.department === "Operations")
return {
fill: "#EBB967",
fillOpacity: 0.2,
stroke: "#A94F1D",
strokeWidth: 2,
};
},
title: { key: "name" },
subtitle: { key: "job" },
labels: [{ key: "location" }],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
node: {
width: 180,
cornerRadius: 12,
itemStyler: ({ datum }) => {
if (datum.department === 'Executive')
return { fill: '#76B2DC', fillOpacity: 0.2, stroke: '#1B65BF', strokeWidth: 2 };
if (datum.department === 'Technology')
return { fill: '#7AE281', fillOpacity: 0.2, stroke: '#327C35', strokeWidth: 2 };
if (datum.department === 'Operations')
return { fill: '#EBB967', fillOpacity: 0.2, stroke: '#A94F1D', strokeWidth: 2 };
},
},
},
],
}In this configuration:
- The
widthoption is used to set the card dimensions. This causes text wrapping when the content exceeds the available space. cornerRadiusrounds the card corners.- Each department is assigned a specific colour by using the
itemStylercallback based on thedepartmentfield in the data.
See the API Reference for the full list of available styling options.
Connectors Copy Link
Connectors are the lines drawn between parent and child nodes and are configured via the link property.
import {
AgCharts,
AgOrganizationSeriesOptions,
AgStandaloneChartOptions,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgStandaloneChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
link: {
stroke: "#ff8833",
strokeWidth: 2,
lineDash: [8, 2],
interpolation: { type: "step", cornerRadius: 8 },
itemStyler: ({ fromDatum }) => {
if (fromDatum.department === "Technology") {
return { stroke: "#00994d" };
} else if (fromDatum.job === "CEO") {
return { stroke: "#006f9b", strokeWidth: 4, lineDash: [] };
}
},
},
node: {
image: {
key: "avatar",
position: "left",
height: 50,
width: 50,
cornerRadius: 25,
},
title: { key: "name" },
subtitle: { key: "job" },
labels: [{ key: "location" }],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function changeCornerRadius(event: any) {
const value = Number(event.target.value);
document.getElementById("cornerRadiusValue")!.innerHTML = String(value);
(options.series![0] as AgOrganizationSeriesOptions).link!.interpolation = {
type: "step",
cornerRadius: value,
};
chart.update(options);
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).changeCornerRadius = changeCornerRadius;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
link: {
stroke: '#ff8833',
strokeWidth: 2,
lineDash: [8, 2],
interpolation: { type: 'step', cornerRadius: 8 },
itemStyler: ({ fromDatum }) => {
if (fromDatum.department === 'Technology') {
return { stroke: '#00994d' };
} else if (fromDatum.job === 'CEO') {
return { stroke: '#006f9b', strokeWidth: 4, lineDash: [] };
}
},
},
},
],
}In this configuration:
interpolation.cornerRadiusrounds the corners of each step.lineDashsets a dashed line pattern.link.itemStylerstyles connectors per-relationship, receivingfromDatum(parent) andtoDatum(child).
Expander Copy Link
The expander's appearance can be customised via the expander property. See Expander above for text-content options like child counts and formatter.
import {
AgChartOptions,
AgCharts,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
expander: {
cornerRadius: 25,
strokeWidth: 2,
padding: 15,
itemStyler: ({ datum }) => {
if (datum.department === "Technology")
return { fill: "#e8f5e9", stroke: "#2e7d32" };
if (datum.department === "Operations")
return { fill: "#fff3e0", stroke: "#e65100" };
},
},
node: {
image: {
key: "avatar",
position: "left",
height: 50,
width: 50,
cornerRadius: 25,
},
itemStyler: ({ datum }) => {
if (datum.department === "Executive")
return {
fill: "#76B2DC",
fillOpacity: 0.2,
stroke: "#1B65BF",
strokeWidth: 2,
};
if (datum.department === "Technology")
return {
fill: "#7AE281",
fillOpacity: 0.2,
stroke: "#327C35",
strokeWidth: 2,
};
if (datum.department === "Operations")
return {
fill: "#EBB967",
fillOpacity: 0.2,
stroke: "#A94F1D",
strokeWidth: 2,
};
},
title: { key: "name" },
subtitle: { key: "job" },
labels: [{ key: "location" }],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
expander: {
cornerRadius: 25,
strokeWidth: 2,
padding: 15,
itemStyler: ({ datum }) => {
if (datum.department === 'Technology') return { fill: '#e8f5e9', stroke: '#2e7d32' };
if (datum.department === 'Operations') return { fill: '#fff3e0', stroke: '#e65100' };
},
},
},
],
}In this configuration:
cornerRadius,strokeWidth, andpaddingcontrol the button shape and border.expander.itemStylerprovides per-node styling based on the department.
Node Spacing Copy Link
Three spacing properties control the gaps between nodes. These values apply at the leaf level, with higher levels in the hierarchy deriving their spacing from these.
import {
AgCharts,
AgOrganizationSeriesOptions,
AgStandaloneChartOptions,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgStandaloneChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
innerSpacing: 20,
outerSpacing: 40,
depthSpacing: 52,
node: {
image: {
key: "avatar",
position: "left",
height: 50,
width: 50,
cornerRadius: 25,
},
title: { key: "name" },
subtitle: { key: "job" },
labels: [{ key: "location" }],
},
},
],
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function changeInnerSpacing(event: any) {
const value = Number(event.target.value);
document.getElementById("innerSpacingValue")!.innerHTML = String(value);
(options.series![0] as AgOrganizationSeriesOptions).innerSpacing = value;
chart.update(options);
}
function changeOuterSpacing(event: any) {
const value = Number(event.target.value);
document.getElementById("outerSpacingValue")!.innerHTML = String(value);
(options.series![0] as AgOrganizationSeriesOptions).outerSpacing = value;
chart.update(options);
}
function changeDepthSpacing(event: any) {
const value = Number(event.target.value);
document.getElementById("depthSpacing")!.innerHTML = String(value);
(options.series![0] as AgOrganizationSeriesOptions).depthSpacing = value;
chart.update(options);
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).changeInnerSpacing = changeInnerSpacing;
(<any>window).changeOuterSpacing = changeOuterSpacing;
(<any>window).changeDepthSpacing = changeDepthSpacing;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
series: [
{
type: 'organization',
innerSpacing: 20,
outerSpacing: 40,
depthSpacing: 52,
},
],
}In this configuration:
innerSpacingis the gap between sibling nodes, such as the gap between 'Lawrence Martinez' and 'Eric Jensen'.outerSpacingis the gap between cousin nodes, such as the gap between 'Justin Contreras' and 'Lawrence Martinez'.depthSpacingis the gap between parent and child nodes, such as the gap between 'Gabriella Garcia' and 'Lawrence Martinez'.
Interactivity Copy Link
Collapse and Expand Copy Link
Nodes with children can be collapsed and expanded by clicking the expander. They can also be controlled programmatically.
import {
AgCharts,
AgOrganizationSeriesOptions,
AgStandaloneChartOptions,
ContextMenuModule,
ModuleRegistry,
OrganizationSeriesModule,
} from "ag-charts-enterprise";
import { getData } from "./data";
ModuleRegistry.registerModules([OrganizationSeriesModule, ContextMenuModule]);
const options: AgStandaloneChartOptions = {
title: { text: "Company Organisation" },
data: getData(),
initialState: {
collapsed: [
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
},
series: [
{
type: "organization",
idKey: "id",
parentIdKey: "parentId",
node: {
image: {
key: "avatar",
position: "left",
height: 50,
width: 50,
cornerRadius: 25,
},
title: { key: "name" },
subtitle: { key: "job" },
labels: [{ key: "location" }],
clickToExpand: true,
},
},
],
listeners: {
collapsedChange: ({ collapsed, expanded }) => {
console.log(
"collapsed:",
collapsed.map((item) => item.itemId),
"expanded:",
expanded.map((item) => item.itemId),
);
},
},
};
options.container = document.getElementById("myChart");
const chart = AgCharts.create(options);
function setClickToExpand(clickToExpand: boolean) {
(options.series![0] as AgOrganizationSeriesOptions).node!.clickToExpand =
clickToExpand;
chart.update(options);
}
function expandAll() {
const { version } = chart.getState();
chart.setState({ version, collapsed: [] });
}
function collapseAll() {
const { version } = chart.getState();
chart.setState({
version,
collapsed: [
"Julia Howe",
"Gabriella Garcia",
"Mr. Jeffrey Brown",
"Nathan Jones",
"Justin Contreras",
"Lawrence Martinez",
"Eric Jensen",
],
});
}
function toggleCTO() {
const { version, collapsed: prev } = chart.getState();
const collapsed = prev?.filter((id) => id !== "Julia Howe");
if (!prev?.includes("Julia Howe")) {
collapsed?.push("Julia Howe");
}
chart.setState({ version, collapsed });
}
if (typeof window !== "undefined") {
// Attach external event handlers to window so they can be called from index.html
(<any>window).setClickToExpand = setClickToExpand;
(<any>window).expandAll = expandAll;
(<any>window).collapseAll = collapseAll;
(<any>window).toggleCTO = toggleCTO;
}
export function getData() {
return [
{
id: "Ashley Rivers",
parentId: null,
name: "Ashley Rivers",
job: "CEO",
department: "Executive",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/19.webp",
},
{
id: "Julia Howe",
parentId: "Ashley Rivers",
name: "Julia Howe",
job: "CTO",
department: "Technology",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/20.webp",
},
{
id: "Mr. Jeffrey Brown",
parentId: "Julia Howe",
name: "Mr. Jeffrey Brown",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/22.webp",
},
{
id: "Melissa Vazquez",
parentId: "Mr. Jeffrey Brown",
name: "Melissa Vazquez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Thomas",
parentId: "Mr. Jeffrey Brown",
name: "John Thomas",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/5.webp",
},
{
id: "Nathan Jones",
parentId: "Julia Howe",
name: "Nathan Jones",
job: "Exec. Vice President",
department: "Technology",
location: "Portugal",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/29.webp",
},
{
id: "James Long",
parentId: "Nathan Jones",
name: "James Long",
job: "Design",
department: "Technology",
location: "Netherlands",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/25.webp",
},
{
id: "Samuel Hernandez",
parentId: "Nathan Jones",
name: "Samuel Hernandez",
job: "Design",
department: "Technology",
location: "Ireland",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/7.webp",
},
{
id: "Justin Contreras",
parentId: "Julia Howe",
name: "Justin Contreras",
job: "Design",
department: "Technology",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Rachel Ibarra",
parentId: "Justin Contreras",
name: "Rachel Ibarra",
job: "Design",
department: "Technology",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/2.webp",
},
{
id: "John Gomez",
parentId: "Justin Contreras",
name: "John Gomez",
job: "Design",
department: "Technology",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/17.webp",
},
{
id: "Gabriella Garcia",
parentId: "Ashley Rivers",
name: "Gabriella Garcia",
job: "Head of Department",
department: "Operations",
location: "Netherlands",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Lawrence Martinez",
parentId: "Gabriella Garcia",
name: "Lawrence Martinez",
job: "Design",
department: "Operations",
location: "United States",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/33.webp",
},
{
id: "Devin Pittman",
parentId: "Lawrence Martinez",
name: "Devin Pittman",
job: "Design",
department: "Operations",
location: "United Kingdom",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/18.webp",
},
{
id: "Emily Barajas",
parentId: "Lawrence Martinez",
name: "Emily Barajas",
job: "Design",
department: "Operations",
location: "Italy",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/28.webp",
},
{
id: "Eric Jensen",
parentId: "Gabriella Garcia",
name: "Eric Jensen",
job: "Design",
department: "Operations",
location: "Spain",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/35.webp",
},
{
id: "Michael Morris",
parentId: "Eric Jensen",
name: "Michael Morris",
job: "Design",
department: "Operations",
location: "France",
status: "In Office",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/10.webp",
},
{
id: "Jodi Miller",
parentId: "Eric Jensen",
name: "Jodi Miller",
job: "Design",
department: "Operations",
location: "Italy",
status: "Remote",
avatar: "https://www.ag-grid.com/charts/archive/14.2.0/example-assets/docs-images/hr/30.webp",
},
];
}
{
initialState: {
collapsed: ['Lawrence Martinez', 'Eric Jensen'],
},
series: [
{
type: 'organization',
node: {
clickToExpand: true,
},
},
],
listeners: {
collapsedChange: ({ collapsed, expanded }) => {
console.log(
'collapsed:',
collapsed.map((item) => item.itemId),
'expanded:',
expanded.map((item) => item.itemId)
);
},
},
}In this example:
- The subtrees under 'Lawrence Martinez' and 'Eric Jensen' will start in a collapsed state. This uses the
initialState.collapsedproperty to specify which subtrees start collapsed. - Use
node.clickToExpandto toggle collapsing/expanding by clicking anywhere on the card instead of the expander only.- Defaults to
falsewhen node has a click listener or has Data Selection enabled, otherwise defaults totrue.
- Defaults to
- The
collapsedarray contains the identifiers of all currently collapsed nodes.- See the State API page for more details.
- Changes in the collapsed items can be listened to with the
collapsedChangeevent, logged to the console here showing theitemIdof each newly collapsed and expanded node.- See the Events API page for more details.
Zoom Copy Link
Organisation Charts have zoom and pan enabled by default. Scroll to zoom in and out, and click and drag the background to pan across the hierarchy.
See the Zoom page for the full range of zoom options.
Accessibility Copy Link
Organisation Charts support full keyboard navigation and screen readers.
The following keys are available:
- ←→↑↓ moves focus between nodes.
- Alt+↓ and Alt+↑ expand and collapse the focused node.
- ↵ Enter or ␣ Space trigger any click listeners, and also toggle the focused node when
clickToExpandis enabled.
See Accessibility for more details.
Org Chart Examples Copy Link
See more Org Chart examples in the AG Charts Gallery.
API Reference Copy Link
Properties available on the AgOrganizationSeriesOptions interface.
- type required
'organization' - Configuration for the Organization Series.
- expander
AgOrganizationSeriesOptionsExpander - node
AgOrganizationSeriesOptionsNode - id
stringdefault: auto-generated value - Primary identifier for the series. This is provided as `seriesId` in user callbacks to differentiate multiple series. Auto-generated ids are subject to future change without warning, if your callbacks need to vary behaviour by series please supply your own unique `id` value.
- context
ContextDefault - Context object to use in callbacks.
- data
DatumDefault[] - The data to use when rendering the series. If this is not supplied, data must be set on the chart instead.
- visible
boolean - Whether to display the series.
- cursor
string - The cursor to use for hovered markers. This config is identical to the CSS `cursor` property.
- highlight
AgHighlightOptions - Configuration for highlighting when a series or legend item is hovered over.
- nodeClickRange
InteractionRange - Range from a node that a click triggers the listener.
- showInLegend
boolean - Whether to include the series in the legend.
- listeners
AgSeriesListeners - A map of event names to event listeners.
- idKey
stringdefault: 'id' - The key of the data field containing the unique node identifier.
- parentIdKey
stringdefault: 'parentId' - The key of the data field containing the parent node identifier. The root node should have a `null` value for this field.
- direction
AgOrganizationSeriesDirection - The direction child nodes are arranged relative to their parent. Sibling nodes are arranged along the perpendicular axis. Default: 'vertical'
- reverse
boolean - Whether the direction should be reversed. Default: false
- layout
AgOrganizationSeriesLayout - Configuration for the series layout.
- link
AgOrganizationSeriesOptionsLink - tooltip
AgSeriesTooltip - Series-specific tooltip configuration.
- selection
AgSelectionOptions - Configuration for data selection.
- depthSpacing
PixelSizedefault: 52 - Gap in pixels between parent and child nodes.
- innerSpacing
PixelSizedefault: 20 - Gap in pixels between sibling nodes (nodes that share the same parent).
- outerSpacing
PixelSizedefault: 40 - Gap in pixels between adjacent nodes whose immediate parents differ (cousins). The layout uses `outerSpacing` for these cross-subtree gaps and `innerSpacing` for gaps between nodes that share the same parent.
Properties available on the AgOrganizationSeriesOptions interface.
- type required
'organization' - Configuration for the Organization Series.
- expander
AgOrganizationSeriesOptionsExpander - node
AgOrganizationSeriesOptionsNode - id
stringdefault: auto-generated value - Primary identifier for the series. This is provided as `seriesId` in user callbacks to differentiate multiple series. Auto-generated ids are subject to future change without warning, if your callbacks need to vary behaviour by series please supply your own unique `id` value.
- context
ContextDefault - Context object to use in callbacks.
- data
DatumDefault[] - The data to use when rendering the series. If this is not supplied, data must be set on the chart instead.
- visible
boolean - Whether to display the series.
- cursor
string - The cursor to use for hovered markers. This config is identical to the CSS `cursor` property.
- highlight
AgHighlightOptions - Configuration for highlighting when a series or legend item is hovered over.
- nodeClickRange
InteractionRange - Range from a node that a click triggers the listener.
- showInLegend
boolean - Whether to include the series in the legend.
- listeners
AgSeriesListeners - A map of event names to event listeners.
- idKey
stringdefault: 'id' - The key of the data field containing the unique node identifier.
- parentIdKey
stringdefault: 'parentId' - The key of the data field containing the parent node identifier. The root node should have a `null` value for this field.
- direction
AgOrganizationSeriesDirection - The direction child nodes are arranged relative to their parent. Sibling nodes are arranged along the perpendicular axis. Default: 'vertical'
- reverse
boolean - Whether the direction should be reversed. Default: false
- layout
AgOrganizationSeriesLayout - Configuration for the series layout.
- link
AgOrganizationSeriesOptionsLink - tooltip
AgSeriesTooltip - Series-specific tooltip configuration.
- selection
AgSelectionOptions - Configuration for data selection.
- depthSpacing
PixelSizedefault: 52 - Gap in pixels between parent and child nodes.
- innerSpacing
PixelSizedefault: 20 - Gap in pixels between sibling nodes (nodes that share the same parent).
- outerSpacing
PixelSizedefault: 40 - Gap in pixels between adjacent nodes whose immediate parents differ (cousins). The layout uses `outerSpacing` for these cross-subtree gaps and `innerSpacing` for gaps between nodes that share the same parent.