UNPKG

@marciocamello/react-sortable-tree

Version:

Drag-and-drop sortable component for nested data and hierarchies

143 lines (137 loc) 3.39 kB
import React, { Component } from 'react' import SortableTree, { addNodeUnderParent, removeNodeAtPath } from '../src' // In your own app, you would need to use import styles once in the app // import 'react-sortable-tree/styles.css'; const firstNames = [ 'Abraham', 'Adam', 'Agnar', 'Albert', 'Albin', 'Albrecht', 'Alexander', 'Alfred', 'Alvar', 'Ander', 'Andrea', 'Arthur', 'Axel', 'Bengt', 'Bernhard', 'Carl', 'Daniel', 'Einar', 'Elmer', 'Eric', 'Erik', 'Gerhard', 'Gunnar', 'Gustaf', 'Harald', 'Herbert', 'Herman', 'Johan', 'John', 'Karl', 'Leif', 'Leonard', 'Martin', 'Matt', 'Mikael', 'Nikla', 'Norman', 'Oliver', 'Olof', 'Olvir', 'Otto', 'Patrik', 'Peter', 'Petter', 'Robert', 'Rupert', 'Sigurd', 'Simon', ] export default class App extends Component { constructor(props) { super(props) this.state = { treeData: [{ title: 'Peter Olofsson' }, { title: 'Karl Johansson' }], addAsFirstChild: false, } } render() { const getNodeKey = ({ treeIndex }) => treeIndex const getRandomName = () => firstNames[Math.floor(Math.random() * firstNames.length)] return ( <div> <div style={{ height: 300 }}> <SortableTree treeData={this.state.treeData} onChange={(treeData) => this.setState({ treeData })} generateNodeProps={({ node, path }) => ({ buttons: [ <button onClick={() => this.setState((state) => ({ treeData: addNodeUnderParent({ treeData: state.treeData, parentKey: path[path.length - 1], expandParent: true, getNodeKey, newNode: { title: `${getRandomName()} ${ node.title.split(' ')[0] }sson`, }, addAsFirstChild: state.addAsFirstChild, }).treeData, })) }> Add Child </button>, <button onClick={() => this.setState((state) => ({ treeData: removeNodeAtPath({ treeData: state.treeData, path, getNodeKey, }), })) }> Remove </button>, ], })} /> </div> <button onClick={() => this.setState((state) => ({ treeData: state.treeData.concat({ title: `${getRandomName()} ${getRandomName()}sson`, }), })) }> Add more </button> <br /> <label htmlFor="addAsFirstChild"> Add new nodes at start <input name="addAsFirstChild" type="checkbox" checked={this.state.addAsFirstChild} onChange={() => this.setState((state) => ({ addAsFirstChild: !state.addAsFirstChild, })) } /> </label> </div> ) } }