|  | @@ -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>
 | 
	
		
			
				|  |  |    )
 | 
	
		
			
				|  |  |  }
 |