JengaNavNavigateNodes.jsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import React from 'react'
  2. import treeActions from 'actions/tree'
  3. import newEventActions from 'actions/newEvent'
  4. import newEventStores from 'stores/newEvent'
  5. import iconStrObj from 'src/assets/icons/iconsStr'
  6. export default class JengaNavNavigateNodes extends React.Component {
  7. constructor(props) {
  8. super(props)
  9. this.state = {
  10. curNavIds: newEventStores.curNavIds,
  11. curNavId: newEventStores.curNavId
  12. }
  13. this.onEventChange = this.onEventChange.bind(this)
  14. this.curNavIdIndex = this.curNavIdIndex.bind(this)
  15. this.onClick = this.onClick.bind(this)
  16. this.isAllow = this.isAllow.bind(this)
  17. this.allowBackward = this.allowBackward.bind(this)
  18. this.allowForward = this.allowForward.bind(this)
  19. }
  20. componentDidMount() {
  21. this.unsubscribe = newEventStores.listen(this.onEventChange)
  22. }
  23. componentWillUnmount() {
  24. this.unsubscribe()
  25. }
  26. onEventChange(status) {
  27. let obj = {}
  28. if (status && status.types) {
  29. if (status.types.includes('curNavIds')) {
  30. obj.curNavIds = status.data.curNavIds
  31. }
  32. if (status.types.includes('curNavId')) {
  33. if (this.state.curNavId !== status.data.curNavId) {
  34. obj.curNavId = status.data.curNavId
  35. }
  36. }
  37. }
  38. if (Object.keys(obj).length > 0) {
  39. this.setState(obj)
  40. this.forceUpdate()
  41. }
  42. }
  43. curNavIdIndex() {
  44. let { curNavIds, curNavId } = this.state
  45. return curNavIds.findIndex(v => {
  46. return v.id === curNavId
  47. })
  48. }
  49. onClick(type) {
  50. let index = this.curNavIdIndex()
  51. let { curNavIds } = this.state
  52. let navInfo = undefined
  53. switch (type) {
  54. case 'backward':
  55. navInfo = curNavIds[index - 1]
  56. break
  57. case 'forward':
  58. navInfo = curNavIds[index + 1]
  59. break
  60. }
  61. if (navInfo) {
  62. treeActions.selectNode(navInfo.nodeId)
  63. newEventActions.toggleEventView({
  64. show: true,
  65. nodeId: navInfo.nodeId,
  66. mode: navInfo.mode,
  67. navId: navInfo.id
  68. })
  69. }
  70. }
  71. isAllow() {
  72. let { curNavIds, curNavId } = this.state
  73. return !!(curNavIds && curNavIds.length > 0 && curNavId)
  74. }
  75. allowBackward() {
  76. return this.isAllow() && !([-1, 0].indexOf(this.curNavIdIndex()) >= 0)
  77. }
  78. allowForward() {
  79. let { curNavIds } = this.state
  80. return (
  81. this.isAllow() &&
  82. !([-1, curNavIds.length - 1].indexOf(this.curNavIdIndex()) >= 0)
  83. )
  84. }
  85. render() {
  86. return (
  87. <div className="jenga-nav-navigate-nodes-wrap f--hlc">
  88. <button
  89. className="btn-clear btn-navigate-backward"
  90. disabled={!this.allowBackward()}
  91. onClick={this.onClick.bind(this, 'backward')}
  92. dangerouslySetInnerHTML={{ __html: iconStrObj.navigateBackward }}
  93. />
  94. <button
  95. className="btn-clear btn-navigate-forward"
  96. disabled={!this.allowForward()}
  97. onClick={this.onClick.bind(this, 'forward')}
  98. dangerouslySetInnerHTML={{ __html: iconStrObj.navigateForward }}
  99. />
  100. </div>
  101. )
  102. }
  103. }