react-tree-menu
Version:
A tree menu component for React
304 lines (204 loc) • 8.1 kB
Markdown
## React Tree Menu Component
A stateless tree component with the following features:
* Checkboxes
* Collapsible nodes
* Dynamic tree generation
* Declarative tree menus
* Built with the Flux proposal in mind (i.e. trickle-down state)
## Please check out the [Demo](http://mandarinconlabarba.github.io/react-tree-menu/example/index.html).
## Install
```
npm install --save react-tree-menu
```
## General Usage
```
var TreeMenu = require('react-tree-menu').TreeMenu,
TreeNode = require('react-tree-menu').TreeNode;
...
<TreeMenu/>
<TreeMenu>
<TreeNode/>
</TreeMenu>
```
## Exports
This package exports the following:
```
module.exports = {
TreeMenu: require('./src/TreeMenu.jsx'),
TreeNode: require('./src/TreeNode.jsx'),
Utils: require('./src/TreeMenuUtils')
};
```
## Declarative use
In your `.render()` method, embed `TreeMenu`:
```jsx
return <TreeMenu
identifier={"id"}
onTreeNodeClick={this._setLastActionState.bind(this, "clicked")}
onTreeNodeCheckChange={this._setLastActionState.bind(this, "checked")}
collapsible={false}
expandIconClass="fa fa-chevron-right"
collapseIconClass="fa fa-chevron-down">
<TreeNode label="Option 1" id="option_1"/>
<TreeNode label="Option 2" collapsible={false} id="option_2">
<TreeNode label="Option A" checkbox={true} id="option_2.a"/>
<TreeNode label="Option B" checkbox={true} id="option_2.b"/>
</TreeNode>
<TreeNode label="Option 3" id="option_3"/>
<TreeNode label="Option 4" id="option_4"/>
</TreeMenu>;
```
## Dynamic use w/ the 'data' prop
In your `.render()` method, embed `TreeMenu` with a `data` prop:
```jsx
var data = [{
label : "Option 1"
},
{
label : "Option 2",
children : [
{
checkbox: true,
label: "Sub Option A",
children: [
{
label: "Third Level Nest Option 1",
checkbox : true
},
{
label: "Third Level Nest Option 2",
checkbox : true
}
]
},
{
checkbox: true,
label: "Sub Option B"
}
]
}];
return <TreeMenu
onTreeNodeClick={...}
onTreeNodeCollapseChange={...}
onTreeNodeCheckChange={...}
data={data} />;
```
## `<TreeMenu/>` Style Guide
To style `<TreeMenu/>`, use the following props:
* [classNamePrefix](#classnameprefixstring)
* [expandIconClass](#expandiconclassstring)
* [collapseIconClass](#collapseiconclassstring)
See the [example CSS](example/tree-view.css) for how this works.
## `<TreeMenu/>` Props
### `sort={<Boolean> || <Function>}`
* If sort is a `Boolean` and true (i.e. `<TreeMenu sort ... />`), the node label will be used for sorting.
* If sort is a `Function`, it will be used as the sort function, with the argument the `React` element (props are available for sorting). Example:
```
<TreeMenu sort={(node) => node.props.value} ... />
```
### `stateful={<Boolean>}`
If you need it, you can make `<TreeMenu/`> keep track of its own state. That being said, `react-tree-menu` was designed to
fit inside Flux architecture, which encourages components to render based on props passed from the Controller-View. Defaults to false.
### `classNamePrefix={<String>}`
The prefix to put in front of all the CSS classes for nested element (like the container for the menu, the checkbox, etc)
### `identifier={<String>}`
Optional prop/field to use for the node identifier. Defaults to Array index
### `collapsible={<Boolean>}`
Whether or not nested <TreeNode/> components are collapsible. Defaults to true.
### `expandIconClass={<String>}`
The CSS class to give the expand icon component. Empty by default.
### `collapseIconClass={<String>}`
The CSS class to give the collapse icon component. Empty by default
### `labelFilter={<Function>}`
A function that can be used to filter/transform the label. Empty by default
### `labelFactory={<Function>}`
A factory function that returns a label node. See example source for usage.
### `checkboxFactory={<Function>}`
A factory function that returns a checkbox node. See example source for usage.
### `onTreeNodeClick={<Function>}`
Function handler for click event on <TreeNode /> components. If the `TreeNode` has an `onTreeNodeSelectChange` handler, this is not fired. See [Callback API](#callback-api-for-treemenu-event-handler-props). Defaults to noop.
### `onTreeNodeCollapseChange={<Function>}`
Function handler for collapse change event on <TreeNode /> components. See [Callback API](#callback-api-for-treemenu-event-handler-props). Defaults to noop.
### `onTreeNodeCheckChange={<Function>}`
Function handler for checkbox change event on <TreeNode /> components. See [Callback API](#callback-api-for-treemenu-event-handler-props). Defaults to noop.
### `onTreeNodeSelectChange={<Function>}`
Function handler for select state change event on <TreeNode /> components. An alternative for cases when checkboxes aren't desired. See [Callback API](#callback-api-for-treemenu-event-handler-props). Defaults to noop.
### `data={<Array>||<Object>}`
The data to use when building <TreeNode/> components dynamically. Required if there aren't any nested `<TreeNode/>` elements declared.
Sample array format:
```
[{label : "Option 1"},
{
label : "Option 2",
children : [
{
checkbox: true,
label: "Sub Option A",
children: [{
label: "Third Level Nest Option 1",
checkbox : true,
children : {...},
}]
},
{
checkbox: true,
label: "Sub Option B"
}]}]
```
Sample object format:
```
{
"Option 1" : {
checked: true,
checkbox: true,
children: {
"Sub Option 1" : {
checked: false
},
"Sub Option 2" : {
checked: false,
checkbox: true,
children: {
"Sub-Sub Option 1" : {
checked: false,
checkbox: true
},
"Sub-Sub Option 2" : {
checked: false,
checkbox: true
}
}
}
}
},
"Option 2" : {
checked: false,
checkbox: true
}
}
```
## Callback API for `<TreeMenu/>` event handler props
`<TreeMenu/>` callbacks will receive an array representation of the node. Example:
```
var onClick = function(node) {
//node is in format: [<topLevelId>, [...<nodeId>,] <nodeId>]
//where <nodeId> is the <TreeNode/> that sourced the event
//...
}
return <TreeMenu onTreeNodeClick={onClick} />;
```
## `<TreeNode />` Props
### `label={<String>}`
The node label. Required.
### `checkbox={<Boolean>}`
Whether or not the node has a checkbox. Defaults to false. If the node checkbox={true}, clicking on the label also fires the `onTreeNodeCheckChange` function
### `checked={<Boolean>}`
If the node has a checkbox, whether or not the node is checked. If the node checkbox={true}, clicking on the label also fires the `onTreeNodeCheckChange`
function instead od the `onTreeNodeClick` function
### `selected={<Boolean>}`
Whether or not the node is selected. An alternative to using `checked` in conjunction w/ `checkbox`.
### `collapsible={<Boolean>}`
Whether or not the node is collapsible. If the node has no children, this value has no effect. Defaults to true.
This value is overridden by the `collapsible` prop value set on the root `<TreeMenu/>`
### `collapsed={<Boolean>}`
If the node is collapsible, whether or not the node is collapsed. Defaults to false.