From f3d4db769ba9b51b799d981511a710fd443d0e08 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期一, 21 四月 2025 12:18:03 +0800 Subject: [PATCH] Merge branch 'master' into positec --- src/menu/tablenodes/index.jsx | 548 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 514 insertions(+), 34 deletions(-) diff --git a/src/menu/tablenodes/index.jsx b/src/menu/tablenodes/index.jsx index 10b38e2..4174e4d 100644 --- a/src/menu/tablenodes/index.jsx +++ b/src/menu/tablenodes/index.jsx @@ -1,14 +1,15 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' -import { Modal, Button, notification, Spin } from 'antd' +import { Modal, Button, notification, Spin, Input, message } from 'antd' import { ForkOutlined } from '@ant-design/icons' import Api from '@/api' import G6 from "@antv/g6" import Utils from '@/utils/utils.js' -import MKEmitter from '@/utils/events.js' import './index.scss' + +const { Search } = Input class TableNodes extends Component { static propTpyes = { @@ -18,6 +19,7 @@ state = { visible: false, loading: false, + nodes: null, empty: false } @@ -53,13 +55,351 @@ }) } - traversal(config.components) + if (config.Template === 'BaseTable') { + config.components.forEach(item => { + if (item.type === 'tabs') { + item.subtabs.forEach(tab => { + if (tab.components[0].$tables) { + ptbs.push(...tab.components[0].$tables) + tab.components[0].$tables.forEach(tb => { + tbs.push({ + label: tab.label, + table: tb, + color: '#5AD8A6', + id: Utils.getuuid(), + direction: 'left' + }) + }) + } + }) + } else if (item.$tables) { + ptbs.push(...item.$tables) + item.$tables.forEach(tb => { + tbs.push({ + label: '涓昏〃', + table: tb, + color: '#5AD8A6', + id: Utils.getuuid(), + direction: 'left' + }) + }) + } + }) + } else { + traversal(config.components) + + if (config.interfaces) { + config.interfaces.forEach(item => { + if (item.$tables) { + ptbs.push(...item.$tables) + item.$tables.forEach(tb => { + tbs.push({ + label: item.name, + table: tb, + color: '#5AD8A6', + id: Utils.getuuid(), + direction: 'left' + }) + }) + } + }) + } + } return {tbs, ptbs} } + getFuncAndInterface = (config) => { + let ptbs = [] + + let filterBtn = (cell, tbs) => { + if (cell.intertype === 'inner') { + tbs.push({ + label: cell.innerFunc + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } else if (cell.intertype === 'outer' || cell.intertype === 'custom') { + if (cell.innerFunc) { + tbs.push({ + label: cell.innerFunc + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (cell.outerFunc) { + tbs.push({ + label: cell.outerFunc + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (cell.interface && cell.sysInterface !== 'true') { + tbs.push({ + label: cell.interface + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (cell.proInterface) { + tbs.push({ + label: cell.proInterface + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (cell.exInterface) { + let url = '' + + try { + url = JSON.parse(cell.exInterface).url + } catch(e) { + url = '' + } + + if (url) { + tbs.push({ + label: url + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + } + if (cell.exProInterface) { + let url = '' + + try { + url = JSON.parse(cell.exProInterface).url + } catch(e) { + url = '' + } + + if (url) { + tbs.push({ + label: url + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + } + if (cell.callbackFunc) { + tbs.push({ + label: cell.callbackFunc + ' (' + cell.label + ')', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + } + } + + let filterSetting = (item, tbs) => { + if (!item.setting) return + if (item.setting.interType === 'inner') { + tbs.push({ + label: item.setting.innerFunc + ' (鏁版嵁婧�)', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } else if (item.setting.interType === 'outer') { + if (item.setting.outerFunc) { + tbs.push({ + label: item.setting.outerFunc + ' (鏁版嵁婧�)', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (item.setting.interface && item.setting.sysInterface !== 'true') { + tbs.push({ + label: item.setting.interface + ' (鏁版嵁婧�)', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (item.setting.proInterface) { + tbs.push({ + label: item.setting.proInterface + ' (鏁版嵁婧�)', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + if (item.setting.exInterface) { + let url = '' + + try { + url = JSON.parse(item.setting.exInterface).url + } catch(e) { + url = '' + } + + if (url) { + tbs.push({ + label: url + ' (鏁版嵁婧�)', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + } + if (item.setting.exProInterface) { + let url = '' + + try { + url = JSON.parse(item.setting.exProInterface).url + } catch(e) { + url = '' + } + + if (url) { + tbs.push({ + label: url + ' (鏁版嵁婧�)', + color: 'orange', + id: Utils.getuuid(), + direction: 'left' + }) + } + } + } + } + + let traversal = (components, extra) => { + components.forEach(item => { + if (item.type === 'tabs') { + item.subtabs.forEach(tab => { + traversal(tab.components, extra) + }) + } else if (item.type === 'group') { + traversal(item.components, extra) + } else { + let tbs = [] + + filterSetting(item, tbs) + + if (item.action) { + item.action.forEach(cell => { + if (cell.OpenType === 'popview') { + if (cell.config.components) { + traversal(cell.config.components, `-${cell.label}(寮圭獥)`) + } + } else { + filterBtn(cell, tbs) + } + }) + } + + if (item.type === 'card' || item.type === 'carousel' || item.type === 'timeline') { + item.subcards.forEach(card => { + card.elements && card.elements.forEach(cell => { + if (cell.eleType !== 'button') return + + if (cell.OpenType === 'popview') { + if (cell.config.components) { + traversal(cell.config.components, `-${cell.label}(寮圭獥)`) + } + } else { + filterBtn(cell, tbs) + } + }) + card.backElements && card.backElements.forEach(cell => { + if (cell.eleType !== 'button') return + + if (cell.OpenType === 'popview') { + if (cell.config.components) { + traversal(cell.config.components, `-${cell.label}(寮圭獥)`) + } + } else { + filterBtn(cell, tbs) + } + }) + }) + } else if (item.type === 'balcony') { + item.elements && item.elements.forEach(cell => { + if (cell.eleType !== 'button') return + + if (cell.OpenType === 'popview') { + if (cell.config.components) { + traversal(cell.config.components, `-${cell.label}(寮圭獥)`) + } + } else { + filterBtn(cell, tbs) + } + }) + } else if (item.type === 'table') { + let loopCol = (cols) => { + cols.forEach(col => { + if (col.type === 'colspan') { + loopCol(col.subcols) + } else if (col.type === 'custom') { + col.elements.forEach(cell => { + if (cell.eleType !== 'button') return + + if (cell.OpenType === 'popview') { + if (cell.config.components) { + traversal(cell.config.components, `-${cell.label}(寮圭獥)`) + } + } else { + filterBtn(cell, tbs) + } + }) + } + }) + } + loopCol(item.cols) + } else if (item.type === 'form') { + item.subcards.forEach(group => { + filterBtn(group.subButton, tbs) + }) + } + + if (tbs.length) { + ptbs.push({ + label: item.name + extra, + id: Utils.getuuid(), + direction: 'left', + color: 'orange', + children: tbs + }) + } + } + }) + } + + if (config.interfaces) { + config.interfaces.forEach(item => { + let tbs = [] + filterSetting(item, tbs) + if (tbs.length) { + ptbs.push({ + label: item.name, + id: Utils.getuuid(), + direction: 'left', + color: 'orange', + children: tbs + }) + } + }) + } + + traversal(config.components, '') + + return ptbs + } + trigger = () => { const { config } = this.props + + if (!config) return this.setState({visible: true, loading: true, empty: false}, () => { let param = { @@ -69,7 +409,7 @@ MenuID: config.uuid } - Api.getSystemConfig(param).then(result => { + Api.getCloudConfig(param).then(result => { if (!result.status) { notification.warning({ top: 92, @@ -105,6 +445,7 @@ id: 'par' + i, direction: 'left', color: '#5AD8A6', + node: 'table', children: [] } @@ -118,14 +459,56 @@ }) } - if (ptbs.length) { - ptbs.forEach((item, i) => { + let funcs = this.getFuncAndInterface(config) + + if (funcs.length) { + data.children.push(...funcs) + } + + if (result.tb_list) { + result.tb_list.sort((a, b) => a.tbname > b.tbname ? 1 : -1) + let length = result.tb_list.length + result.tb_list.forEach((item, i) => { let cell = { - label: item, - id: 'menu' + i, + label: item.tbname, + name: item.tbname.toLowerCase(), + id: 'table' + i, direction: 'right', color: '#1890ff', - // children: [] + collapsed: false, + collable: true, + children: [] + } + + if (item[item.tbname]) { + item[item.tbname].forEach((m, i) => { + if (m.debug_url) { + let _param = JSON.parse(window.decodeURIComponent(window.atob(m.debug_url))) + let label = _param.MenuName + _param.lang = _param.lang || 'zh-CN' + + if (_param && _param.type === 'app') { + label += ` (${_param.kei_no} | ${_param.typename}${_param.lang !== 'zh-CN' ? ' | ' + _param.lang : ''})` + } else if (_param && _param.lang && _param.lang !== 'zh-CN') { + label += ` (${_param.lang})` + } + + cell.children.push({ + label: label, + id: item.tbname + 'menu' + i, + direction: 'right', + color: '#1890ff', + type: 'dice-mind-map-leaf', + param: _param + }) + } + }) + } + + if (cell.children.length > 5 && length > 1) { + cell.collapsed = true + } else if (cell.children.length === 0) { + cell.collable = false } data.children.push(cell) @@ -135,7 +518,7 @@ if (data.children.length === 0) { this.setState({empty: true, loading: false}) } else { - this.setState({loading: false}) + this.setState({loading: false, nodes: data}) this.getForks(data) } }) @@ -143,9 +526,63 @@ } changeMenu = (menu) => { - if (menu.depth === 0) return + if (menu.direction !== 'right') return - MKEmitter.emit('changeEditMenu', menu) + if (menu.depth === 1) { + sessionStorage.setItem('mk-table-node', menu.label) + window.open('#/hs') + + setTimeout(() => { + sessionStorage.removeItem('mk-table-node') + }, 50) + } else if (menu.param) { + if (menu.param.type === 'admin') { + if (['custom', 'home', 'billPrint'].includes(menu.param.MenuType)) { + let _param = {...menu.param} + delete _param.type + _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param))) + window.open(`#/menudesign/${_param}`) + } else if (menu.param.MenuType === 'BaseTable') { + let _param = {...menu.param} + delete _param.type + delete _param.MenuType + _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param))) + window.open(`#/tabledesign/${_param}`) + } + } else if (menu.param.type === 'app') { + if (menu.param.typename !== 'pc') { + let _param = {...menu.param} + _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param))) + window.open(`#/mobdesign/${_param}`) + } else { + let _param = {...menu.param} + _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param))) + window.open(`#/pcdesign/${_param}`) + } + } + } + } + + resetNodes = (key) => { + let data = fromJS(this.state.nodes).toJS() + key = key ? key.toLowerCase() : '' + + data.children.forEach(cell => { + if (cell.direction === 'right') { + cell.fontcolor = '' + if (key && cell.name.indexOf(key) > -1) { + cell.fontcolor = 'orange' + } + } + }) + let _element = document.getElementById('mkTableNode') + if (_element) { + _element.innerHTML = '' + } + + this.setState({}, () => { + this.getForks(data) + }) } getForks = (data) => { @@ -159,12 +596,12 @@ const stroke = cfg.style.stroke || '#096dd9'; return ` - <group> - <rect draggable="true" style={{width: ${width}, height: 30, stroke: ${stroke}, radius: 4}} keyshape> - <text style={{ fontSize: 14, marginLeft: 6, marginTop: 6 }}>${cfg.label}</text> - </rect> - </group> - `; + <group> + <rect draggable="true" style={{width: ${width}, height: 30, stroke: ${stroke}, radius: 4}} keyshape> + <text style={{ fontSize: 14, marginLeft: 6, marginTop: 6 }}>${cfg.label}</text> + </rect> + </group> + `; }, getAnchorPoints() { return [ @@ -183,13 +620,13 @@ const color = cfg.color; return ` - <group> - <rect draggable="true" style={{width: ${width}, height: 26, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, fill: 'transparent' }}> - <text style={{ fontSize: 12, fill: black, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, marginLeft: 12, marginTop: 6 }}>${cfg.label}</text> - </rect> - <rect style={{ fill: ${color}, width: ${width}, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, height: 2, x: 0, y: 32 }} /> - </group> - `; + <group> + <rect draggable="true" style={{width: ${width}, height: 26, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, fill: 'transparent' }}> + <text style={{ fontSize: 12, fill: ${cfg.fontcolor ? cfg.fontcolor : 'black'}, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, marginLeft: 12, marginTop: 6 }}>${cfg.label} ${cfg.collable ? '+' : ''}</text> + </rect> + <rect style={{ fill: ${color}, width: ${width}, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, height: 2, x: 0, y: 32 }} /> + </group> + `; }, getAnchorPoints() { return [ @@ -209,6 +646,35 @@ editNode(evt) { const item = evt.item; const model = item.get('model'); + + // 閫変腑鑺傜偣 + this.graph.getNodes().forEach(node => { + let _model = node.get('model') + if (_model.fontcolor === '#1890ff') { + _model.fontcolor = '' + this.graph.updateItem(node, _model, false) + } + }) + + if (model.direction === 'left') { + if (model.node === 'table') { + model.fontcolor = '#1890ff' + this.graph.updateItem(item, model, false) + + let oInput = document.createElement('input') + oInput.value = model.label + document.body.appendChild(oInput) + oInput.select() + document.execCommand('Copy') + document.body.removeChild(oInput) + + message.success('琛ㄥ悕澶嶅埗鎴愬姛銆�') + } + return + } + + model.fontcolor = '#1890ff' + this.graph.updateItem(item, model, false) that.changeMenu(model) } @@ -269,7 +735,7 @@ data.color = color; } - if (d.children) { + if (d.children && !d.collapsed) { data.children = d.children.map((child) => changeData(child, level + 1, data.color)); } return data; @@ -278,7 +744,7 @@ }; const tree = new G6.TreeGraph({ - container: 'mountNode', + container: 'mkTableNode', width: this.wrap.offsetWidth, height: this.wrap.offsetHeight, fitView: true, @@ -310,9 +776,21 @@ lineWidth: 2, }, }, - minZoom: 0.5, + minZoom: 0.3, modes: { - default: ['drag-canvas', 'zoom-canvas', 'dice-mindmap'], + default: [ + { + type: 'collapse-expand', + trigger: 'click', + shouldBegin: (e, self) => { + if (e.item && e.item.getModel().collable) return true; + return false; + }, + }, + 'drag-canvas', + 'zoom-canvas', + 'dice-mindmap' + ], }, }); @@ -325,7 +803,7 @@ const { visible, loading, empty } = this.state return ( - <div style={{display: 'inline-block'}}> + <> <Button style={{borderColor: '#8E44AD', color: '#8E44AD'}} onClick={this.trigger}><ForkOutlined /> 琛ㄥ叧绯诲浘</Button> <Modal title="" @@ -337,17 +815,19 @@ footer={[]} destroyOnClose > - <div className="header">椤甸潰鍏崇郴鍥�</div> + <div className="header">琛ㄥ叧绯诲浘</div> + <Search className="tb-search" placeholder="璇疯緭鍏ヨ〃鍚�" onSearch={value => this.resetNodes(value)} enterButton /> <div className="wrap"> {loading ? <Spin size="large" /> : null} - {empty ? <div className="empty">鏈煡璇㈠埌椤甸潰鍏宠仈鑿滃崟銆�</div> : null} - <div className="mountNode" id="mountNode" ref={ref => this.wrap = ref}></div> + {empty ? <div className="empty">鏈煡璇㈠埌琛ㄥ悕淇℃伅銆�</div> : null} + <div className="mountNode" id="mkTableNode" ref={ref => this.wrap = ref}></div> </div> <div className="footer"> <Button key="cancel" onClick={() => { this.setState({ visible: false })}}>鍏抽棴</Button> + <span className="tip">娉細鐐瑰嚮琛ㄥ悕锛堝彸渚э級鍙睍寮�/鏀惰捣鑿滃崟锛屽乏渚ф鑹叉爣娉ㄤ负鎺ュ彛鎴栧嚱鏁板悕銆�</span> </div> </Modal> - </div> + </> ) } } -- Gitblit v1.8.0