In my React app, I have been using the d3 org chart library to display some of my charts.
The example I used is from here:
https://codesandbox.io/s/org-chart-fnx0zi?file=/src/components/orgChart.js
This is the component code:
import React, { useState, useRef, useLayoutEffect } from "react";
import ReactDOMServer from "react-dom/server";
import { OrgChart } from "d3-org-chart";
import CustomNodeContent from "./customNodeContent";
import CustomExpandButton from "./customExpandButton";
import EmployeeDetailsCard from "./employeeDetailsCard";
const styles = {
orgChart: {
height: "calc(100vh - 60px)",
backgroundColor: "#eaeaea",
},
};
const OrganizationalChart = (props) => {
const d3Container = useRef(null);
const [cardShow, setCardShow] = useState(false);
const [employeeId, setEmployeeId] = useState("");
const handleShow = () => setCardShow(true);
const handleClose = () => setCardShow(false);
useLayoutEffect(() => {
const toggleDetailsCard = (nodeId) => {
handleShow();
setEmployeeId(nodeId);
};
const chart = new OrgChart();
if (props.data && d3Container.current) {
chart
.container(d3Container.current)
.data(props.data)
.nodeWidth((d) => 300)
.nodeHeight((d) => 150)
.compactMarginBetween((d) => 80)
.onNodeClick((d) => {
toggleDetailsCard(d);
})
.buttonContent((node, state) => {
return ReactDOMServer.renderToStaticMarkup(
<CustomExpandButton {...node.node} />
);
})
.nodeContent((d) => {
return ReactDOMServer.renderToStaticMarkup(
<CustomNodeContent {...d} />
);
})
.render();
}
}, [props, props.data]);
return (
<div style={styles.orgChart} ref={d3Container}>
{cardShow && (
<EmployeeDetailsCard
employees={props.data}
employee={props.data.find((employee) => employee.id === employeeId)}
handleClose={handleClose}
/>
)}
</div>
);
};
export default OrganizationalChart;
It works ok, but I dislike how it rearranges the nodes automatically; for example, when I add children to the root node, it initially arranges them like this:
and then rearranges when expanding further.
I would much prefer it if it displayed all of the same-level nodes in a single line, is there any way to do this?
Initial view of organization chart will be in vertical view. You can adjust this by adding
.compact(false)
. By this you can view your chart iniline.