|
|
@@ -2,17 +2,29 @@ import { MEMBER_TYPE_COLORS, MEMBER_TYPE_LABELS, STATUS_ENABLED } from '@/define
|
|
|
import { BindRolesDrawer } from '@/pages/Admin/_shared/BindRolesDrawer';
|
|
|
import { UserPermDrawer } from '@/pages/Admin/_shared/UserPermDrawer';
|
|
|
import { ProductRolesBase, useUserProductRoles } from '@/pages/Admin/_shared/useUserProductRoles';
|
|
|
+import { fetchUpdateUser } from '@/services/user';
|
|
|
import { StopOutlined } from '@ant-design/icons';
|
|
|
-import { Spin, Table, Tag } from 'antd';
|
|
|
-import type { ColumnsType } from 'antd/es/table';
|
|
|
+import { DrawerForm, ProColumns, ProFormSelect, ProTable } from '@ant-design/pro-components';
|
|
|
+import { Button, message, Popconfirm, Spin, Tag } from 'antd';
|
|
|
import { useMemo, useState } from 'react';
|
|
|
|
|
|
interface DeptUserTableProps {
|
|
|
users: API.UserItem[];
|
|
|
productRolesBase: ProductRolesBase;
|
|
|
+ deptId: number;
|
|
|
+ deptName: string;
|
|
|
+ noDeptUsers: API.UserItem[];
|
|
|
+ onMemberChange: () => void;
|
|
|
}
|
|
|
|
|
|
-export const DeptUserTable = ({ users, productRolesBase }: DeptUserTableProps) => {
|
|
|
+export const DeptUserTable = ({
|
|
|
+ users,
|
|
|
+ productRolesBase,
|
|
|
+ deptId,
|
|
|
+ deptName,
|
|
|
+ noDeptUsers,
|
|
|
+ onMemberChange,
|
|
|
+}: DeptUserTableProps) => {
|
|
|
const [rolesDrawer, setRolesDrawer] = useState<{ open: boolean; userId: number }>({
|
|
|
open: false,
|
|
|
userId: 0,
|
|
|
@@ -26,7 +38,12 @@ export const DeptUserTable = ({ users, productRolesBase }: DeptUserTableProps) =
|
|
|
const userIds = useMemo(() => users.map((u) => u.id), [users]);
|
|
|
const { userProductInfo } = useUserProductRoles(userIds, productRolesBase, refreshKey);
|
|
|
|
|
|
- const columns: ColumnsType<API.UserItem> = [
|
|
|
+ const userOptions = useMemo(
|
|
|
+ () => noDeptUsers.map((u) => ({ label: `${u.username}(${u.nickname})`, value: u.id })),
|
|
|
+ [noDeptUsers],
|
|
|
+ );
|
|
|
+
|
|
|
+ const columns: ProColumns<API.UserItem>[] = [
|
|
|
{ title: '用户名', dataIndex: 'username', width: 200 },
|
|
|
{ title: '昵称', dataIndex: 'nickname', width: 200 },
|
|
|
{
|
|
|
@@ -77,11 +94,22 @@ export const DeptUserTable = ({ users, productRolesBase }: DeptUserTableProps) =
|
|
|
{
|
|
|
title: '操作',
|
|
|
key: 'action',
|
|
|
- width: 160,
|
|
|
+ width: 220,
|
|
|
render: (_, r) => (
|
|
|
<span className="flex gap-3">
|
|
|
<a onClick={() => setRolesDrawer({ open: true, userId: r.id })}>分配角色</a>
|
|
|
<a onClick={() => setPermDrawer({ open: true, userId: r.id })}>设置权限</a>
|
|
|
+ <Popconfirm
|
|
|
+ title={`确认将「${r.username}」移出「${deptName}」?`}
|
|
|
+ onConfirm={async () => {
|
|
|
+ const res = await fetchUpdateUser({ id: r.id, deptId: 0 });
|
|
|
+ if (!res.success) return;
|
|
|
+ message.success('已移出');
|
|
|
+ onMemberChange();
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <a className="text-(--ant-color-error)">移出部门</a>
|
|
|
+ </Popconfirm>
|
|
|
</span>
|
|
|
),
|
|
|
},
|
|
|
@@ -89,19 +117,45 @@ export const DeptUserTable = ({ users, productRolesBase }: DeptUserTableProps) =
|
|
|
|
|
|
return (
|
|
|
<Spin spinning={productRolesBase.loading}>
|
|
|
- <Table<API.UserItem>
|
|
|
+ <ProTable<API.UserItem>
|
|
|
columns={columns}
|
|
|
dataSource={users}
|
|
|
rowKey="id"
|
|
|
+ search={false}
|
|
|
+ options={false}
|
|
|
pagination={{
|
|
|
defaultPageSize: 20,
|
|
|
pageSizeOptions: [10, 20, 50, 100],
|
|
|
showSizeChanger: true,
|
|
|
- showTotal: (total, range) => `第 ${range[0]}-${range[1]} 条/总共 ${total} 条`,
|
|
|
}}
|
|
|
size="small"
|
|
|
scroll={{ x: 900 }}
|
|
|
tableLayout="fixed"
|
|
|
+ toolBarRender={() => [
|
|
|
+ <DrawerForm
|
|
|
+ key="add"
|
|
|
+ title="添加成员"
|
|
|
+ trigger={<Button type="primary">添加成员</Button>}
|
|
|
+ onFinish={async (values) => {
|
|
|
+ const res = await fetchUpdateUser({ id: values.userId, deptId });
|
|
|
+ if (!res.success) return false;
|
|
|
+ message.success('添加成功');
|
|
|
+ onMemberChange();
|
|
|
+ return true;
|
|
|
+ }}
|
|
|
+ drawerProps={{ destroyOnClose: true }}
|
|
|
+ >
|
|
|
+ <ProFormSelect
|
|
|
+ name="userId"
|
|
|
+ label="选择用户"
|
|
|
+ options={userOptions}
|
|
|
+ showSearch
|
|
|
+ rules={[{ required: true, message: '请选择用户' }]}
|
|
|
+ placeholder="仅显示未分配部门的用户"
|
|
|
+ fieldProps={{ id: 'dept-member-select' }}
|
|
|
+ />
|
|
|
+ </DrawerForm>,
|
|
|
+ ]}
|
|
|
/>
|
|
|
<BindRolesDrawer
|
|
|
{...rolesDrawer}
|