|
@@ -1,33 +1,81 @@
|
|
|
import { GroupItem } from '@/components/AuditContent'
|
|
|
+import { ZhButton, ZhDangerButton } from '@/components/Button'
|
|
|
import Header from '@/components/Header'
|
|
|
import Slot from '@/components/Header/slot'
|
|
|
import SvgIcon from '@/components/SvgIcon'
|
|
|
import { userStore } from '@/store/mobx'
|
|
|
-import { iAccountGroupItem, iUserInfo } from '@/types/setting'
|
|
|
+import { iAccountGroupItem, iPermissionData, iUserInfo } from '@/types/setting'
|
|
|
import { getUserGroup } from '@/utils/common/user'
|
|
|
import consts from '@/utils/consts'
|
|
|
import { Button, Input, message, Popover, Table } from 'antd'
|
|
|
+import { ColumnsType } from 'antd/lib/table'
|
|
|
import { observer } from 'mobx-react'
|
|
|
-import React, { useState, useEffect, ChangeEvent } from 'react'
|
|
|
+import React, { useState, useEffect, ChangeEvent, useMemo } from 'react'
|
|
|
import { useActivate } from 'react-activation'
|
|
|
import { RouteComponentProps } from 'react-router'
|
|
|
-import { apiCreateBidAccount, apiGetSettingAccount } from './api'
|
|
|
-
|
|
|
-
|
|
|
+import { apiCreateBidAccount, apiDelBidAccount, apiGetSettingAccount, apiUpdateBidAccountAuth } from './api'
|
|
|
+import PermissionModal from './modal'
|
|
|
+import './index.scss'
|
|
|
+import { Store } from 'antd/lib/form/interface'
|
|
|
interface iPopoverState {
|
|
|
visible: boolean
|
|
|
searchValue: string
|
|
|
}
|
|
|
-const Member: React.FC<RouteComponentProps> = (props) => {
|
|
|
- const { id = '', name = '' }: {id: string, name: string} = props.location.state as any
|
|
|
- const [ groups, setGroups ] = useState<Array<iAccountGroupItem>>([])
|
|
|
- const [ popoverState, setPopoverState ] = useState<iPopoverState>({ visible: false, searchValue: '' })
|
|
|
+
|
|
|
+interface PermissionType {
|
|
|
+ access: number
|
|
|
+ add: number
|
|
|
+ delete: number
|
|
|
+}
|
|
|
+
|
|
|
+interface iTableDataState extends iUserInfo {
|
|
|
+ contractPermission: string
|
|
|
+ qualityPermission: string
|
|
|
+ safePermission: string
|
|
|
+}
|
|
|
+
|
|
|
+interface iPermissionModalState {
|
|
|
+ visible: boolean
|
|
|
+ loading: boolean
|
|
|
+ permissionObj: {
|
|
|
+ contract: string
|
|
|
+ quality: string
|
|
|
+ safe: string
|
|
|
+ }
|
|
|
+ id: string
|
|
|
+}
|
|
|
+interface iState {
|
|
|
+ loading: boolean
|
|
|
+ groups: iAccountGroupItem[]
|
|
|
+ popover: iPopoverState
|
|
|
+ dataSource: iTableDataState[]
|
|
|
+ permissionModal: iPermissionModalState
|
|
|
+}
|
|
|
+
|
|
|
+const Member: React.FC<RouteComponentProps> = props => {
|
|
|
+ const { id = '', name = '' }: { id: string; name: string } = props.location.state as any
|
|
|
+ const [ state, setState ] = useState<iState>({
|
|
|
+ groups: [],
|
|
|
+ loading: false,
|
|
|
+ popover: { visible: false, searchValue: '' },
|
|
|
+ dataSource: [],
|
|
|
+ permissionModal: {
|
|
|
+ visible: false,
|
|
|
+ loading: false,
|
|
|
+ permissionObj: {
|
|
|
+ contract: '',
|
|
|
+ safe: '',
|
|
|
+ quality: ''
|
|
|
+ },
|
|
|
+ id: ''
|
|
|
+ }
|
|
|
+ })
|
|
|
useEffect(() => {
|
|
|
- popoverState.visible && (initGroupList())
|
|
|
+ state.popover.visible && initGroupList()
|
|
|
if (!userStore.groupList.length) {
|
|
|
userStore.getGroupList()
|
|
|
}
|
|
|
- }, [ popoverState.visible ])
|
|
|
+ }, [ state.popover.visible ])
|
|
|
|
|
|
useEffect(() => {
|
|
|
initData()
|
|
@@ -35,22 +83,114 @@ const Member: React.FC<RouteComponentProps> = (props) => {
|
|
|
|
|
|
useActivate(() => initData())
|
|
|
const initData = async () => {
|
|
|
+ setState({ ...state, loading: true })
|
|
|
const { code = -1, data } = await apiGetSettingAccount(id)
|
|
|
if (code === consts.RET_CODE.SUCCESS) {
|
|
|
- console.log(data)
|
|
|
+ setState({ ...state, loading: false, dataSource: data, permissionModal: { ...state.permissionModal, visible: false, loading: false } })
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ const openPermissionModal = (id: string, permissionObj: { contract: string; quality: string; safe: string }) => {
|
|
|
+ setState({ ...state, permissionModal: { ...state.permissionModal, visible: true, permissionObj, id } })
|
|
|
+ }
|
|
|
+
|
|
|
+ const deleteSettingMenmber = async (bid: string, id: string) => {
|
|
|
+ const { code = -1 } = await apiDelBidAccount(bid, id)
|
|
|
+ if (code === consts.RET_CODE.SUCCESS) {
|
|
|
+ const newData = state.dataSource.filter(item => item.id !== id)
|
|
|
+ setState({ ...state, dataSource: newData })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const renderPermissionText = (permission: PermissionType | undefined): React.ReactNode => {
|
|
|
+ if (permission) {
|
|
|
+ let textNode = ''
|
|
|
+ for (const key in permission) {
|
|
|
+ if (Object.prototype.hasOwnProperty.call(permission, key)) {
|
|
|
+ const perm = permission[key]
|
|
|
+ switch (key) {
|
|
|
+ case 'access':
|
|
|
+ perm && (textNode += '<span>创建</span>')
|
|
|
+ break
|
|
|
+ case 'add':
|
|
|
+ perm && (textNode += '<span>删除</span>')
|
|
|
+ break
|
|
|
+ case 'delete':
|
|
|
+ perm && (textNode += '<span>查看所有</span>')
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return <div className="permission-text" dangerouslySetInnerHTML={{ __html: textNode }}></div>
|
|
|
}
|
|
|
}
|
|
|
+ const columns: ColumnsType<iTableDataState> = [
|
|
|
+ {
|
|
|
+ title: '成员名称',
|
|
|
+ key: 'name',
|
|
|
+ dataIndex: 'name',
|
|
|
+ width: '17%'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '合同管理权限',
|
|
|
+ key: 'contractPermission',
|
|
|
+ dataIndex: 'contractPermission',
|
|
|
+ width: '22%',
|
|
|
+ render: (text: string) => {
|
|
|
+ const contractJson: PermissionType | undefined = text && JSON.parse(text)
|
|
|
+ return renderPermissionText(contractJson)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '质量管理权限',
|
|
|
+ key: 'qualityPermission',
|
|
|
+ dataIndex: 'qualityPermission',
|
|
|
+ width: '22%',
|
|
|
+ render: (text: string) => {
|
|
|
+ const qualityJson: PermissionType | undefined = text && JSON.parse(text)
|
|
|
+ return renderPermissionText(qualityJson)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '安全管理权限',
|
|
|
+ key: 'safePermission',
|
|
|
+ dataIndex: 'safePermission',
|
|
|
+ width: '22%',
|
|
|
+ render: (text: string) => {
|
|
|
+ const safeJson: PermissionType | undefined = text && JSON.parse(text)
|
|
|
+ return renderPermissionText(safeJson)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ dataIndex: 'opreate',
|
|
|
+ key: 'opreate',
|
|
|
+ width: '17%',
|
|
|
+ // eslint-disable-next-line react/display-name
|
|
|
+ render: (_: any, record: iTableDataState) => {
|
|
|
+ const { contractPermission: contract = '', qualityPermission: quality = '', safePermission: safe = '' } = record
|
|
|
+ return (
|
|
|
+ <div className="pi-flex">
|
|
|
+ <ZhButton size="small" className="pi-mg-right-5" onClick={() => openPermissionModal(record.id, { contract, quality, safe })}>
|
|
|
+ 权限
|
|
|
+ </ZhButton>
|
|
|
+ <ZhDangerButton size="small" danger onClick={() => deleteSettingMenmber(id, record.id)}>
|
|
|
+ 移除
|
|
|
+ </ZhDangerButton>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
const initGroupList = async (serach?: string) => {
|
|
|
- const data = await getUserGroup(serach)
|
|
|
- console.log(data)
|
|
|
-
|
|
|
- setGroups(data)
|
|
|
+ const data = await getUserGroup({ name: serach, hasOwner: false })
|
|
|
+ setState({ ...state, groups: data })
|
|
|
}
|
|
|
|
|
|
const search = (value: string) => {
|
|
|
- if (value != popoverState.searchValue) {
|
|
|
- setPopoverState({ ...popoverState, searchValue: value })
|
|
|
+ if (value != state.popover.searchValue) {
|
|
|
+ setState({ ...state, popover: { ...state.popover, searchValue: value } })
|
|
|
initGroupList(value)
|
|
|
}
|
|
|
}
|
|
@@ -63,46 +203,98 @@ const Member: React.FC<RouteComponentProps> = (props) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ const permissionData = useMemo(() => {
|
|
|
+ const permissionArr: iPermissionData[] = []
|
|
|
+ if (state.permissionModal.visible) {
|
|
|
+ for (const key in state.permissionModal.permissionObj) {
|
|
|
+ if (Object.prototype.hasOwnProperty.call(state.permissionModal.permissionObj, key)) {
|
|
|
+ const modalData: iPermissionData = { label: '', permissions: [], type: key }
|
|
|
+ switch (key) {
|
|
|
+ case 'contract':
|
|
|
+ modalData.label = '合同管理'
|
|
|
+ break
|
|
|
+ case 'quality':
|
|
|
+ modalData.label = '安全巡检'
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ modalData.label = '质量巡检'
|
|
|
+ break
|
|
|
+ }
|
|
|
+ const permission: PermissionType | undefined = state.permissionModal.permissionObj[key] && JSON.parse(state.permissionModal.permissionObj[key])
|
|
|
+ if (permission) {
|
|
|
+ for (const type in permission) {
|
|
|
+ if (Object.prototype.hasOwnProperty.call(permission, type)) {
|
|
|
+ const perm = permission[type]
|
|
|
+ if (perm) {
|
|
|
+ modalData.permissions.push(type)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ permissionArr.push(modalData)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return { permissionArr, visible: state.permissionModal.visible, loading: state.permissionModal.loading }
|
|
|
+ }, [ state.permissionModal ])
|
|
|
+
|
|
|
const itemSelectHandler = async (item: iUserInfo) => {
|
|
|
- setPopoverState({ ...popoverState, visible: false })
|
|
|
+ setState({ ...state, popover: { ...state.popover, visible: false, searchValue: '' } })
|
|
|
const { code = -1, msg = '添加成员账号失败!' } = await apiCreateBidAccount(id, item.id)
|
|
|
if (code === consts.RET_CODE.SUCCESS) {
|
|
|
- await initGroupList(id)
|
|
|
+ await initData()
|
|
|
return message.success('创建成功!')
|
|
|
}
|
|
|
return message.error(msg)
|
|
|
}
|
|
|
|
|
|
const handleVisibleChange = (visible: boolean) => {
|
|
|
- setPopoverState({ ...popoverState, visible })
|
|
|
+ setState({ ...state, popover: { ...state.popover, visible } })
|
|
|
}
|
|
|
|
|
|
const showPopover = () => {
|
|
|
- setPopoverState({ ...popoverState, visible: true })
|
|
|
+ setState({ ...state, popover: { ...state.popover, visible: true } })
|
|
|
+ }
|
|
|
+
|
|
|
+ const onModalConfirm = async (values: Store) => {
|
|
|
+ setState({ ...state, permissionModal: { ...state.permissionModal, loading: true } })
|
|
|
+ const { code = -1 } = await apiUpdateBidAccountAuth(values, state.permissionModal.id, id)
|
|
|
+ if (code === consts.RET_CODE.SUCCESS) {
|
|
|
+ initData()
|
|
|
+ return message.success('成员权限更新成功!')
|
|
|
+ }
|
|
|
+ setState({ ...state, permissionModal: { ...state.permissionModal, loading: false } })
|
|
|
+ return message.error('更新失败,请重试!')
|
|
|
+ }
|
|
|
+
|
|
|
+ const onModalCancel = () => {
|
|
|
+ setState({ ...state, permissionModal: { ...state.permissionModal, visible: false } })
|
|
|
}
|
|
|
return (
|
|
|
<div className="wrap-contaniner">
|
|
|
<Header title={`${name} 成员管理`}>
|
|
|
<Slot position="right">
|
|
|
- <Popover
|
|
|
- title={<Input.Search size="small" placeholder="姓名/手机 检索" onSearch={search} onChange={e => change(e)}></Input.Search>}
|
|
|
- content={groups.map(item => (
|
|
|
- <GroupItem {...item} key={item.value} onSelect={(item: iUserInfo) => itemSelectHandler(item)}></GroupItem>
|
|
|
- ))}
|
|
|
- overlayClassName="popover-card"
|
|
|
- trigger="click"
|
|
|
- visible={popoverState.visible}
|
|
|
- onVisibleChange={handleVisibleChange}
|
|
|
- placement="bottomRight">
|
|
|
- <Button type="primary" size="small" onClick={showPopover}>
|
|
|
- <span>添加成员</span><SvgIcon type="xxh-caret-down"></SvgIcon>
|
|
|
- </Button>
|
|
|
- </Popover>
|
|
|
+ <Popover
|
|
|
+ title={<Input.Search size="small" placeholder="姓名/手机 检索" onSearch={search} onChange={e => change(e)}></Input.Search>}
|
|
|
+ content={state.groups.map(item => (
|
|
|
+ <GroupItem {...item} key={item.value} onSelect={(item: iUserInfo) => itemSelectHandler(item)}></GroupItem>
|
|
|
+ ))}
|
|
|
+ overlayClassName="popover-card"
|
|
|
+ trigger="click"
|
|
|
+ visible={state.popover.visible}
|
|
|
+ onVisibleChange={handleVisibleChange}
|
|
|
+ placement="bottomRight">
|
|
|
+ <Button type="primary" size="small" onClick={showPopover}>
|
|
|
+ <span>添加成员</span>
|
|
|
+ <SvgIcon type="xxh-caret-down"></SvgIcon>
|
|
|
+ </Button>
|
|
|
+ </Popover>
|
|
|
</Slot>
|
|
|
</Header>
|
|
|
<div className="wrap-content">
|
|
|
- <Table></Table>
|
|
|
+ <Table<iTableDataState> loading={state.loading} dataSource={state.dataSource} columns={columns} rowKey={record => record.id} bordered></Table>
|
|
|
</div>
|
|
|
+ <PermissionModal data={permissionData} onCreate={onModalConfirm} onCancel={onModalCancel}></PermissionModal>
|
|
|
</div>
|
|
|
)
|
|
|
}
|