| | |
| | | { |
| | | "appId": "201912040924165801464FF1788654BC5AC73", |
| | | "appkey": "20191106103859640976D6E924E464D029CF0", |
| | | "appId": "202108312122504607B107A83F55B40C98CCF", |
| | | "appkey": "20210831212235413F287EC3BF489424496C8", |
| | | "mainSystemApi": "http://sso.mk9h.cn/cloud/webapi/dostars", |
| | | "systemType": "", |
| | | "externalDatabase": "", |
| | | "lineColor": "", |
| | | "filter": "false", |
| | | "defaultApp": "mk", |
| | | "defaultApp": "mkindustry", |
| | | "defaultLang": "zh-CN", |
| | | "WXAppID": "", |
| | | "WXminiAppID": "", |
| | | "WXNotice": "true", |
| | | "WXNotice": "false", |
| | | "nginx": "true", |
| | | "debugger": false, |
| | | "licenseKey": "", |
| | |
| | | "transfer": "false", |
| | | "keepPassword": "true", |
| | | "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"], |
| | | "host": "http://qingqiumarket.cn", |
| | | "service": "MKWMS/" |
| | | "host": "http://demo.mk9h.cn", |
| | | "service": "erp_new/" |
| | | } |
| | |
| | | } |
| | | |
| | | getrolelist = () => { |
| | | Api.getSystemConfig({func: 's_get_rolelist', OrderCol: 'RoleID desc', PageIndex: 1, PageSize: 1000}).then(res => { |
| | | // Api.getSystemConfig({func: 's_get_rolelist', OrderCol: 'RoleID desc', PageIndex: 1, PageSize: 1000}).then(res => { |
| | | Api.genericInterface({func: 's_get_organizations_v1'}).then(res => { |
| | | if (!res.status) { |
| | | notification.error({ |
| | | top: 92, |
| | |
| | | width: 84%; |
| | | } |
| | | } |
| | | .member-input { |
| | | display: inline-block; |
| | | width: 100%; |
| | | height: 32px; |
| | | padding: 4px 11px; |
| | | color: rgba(0, 0, 0, 0.65); |
| | | font-size: 14px; |
| | | line-height: 1.5; |
| | | background-color: #fff; |
| | | background-image: none; |
| | | border: 1px solid #d9d9d9; |
| | | border-radius: 4px; |
| | | |
| | | .anticon-form { |
| | | float: right; |
| | | margin-top: 3px; |
| | | } |
| | | } |
| | | } |
| | | .member-transfer { |
| | | .ant-transfer-list:first-child { |
| | | width: 60%; |
| | | } |
| | | .ant-transfer-list:last-child { |
| | | width: 40%; |
| | | } |
| | | .ant-transfer-list-header { |
| | | .ant-transfer-list-header-selected { |
| | | span:not(.ant-transfer-list-header-title) { |
| | | display: none; |
| | | } |
| | | .ant-transfer-list-header-title { |
| | | position: unset; |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Modal, Transfer, Tree } from 'antd' |
| | | import { FormOutlined } from '@ant-design/icons' |
| | | |
| | | const { TreeNode } = Tree |
| | | |
| | | const isChecked = (selectedKeys, eventKey) => { |
| | | return selectedKeys.indexOf(eventKey) !== -1 |
| | | } |
| | | |
| | | const generateTree = (treeNodes = [], checkedKeys = []) => { |
| | | return treeNodes.map(({ children, ...props }) => ( |
| | | <TreeNode {...props} disabled={checkedKeys.includes(props.key)} key={props.key}> |
| | | {generateTree(children, checkedKeys)} |
| | | </TreeNode> |
| | | )) |
| | | } |
| | | |
| | | const TreeTransfer = ({ dataSource, targetKeys, ...restProps }) => { |
| | | const transferDataSource = [] |
| | | function flatten(list = []) { |
| | | list.forEach(item => { |
| | | transferDataSource.push(item) |
| | | flatten(item.children) |
| | | }) |
| | | } |
| | | flatten(dataSource) |
| | | |
| | | return ( |
| | | <Transfer |
| | | {...restProps} |
| | | targetKeys={targetKeys} |
| | | dataSource={transferDataSource} |
| | | className="member-transfer" |
| | | titles={['全部人员', '已选']} |
| | | render={item => item.title} |
| | | showSelectAll={false} |
| | | > |
| | | {({ direction, onItemSelect, selectedKeys }) => { |
| | | if (direction === 'left') { |
| | | const checkedKeys = [...selectedKeys, ...targetKeys] |
| | | return ( |
| | | <Tree |
| | | blockNode |
| | | checkable |
| | | checkStrictly |
| | | defaultExpandAll |
| | | checkedKeys={checkedKeys} |
| | | onCheck={(_, { node: { props: { eventKey } } }) => { |
| | | onItemSelect(eventKey, !isChecked(checkedKeys, eventKey)) |
| | | }} |
| | | onSelect={(_, { node: { props: { eventKey } } }) => { |
| | | onItemSelect(eventKey, !isChecked(checkedKeys, eventKey)) |
| | | }} |
| | | > |
| | | {generateTree(dataSource, targetKeys)} |
| | | </Tree> |
| | | ) |
| | | } |
| | | }} |
| | | </Transfer> |
| | | ) |
| | | } |
| | | |
| | | const treeData = [ |
| | | { |
| | | key: '0-0', |
| | | title: '0-0', |
| | | checkable: false, |
| | | children: [{ key: '0-0-0', title: '0-0-0' }, { key: '0-0-1', title: '0-0-1' }] |
| | | }, |
| | | { |
| | | key: '0-1', |
| | | title: '0-1', |
| | | checkable: false, |
| | | children: [{ key: '0-1-0', title: '0-1-0' }, { key: '0-1-1', title: '0-1-1' }], |
| | | }, |
| | | { key: '0-2', title: '0-3' }, |
| | | ] |
| | | |
| | | class MemberForm extends Component { |
| | | static propTpyes = { |
| | | node: PropTypes.any, |
| | | data: PropTypes.any, |
| | | rolelist: PropTypes.array |
| | | } |
| | | |
| | | state = { |
| | | visible: false, |
| | | targetKeys: [] |
| | | } |
| | | |
| | | onChange = targetKeys => { |
| | | this.setState({ targetKeys }) |
| | | } |
| | | |
| | | render() { |
| | | const { visible, targetKeys } = this.state |
| | | |
| | | return ( |
| | | <> |
| | | <div className="member-input">0人<FormOutlined onClick={() => this.setState({visible: true})} /></div> |
| | | <Modal |
| | | title="选择人员" |
| | | visible={visible} |
| | | closable={false} |
| | | maskClosable={false} |
| | | width={800} |
| | | onOk={this.confirm} |
| | | onCancel={() => this.setState({visible: false})} |
| | | destroyOnClose |
| | | > |
| | | <TreeTransfer dataSource={treeData} targetKeys={targetKeys} onChange={this.onChange} /> |
| | | </Modal> |
| | | </> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | export default MemberForm |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Form, Row, Col, Select, Input, Radio, Tooltip, InputNumber } from 'antd' |
| | | import { Form, Row, Col, Input, Radio, Tooltip, InputNumber } from 'antd' |
| | | import { QuestionCircleOutlined } from '@ant-design/icons' |
| | | |
| | | import MemberForm from './memberform' |
| | | const { TextArea } = Input |
| | | |
| | | class NodeForm extends Component { |
| | |
| | | } |
| | | |
| | | render() { |
| | | const { node, rolelist } = this.props |
| | | const { node } = this.props |
| | | const { getFieldDecorator } = this.props.form |
| | | const formItemLayout = { |
| | | labelCol: { |
| | |
| | | </Form.Item> |
| | | </Col> : null} |
| | | <Col span={12}> |
| | | <Form.Item label="角色"> |
| | | <Form.Item label="人员"> |
| | | {getFieldDecorator('roleId', { |
| | | initialValue: data.roleId || '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请选择角色!' |
| | | message: '请选择人员!' |
| | | } |
| | | ] |
| | | })( |
| | | <Select showSearch filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}> |
| | | {rolelist.map(item => (<Select.Option key={item.RoleID} value={item.RoleID}>{item.RoleName}</Select.Option>))} |
| | | </Select> |
| | | <MemberForm /> |
| | | )} |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={12}> |
| | | <Form.Item label="部门"> |
| | | <Form.Item label="抄送"> |
| | | {getFieldDecorator('depId', { |
| | | initialValue: data.depId || '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请选择部门!' |
| | | } |
| | | ] |
| | | initialValue: data.depId || '' |
| | | })( |
| | | <Select showSearch filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}> |
| | | {rolelist.map(item => (<Select.Option key={item.RoleID} value={item.RoleID}>{item.RoleName}</Select.Option>))} |
| | | </Select> |
| | | <MemberForm /> |
| | | )} |
| | | </Form.Item> |
| | | </Col> |