hierarchy-model
Version:
A data model for a hierarchy of nodes, used by roles-hierarchy and permissions-hierarchy
288 lines (217 loc) • 9.41 kB
Markdown
Hierarchy Data Model
===
[](https://travis-ci.org/AppWorkshop/hierarchy-model)
This is a data model for a hierarchy or tree, used by roles-hierarchy and permissions-hierarchy.
Given a definition of a hierarchy :
```js
let hierarchyObj = {
"name": "Primate",
"children": [
{
"name": "Hominidae",
"children": [
{
"name": "Homo",
"children": [
{
"name": "Sapiens",
"children": [
{
"name": "Human"
}
]
}
]
}
]
},
{
"name": "Pongidae",
"children": [
{
"name": "Pan",
"children": [
{
"name": "Troglodytes",
"children": [
{
"name": "Chimpanzee"
}
]
}
]
}
]
}
]
};
let hierarchy = new Hierarchy(
{
"hierarchy": hierarchyObj),
"loggingConfig": { level: "debug" },
treeModelConfig: { "childrenPropertyName": "children" },
}
);
```
You can find information about the node's descendants.
```js
let subordinatesArr = hierarchy.getAllDescendantNodesAsArray('Primate'); // ["Hominidae", "Pongidae", "Homo", "Pan", "Sapiens", "Troglodytes", "Human", "Chimpanzee"]
```
You can retrieve a single node by name
```js
let primate = hierarchy.findNodeInHierarchy("Primate"); // {"name":"Primate","children":[{.....}]}
```
And check if one node is a descendant of another
```js
let subordinate = hierarchy.findDescendantNodeByName('Primate', 'Homo'); // {"name":"Homo","children":[....]}
```
## Tests
Look in the test/test.js file, it gives you a pretty good idea of how to use this library.
To run the tests, simply :
```npm test```
## API
Docs generated with jsdoc2md.
## Functions
<dl>
<dt><a href="#reparse">reparse(hierarchy)</a></dt>
<dd><p>re-create the hierarchy with a new object structure.</p>
</dd>
<dt><a href="#findNodeInHierarchy">findNodeInHierarchy(nodeName)</a> ⇒ <code>object</code></dt>
<dd><p>Find the model for a node in the hierarchy, by name</p>
</dd>
<dt><a href="#findNodeObj">findNodeObj(nodeName, [startNode])</a></dt>
<dd><p>Find the node object for a node in the hierarchy, by name</p>
</dd>
<dt><a href="#findDescendantNodeByName">findDescendantNodeByName(nodeName, descendantNodeName, [startNode])</a> ⇒ <code>object</code></dt>
<dd><p>Return the descendent node of the given nodeName if found.</p>
</dd>
<dt><a href="#getAllDescendantNodesAsArray">getAllDescendantNodesAsArray(nodeName, [startNode])</a> ⇒ <code>Array</code></dt>
<dd><p>Get the names of subordinate nodes as an array</p>
</dd>
<dt><a href="#getTopiaryAsString">getTopiaryAsString(hierarchy)</a> ⇒ <code>string</code></dt>
<dd><p>get a string suitable for printing, via the topiary library.</p>
</dd>
<dt><a href="#walkNodes">walkNodes(callback)</a></dt>
<dd><p>Process each node in the tree via a callback, halting when your callback returns false.</p>
</dd>
<dt><a href="#addNodeAsChildOfNode">addNodeAsChildOfNode(parentNode, childNode)</a> ⇒ <code>Object</code></dt>
<dd><p>Add a child to a parent.</p>
</dd>
<dt><a href="#getPathOfNode">getPathOfNode(node)</a> ⇒ <code>Object</code></dt>
<dd><p>Get the array of Nodes representing the path from the root to this Node (inclusive).</p>
</dd>
<dt><a href="#getNamesOfNodePath">getNamesOfNodePath(node)</a> ⇒ <code>Array.<String></code></dt>
<dd><p>Get the array of Node names representing the path from the root to this Node (inclusive).</p>
</dd>
<dt><a href="#deleteNodeFromHierarchy">deleteNodeFromHierarchy(node)</a> ⇒ <code>Object</code></dt>
<dd><p>Drop the subtree starting at this node. Returns the node itself, which is now a root node.</p>
</dd>
<dt><a href="#getTreeModel">getTreeModel()</a> ⇒ <code>Object</code></dt>
<dd><p>get the underlying TreeModel instance</p>
</dd>
<dt><a href="#getNewNode">getNewNode(paramsObj)</a></dt>
<dd><p>Create Node (which is itself just a TreeModel)</p>
</dd>
</dl>
<a name="reparse"></a>
## reparse(hierarchy)
re-create the hierarchy with a new object structure.
**Kind**: global function
| Param | Type |
| --- | --- |
| hierarchy | <code>Object</code> |
<a name="findNodeInHierarchy"></a>
## findNodeInHierarchy(nodeName) ⇒ <code>object</code>
Find the model for a node in the hierarchy, by name
**Kind**: global function
**Returns**: <code>object</code> - - the model of the node in the tree that matches
| Param | Type | Description |
| --- | --- | --- |
| nodeName | <code>string</code> | the name of the node to find (i.e. 'name' property value) |
<a name="findNodeObj"></a>
## findNodeObj(nodeName, [startNode])
Find the node object for a node in the hierarchy, by name
**Kind**: global function
| Param | Type | Description |
| --- | --- | --- |
| nodeName | <code>string</code> | the name of the node to find (i.e. 'name' property value) |
| [startNode] | <code>object</code> | the node in the hierarchy to start from |
<a name="findDescendantNodeByName"></a>
## findDescendantNodeByName(nodeName, descendantNodeName, [startNode]) ⇒ <code>object</code>
Return the descendent node of the given nodeName if found.
**Kind**: global function
**Returns**: <code>object</code> - - the node of the descendant, or undefined or false if not found.
| Param | Type | Description |
| --- | --- | --- |
| nodeName | <code>string</code> | the name of the node underneath which we should search |
| descendantNodeName | <code>string</code> | the name of the descendant node to find |
| [startNode] | <code>object</code> | the node in the hierarchy to start from |
<a name="getAllDescendantNodesAsArray"></a>
## getAllDescendantNodesAsArray(nodeName, [startNode]) ⇒ <code>Array</code>
Get the names of subordinate nodes as an array
**Kind**: global function
**Returns**: <code>Array</code> - - the subordinate node names if any, otherwise undefined.
| Param | Type | Description |
| --- | --- | --- |
| nodeName | <code>string</code> | the name of the senior node i.e. 'name' property value |
| [startNode] | <code>object</code> | the node in the hierarchy to start from |
<a name="getTopiaryAsString"></a>
## getTopiaryAsString(hierarchy) ⇒ <code>string</code>
get a string suitable for printing, via the topiary library.
**Kind**: global function
**Returns**: <code>string</code> - a string representation of the hierarchy
| Param | Type | Description |
| --- | --- | --- |
| hierarchy | <code>object</code> | a Hierarchy instance |
<a name="walkNodes"></a>
## walkNodes(callback)
Process each node in the tree via a callback, halting when your callback returns false.
**Kind**: global function
| Param | Type | Description |
| --- | --- | --- |
| callback | <code>function</code> | a function that takes a single parameter, 'node', which is the value of the node currently being processed. Return false from the callback to halt the traversal. |
<a name="addNodeAsChildOfNode"></a>
## addNodeAsChildOfNode(parentNode, childNode) ⇒ <code>Object</code>
Add a child to a parent.
**Kind**: global function
**Returns**: <code>Object</code> - the child node.
| Param | Type | Description |
| --- | --- | --- |
| parentNode | <code>Object</code> | the node in the hierarchy to which the child should be added |
| childNode | <code>Object</code> | a node or tree |
<a name="getPathOfNode"></a>
## getPathOfNode(node) ⇒ <code>Object</code>
Get the array of Nodes representing the path from the root to this Node (inclusive).
**Kind**: global function
**Returns**: <code>Object</code> - the array of Nodes representing the path from the root to this Node (inclusive).
| Param | Type |
| --- | --- |
| node | <code>Object</code> |
<a name="getNamesOfNodePath"></a>
## getNamesOfNodePath(node) ⇒ <code>Array.<String></code>
Get the array of Node names representing the path from the root to this Node (inclusive).
**Kind**: global function
**Returns**: <code>Array.<String></code> - the array of Strings representing the path from the root to this Node (inclusive).
| Param | Type |
| --- | --- |
| node | <code>Object</code> |
<a name="deleteNodeFromHierarchy"></a>
## deleteNodeFromHierarchy(node) ⇒ <code>Object</code>
Drop the subtree starting at this node. Returns the node itself, which is now a root node.
**Kind**: global function
**Returns**: <code>Object</code> - node the node that just got dropped.
| Param | Type | Description |
| --- | --- | --- |
| node | <code>Object</code> | the node in the hierarchy to drop. |
<a name="getTreeModel"></a>
## getTreeModel() ⇒ <code>Object</code>
get the underlying TreeModel instance
**Kind**: global function
**Returns**: <code>Object</code> - the underlying TreeModel instance.
<a name="getNewNode"></a>
## getNewNode(paramsObj)
Create Node (which is itself just a TreeModel)
**Kind**: global function
| Param | Type | Description |
| --- | --- | --- |
| paramsObj | <code>Object</code> | an object which has 'name' and 'children' properties |