import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Modal, notification, Button } from 'antd'
|
import moment from 'moment'
|
|
import Api from '@/api'
|
import Utils from '@/utils/utils.js'
|
import { getActionForm } from './formconfig'
|
import asyncSpinComponent from '@/utils/asyncSpinComponent'
|
|
import ActionForm from './actionform'
|
import DragElement from './dragaction'
|
import MKEmitter from '@/utils/events.js'
|
import './index.scss'
|
|
const { confirm } = Modal
|
const VerifyCard = asyncSpinComponent(() => import('@/templates/zshare/verifycard'))
|
const VerifyPrint = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyprint'))
|
const VerifyExcelIn = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelin'))
|
const VerifyMegvii = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifymegvii'))
|
const VerifyExcelOut = asyncSpinComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelout'))
|
|
class ActionComponent extends Component {
|
static propTpyes = {
|
type: PropTypes.string, // 菜单类型,主表或子表
|
menu: PropTypes.object, // 菜单信息(菜单id,菜单参数,菜单名称)
|
config: PropTypes.object, // 菜单配置信息
|
tabs: PropTypes.array, // 所有标签
|
setSubConfig: PropTypes.func, // 设置子配置信息
|
updateaction: PropTypes.func // 菜单配置更新
|
}
|
|
state = {
|
card: null, // 编辑中元素
|
formlist: null, // 表单信息
|
actionlist: null, // 按钮组
|
copying: false, // 按钮复制中
|
visible: false, // 模态框控制
|
printTemps: [], // 单据打印模板
|
profVisible: false, // 验证信息模态框
|
record: null
|
}
|
|
/**
|
* @description 搜索条件初始化
|
*/
|
UNSAFE_componentWillMount () {
|
this.setState({
|
actionlist: fromJS(this.props.config.action).toJS()
|
})
|
}
|
|
componentDidMount () {
|
this.getBillPrintTemp()
|
MKEmitter.addListener('revert', this.revert)
|
MKEmitter.addListener('pasteButton', this.pasteButton)
|
}
|
// dms-trans
|
revert = (id, type) => {
|
if (id !== this.props.config.uuid || type !== 'action') return
|
|
this.setState({
|
actionlist: fromJS(this.props.config.action).toJS()
|
})
|
}
|
|
pasteButton = (MenuId, btn) => {
|
const { config } = this.props
|
const { actionlist } = this.state
|
|
if (MenuId !== config.uuid) return
|
|
this.setState({
|
actionlist: [...actionlist, btn],
|
}, () => {
|
this.handleAction(btn)
|
})
|
}
|
|
getBillPrintTemp = () => {
|
let _sql = `select ID,Images,PrintTempNO+PrintTempName as PN from sPrintTemplate
|
where appkey= @appkey@ and Deleted=0 and typechartwo='web_print'
|
union select ID,Images,a.PrintTempNO+PrintTempName as PN
|
from (select * from sPrintTemplate where appkey= '' and Deleted=0 and typechartwo='web_print') a
|
left join (select PrintTempNO from sPrintTemplate where appkey= @appkey@ and Deleted=0 ) b
|
on a.PrintTempNO=b.PrintTempNO
|
left join (select Srcid from sPrintTemplate_Log where appkey='' and apicode= @appkey@ and Deleted=0 ) c
|
on a.ID=c.Srcid where b.PrintTempNO is null and c.Srcid is null`
|
|
let param = {
|
func: 'sPC_Get_SelectedList',
|
LText: Utils.formatOptions(_sql, 'x'),
|
obj_name: 'data',
|
arr_field: 'PN,ID,Images',
|
exec_type: 'x'
|
}
|
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp) // 云端数据验证
|
|
Api.getCloudConfig(param).then(res => {
|
if (res.status) {
|
let temps = res.data.map(temp => {
|
return {
|
value: temp.ID,
|
text: temp.PN
|
}
|
})
|
|
this.setState({
|
printTemps: temps
|
})
|
} else {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
}
|
})
|
}
|
|
/**
|
* @description 按钮顺序调整,或拖拽添加
|
*/
|
handleList = (list, card) => {
|
const { config } = this.props
|
|
if (card) {
|
this.setState({actionlist: list})
|
this.handleAction(card)
|
} else {
|
this.setState({actionlist: list}, () => {
|
this.props.updateaction({...config, action: list})
|
})
|
}
|
}
|
|
/**
|
* @description 按钮编辑,获取按钮表单信息
|
*/
|
handleAction = (card) => {
|
const { menu } = this.props
|
|
let usefulFields = sessionStorage.getItem('permFuncField')
|
if (usefulFields) {
|
try {
|
usefulFields = JSON.parse(usefulFields)
|
} catch (e) {
|
usefulFields = []
|
}
|
} else {
|
usefulFields = []
|
}
|
|
let menulist = []
|
|
if (menu.fstMenuList) {
|
let trees = fromJS(menu.fstMenuList).toJS()
|
menulist = trees.map(fst => {
|
fst.value = fst.MenuID
|
fst.label = fst.MenuName
|
fst.isLeaf = false
|
fst.children = fst.children.map(snd => {
|
snd.value = snd.MenuID
|
snd.label = snd.MenuName
|
|
snd.children = snd.children.map(thd => {
|
thd.value = thd.MenuID
|
thd.label = thd.MenuName
|
thd.disabled = thd.MenuID === menu.MenuID
|
return thd
|
})
|
return snd
|
})
|
return fst
|
})
|
}
|
|
this.setState({
|
visible: true,
|
card: card,
|
formlist: getActionForm(card, this.props.config, usefulFields, this.props.type, menulist, this.state.printTemps, this.props.tabs)
|
})
|
}
|
|
/**
|
* @description 取消保存,如果元素为新添元素,则从序列中删除
|
*/
|
editModalCancel = () => {
|
const { config } = this.props
|
const { card, actionlist } = this.state
|
|
if (card.focus) {
|
let _actionlist = actionlist.filter(item => item.uuid !== card.uuid)
|
|
this.setState({
|
card: null,
|
actionlist: _actionlist,
|
visible: false
|
})
|
this.props.updateaction({...config, action: _actionlist})
|
} else {
|
this.setState({
|
card: null,
|
visible: false
|
})
|
}
|
}
|
|
/**
|
* @description 搜索修改后提交保存
|
* 1、去除系统默认搜索条件
|
* 2、字段及提示文字重复校验
|
* 3、更新下拉菜单可选集合
|
* 4、下拉菜单数据源语法验证
|
*/
|
handleSubmit = () => {
|
const { config } = this.props
|
let _actionlist = fromJS(this.state.actionlist).toJS()
|
|
this.actionFormRef.handleConfirm().then(btn => {
|
_actionlist = _actionlist.filter(item => !item.origin || item.uuid === btn.uuid)
|
|
let labelrepet = false
|
_actionlist = _actionlist.map(item => {
|
if (item.uuid !== btn.uuid && item.label === btn.label) {
|
labelrepet = true
|
}
|
|
if (item.uuid === btn.uuid) {
|
return btn
|
} else {
|
return item
|
}
|
})
|
|
if (labelrepet) {
|
notification.warning({
|
top: 92,
|
message: '名称已存在!',
|
duration: 5
|
})
|
return
|
}
|
|
let copyActionId = '' // 按钮为复制时,记录当前按钮的Id,菜单取消保存时,删除复制按钮配置信息
|
|
// 判断是否存在操作列
|
let _hasGridbtn = _actionlist.filter(act => act.position === 'grid').length > 0
|
let _gridBtn = config.gridBtn ? fromJS(config.gridBtn).toJS() : null
|
|
if (_gridBtn) {
|
_gridBtn.display = _hasGridbtn
|
} else {
|
_gridBtn = {
|
display: _hasGridbtn,
|
Align: 'center',
|
IsSort: 'false',
|
uuid: Utils.getuuid(),
|
label: '操作',
|
type: 'action',
|
style: 'button',
|
show: 'horizontal',
|
Width: 120
|
}
|
}
|
|
this.setState({
|
actionlist: _actionlist,
|
visible: false
|
}, () => {
|
this.props.updateaction({...config, action: _actionlist, gridBtn: _gridBtn}, copyActionId)
|
})
|
})
|
}
|
|
/**
|
* @description 按钮删除
|
*/
|
deleteElement = (card) => {
|
const { config } = this.props
|
let that = this
|
|
confirm({
|
content: `确定删除 - ${card.label} ?`,
|
onOk() {
|
let _actionlist = fromJS(that.state.actionlist).toJS()
|
|
_actionlist = _actionlist.filter(item => item.uuid !== card.uuid)
|
|
let _hasGridbtn = _actionlist.filter(act => act.position === 'grid').length > 0
|
let _gridBtn = config.gridBtn ? fromJS(config.gridBtn).toJS() : null
|
|
if (_gridBtn) {
|
_gridBtn.display = _hasGridbtn
|
} else {
|
_gridBtn = {
|
display: _hasGridbtn,
|
Align: 'center',
|
IsSort: 'false',
|
uuid: Utils.getuuid(),
|
label: '操作',
|
type: 'action',
|
style: 'button',
|
show: 'horizontal',
|
Width: 120
|
}
|
}
|
|
let delcard = {
|
type: 'action',
|
card: card
|
}
|
|
that.setState({
|
actionlist: _actionlist
|
}, () => {
|
that.props.updateaction({...config, action: _actionlist, gridBtn: _gridBtn}, '', delcard)
|
})
|
},
|
onCancel() {}
|
})
|
}
|
|
/**
|
* @description 验证信息配置
|
*/
|
profileAction = (element) => {
|
this.setState({
|
profVisible: true,
|
card: element
|
})
|
}
|
|
/**
|
* @description 验证信息保存
|
*/
|
verifySubmit = () => {
|
const { config } = this.props
|
const { card } = this.state
|
|
this.verifyRef.handleConfirm().then(res => {
|
let _actionlist = fromJS(this.state.actionlist).toJS()
|
_actionlist = _actionlist.filter(item => !item.origin || item.uuid === card.uuid)
|
|
_actionlist = _actionlist.map(item => {
|
if (item.uuid === card.uuid) {
|
item.verify = res
|
}
|
|
return item
|
})
|
|
this.setState({
|
actionlist: _actionlist,
|
profVisible: false
|
}, () => {
|
this.props.updateaction({...config, action: _actionlist})
|
})
|
})
|
}
|
|
/**
|
* @description 按钮双击触发子配置
|
*/
|
btnDoubleClick = (el) => {
|
// execMode === 'pop' 为 OpenType === 'funcbutton'
|
if (!el.origin && (el.OpenType === 'pop' || el.execMode === 'pop' || el.OpenType === 'popview' || (el.OpenType === 'tab' && el.tabTemplate === 'FormTab'))) {
|
this.props.setSubConfig(el)
|
} else {
|
this.handleAction(el)
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
/**
|
* @description 组件销毁,清除state更新
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
MKEmitter.removeListener('revert', this.revert)
|
MKEmitter.removeListener('pasteButton', this.pasteButton)
|
}
|
|
getVerify = (card) => {
|
const { config } = this.props
|
|
if (!card) return null
|
|
if (['pop', 'prompt', 'exec'].includes(card.OpenType)) {
|
return <VerifyCard
|
card={card}
|
config={config}
|
columns={config.columns}
|
wrappedComponentRef={(inst) => this.verifyRef = inst}
|
/>
|
} else if (card.OpenType === 'excelIn') {
|
return <VerifyExcelIn
|
card={card}
|
columns={config.columns}
|
wrappedComponentRef={(inst) => this.verifyRef = inst}
|
/>
|
} else if (card.OpenType === 'excelOut') {
|
return <VerifyExcelOut
|
card={card}
|
config={config}
|
wrappedComponentRef={(inst) => this.verifyRef = inst}
|
/>
|
} else if (card.OpenType === 'funcbutton' && card.funcType === 'print') {
|
return <VerifyPrint
|
card={card}
|
columns={[]}
|
// columns={config.columns}
|
wrappedComponentRef={(inst) => this.verifyRef = inst}
|
/>
|
} else if (card.OpenType === 'funcbutton' && card.funcType === 'megvii') {
|
return <VerifyMegvii
|
card={card}
|
columns={config.columns}
|
wrappedComponentRef={(inst) => this.verifyRef = inst}
|
/>
|
}
|
}
|
|
render() {
|
const { config } = this.props
|
const { actionlist, visible, card, copying, profVisible } = this.state
|
|
return (
|
<div className="model-table-action-list" style={config.charts && config.charts.length > 1 ? {paddingTop: 25} : null}>
|
<DragElement
|
list={actionlist}
|
setting={this.props.config.setting}
|
handleList={this.handleList}
|
handleMenu={this.handleAction}
|
deleteMenu={this.deleteElement}
|
profileMenu={this.profileAction}
|
doubleClickCard={this.btnDoubleClick}
|
/>
|
{/* 编辑按钮:复制、编辑 */}
|
<Modal
|
title={'按钮-' + (card && card.copyType === 'action' ? '复制' : '编辑')}
|
wrapClassName="model-table-action-edit-modal"
|
visible={visible}
|
width={920}
|
maskClosable={false}
|
onCancel={this.editModalCancel}
|
footer={[
|
<Button key="cancel" onClick={this.editModalCancel}>取消</Button>,
|
<Button key="confirm" type="primary" loading={copying} onClick={this.handleSubmit}>确定</Button>
|
]}
|
destroyOnClose
|
>
|
<ActionForm
|
card={card}
|
formlist={this.state.formlist}
|
inputSubmit={this.handleSubmit}
|
setting={config.setting}
|
updRecord={(record) => this.setState({record: fromJS(record).toJS()})}
|
wrappedComponentRef={(inst) => this.actionFormRef = inst}
|
/>
|
</Modal>
|
{/* 按钮使用系统存储过程时,验证信息模态框 */}
|
<Modal
|
wrapClassName="mk-pop-modal"
|
visible={profVisible}
|
width={'90vw'}
|
maskClosable={false}
|
okText="提交"
|
onOk={this.verifySubmit}
|
onCancel={() => {
|
if (this.verifyRef.handleCancel) {
|
this.verifyRef.handleCancel().then(() => {
|
this.setState({ profVisible: false })
|
})
|
} else {
|
this.setState({ profVisible: false })
|
}
|
}}
|
destroyOnClose
|
>
|
{this.getVerify(card)}
|
</Modal>
|
</div>
|
)
|
}
|
}
|
|
export default ActionComponent
|