|
@@ -1,103 +1,72 @@
|
|
|
'use client'
|
|
|
-import React, { useCallback, useEffect, useState } from 'react'
|
|
|
-import { RiAddLine, RiCloseLine, RiRefreshLine, RiSearchLine } from '@remixicon/react'
|
|
|
+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 { delCorpus, fetchIntentType, fetchTypes } from '@/service/common'
|
|
|
+import { deptAddUsers, deptDelUsers, fetchIntent, fetchNoDeptUsers } from '@/service/common'
|
|
|
import 'react-multi-email/dist/style.css'
|
|
|
-import Input from '@/app/components/base/input'
|
|
|
-import useSWR from 'swr'
|
|
|
import cn from '@/utils/classnames'
|
|
|
import Confirm from '@/app/components/base/confirm'
|
|
|
-import Pagination from '@/app/components/base/pagination'
|
|
|
-import { SimpleSelect } from '@/app/components/base/select'
|
|
|
+import { Select as AntdSelect } from 'antd'
|
|
|
|
|
|
-const TypeModal = ({
|
|
|
+const UserModal = ({
|
|
|
onCancel,
|
|
|
onSend,
|
|
|
+ transfer,
|
|
|
}: any) => {
|
|
|
- const [page, setPage] = React.useState<number>(0)
|
|
|
- const [limit, setLimit] = useState<number>(10)
|
|
|
- const [name, setName] = useState('')
|
|
|
- const [query, setQuery] = useState<any>({})
|
|
|
- const { data, mutate }: any = useSWR(
|
|
|
- {
|
|
|
- url: '/xxx',
|
|
|
- params: {
|
|
|
- page: page + 1,
|
|
|
- limit,
|
|
|
- ...query,
|
|
|
- },
|
|
|
- },
|
|
|
- fetchIntentType,
|
|
|
- )
|
|
|
- const list: any = data?.data || []
|
|
|
- const total = data?.total || 0
|
|
|
- const handleSearch = (reset = false) => {
|
|
|
- if (reset)
|
|
|
- setIntentType('')
|
|
|
-
|
|
|
- const params: any = {}
|
|
|
- if (intentType)
|
|
|
- params.intentType = intentType
|
|
|
- setQuery(params)
|
|
|
- setPage(0)
|
|
|
+ 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(() => {
|
|
|
- mutate()
|
|
|
- }, [page, limit])
|
|
|
+ handlePage()
|
|
|
+ }, [])
|
|
|
const [showConfirmDelete, setShowConfirmDelete] = useState(false)
|
|
|
const [row, setRow] = useState<any>({})
|
|
|
const handleDel = async () => {
|
|
|
try {
|
|
|
- await delCorpus({
|
|
|
- url: `/tags/${row.id}`,
|
|
|
- body: {},
|
|
|
+ const { result }: any = await deptDelUsers({
|
|
|
+ url: '/dept/dept-accounts',
|
|
|
+ body: { dept_id: transfer.row.dept_id, account_ids: [{ account_id: row.account_id }] },
|
|
|
})
|
|
|
- setShowConfirmDelete(false)
|
|
|
+ if (result === 'success') {
|
|
|
+ setShowConfirmDelete(false)
|
|
|
+ handlePage()
|
|
|
+ }
|
|
|
}
|
|
|
catch (e) { }
|
|
|
}
|
|
|
const [showDetail, setShowDetail] = useState(false)
|
|
|
- const [mode, setMode] = useState<any>('add')
|
|
|
- const [editIntentType, setEditIntentType] = useState('')
|
|
|
- const [selectUser, setSelectUser] = useState<any>('')
|
|
|
+ const [selectUser, setSelectUser] = useState<any>([])
|
|
|
const [userOptions, setUserOptions] = useState<any>([])
|
|
|
useEffect(() => {
|
|
|
- fetchTypes({
|
|
|
- url: '/tags/page',
|
|
|
- params: {
|
|
|
- page: 1,
|
|
|
- limit: 99999,
|
|
|
- tag_type: 'knowledge_category',
|
|
|
- },
|
|
|
+ fetchNoDeptUsers({
|
|
|
+ url: '/account/nodept',
|
|
|
+ params: {},
|
|
|
}).then((res: any) => {
|
|
|
- setUserOptions(res.data.map((v: any) => ({ name: v.name, value: v.id })) || [])
|
|
|
+ setUserOptions(res.data.map((v: any) => ({ label: v.email, value: v.account_id })) || [])
|
|
|
})
|
|
|
}, [])
|
|
|
- const handleSave = useCallback(async () => {
|
|
|
- // try {
|
|
|
- // let res
|
|
|
- // if (transfer.mode === 'add') {
|
|
|
- // res = await addCorpus({
|
|
|
- // url: '/xxx',
|
|
|
- // body: { name, type: 'knowledge_category' },
|
|
|
- // })
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // res = await editCorpus({
|
|
|
- // url: '/xxx',
|
|
|
- // body: { name },
|
|
|
- // })
|
|
|
- // }
|
|
|
- // const { id }: any = res
|
|
|
- // if (id) {
|
|
|
- // onCancel()
|
|
|
- // onSend()
|
|
|
- // }
|
|
|
- // }
|
|
|
- // catch (e) { }
|
|
|
- }, [mode, editIntentType, onCancel, onSend])
|
|
|
+ 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]">
|
|
@@ -106,36 +75,34 @@ const TypeModal = ({
|
|
|
<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="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={() => {
|
|
|
- setMode('add')
|
|
|
- setEditIntentType('')
|
|
|
setShowDetail(true)
|
|
|
}}>
|
|
|
<RiAddLine className='mr-1 h-4 w-4' />
|
|
@@ -149,6 +116,7 @@ const TypeModal = ({
|
|
|
<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>
|
|
@@ -159,6 +127,7 @@ const TypeModal = ({
|
|
|
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)
|
|
@@ -173,24 +142,24 @@ const TypeModal = ({
|
|
|
</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'
|
|
|
- />
|
|
|
- )}
|
|
|
+ {/* {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}?`}
|
|
|
+ title="取消确认"
|
|
|
+ content={`请确认是否取消关联${row.name}?`}
|
|
|
isShow={showConfirmDelete}
|
|
|
onConfirm={handleDel}
|
|
|
onCancel={() => setShowConfirmDelete(false)}
|
|
@@ -209,11 +178,14 @@ const TypeModal = ({
|
|
|
选择用户
|
|
|
</div>
|
|
|
<div className='w-full'>
|
|
|
- <SimpleSelect
|
|
|
- defaultValue={selectUser}
|
|
|
- onSelect={(i) => { setSelectUser(i.value) }}
|
|
|
- items={userOptions}
|
|
|
- allowSearch={false}
|
|
|
+ <AntdSelect
|
|
|
+ className="w-full"
|
|
|
+ mode="multiple"
|
|
|
+ showSearch
|
|
|
+ placeholder="请选择用户"
|
|
|
+ optionFilterProp="label"
|
|
|
+ onChange={v => setSelectUser(v)}
|
|
|
+ options={userOptions}
|
|
|
/>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -221,7 +193,7 @@ const TypeModal = ({
|
|
|
tabIndex={0}
|
|
|
className='w-full'
|
|
|
onClick={handleSave}
|
|
|
- disabled={!editIntentType.length}
|
|
|
+ disabled={!selectUser.length}
|
|
|
variant='primary'
|
|
|
>
|
|
|
保存
|
|
@@ -234,4 +206,4 @@ const TypeModal = ({
|
|
|
)
|
|
|
}
|
|
|
|
|
|
-export default TypeModal
|
|
|
+export default UserModal
|