| | |
| | | import { fromJS } from 'immutable' |
| | | import { Spin, notification, Button, Table, Modal, ConfigProvider, Tree, Input, Empty } from 'antd' |
| | | import moment from 'moment' |
| | | // import md5 from 'md5' |
| | | import md5 from 'md5' |
| | | import enUS from 'antd/es/locale/en_US' |
| | | import zhCN from 'antd/es/locale/zh_CN' |
| | | |
| | |
| | | thawmenulist: [], |
| | | confirmLoading: false, |
| | | targetKeys: [], |
| | | trees: [], |
| | | trees: null, |
| | | expandedKeys: [], |
| | | searchkey: '' |
| | | } |
| | | |
| | | oriTrees = null |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param))) |
| | | |
| | | this.setState({app: param}, () => { |
| | | this.getTreeList() |
| | | this.getMenuList() |
| | | this.getThawMenulist() |
| | | }) |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | getMenuList = () => { |
| | | getMenuList = (reset) => { |
| | | const { app } = this.state |
| | | let param = { |
| | | func: 's_get_app_menus', |
| | |
| | | Api.getCloudConfig(param).then(result => { |
| | | if (result.status) { |
| | | this.setState({ |
| | | loading: false, |
| | | menulist: result.menus.map(item => { |
| | | item.nodes = '' |
| | | item.type = 'view' |
| | |
| | | return item |
| | | }) |
| | | }, () => { |
| | | this.initMenutree() |
| | | if (reset && (!this.oriTrees || this.oriTrees.length === 0)) { |
| | | this.initMenutree() |
| | | } else if (!reset && this.oriTrees && this.oriTrees.length === 0) { |
| | | this.initMenutree() |
| | | } |
| | | this.setState({loading: false}) |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | |
| | | }) |
| | | } |
| | | |
| | | initMenutree = () => { |
| | | getTreeList = () => { |
| | | const { app } = this.state |
| | | let param = { |
| | | func: 's_get_menus_roles_tree', |
| | | typecharone: app.kei_no, |
| | | lang: app.lang |
| | | } |
| | | |
| | | param.upid = md5(window.GLOB.appkey + app.kei_no + app.typename + app.lang) |
| | | |
| | | Api.getCloudConfig(param).then(result => { |
| | | if (result.status) { |
| | | if (!result.data || result.data.length === 0) { |
| | | this.oriTrees = [] |
| | | if (this.state.menulist.length > 0) { |
| | | this.initMenutree() |
| | | } |
| | | this.setState({trees: [], loading: false}) |
| | | } else { |
| | | this.oriTrees = result.data |
| | | this.initTrees(result.data) |
| | | this.setState({loading: false}) |
| | | } |
| | | } else { |
| | | this.setState({ |
| | | loading: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 5 |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | initTrees = (data) => { |
| | | let trees = [] |
| | | let map = new Map() |
| | | let _data = data.sort((a, b) => { |
| | | return a.sort - b.sort |
| | | }) |
| | | |
| | | _data.forEach(menu => { |
| | | if (menu.ParentID === 'top') { |
| | | trees.push({ |
| | | key: menu.MenuID, |
| | | title: menu.MenuName, |
| | | children: [] |
| | | }) |
| | | } else { |
| | | map.set(menu.MenuID, menu) |
| | | } |
| | | }) |
| | | |
| | | let reset = (m) => { |
| | | return m.map(n => { |
| | | [...map.keys()].forEach(key => { |
| | | if (map.get(key).ParentID === n.key) { |
| | | let c = map.get(key) |
| | | n.children.push({ |
| | | key: c.MenuID, |
| | | title: c.MenuName, |
| | | children: [] |
| | | }) |
| | | map.delete(key) |
| | | } |
| | | }) |
| | | if (n.children.length > 0) { |
| | | n.children = reset(n.children) |
| | | } |
| | | return n |
| | | }) |
| | | } |
| | | |
| | | trees = reset(trees) |
| | | |
| | | let expandedKeys = this.getExpandedKeys(trees, 0, []) |
| | | |
| | | this.setState({trees, expandedKeys}) |
| | | } |
| | | |
| | | getExpandedKeys = (trees, i, keys) => { |
| | | if (i >= 3 || !trees[0]) return keys |
| | | |
| | | keys.push(trees[0].key) |
| | | |
| | | i++ |
| | | |
| | | if (trees[0].children && trees[0].children.length > 0) { |
| | | keys = this.getExpandedKeys(trees[0].children, i, keys) |
| | | } |
| | | |
| | | return keys |
| | | } |
| | | |
| | | initMenutree = (resolve) => { |
| | | const { menulist } = this.state |
| | | |
| | | if (!menulist || menulist.length === 0) { |
| | | this.setState({trees: [], expandedKeys: []}, () => { |
| | | if (resolve) { |
| | | this.execSave(resolve) |
| | | } |
| | | }) |
| | | |
| | | return |
| | | } |
| | | |
| | | let navbars = [] |
| | | let map = new Map() |
| | |
| | | data = [...data, ...map.values()] |
| | | } |
| | | |
| | | let expandedKeys = [] |
| | | |
| | | if (data[0]) { |
| | | expandedKeys.push(data[0].key) |
| | | if (data[0].children && data[0].children[0]) { |
| | | expandedKeys.push(data[0].children[0].key) |
| | | if (data[0].children[0].children && data[0].children[0].children[0]) { |
| | | expandedKeys.push(data[0].children[0].children[0].key) |
| | | } |
| | | } |
| | | } |
| | | let expandedKeys = this.getExpandedKeys(data, 0, []) |
| | | |
| | | this.setState({trees: [], expandedKeys: []}, () => { |
| | | this.setState({trees: data, expandedKeys}) |
| | | this.setState({trees: data, expandedKeys}, () => { |
| | | if (resolve) { |
| | | this.execSave(resolve) |
| | | } |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | getThawMenulist = () => { |
| | | const { app } = this.state |
| | | |
| | | Api.getCloudConfig({ |
| | | func: 'sPC_Get_FrozenMenu', |
| | | ParentID: '0', |
| | | TYPE: 10 |
| | | ParentID: 'mk_app', |
| | | TypeCharOne: app.kei_no, |
| | | typename: app.typename, |
| | | lang: app.lang |
| | | }).then(res => { |
| | | if (res.status) { |
| | | this.setState({ |
| | |
| | | } |
| | | |
| | | deleteMenu = (record) => { |
| | | // const { app } = this.state |
| | | const { app } = this.state |
| | | const _this = this |
| | | |
| | | let param = { |
| | | func: 'sPC_MainMenu_Del', |
| | | MenuID: record.MenuID, |
| | | // ID: app.ID, |
| | | // TypeCharOne: app.kei_no, |
| | | // typename: app.typename, |
| | | // lang: app.lang |
| | | TypeCharOne: app.kei_no, |
| | | typename: app.typename, |
| | | lang: app.lang |
| | | } |
| | | |
| | | |
| | | if (app.typename === 'pc' && record.nodes && record.nodes.popviews && record.nodes.popviews.length > 0) { |
| | | param.MenuID = param.MenuID + ',' + record.nodes.popviews.join(',') |
| | | } |
| | | |
| | | confirm({ |
| | | content: '确定删除该菜单吗?', |
| | | onOk() { |
| | |
| | | message: '操作成功!', |
| | | duration: 3 |
| | | }) |
| | | _this.getMenuList() |
| | | _this.getMenuList(true) |
| | | } else { |
| | | notification.warning({ |
| | | top: 92, |
| | |
| | | } |
| | | |
| | | thawSubmit = () => { |
| | | const { targetKeys } = this.state |
| | | const { targetKeys, app } = this.state |
| | | |
| | | if (targetKeys.length === 0) { |
| | | notification.warning({ |
| | |
| | | confirmLoading: true |
| | | }) |
| | | |
| | | let defers = targetKeys.map(item => { |
| | | return new Promise((resolve) => { |
| | | // Api.getCloudConfig({ |
| | | // func: 'sPC_MainMenu_ReDel', |
| | | // MenuID: item |
| | | // }).then(res => { |
| | | // if (res.status) { |
| | | // resolve('') |
| | | // } else { |
| | | // resolve(res.message) |
| | | // } |
| | | // }) |
| | | resolve('') |
| | | }) |
| | | }) |
| | | Promise.all(defers).then(res => { |
| | | let msg = res.filter(Boolean)[0] |
| | | if (msg) { |
| | | notification.error({ |
| | | Api.getSystemConfig({ |
| | | func: 'sPC_MainMenu_ReDel', |
| | | MenuID: targetKeys.join(','), |
| | | TypeCharOne: app.kei_no, |
| | | typename: app.typename, |
| | | lang: app.lang |
| | | }).then(res => { |
| | | if (!res.status) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: msg, |
| | | duration: 10 |
| | | message: res.message, |
| | | duration: 2 |
| | | }) |
| | | this.setState({ |
| | | confirmLoading: false |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | confirmLoading: false, |
| | | visible: false, |
| | | targetKeys: [], |
| | | thawmenulist: this.state.thawmenulist.filter(item => !targetKeys.includes(item.key)) |
| | | let param = { |
| | | func: 's_get_app_menus', |
| | | TypeCharOne: app.kei_no, |
| | | typename: app.typename, |
| | | LText: `select '${window.GLOB.appkey}'`, |
| | | timestamp: moment().format('YYYY-MM-DD HH:mm:ss'), |
| | | lang: app.lang |
| | | } |
| | | |
| | | param.secretkey = Utils.encrypt(param.LText, param.timestamp) |
| | | |
| | | Api.getCloudConfig(param).then(result => { |
| | | if (result.status) { |
| | | let list = [] |
| | | this.setState({ |
| | | menulist: result.menus.map(item => { |
| | | item.nodes = '' |
| | | item.type = 'view' |
| | | if (item.menus_rolelist) { |
| | | try { |
| | | let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist))) |
| | | item.nodes = pageParam |
| | | if (pageParam.type === 'navbar') { |
| | | item.type = 'navbar' |
| | | } |
| | | } catch { |
| | | item.nodes = '' |
| | | } |
| | | } |
| | | |
| | | if (targetKeys.includes(item.MenuID) && item.nodes && item.nodes.popviews && item.nodes.popviews.length > 0) { |
| | | list = [...list, ...item.nodes.popviews] |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | }, () => { |
| | | if (!this.oriTrees || this.oriTrees.length === 0) { |
| | | this.initMenutree() |
| | | } |
| | | }) |
| | | |
| | | if (app.typename === 'pc' && list.length > 0) { |
| | | Api.getSystemConfig({ |
| | | func: 'sPC_MainMenu_ReDel', |
| | | MenuID: list.join(','), |
| | | TypeCharOne: app.kei_no, |
| | | typename: app.typename, |
| | | lang: app.lang |
| | | }).then(response => { |
| | | if (!response.status) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: response.message, |
| | | duration: 2 |
| | | }) |
| | | this.setState({ |
| | | confirmLoading: false |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | confirmLoading: false, |
| | | visible: false, |
| | | targetKeys: [] |
| | | }) |
| | | } |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | confirmLoading: false, |
| | | visible: false, |
| | | targetKeys: [] |
| | | }) |
| | | } |
| | | } else { |
| | | this.setState({ |
| | | confirmLoading: false |
| | | }) |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 5 |
| | | }) |
| | | } |
| | | }) |
| | | this.getMenuList() |
| | | } |
| | | }) |
| | | } |
| | | |
| | | onDrop = info => { |
| | | const dropKey = info.node.props.eventKey; |
| | | const dragKey = info.dragNode.props.eventKey; |
| | | const dropPos = info.node.props.pos.split('-'); |
| | | const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]); |
| | | const dropKey = info.node.props.eventKey |
| | | const dragKey = info.dragNode.props.eventKey |
| | | const dropPos = info.node.props.pos.split('-') |
| | | const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]) |
| | | |
| | | const loop = (data, key, callback) => { |
| | | data.forEach((item, index, arr) => { |
| | |
| | | confirm({ |
| | | content: '初始化会根据菜单重置权限树,确定执行吗?', |
| | | onOk() { |
| | | _this.initMenutree() |
| | | return new Promise(resolve => { |
| | | _this.initMenutree(resolve) |
| | | }) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | | } |
| | | |
| | | syncTree = () => { |
| | | const _this = this |
| | | |
| | | confirm({ |
| | | content: '同步会根据菜单删除或新增节点,确定执行吗?', |
| | | onOk() { |
| | | |
| | | return new Promise(resolve => { |
| | | _this.syncMenutree(resolve) |
| | | }) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | | } |
| | | |
| | | saveTree = () => { |
| | | const { trees } = this.state |
| | | const _this = this |
| | | |
| | | if (!trees || trees.length === 0) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '未获取到权限信息!', |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | confirm({ |
| | | content: '确定执行吗?', |
| | | onOk() { |
| | | |
| | | return new Promise(resolve => { |
| | | _this.execSave(resolve) |
| | | }) |
| | | }, |
| | | onCancel() {} |
| | | }) |
| | | } |
| | | |
| | | syncMenutree = (resolve) => { |
| | | const { menulist } = this.state |
| | | |
| | | if (menulist.length === 0) { |
| | | this.setState({trees: [], expandedKeys: []}, () => { |
| | | this.execSave(resolve) |
| | | }) |
| | | |
| | | return |
| | | } |
| | | |
| | | let navbars = [] |
| | | let map = new Map() |
| | | |
| | | fromJS(menulist).toJS().forEach(menu => { |
| | | if (!menu.nodes) return |
| | | |
| | | if (menu.type === 'navbar') { |
| | | navbars.push(menu.nodes) |
| | | } else { |
| | | map.set(menu.MenuID, menu.nodes) |
| | | } |
| | | }) |
| | | |
| | | let re = {} |
| | | this.oriTrees && this.oriTrees.forEach(item => { |
| | | if (item.ParentID === 'top') return |
| | | if (!re[item.ParentID]) { |
| | | re[item.ParentID] = [] |
| | | } |
| | | re[item.ParentID].push(item.MenuID) |
| | | }) |
| | | |
| | | let data = [] |
| | | |
| | | if (navbars.length === 0) { |
| | | data = [...map.values()] |
| | | } else { |
| | | let reset = (m) => { |
| | | return m.map(n => { |
| | | if (n.children && n.children.length > 0) { |
| | | n.children = reset(n.children) |
| | | } else if (map.has(n.key)) { |
| | | let p = map.get(n.key) |
| | | if (p.children && p.children.length > 0) { |
| | | n.children = reset(p.children) |
| | | } |
| | | map.delete(n.key) |
| | | } |
| | | if (re[n.key]) { |
| | | n.children = n.children || [] |
| | | re[n.key].forEach(c => { |
| | | if (map.has(c)) { |
| | | let p = map.get(c) |
| | | if (p.children && p.children.length > 0) { |
| | | p.children = reset(p.children) |
| | | } |
| | | map.delete(c) |
| | | n.children.push(p) |
| | | } |
| | | }) |
| | | } |
| | | return n |
| | | }) |
| | | } |
| | | |
| | | data = reset(navbars) |
| | | data = [...data, ...map.values()] |
| | | } |
| | | |
| | | let expandedKeys = this.getExpandedKeys(data, 0, []) |
| | | |
| | | this.setState({trees: [], expandedKeys: []}, () => { |
| | | this.setState({trees: data, expandedKeys}, () => { |
| | | this.execSave(resolve) |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | execSave = (resolve) => { |
| | | const { trees, app } = this.state |
| | | |
| | | let lines = [] |
| | | let i = 0 |
| | | let reset = (m) => { |
| | | m.children.forEach(n => { |
| | | lines.push(`'${n.key}','${n.title}','${m.key}',${i}`) |
| | | i++ |
| | | if (n.children) { |
| | | reset(n) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | trees.forEach(g => { |
| | | lines.push(`'${g.key}','${g.title}','top',${i}`) |
| | | i++ |
| | | if (g.children) { |
| | | reset(g) |
| | | } |
| | | }) |
| | | |
| | | let param = { |
| | | func: 's_menus_roles_tree_adduptdel', |
| | | typecharone: app.kei_no, |
| | | typename: app.typename, |
| | | lang: app.lang |
| | | } |
| | | |
| | | lines = lines.join(';') |
| | | |
| | | param.upid = md5(window.GLOB.appkey + param.typecharone + param.typename + param.lang) |
| | | param.menus_roles_longtext = window.btoa(window.encodeURIComponent(lines)) |
| | | |
| | | Api.getCloudConfig(param).then(result => { |
| | | if (result.status) { |
| | | notification.success({ |
| | | top: 92, |
| | | message: '操作成功!', |
| | | duration: 3 |
| | | }) |
| | | } else { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 5 |
| | | }) |
| | | } |
| | | resolve() |
| | | }, () => { |
| | | resolve() |
| | | }) |
| | | } |
| | | |
| | | triggerThaw = () => { |
| | | this.getThawMenulist() |
| | | this.setState({ visible: true, targetKeys: [] }) |
| | | } |
| | | |
| | | render () { |
| | |
| | | <div className="left-view"> |
| | | <div className="app-table"> |
| | | <div className="app-action"> |
| | | <Button className="mk-green" onClick={() => this.setState({ visible: true, targetKeys: [] })}>解冻菜单</Button> |
| | | <Button className="mk-green" onClick={this.triggerThaw}>解冻菜单</Button> |
| | | <Search placeholder="综合搜索" onSearch={value => this.setState({ searchkey: value })} enterButton /> |
| | | </div> |
| | | <Table |
| | |
| | | <Button className="mk-purple" onClick={this.syncTree}>同步</Button> |
| | | <Button className="mk-green save" onClick={this.saveTree}>保存</Button> |
| | | </div> |
| | | {trees.length ? <Tree |
| | | {trees && trees.length ? <Tree |
| | | className="draggable-tree" |
| | | defaultExpandedKeys={this.state.expandedKeys} |
| | | // showLine |