From c14ad8237b10d9e24ad3101e706e90c4366636c0 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期三, 05 十月 2022 23:28:09 +0800 Subject: [PATCH] 2022-10-05 --- public/options.json | 10 src/menu/tablenodes/index.jsx | 18 ++ src/tabviews/debugtable/index.jsx | 94 +++++++++++++++ src/views/appmanage/index.jsx | 3 src/menu/components/card/cardcellcomponent/index.jsx | 13 -- src/views/pcdesign/index.jsx | 68 +++++++++- src/menu/components/share/actioncomponent/formconfig.jsx | 14 ++ src/tabviews/debugtable/index.scss | 4 src/views/imdesign/index.jsx | 3 src/views/mobdesign/index.jsx | 68 +++++++++- src/views/menudesign/index.jsx | 2 src/menu/components/share/actioncomponent/index.jsx | 13 -- 12 files changed, 253 insertions(+), 57 deletions(-) diff --git a/public/options.json b/public/options.json index 32085f0..ea0061e 100644 --- a/public/options.json +++ b/public/options.json @@ -1,12 +1,12 @@ { - "appId": "202108312122504607B107A83F55B40C98CCF", - "appkey": "20210831212235413F287EC3BF489424496C8", + "appId": "201912040924165801464FF1788654BC5AC73", + "appkey": "20191106103859640976D6E924E464D029CF0", "mainSystemApi": "http://sso.mk9h.cn/cloud/webapi/dostars", "systemType": "", "externalDatabase": "false", "lineColor": "", "filter": "false", - "defaultApp": "mkindustry", + "defaultApp": "mk", "defaultLang": "zh-CN", "WXAppID": "", "WXminiAppID": "", @@ -17,6 +17,6 @@ "transfer": "false", "keepPassword": "true", "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"], - "host": "http://demo.mk9h.cn", - "service": "erp_new/" + "host": "http://qingqiumarket.cn", + "service": "MKWMS/" } \ No newline at end of file diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx index 4d67454..c00048b 100644 --- a/src/menu/components/card/cardcellcomponent/index.jsx +++ b/src/menu/components/card/cardcellcomponent/index.jsx @@ -297,17 +297,6 @@ <p style={{marginBottom: '5px'}}>{this.state.dict['model.tooltip.func.innerface'].replace('@ableField', ableField)}</p> </div> - let menulist = sessionStorage.getItem('fstMenuList') - if (menulist) { - try { - menulist = JSON.parse(menulist) - } catch (e) { - menulist = [] - } - } else { - menulist = [] - } - let supId = '' if (cards.setting && cards.setting.supModule) { let pid = cards.setting.supModule[cards.setting.supModule.length - 1] @@ -324,7 +313,7 @@ this.setState({ actvisible: true, card: card, - formlist: getActionForm(card, functip, cards, usefulFields, menulist, modules, anchors) + formlist: getActionForm(card, functip, cards, usefulFields, modules, anchors) }) } diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx index 970a91a..a8f146a 100644 --- a/src/menu/components/share/actioncomponent/formconfig.jsx +++ b/src/menu/components/share/actioncomponent/formconfig.jsx @@ -12,7 +12,7 @@ * @param {*} usefulFields 瀛樺偍杩囩▼鍙敤鐨勫紑濮嬪瓧娈� * @param {*} type 鎸夐挳绫诲瀷锛岀敤浜庡尯鍒嗗彲閫夌殑鎵撳紑鏂瑰紡 */ -export function getActionForm (card, functip, config, usefulFields, menulist = [], modules = [], anchors = []) { +export function getActionForm (card, functip, config, usefulFields, modules = [], anchors = []) { let appType = sessionStorage.getItem('appType') let viewType = sessionStorage.getItem('editMenuType') // 寮圭獥 popview let printTemps = sessionStorage.getItem('printTemps') @@ -20,6 +20,7 @@ let setting = config.setting || {} let columns = config.columns || [] let appMenus = [] + let menulist = [] let type = '' if (card.eleType === 'button') { @@ -115,6 +116,17 @@ } else { appMenus = [] } + } else { + menulist = sessionStorage.getItem('fstMenuList') + if (menulist) { + try { + menulist = JSON.parse(menulist) + } catch (e) { + menulist = [] + } + } else { + menulist = [] + } } if (appType === 'mob') { opentypes = opentypes.filter(item => ['pop', 'prompt', 'exec', 'innerpage', 'funcbutton'].includes(item.value)) diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx index 82785e7..d7b3e7d 100644 --- a/src/menu/components/share/actioncomponent/index.jsx +++ b/src/menu/components/share/actioncomponent/index.jsx @@ -171,17 +171,6 @@ functip = '' } - let menulist = sessionStorage.getItem('fstMenuList') - if (menulist) { - try { - menulist = JSON.parse(menulist) - } catch (e) { - menulist = [] - } - } else { - menulist = [] - } - let supId = '' if (config.setting && config.setting.supModule) { let pid = config.setting.supModule[config.setting.supModule.length - 1] @@ -198,7 +187,7 @@ this.setState({ visible: true, card: card, - formlist: getActionForm(card, functip, config, usefulFields, menulist, modules, anchors) + formlist: getActionForm(card, functip, config, usefulFields, modules, anchors) }) } diff --git a/src/menu/tablenodes/index.jsx b/src/menu/tablenodes/index.jsx index 0610c01..8f31c88 100644 --- a/src/menu/tablenodes/index.jsx +++ b/src/menu/tablenodes/index.jsx @@ -138,8 +138,14 @@ 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 + + if (_param && _param.type === 'app') { + label += ` (${_param.kei_no} | ${_param.typename}${param.lang !== 'zh-CN' ? ' | ' + param.lang : ''})` + } + cell.children.push({ - label: _param.MenuName, + label: label, id: item.tbname + 'menu' + i, direction: 'right', color: '#1890ff', @@ -176,6 +182,16 @@ _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param))) window.open(`#/menudesign/${_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}`) + } } } } diff --git a/src/tabviews/debugtable/index.jsx b/src/tabviews/debugtable/index.jsx new file mode 100644 index 0000000..8e6d5c1 --- /dev/null +++ b/src/tabviews/debugtable/index.jsx @@ -0,0 +1,94 @@ +import React, {Component} from 'react' +import { is, fromJS } from 'immutable' +import { notification, Table} from 'antd' + +import Api from '@/api' +import UtilsDM from '@/utils/utils-datamanage.js' + +import './index.scss' + +class DebugTable extends Component { + state = { + columns: null, // 鏄剧ず鍒� + data: [], // 鍒楄〃鏁版嵁闆� + loading: false, // 鍒楄〃鏁版嵁鍔犺浇涓� + setting: { + interType: 'system', + execute: true, + dataresource: 'select * from s_debug_value_log where createuserid=@userid@' + }, + arr_field: 'ID,Sort,CDefine1,CDefine2,CDefine3,CDefine4,CDefine5,CDefine6,CDefine7,' + } + + /** + * @description 瀛愯〃鏁版嵁鍔犺浇 + */ + async loadmaindata () { + const { setting, arr_field } = this.state + + this.setState({ + loading: true + }) + + let _orderBy = 'sort' + let param = UtilsDM.getQueryDataParams(setting, arr_field, [], _orderBy, 1, 9999, '') + + let result = await Api.genericInterface(param) + + if (result.status) { + let start = 1 + + this.setState({ + data: result.data.map((item, index) => { + item.key = index + item.$$uuid = item.ID || '' + item.$$key = '' + item.key + item.$$uuid + item.$Index = start + index + '' + + return item + }), + loading: false + }) + } else { + this.setState({ + loading: false + }) + + notification.error({ + top: 92, + message: result.message, + duration: 10 + }) + } + } + + UNSAFE_componentWillMount() { + // 缁勪欢鍔犺浇鏃讹紝鑾峰彇鑿滃崟鏁版嵁 + this.loadmaindata() + } + + shouldComponentUpdate (nextProps, nextState) { + return !is(fromJS(this.state), fromJS(nextState)) + } + + /** + * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊 + */ + componentWillUnmount () { + this.setState = () => { + return + } + } + + render() { + const { data, loading, columns } = this.state + + return ( + <div className="debugtable"> + <Table size="middle" columns={columns} dataSource={data} loading={loading} scroll={{ x: '100%', y: false }}/> + </div> + ) + } +} + +export default DebugTable \ No newline at end of file diff --git a/src/tabviews/debugtable/index.scss b/src/tabviews/debugtable/index.scss new file mode 100644 index 0000000..7608d90 --- /dev/null +++ b/src/tabviews/debugtable/index.scss @@ -0,0 +1,4 @@ +.debugtable { + position: relative; + min-height: 200px; +} diff --git a/src/views/appmanage/index.jsx b/src/views/appmanage/index.jsx index 931230a..a3512bd 100644 --- a/src/views/appmanage/index.jsx +++ b/src/views/appmanage/index.jsx @@ -709,8 +709,9 @@ if (item.typename === 'pc') { route = 'pcdesign' } + let param = {...item, kei_no: selectApp.kei_no, remark: selectApp.remark, type: 'app'} - window.open(window.location.href.replace(/#.+/ig, `#/${route}/${window.btoa(window.encodeURIComponent(JSON.stringify({...item, kei_no: selectApp.kei_no, remark: selectApp.remark, type: 'app'})))}`)) + window.open(window.location.href.replace(/#.+/ig, `#/${route}/${window.btoa(window.encodeURIComponent(JSON.stringify(param)))}`)) } jumpMenu = (item) => { diff --git a/src/views/imdesign/index.jsx b/src/views/imdesign/index.jsx index 15ee914..3092a93 100644 --- a/src/views/imdesign/index.jsx +++ b/src/views/imdesign/index.jsx @@ -55,10 +55,9 @@ if (param.type === 'app') { sessionStorage.setItem('appId', param.ID || '') + sessionStorage.setItem('appName', param.remark || '') sessionStorage.setItem('lang', param.lang || 'zh-CN') sessionStorage.setItem('kei_no', param.kei_no || '') - sessionStorage.setItem('role_type', param.role_type || 'true') - sessionStorage.setItem('login_types', param.login_types || 'false') sessionStorage.setItem('typename', param.typename || 'mob') sessionStorage.setItem('adapter', param.adapter || '') sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff') diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx index 536a66e..357f02f 100644 --- a/src/views/menudesign/index.jsx +++ b/src/views/menudesign/index.jsx @@ -639,7 +639,7 @@ } tbs = tbs.map(tb => `'${tb}'`).join(';') - let key = md5(config.uuid + window.GLOB.appkey + tbs.toLowerCase()) + let key = md5(config.uuid + tbs.toLowerCase()) let url = '' if (config.tbkey === key) { diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx index 4402d28..7d19e54 100644 --- a/src/views/mobdesign/index.jsx +++ b/src/views/mobdesign/index.jsx @@ -2,16 +2,16 @@ import { DndProvider } from 'react-dnd' import { withRouter } from 'react-router' import { is, fromJS } from 'immutable' -import moment from 'moment' import HTML5Backend from 'react-dnd-html5-backend' import { ConfigProvider, notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd' import { DoubleLeftOutlined, DoubleRightOutlined, HomeOutlined, LoginOutlined, RedoOutlined, ArrowLeftOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons' +import moment from 'moment' +import md5 from 'md5' import Api from '@/api' import Utils, { setGLOBFuncs } from '@/utils/utils.js' import zhCN from '@/locales/zh-CN/mob.js' import enUS from '@/locales/en-US/mob.js' -import antdEnUS from 'antd/es/locale/en_US' import antdZhCN from 'antd/es/locale/zh_CN' import MKEmitter from '@/utils/events.js' import MenuUtils from '@/utils/utils-custom.js' @@ -33,6 +33,7 @@ const ViewNodes = asyncComponent(() => import('@/menu/viewnodes')) const SourceWrap = asyncComponent(() => import('@/mob/modulesource')) const Modulecell = asyncComponent(() => import('@/menu/modulecell')) +const TableNodes = asyncComponent(() => import('@/menu/tablenodes')) const BgController = asyncComponent(() => import('@/pc/bgcontroller')) const ReplaceField = asyncComponent(() => import('@/menu/replaceField')) const SysInterface = asyncComponent(() => import('@/menu/sysinterface')) @@ -61,7 +62,6 @@ class MobDesign extends Component { state = { - localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS, dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, loading: true, MenuId: '', @@ -89,10 +89,9 @@ if (param.type === 'app') { sessionStorage.setItem('appId', param.ID || '') + sessionStorage.setItem('appName', param.remark || '') sessionStorage.setItem('lang', param.lang || 'zh-CN') sessionStorage.setItem('kei_no', param.kei_no || '') - sessionStorage.setItem('role_type', param.role_type || 'true') - sessionStorage.setItem('login_types', param.login_types || 'false') sessionStorage.setItem('typename', param.typename || 'mob') sessionStorage.setItem('adapter', param.adapter || '') sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff') @@ -100,7 +99,6 @@ sessionStorage.setItem('instantMessage', param.instantMessage || '') this.setState({ - localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS, dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS }) this.getAppMessage(param.MenuID) @@ -919,12 +917,16 @@ }) } - getMenuMessage = () => { + getMenuMessage = (tbs) => { const { config } = this.state let traversal = (components) => { let list = [] components.forEach(item => { + if (item.$tables) { + tbs.push(...item.$tables) + } + let m = { key: item.uuid, title: item.name, @@ -1320,10 +1322,50 @@ config.enabled = false } + let tbs = [] let roleParam = {type: 'view', version: '1.0', key: config.uuid, title: config.MenuName, children: []} - roleParam.children = this.getMenuMessage() + roleParam.children = this.getMenuMessage(tbs) config.loginview = false config.tabview = false + + let arr = [] + tbs = tbs.filter(tb => { + let _tb = tb.toLowerCase() + + if (arr.includes(_tb)) return false + arr.push(_tb) + + return true + }) + tbs.sort() + if (tbs.length && sessionStorage.getItem('mk_tb_names')) { + let names = sessionStorage.getItem('mk_tb_names') + tbs = tbs.filter(tb => names.indexOf(',' + tb.toLowerCase() + ',') > -1) + } + tbs = tbs.map(tb => `'${tb}'`).join(';') + + let key = md5(config.uuid + sessionStorage.getItem('kei_no') + sessionStorage.getItem('typename') + sessionStorage.getItem('lang') + tbs.toLowerCase()) + let url = '' + + if (config.tbkey === key) { + key = '' + } else { + let urlparam = { + type: 'app', + MenuID: config.uuid, + ID: sessionStorage.getItem('appId') || '', + remark: sessionStorage.getItem('appName') || '', + lang: sessionStorage.getItem('lang') || '', + kei_no: sessionStorage.getItem('kei_no') || '', + typename: sessionStorage.getItem('typename') || '', + adapter: sessionStorage.getItem('adapter') || '', + sysBgColor: sessionStorage.getItem('sysBgColor') || '', + MenuName: config.MenuName || '', + } + + url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam))) + config.tbkey = key + } if (roleParam.children.length === 0) { roleParam.pass = true @@ -1377,7 +1419,10 @@ menus_rolelist: window.btoa(window.encodeURIComponent(JSON.stringify(roleParam))), LText: '', LTexttb: '', - menus_used_list + menus_used_list, + debug_md5: key, + debug_url: url, + debug_list: window.btoa(tbs) } param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') @@ -1921,10 +1966,10 @@ render () { - const { viewType, localedict, comloading, loading, settingshow, controlshow, activeKey, dict, MenuId, config, menuloading, customComponents, adapters, eyeopen } = this.state + const { viewType, comloading, loading, settingshow, controlshow, activeKey, dict, MenuId, config, menuloading, customComponents, adapters, eyeopen } = this.state return ( - <ConfigProvider locale={localedict}> + <ConfigProvider locale={antdZhCN}> <div className={'mk-mob-view ' + viewType} id="mk-mob-design-view"> <Header changeView={this.changeView}/> {loading ? <Spin className="view-spin" size="large" /> : null} @@ -1979,6 +2024,7 @@ <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button> <CreateView resetmenu={this.getAppMenus} /> <PasteController insert={this.insert} /> + <TableNodes config={config} /> <ViewNodes config={config} MenuId={MenuId}/> <SysInterface config={config} updateConfig={this.updateConfig}/> <PictureController/> diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx index 26c4531..17f63bf 100644 --- a/src/views/pcdesign/index.jsx +++ b/src/views/pcdesign/index.jsx @@ -2,16 +2,17 @@ import { DndProvider } from 'react-dnd' import { withRouter } from 'react-router' import { is, fromJS } from 'immutable' -import moment from 'moment' import HTML5Backend from 'react-dnd-html5-backend' import { ConfigProvider, notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd' import { DoubleLeftOutlined, DoubleRightOutlined, HomeOutlined, LoginOutlined, RedoOutlined, ArrowLeftOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons' +import moment from 'moment' +import md5 from 'md5' import Api from '@/api' import Utils, { setGLOBFuncs } from '@/utils/utils.js' import zhCN from '@/locales/zh-CN/mob.js' import enUS from '@/locales/en-US/mob.js' -import antdEnUS from 'antd/es/locale/en_US' +// import antdEnUS from 'antd/es/locale/en_US' import antdZhCN from 'antd/es/locale/zh_CN' import MKEmitter from '@/utils/events.js' import MenuUtils from '@/utils/utils-custom.js' @@ -31,6 +32,7 @@ const ViewNodes = asyncComponent(() => import('@/menu/viewnodes')) const SourceWrap = asyncComponent(() => import('@/pc/modulesource')) const Modulecell = asyncComponent(() => import('@/menu/modulecell')) +const TableNodes = asyncComponent(() => import('@/menu/tablenodes')) const CreateView = asyncComponent(() => import('@/pc/createview')) const BgController = asyncComponent(() => import('@/pc/bgcontroller')) const Quotecomponent = asyncComponent(() => import('@/pc/quotecomponent')) @@ -55,7 +57,6 @@ class MenuDesign extends Component { state = { - localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS, dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, loading: true, MenuId: '', @@ -91,14 +92,12 @@ if (param.type === 'app') { sessionStorage.setItem('appId', param.ID || '') + sessionStorage.setItem('appName', param.remark || '') sessionStorage.setItem('lang', param.lang || 'zh-CN') sessionStorage.setItem('kei_no', param.kei_no || '') - sessionStorage.setItem('role_type', param.role_type || 'true') - sessionStorage.setItem('login_types', param.login_types || 'false') sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff') this.setState({ - localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS, dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS }) this.getAppMessage(param.MenuID) @@ -869,7 +868,7 @@ }) } - getMenuMessage = () => { + getMenuMessage = (tbs) => { const { config } = this.state let nodes = {type: 'view', version: '1.0', key: config.uuid, title: config.MenuName, children: []} let popviews = [] @@ -877,6 +876,10 @@ let traversal = (components) => { let list = [] components.forEach(item => { + if (item.$tables) { + tbs.push(...item.$tables) + } + let m = { key: item.uuid, title: item.name, @@ -1204,11 +1207,50 @@ config.enabled = false } - let roleParam = this.getMenuMessage() + let tbs = [] + let roleParam = this.getMenuMessage(tbs) let subMenus = this.getSubMenus() let menus_used_list = subMenus.map(m => `'${config.uuid}','${config.MenuName || ''}','${config.MenuNo || ''}','${m.MenuID}','${m.MenuName}'`).join(';') menus_used_list = window.btoa(window.encodeURIComponent(menus_used_list || 'del')) + + let arr = [] + tbs = tbs.filter(tb => { + let _tb = tb.toLowerCase() + + if (arr.includes(_tb)) return false + arr.push(_tb) + + return true + }) + tbs.sort() + if (tbs.length && sessionStorage.getItem('mk_tb_names')) { + let names = sessionStorage.getItem('mk_tb_names') + tbs = tbs.filter(tb => names.indexOf(',' + tb.toLowerCase() + ',') > -1) + } + tbs = tbs.map(tb => `'${tb}'`).join(';') + + let key = md5(config.uuid + sessionStorage.getItem('kei_no') + 'pc' + sessionStorage.getItem('lang') + tbs.toLowerCase()) + let url = '' + + if (config.tbkey === key) { + key = '' + } else { + let urlparam = { + type: 'app', + MenuID: config.uuid, + ID: sessionStorage.getItem('appId') || '', + remark: sessionStorage.getItem('appName') || '', + lang: sessionStorage.getItem('lang') || '', + kei_no: sessionStorage.getItem('kei_no') || '', + typename: 'pc', + sysBgColor: sessionStorage.getItem('sysBgColor') || '', + MenuName: config.MenuName || '', + } + + url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam))) + config.tbkey = key + } let param = { func: 'sPC_TrdMenu_AddUpt', @@ -1227,7 +1269,10 @@ open_edition: config.open_edition, LText: '', LTexttb: '', - menus_used_list + menus_used_list, + debug_md5: key, + debug_url: url, + debug_list: window.btoa(tbs) } param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') @@ -1830,10 +1875,10 @@ } render () { - const { localedict, loading, comloading, activeKey, settingshow, controlshow, dict, MenuId, config, menuloading, customComponents, eyeopen } = this.state + const { loading, comloading, activeKey, settingshow, controlshow, dict, MenuId, config, menuloading, customComponents, eyeopen } = this.state return ( - <ConfigProvider locale={localedict}> + <ConfigProvider locale={antdZhCN}> <div className={'mk-pc-view '} id="mk-pc-design-view"> {loading ? <Spin className="view-spin" size="large" /> : null} <DndProvider backend={HTML5Backend}> @@ -1886,6 +1931,7 @@ <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button> <CreateView resetmenu={this.getAppMenus} /> <PasteController insert={this.insert} /> + <TableNodes config={config} /> <ViewNodes config={config} MenuId={MenuId}/> <SysInterface config={config} updateConfig={this.updateConfig}/> <PictureController/> -- Gitblit v1.8.0