| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- import React from 'react'
- import cls from 'classnames'
- import ResizeObserver from 'resize-observer-polyfill'
- import BlockContext from '../utils'
- import treeStores from 'stores/tree'
- import newEventStores from 'stores/newEvent'
- import { getEventNodeById, minScrollJengaPanel } from 'stores/funcs/newEvent'
- import { nodeIsSystem, nodeIsInModule } from 'stores/funcs/nodeType'
- import JengaItemTitle from './JengaItemTitle'
- import JengaItemEvent from './JengaItemEvent'
- export default class JengaItem extends React.Component {
- constructor(props) {
- super(props)
- this.curEventNodeId = newEventStores.curEventNodeId
- this.state = {
- isActive: this.isCurEventNodeId(this.curEventNodeId),
- isEnable: this.isEnable(),
- sysList: this.getCurSysList()
- }
- this.onTreeChange = this.onTreeChange.bind(this)
- this.onEventChange = this.onEventChange.bind(this)
- this.onActiveObserver = this.onActiveObserver.bind(this)
- this.onInactiveObserver = this.onInactiveObserver.bind(this)
- this.onResize = this.onResize.bind(this)
- this.isCurEventNodeId = this.isCurEventNodeId.bind(this)
- this.isEnable = this.isEnable.bind(this)
- this.getCurSysList = this.getCurSysList.bind(this)
- this.updateCurSysList = this.updateCurSysList.bind(this)
- this.getSysList = this.getSysList.bind(this)
- this.getModuleSysList = this.getModuleSysList.bind(this)
- }
- componentDidMount() {
- window.addEventListener('resize', this.onResize)
- this.unsubscribe = newEventStores.listen(this.onEventChange)
- this.unsubscribeTree = treeStores.listen(this.onTreeChange)
- this.onActiveObserver()
- }
- componentWillUnmount() {
- window.removeEventListener('resize', this.onResize)
- this.unsubscribe()
- this.unsubscribeTree()
- this.onInactiveObserver()
- }
- componentDidUpdate(preProps) {
- if (preProps.eventNodeId !== this.props.eventNodeId) {
- this.setState({
- isActive: this.isCurEventNodeId(this.curEventNodeId),
- isEnable: this.isEnable(),
- sysList: this.getCurSysList()
- })
- }
- }
- onTreeChange(status) {
- let obj = {}
- if (status && status.types) {
- if (
- status.types.includes('curNodeIdList') ||
- status.types.includes('curRootId')
- ) {
- obj.sysList = this.getCurSysList()
- }
- }
- if (Object.keys(obj).length > 0) {
- this.setState(obj)
- }
- }
- onEventChange(status) {
- let obj = {}
- if (status && status.types) {
- if (status.types.includes('curEventNodeId')) {
- if (this.curEventNodeId !== status.data.curEventNodeId) {
- let curEventNodeId = status.data.curEventNodeId
- if (this.isCurEventNodeId(status.data.curEventNodeId)) {
- this.updateCurSysList(obj, curEventNodeId, this.curEventNodeId)
- }
- this.curEventNodeId = curEventNodeId
- let isEnable = this.isEnable()
- if (isEnable !== this.state.isEnable) {
- obj.isEnable = isEnable
- }
- let isActive = this.isCurEventNodeId(this.curEventNodeId)
- if (isActive !== this.state.isActive) {
- obj.isActive = isActive
- }
- }
- }
- if (status.types.includes('toggleEvent')) {
- if (status.data.affectEventNodeId === this.curEventNodeId) {
- if (status.data.prop === 'enable') {
- if (this.isCurEventNodeId(status.data.affectEventNodeId)) {
- let isEnable = this.isEnable()
- if (isEnable !== this.state.isEnable) {
- obj.isEnable = isEnable
- }
- }
- }
- }
- }
- }
- if (Object.keys(obj).length > 0) {
- this.setState(obj)
- }
- }
- isCurEventNodeId(curEventNodeId) {
- return !this.props.eventNodeId || this.props.eventNodeId === curEventNodeId
- }
- isEnable() {
- let isEnable = true
- let nodeId = this.props.eventNodeId || this.curEventNodeId
- if (nodeId) {
- let node = getEventNodeById(nodeId)
- if (node && node.events && node.events.enable === false) {
- isEnable = false
- }
- }
- return isEnable
- }
- onActiveObserver() {
- // 选择目标节点
- let target = document.querySelector('.jenga-item')
- // 创建观察者对象
- this.observer = new ResizeObserver(entries => {
- let entry = entries[0]
- if (entry.contentRect.height !== undefined) {
- minScrollJengaPanel()
- }
- })
- // 传入目标节点和观察选项
- this.observer.observe(target)
- }
- onInactiveObserver() {
- this.observer && this.observer.disconnect()
- }
- onResize() {
- minScrollJengaPanel()
- }
- getCurSysList() {
- let sysList = []
- let curEventNodeId = this.props.eventNodeId || this.curEventNodeId
- let moduleRootId = nodeIsInModule(curEventNodeId, true)
- // 当前的node是在module内刷新sysList
- if (moduleRootId) {
- sysList = this.getModuleSysList(moduleRootId)
- } else {
- // module内的重新获取sysList
- sysList = this.getSysList()
- }
- return sysList
- }
- updateCurSysList(obj, curNodeId, preNodeId) {
- let moduleRootId = nodeIsInModule(curNodeId, true)
- // 当前的node是在module内刷新sysList
- if (moduleRootId) {
- obj.sysList = this.getModuleSysList(moduleRootId)
- } else if (nodeIsInModule(preNodeId)) {
- // module内的重新获取sysList
- obj.sysList = this.getSysList()
- }
- }
- getSysList() {
- let result = []
- let list = treeStores.curNodeIdList
- for (let i = 0, len = list.length; i < len; i++) {
- let node = treeStores.getNodeById(list[i])
- if (node && node.type === 'data-module') {
- // 不计算内部的sys
- let lastNodeId = node.id
- while (node && node.children && node.children.length > 0) {
- node = treeStores.getNodeById(node.children[node.children.length - 1])
- }
- if (lastNodeId !== node.id) {
- lastNodeId = node.id
- let lastIndex = list.indexOf(lastNodeId)
- if (i < lastIndex && lastIndex < len) {
- i = lastIndex
- }
- }
- } else if (node && nodeIsSystem(node.type)) {
- result.push(list[i])
- }
- }
- return result
- }
- getModuleSysList(moduleRootId) {
- let result = []
- let loopNode = nodeId => {
- let node = treeStores.getNodeById(nodeId)
- if (node) {
- if (nodeIsSystem(node.type)) {
- result.push(node.id)
- }
- if (node.children) {
- node.children.forEach(childId => {
- loopNode(childId)
- })
- }
- }
- }
- loopNode(moduleRootId)
- return result
- }
- render() {
- return (
- <div
- className={cls('jenga-item', {
- active: this.state.isActive,
- disabled: !this.state.isEnable
- })}
- >
- <JengaItemTitle eventNodeId={this.props.eventNodeId} />
- <BlockContext.Provider value={{ sysList: this.state.sysList }}>
- <JengaItemEvent
- eventNodeId={this.props.eventNodeId}
- visibleBlockIds={this.props.visibleBlockIds}
- />
- </BlockContext.Provider>
- </div>
- )
- }
- }
|