123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- 'use client'
- import React, { useEffect, useState } from 'react'
- import { RiAddLine, RiCloseLine } from '@remixicon/react'
- import Modal from '@/app/components/base/modal'
- import Button from '@/app/components/base/button'
- import { deptAddUsers, deptDelUsers, fetchIntent, fetchNoDeptUsers } from '@/service/common'
- import 'react-multi-email/dist/style.css'
- import cn from '@/utils/classnames'
- import Confirm from '@/app/components/base/confirm'
- import { Select as AntdSelect } from 'antd'
- const UserModal = ({
- onCancel,
- onSend,
- transfer,
- }: any) => {
- const [list, setList] = useState<any>([])
- const [total, setTotal] = useState(0)
- const handlePage = () => {
- fetchIntent({
- url: `/dept/dept-accounts/${transfer.row.dept_id}`,
- params: {},
- }).then((res: any) => {
- setList(res.data)
- setTotal(res.data.length)
- })
- }
- useEffect(() => {
- handlePage()
- }, [])
- const [showConfirmDelete, setShowConfirmDelete] = useState(false)
- const [row, setRow] = useState<any>({})
- const handleDel = async () => {
- try {
- const { result }: any = await deptDelUsers({
- url: '/dept/dept-accounts',
- body: { dept_id: transfer.row.dept_id, account_ids: [{ account_id: row.account_id }] },
- })
- if (result === 'success') {
- setShowConfirmDelete(false)
- handlePage()
- }
- }
- catch (e) { }
- }
- const [showDetail, setShowDetail] = useState(false)
- const [selectUser, setSelectUser] = useState<any>([])
- const [userOptions, setUserOptions] = useState<any>([])
- useEffect(() => {
- fetchNoDeptUsers({
- url: '/account/nodept',
- params: {},
- }).then((res: any) => {
- setUserOptions(res.data.map((v: any) => ({ label: v.email, value: v.account_id })) || [])
- })
- }, [])
- const handleSave = async () => {
- try {
- const { result }: any = await deptAddUsers({
- url: '/dept/dept-accounts',
- body: { dept_id: transfer.row.dept_id, account_ids: selectUser.map((v: any) => ({ account_id: v })) },
- })
- if (result === 'success') {
- setShowDetail(false)
- handlePage()
- }
- }
- catch (e) { }
- }
- return (
- <div>
- <Modal overflowVisible isShow onClose={() => { }} className="p-[24px 32px] w-[800px] max-w-[800px]">
- <div className='mb-2 flex justify-between'>
- <div className='text-xl font-semibold text-text-primary'>关联用户</div>
- <RiCloseLine className='h-4 w-4 cursor-pointer text-text-tertiary' onClick={onCancel} />
- </div>
- <div className='flex h-[600px] flex-col'>
- {/* <div className="flex items-center gap-2"> */}
- {/* <div className="flex shrink-0 items-center text-gray-500"> */}
- {/* 用户名称 */}
- {/* <Input */}
- {/* className="ml-2" */}
- {/* showClearIcon */}
- {/* wrapperClassName='!w-[200px]' */}
- {/* value={name} */}
- {/* onChange={e => setName(e.target.value)} */}
- {/* onClear={() => setName('')} */}
- {/* /> */}
- {/* </div> */}
- {/* <Button variant='primary' className={cn('ml-auto shrink-0')} onClick={() => { */}
- {/* handleSearch(false) */}
- {/* }}> */}
- {/* <RiSearchLine className='mr-1 h-4 w-4' /> */}
- {/* 搜索 */}
- {/* </Button> */}
- {/* <Button variant='primary' className={cn('shrink-0')} onClick={() => { */}
- {/* handleSearch(true) */}
- {/* }}> */}
- {/* <RiRefreshLine className='mr-1 h-4 w-4' /> */}
- {/* 重置 */}
- {/* </Button> */}
- {/* </div> */}
- <div className="mt-2">
- <Button variant='primary' className={cn('shrink-0')}
- onClick={() => {
- setShowDetail(true)
- }}>
- <RiAddLine className='mr-1 h-4 w-4' />
- 添加用户
- </Button>
- </div>
- <div className="flex-1">
- <div className='relative flex h-full w-full flex-col'>
- <div className='relative grow overflow-x-auto'>
- <table className={'mt-3 w-full min-w-[700px] max-w-full border-collapse border-0 text-sm'}>
- <thead className="h-8 border-b border-divider-subtle text-xs font-medium uppercase leading-8 text-text-tertiary">
- <tr>
- <td>用户名称</td>
- <td>用户账号</td>
- <td className="w-[120px] text-center">操作</td>
- </tr>
- </thead>
- <tbody className="text-text-secondary">
- {list.map((item: any) => (
- <tr
- key={item.id}
- className={'h-8 border-b border-divider-subtle hover:bg-background-default-hover'}
- >
- <td>{item.name}</td>
- <td>{item.email}</td>
- <td className="flex justify-center gap-2">
- <Button variant='ghost' size='small' className={cn('shrink-0 text-red-600')} onClick={() => {
- setRow(item)
- setShowConfirmDelete(true)
- }}>
- 解除关联
- </Button>
- </td>
- </tr>
- ))}
- </tbody>
- </table>
- </div>
- {/* Show Pagination only if the total is more than the limit */}
- {/* {total && ( */}
- {/* <Pagination */}
- {/* total={total} */}
- {/* limit={limit} */}
- {/* onLimitChange={setLimit} */}
- {/* current={page} */}
- {/* onChange={setPage} */}
- {/* className='w-full shrink-0 px-0 pb-0' */}
- {/* /> */}
- {/* )} */}
- </div>
- </div>
- </div>
- </Modal>
- {showConfirmDelete && (
- <Confirm
- title="取消确认"
- content={`请确认是否取消关联${row.name}?`}
- isShow={showConfirmDelete}
- onConfirm={handleDel}
- onCancel={() => setShowConfirmDelete(false)}
- />
- )}
- {
- showDetail && (
- <Modal overflowVisible isShow onClose={() => { }} className="p-[24px 32px] w-[400px]">
- <div className='mb-2 flex justify-between'>
- <div className='text-xl font-semibold text-text-primary'>添加用户</div>
- <RiCloseLine className='h-4 w-4 cursor-pointer text-text-tertiary' onClick={() => setShowDetail(false)} />
- </div>
- <div>
- <div className={cn('flex flex-wrap items-center justify-between py-4')}>
- <div className='shrink-0 py-2 text-sm font-medium leading-[20px] text-text-primary'>
- 选择用户
- </div>
- <div className='w-full'>
- <AntdSelect
- className="w-full"
- mode="multiple"
- showSearch
- placeholder="请选择用户"
- optionFilterProp="label"
- onChange={v => setSelectUser(v)}
- options={userOptions}
- />
- </div>
- </div>
- <Button
- tabIndex={0}
- className='w-full'
- onClick={handleSave}
- disabled={!selectUser.length}
- variant='primary'
- >
- 保存
- </Button>
- </div>
- </Modal>
- )
- }
- </div>
- )
- }
- export default UserModal
|