From bd1dfc9e6c9b9f8076ca2783ce598e0936b4c664 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期三, 22 十二月 2021 14:36:03 +0800 Subject: [PATCH] 2021-12-22 --- src/templates/menuconfig/editthdmenu/index.jsx | 382 +++++++++++++++++++++++++++++------------------------- 1 files changed, 206 insertions(+), 176 deletions(-) diff --git a/src/templates/menuconfig/editthdmenu/index.jsx b/src/templates/menuconfig/editthdmenu/index.jsx index 0f35f60..1c9c99f 100644 --- a/src/templates/menuconfig/editthdmenu/index.jsx +++ b/src/templates/menuconfig/editthdmenu/index.jsx @@ -1,9 +1,12 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' +import { connect } from 'react-redux' import { DndProvider } from 'react-dnd' +import { withRouter } from 'react-router-dom' import HTML5Backend from 'react-dnd-html5-backend' -import { notification, Modal, Button, Spin, Icon, Col, Card, Tabs, Row, Input } from 'antd' +import { notification, Modal, Button, Spin, Col, Card, Tabs, Row, Input } from 'antd' +import { PlusOutlined } from '@ant-design/icons' import moment from 'moment' import Api from '@/api' @@ -14,11 +17,12 @@ import treepage from '@/assets/img/treepage.jpg' import calendar from '@/assets/img/calendar.jpg' import customImg from '@/assets/img/custom.jpg' - +import MkIcon from '@/components/mk-icon' import Preview from './preview' import MenuForm from './menuform' import TransferForm from '@/templates/zshare/basetransferform' import Utils from '@/utils/utils.js' +import MenuUtils from '@/utils/utils-custom.js' import DragElement from '../menuelement' import asyncLoadComponent from '@/utils/asyncLoadComponent' import './index.scss' @@ -50,7 +54,7 @@ } state = { - dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, + dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, thawmenulist: null, // 宸插喕缁撶殑浜岀骇鑿滃崟 type: '', // 鎿嶄綔绫诲瀷锛屾柊寤烘垨缂栬緫鑿滃崟 thawMvisible: false, // 瑙i櫎鍐荤粨妯℃�佹 @@ -76,8 +80,16 @@ btnTabConfig: null, // 鎵撳紑鏂版爣绛炬寜閽厤缃� handleMVisible: false, // 娣诲姞鎴栦慨鏀硅彍鍗曟ā鎬佹锛堣鑹叉潈闄愬垎閰嶇瓑锛� sysMenu: false, // 娣诲姞鎴栫紪杈戣彍鍗曪紙瑙掕壊鏉冮檺鍒嗛厤绛夛級 - fstMenuId: null, // 涓�绾ц彍鍗旾d - fstMenuList: null // 涓�绾ц彍鍗曞垪琛� + targetKeys: [] // 瑙e喕鑿滃崟鍒楄〃 + } + + /** + * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊 + */ + componentWillUnmount () { + this.setState = () => { + return + } } /** @@ -106,7 +118,7 @@ }) } else if (menu.type === 'close') { confirm({ - title: this.state.dict['model.menu.close'].replace('@M', menu.card.text), + title: this.state.dict['model.menu.close'].replace('@M', menu.card.MenuName), content: '', onOk() { let param = { @@ -130,25 +142,13 @@ } else if (menu.type === 'edit') { let _menu = fromJS(menu.card).toJS() - delete _menu.id - delete _menu.src - delete _menu.text - - if (_menu.PageParam && _menu.PageParam.Template === 'RolePermission') { // 鍗曢〉闈慨鏀� + if (_menu.PageParam && (_menu.PageParam.Template === 'RolePermission' || _menu.PageParam.Template === 'NewPage')) { // 鍗曢〉闈慨鏀� _menu.Template = _menu.PageParam.Template + _menu.url = _menu.PageParam.url - if (!this.state.fstMenuId) { - notification.warning({ - top: 92, - message: '鑿滃崟鍔犺浇涓紝璇风◢鍚庨噸璇曪紒', - duration: 5 - }) - return - } - + _menu.fstMenuId = _menu.FstId _menu.supMenuList = this.props.supMenuList - _menu.fstMenuId = this.state.fstMenuId || '' - _menu.fstMenuList = this.state.fstMenuList || [] + _menu.fstMenuList = this.props.menuTree this.setState({ handleMVisible: true, @@ -181,9 +181,9 @@ } _menu.LongParam = _LongParam + _menu.fstMenuId = _menu.FstId _menu.supMenuList = this.props.supMenuList - _menu.fstMenuId = this.state.fstMenuId || '' - _menu.fstMenuList = this.state.fstMenuList || [] + _menu.fstMenuList = this.props.menuTree _menu.open_edition = res.open_edition || '' // 妫�娴嬫ā鏉挎槸鍚﹀瓨鍦� @@ -193,7 +193,7 @@ if (_Template.length === 0) { notification.warning({ top: 92, - message: this.state.dict['model.menu.template.empty'], + message: '鑿滃崟妯℃澘涓㈠け锛岃閲嶆柊閫夋嫨妯℃澘锛�', duration: 5 }) @@ -205,7 +205,7 @@ }, () => { document.getElementById('root').style.overflowY = 'hidden' }) - } else if (_menu.fstMenuId) { + } else { this.setState({ type: 'edit', editMenu: _menu, @@ -213,12 +213,6 @@ tabview: _menu.PageParam.Template }, () => { document.getElementById('root').style.overflowY = 'hidden' - }) - } else { - _menu.loadingFstMenuId = true - this.setState({ - type: 'edit', - editMenu: _menu }) } } else { @@ -247,15 +241,6 @@ return } - if (!this.state.fstMenuId) { - notification.warning({ - top: 92, - message: '鑿滃崟鍔犺浇涓紝璇风◢鍚庨噸璇曪紒', - duration: 5 - }) - return - } - this.setState({ tabview: 'template', editMenu: { @@ -268,8 +253,8 @@ isSubtable: '', // 鏄惁涓轰富瀛愯〃 ParentId: this.props.supMenu.MenuID, supMenuList: this.props.supMenuList, - fstMenuId: this.state.fstMenuId, - fstMenuList: this.state.fstMenuList, + fstMenuId: this.props.mainMenu.MenuID, + fstMenuList: this.props.menuTree, menuSort: (this.props.menulist.length + 1) * 10 // 鏂板缓鑿滃崟璁剧疆鎺掑簭 } }, () => { @@ -285,7 +270,8 @@ return } this.setState({ - thawMvisible: true + thawMvisible: true, + targetKeys: [] }) Api.getSystemConfig({ func: 'sPC_Get_FrozenMenu', @@ -346,13 +332,27 @@ this.props.exitEdit() } } else if (type === 'close') { - this.props.exitEdit() + if (!is(fromJS(this.props.menulist), fromJS(this.state.menulist))) { + let _this = this + + confirm({ + title: '鑿滃崟椤哄簭宸茶皟鏁达紝鏀惧純淇濆瓨鍚楋紵', + content: '', + onOk() { + _this.props.exitEdit() + }, + onCancel() {} + }) + } else { + this.props.exitEdit() + } } } thawMemuSubmit = () => { + const { targetKeys } = this.state // 涓夌骇鑿滃崟瑙i櫎鍐荤粨 - if (this.refs.trawmenu.state.targetKeys.length === 0) { + if (targetKeys.length === 0) { notification.warning({ top: 92, message: this.state.dict['form.required.select'] + this.state.dict['model.menu'], @@ -362,7 +362,7 @@ this.setState({ confirmLoading: true }) - let defers = this.refs.trawmenu.state.targetKeys.map(item => { + let defers = targetKeys.map(item => { return new Promise((resolve) => { Api.getSystemConfig({ func: 'sPC_MainMenu_ReDel', @@ -388,6 +388,7 @@ this.setState({ confirmLoading: false, thawMvisible: false, + targetKeys: [], thawmenulist: null }) this.props.reload() @@ -400,7 +401,8 @@ // 瑙i櫎鍐荤粨-鍙栨秷 this.setState({ thawMvisible: false, - thawmenulist: null + thawmenulist: null, + targetKeys: [] }) } @@ -427,27 +429,35 @@ useTemplate = (template, useType) => { let editMenu = fromJS(this.state.editMenu).toJS() - if (!this.state.fstMenuId) { - notification.warning({ - top: 92, - message: '鑿滃崟鍔犺浇涓紝璇风◢鍚庨噸璇曪紒', - duration: 5 - }) - return - } + editMenu.fstMenuId = this.props.mainMenu.MenuID + editMenu.fstMenuList = this.props.menuTree - if (!editMenu.fstMenuId) { - editMenu.fstMenuId = this.state.fstMenuId - editMenu.fstMenuList = this.state.fstMenuList - } - - if (useType === 'sys' && (template.type === 'RolePermission' || template.type === 'CustomPage')) { // 鐙珛椤甸潰 + if (useType === 'sys' && (template.type === 'RolePermission' || template.type === 'NewPage')) { // 鐙珛椤甸潰 let _menu = { ...editMenu, MenuID: Utils.getuuid(), MenuName: template.title, Template: template.type, ParentId: this.props.supMenu.MenuID, + menuSort: (this.props.menulist.length + 1) * 10, + isSystem: true + } + + this.setState({ + handleMVisible: true, + sysMenu: _menu + }) + return + } else if (template.type === 'CustomPage') { + let _menu = { + ...editMenu, + MenuID: Utils.getuuid(), + MenuName: template.title, + Template: template.type, + ParentId: this.props.supMenu.MenuID, + OriginMenuId: template.uuid || '', + menuSort: (this.props.menulist.length + 1) * 10, + isSystem: true } this.setState({ @@ -519,7 +529,7 @@ this.setState({ loading: false, - tabview: template.type === 'CustomPage' ? '' : template.type, + tabview: template.type, editMenu: { ...editMenu, type: template.type, @@ -529,26 +539,12 @@ } }) - if (template.type === 'CustomPage') { // 浣跨敤鑷畾涔夌殑宸叉湁鑿滃崟 - // let _menu = { - // ...editMenu, - // MenuID: Utils.getuuid(), - // MenuName: template.title, - // Template: template.type, - // ParentID: this.props.supMenu.MenuID, - // } - - // this.setState({ - // handleMVisible: true, - // sysMenu: _menu - // }) - return - } document.getElementById('root').style.overflowY = 'hidden' }) } getUsedTemplate = () => { + const { memberLevel } = this.props let { sysTemplates } = this.state const illust = { // 妯℃澘鍥剧墖锛岀敤浜庡凡浣跨敤妯℃澘 CommonTable: mainsubtable, @@ -562,11 +558,15 @@ let hasRolePermission = false res.UserTemp.forEach(temp => { - if (temp.Template === 'RolePermission') { + if (temp.Template === 'NewPage') { + return + } else if (temp.Template === 'RolePermission') { hasRolePermission = true return + } else if (temp.Template === 'CustomPage' && memberLevel < 20) { + return } - + _templates.push({ uuid: temp.MenuID, title: temp.MenuName, @@ -575,15 +575,15 @@ }) }) - if (!hasRolePermission) { - sysTemplates = sysTemplates.map(temp => { - if (temp.type === 'RolePermission') { - temp.hidden = false - } + sysTemplates = sysTemplates.map(temp => { + if (temp.type === 'RolePermission' && !hasRolePermission) { + temp.hidden = false + } else if (temp.type === 'CustomPage' && memberLevel < 20) { + temp.hidden = true + } - return temp - }) - } + return temp + }) this.setState({ usedTemplates: _templates, @@ -618,7 +618,7 @@ let sysTemplates = fromJS(this.state.sysTemplates).toJS() // 瑙掕壊鏉冮檺鍒嗛厤妯℃澘锛屽彧鍙互娣诲姞涓�娆� - if (sysMenu.isSystem && sysMenu.Template === 'RolePermission') { + if (sysMenu.isSystem && (sysMenu.Template === 'RolePermission')) { sysTemplates = sysTemplates.map(temp => { if (temp.type === sysMenu.type) { temp.hidden = true @@ -629,6 +629,15 @@ } this.menuFormRef.handleConfirm().then(res => { + let PageParam = { + Template: sysMenu.Template, + OpenType: 'newtab' + } + + if (sysMenu.Template === 'NewPage') { + PageParam.OpenType = 'NewPage' + PageParam.url = res.url + } let param = { func: 'sPC_TrdMenu_AddUpt', @@ -639,10 +648,14 @@ MenuNo: res.MenuNo, Template: sysMenu.Template, MenuName: res.MenuName, - PageParam: JSON.stringify({Template: sysMenu.Template, OpenType: 'newtab'}), + PageParam: JSON.stringify(PageParam), LongParam: '', LText: '', LTexttb: '' + } + + if (sysMenu.menuSort) { // 鑿滃崟鏂板缓鏃惰缃帓搴� + param.Sort = sysMenu.menuSort } param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') @@ -652,93 +665,89 @@ confirmLoading: true }) - Api.getSystemConfig(param).then(response => { - if (response.status) { - this.setState({ - sysTemplates: sysTemplates, - confirmLoading: false, - handleMVisible: false, - sysMenu: '', - tabview: '' - }) - - this.props.reload() - } else { - this.setState({ - confirmLoading: false - }) - notification.warning({ - top: 92, - message: response.message, - duration: 5 - }) - } - }) - }) - } - - - UNSAFE_componentWillMount () { - this.getUsedTemplate() - - this.setState({ - menulist: this.props.menulist - }) - } - - componentDidMount () { - let _param = { - func: 's_Get_FSMenusForOpen', - SndMenuID: this.props.supMenu.MenuID, - TYPE: 20, - TypeCharOne: 'PC' - } - this.setState({ - loading: true - }) - - Api.getSystemConfig(_param).then(result => { - if (result.status) { - this.setState({ - loading: false, - fstMenuId: result.FstIDSeleted, - fstMenuList: result.data.map(smenu => { - let _smenu = { - MenuID: smenu.FstID, - text: smenu.FstName, - options: smenu.SndData.map(menu => { - return { - MenuID: menu.SndID, - text: menu.SndName, - } - }) - } - - return _smenu - }) - }, () => { - let _menu = this.state.editMenu ? fromJS(this.state.editMenu).toJS() : null + if (sysMenu.Template === 'CustomPage' && sysMenu.OriginMenuId) { + this.copyMenu(param, sysMenu.OriginMenuId) + } else { + Api.getSystemConfig(param).then(response => { + if (response.status) { + this.setState({ + sysTemplates: sysTemplates, + confirmLoading: false, + handleMVisible: false, + sysMenu: '', + tabview: '' + }) - if (!_menu || !_menu.loadingFstMenuId) { - return + this.props.reload() + document.getElementById('root').style.overflowY = 'unset' + } else { + this.setState({ + confirmLoading: false + }) + notification.warning({ + top: 92, + message: response.message, + duration: 5 + }) } + }) + } + }) + } + + copyMenu = (param, MenuId) => { + Api.getSystemConfig({ + func: 'sPC_Get_LongParam', + MenuID: MenuId + }).then(result => { + if (result.status) { + let config = null - delete _menu.loadingFstMenuId - _menu.fstMenuId = this.state.fstMenuId - _menu.fstMenuList = this.state.fstMenuList + try { + config = result.LongParam ? JSON.parse(window.decodeURIComponent(window.atob(result.LongParam))) : null + } catch (e) { + console.warn('Parse Failure') + config = null + } - this.setState({ - type: 'edit', - editMenu: _menu, - loading: false, - tabview: _menu.PageParam.Template - }, () => { - document.getElementById('root').style.overflowY = 'hidden' - }) + if (config) { + config.uuid = param.MenuID + config.MenuID = param.MenuID + config.parentId = param.ParentID + config.MenuName = param.MenuName + config.MenuNo = param.MenuNo + config.easyCode = '' + config.components = MenuUtils.resetConfig(config.components) + config.enabled = false + + param.LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(config))) + } + + Api.getSystemConfig(param).then(response => { + if (response.status) { + this.setState({ + confirmLoading: false, + handleMVisible: false, + sysMenu: '', + tabview: '' + }) + + this.props.reload() + document.getElementById('root').style.overflowY = 'unset' + } else { + this.setState({ + confirmLoading: false + }) + notification.warning({ + top: 92, + message: response.message, + duration: 5 + }) + } }) } else { this.setState({ - loading: false + confirmLoading: false }) notification.warning({ top: 92, @@ -746,6 +755,14 @@ duration: 5 }) } + }) + } + + UNSAFE_componentWillMount () { + this.getUsedTemplate() + + this.setState({ + menulist: this.props.menulist }) } @@ -778,14 +795,14 @@ <div className="tipcard card5" style={{backgroundImage: 'url(' + card5 + ')'}}> <p>缂栬緫鐘舵�佷腑锛岃彍鍗曚箣澶栧尯鍩熶細閿佸畾锛屾煡鐪嬬郴缁熸暟鎹鐐瑰嚮銆�</p> <div> - <a target="blank" href="#/main" >鏂伴〉闈�</a> + <span className="new-view" onClick={() => {window.open('#/main')}} >鏂伴〉闈�</span> </div> </div> </div> : null } <div className="cus-submenu-title"> - <Icon type={this.props.supMenu.PageParam.Icon} /> - <span>{this.props.supMenu.text}</span> + <MkIcon type={this.props.supMenu.PageParam.Icon} /> + <span>{this.props.supMenu.MenuName}</span> </div> <DndProvider backend={HTML5Backend}> <DragElement @@ -795,7 +812,7 @@ /> </DndProvider> <div className="menu-add" onClick={() => {this.handleSubBtn('add')}}> - <Icon type="plus" /> + <PlusOutlined /> </div> <div className="menu-btn"> <Button type="primary" onClick={() => {this.handleSubBtn('thaw')}}>{dict['model.thaw'] + dict['model.menu']}</Button> @@ -924,7 +941,7 @@ destroyOnClose > {!this.state.thawmenulist && <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" />} - {this.state.thawmenulist && <TransferForm ref="trawmenu" menulist={this.state.thawmenulist}/>} + {this.state.thawmenulist && <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>} </Modal> {/* 娣诲姞绯荤粺鑿滃崟 */} <Modal @@ -938,6 +955,7 @@ <MenuForm menu={this.state.sysMenu} dict={dict} + inputSubmit={this.memuSubmit} wrappedComponentRef={(inst) => this.menuFormRef = inst} /> </Modal> @@ -947,4 +965,16 @@ } } -export default EditMenu \ No newline at end of file +const mapStateToProps = (state) => { + return { + mainMenu: state.mainMenu, + menuTree: state.menuTree, + memberLevel: state.memberLevel + } +} + +const mapDispatchToProps = () => { + return {} +} + +export default withRouter(connect(mapStateToProps, mapDispatchToProps)(EditMenu)) \ No newline at end of file -- Gitblit v1.8.0