react-data-tree
v0.1.7
Published
highly customizable node tree for react
Downloads
14
Readme
React Data Tree
Highly customizable node tree component with flatten data structure to interact intensly and easily

Installation
Install the library using your favorite dependency manager:
npm install react-data-tree --saveOr using yarn:
yarn add react-data-treeUsage/Examples
import React from "react";
import { NodeTreeView, NodeOperations } from "react-data-tree";
import { AiOutlineCheckSquare, AiOutlineMinusSquare } from "react-icons/ai";
function App() {
const [metaData, setMetaData] = React.useState({});
const data = [
{
id: "unique-id-1",
name: "Carmelita Rose",
children: [
{
id: "unique-id-1-1",
name: "Ilmi Carlitos",
},
{
id: "unique-id-1-2",
name: "Mojgan Cateline",
children: [
{
id: "unique-id-1-2-1",
name: "Ida Erich",
children: [
{
id: "unique-id-1-2-1-1",
name: "Ilmi Carlitos",
},
{
id: "unique-id-1-2-1-2",
name: "Mojgan Cateline",
children: [
{
id: "unique-id-1-2-1-2-1",
name: "Ida Erich",
},
{
id: "unique-id-1-2-1-2-2",
name: "Olimpia Bertrand",
},
],
},
],
},
{
id: "unique-id-1-2-2",
name: "Olimpia Bertrand",
},
],
},
],
},
{
id: "unique-id-2",
name: "Terezija Paulus",
children: [
{
id: "unique-id-2-1",
name: "Shemu'el Sneha",
},
],
},
];
const CustomNodeComponent = ({ nodeData, parentNodeIds, isLastNode }) => {
return (
<div
style={{ display: "flex", alignItems: "center", paddingLeft: "10px" }}
>
<div
style={{
padding: "1px",
border: "solid 1px blue",
}}
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
setMetaData((oldData) => {
const operations = new NodeOperations(
oldData,
nodeData?.id,
parentNodeIds,
data
);
return operations.defaultClickOperation();
});
}}
>
{metaData[nodeData?.id]?.isChecked ? (
metaData[nodeData?.id]?.isSemiChecked ? (
<AiOutlineMinusSquare />
) : (
<AiOutlineCheckSquare />
)
) : (
<div className="p-2"></div>
)}
</div>
<div
style={{
padding: "5px",
marginLeft: "5px",
}}
>
{nodeData.name}
</div>
<div
onClick={() => {
setMetaData((ldData) => {
const oldData = JSON.parse(JSON.stringify(ldData));
return {
...oldData,
[nodeData?.id]: {
...oldData[nodeData?.id],
isNodeExpanded: !(
oldData && oldData[nodeData?.id]?.isNodeExpanded
),
},
};
});
}}
style={{ cursor: "pointer", marginLeft: "10px" }}
>
{!isLastNode ? (
metaData[nodeData?.id]?.isNodeExpanded ? (
<div>{"^"}</div>
) : (
<div>{">"}</div>
)
) : null}
</div>
</div>
);
};
return (
<div>
<NodeTreeView
metaData={metaData}
NodeComponent={CustomNodeComponent}
data={data}
/>
</div>
);
}
export default App;
API Reference
Through metaData state we can control the whole node tree, on clicking operations with the methods from NodeOperations we can get status of all nodes
metaData
| key | Type | Description |
| :-------- | :------- | :------------------------- |
| isChecked | boolean | current clicked node selection status |
| isSemiChecked | boolean | if all nested nodes are not selected of a parent node |
| isNodeExpanded | boolean | is node expanded / nested nodes are visible status |
| childrenIds | [string] | children ids of a parent |
| children | undefined | children is a reserved key which will be always undefined |
data
type mainDataNode = {
id: string;
children?: dataType;
[key: string]: any;
};
type data = Array<mainDataNode>
NodeComponent
make your custom node component, you will get some necessary details in props
| Parameter | Type | Description |
| :-------- | :------- | :------------------------- |
| nodeData | mainDataNode | all node details which you gave in json such as id,name except children |
| parentNodeIds | [parent node id] | this array will contain all parents id of a node in outside to inside manner |
| isLastNode | boolean | is current node is the deepest node |
Class NodeOperations
new NodeOperations(metaData, id, parentNodeIds, treeData)
| Parameter | Type | Description |
| :-------- | :------- | :------------------------- |
| metaData | React state | { uniqueNodeKey: { state details for the perticular node }} |
| id | Unique node id | id should be always unique |
| parentNodeIds | [parent node id] | this array will contain all parents id of a node in outside to inside manner |
| treeData | JSON | recursive json data which |
Methods
getFlattenedData()will convert json tree data into metaData structure we can pass custom node modifier function as a parametergetFlattenedData(treeNodeModifier)which takes nodeDetails (mainDataNode) as inputgetIndivisualCheckBoxClickedData({})by default it will makeisChecked=trueof clicked node, also we can provide metaData and custom node modifier with itgetIndivisualCheckBoxClickedData({ modifiedData, clickedObjectModifier })getChildrenClickedData({})by default it will makeisChecked=truefor all children of current node also we can provide metaData and custom children modifier with itgetChildrenClickedData({ modifiedData, childObjectsModifier })getAllParentCheckedData({})by default it will makeisChecked=truefor all parent of current node also it calculates and makesisSemiChecked=trueconditionally, we can provide metaData and custom parent modifier with itgetAllParentCheckedData({ modifiedData, parentObjectsModifier })defaultClickOperation()executes a click operation from provided data in the class and using above mentiond methods in default environment
