List.jsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /**
  2. * @author oldj
  3. * @blog https://oldj.net
  4. */
  5. 'use strict'
  6. import React from 'react'
  7. import ListItem from './ListItem'
  8. import Sortable from 'sortablejs'
  9. import listToArray from 'wheel-js/src/common/listToArray'
  10. import Agent from '../Agent'
  11. import { findPositions } from '../content/kw'
  12. import styles from './List.less'
  13. export default class List extends React.Component {
  14. constructor (props) {
  15. super(props)
  16. this.state = {
  17. kw: ''
  18. }
  19. Agent.on('search:kw', kw => {
  20. this.setState({kw})
  21. })
  22. }
  23. customItems () {
  24. let kw = this.state.kw
  25. function match (kw, item) {
  26. return findPositions(kw, item.content).length > 0 || findPositions(kw, item.title).length > 0
  27. }
  28. return this.props.list.map((item, idx) => {
  29. let show = true
  30. if (kw && !match(kw, item)) {
  31. show = false
  32. }
  33. return (
  34. <ListItem
  35. data={item}
  36. idx={idx}
  37. key={'hosts-' + idx + Math.random()}
  38. show={show}
  39. {...this.props}
  40. />
  41. )
  42. })
  43. }
  44. getCurrentListFromDOM () {
  45. let nodes = this.refs.items.getElementsByClassName('list-item')
  46. nodes = listToArray(nodes)
  47. let ids = nodes.map(el => el.getAttribute('data-id'))
  48. Agent.emit('sort', ids)
  49. }
  50. componentDidMount () {
  51. Sortable.create(this.refs.items, {
  52. group: 'list-sorting'
  53. , sort: true
  54. , animation: 150
  55. , onStart: () => {
  56. Agent.emit('drag_start')
  57. }
  58. , onSort: () => {
  59. this.getCurrentListFromDOM()
  60. Agent.emit('drag_end')
  61. //console.log(evt)
  62. //console.log(evt.item)
  63. //console.log(evt.oldIndex, evt.newIndex)
  64. }
  65. })
  66. }
  67. render () {
  68. return (
  69. <div id="sh-list" className={styles.root}>
  70. <ListItem
  71. data={this.props.sys_hosts}
  72. {...this.props}
  73. sys="1"/>
  74. <div ref="items" className={styles['custom-items']}>
  75. {this.customItems()}
  76. </div>
  77. </div>
  78. )
  79. }
  80. }