|
@@ -2,29 +2,35 @@ import { MEMBER_TYPE_COLORS, MEMBER_TYPE_LABELS, STATUS_ENABLED } from '@/define
|
|
|
import { BindRolesDrawer } from '@/pages/Admin/_shared/BindRolesDrawer';
|
|
import { BindRolesDrawer } from '@/pages/Admin/_shared/BindRolesDrawer';
|
|
|
import { UserPermDrawer } from '@/pages/Admin/_shared/UserPermDrawer';
|
|
import { UserPermDrawer } from '@/pages/Admin/_shared/UserPermDrawer';
|
|
|
import { ProductRolesBase, useUserProductRoles } from '@/pages/Admin/_shared/useUserProductRoles';
|
|
import { ProductRolesBase, useUserProductRoles } from '@/pages/Admin/_shared/useUserProductRoles';
|
|
|
-import { fetchUpdateUser } from '@/services/user';
|
|
|
|
|
|
|
+import { fetchUpdateUser, fetchUserList } from '@/services/user';
|
|
|
import { StopOutlined } from '@ant-design/icons';
|
|
import { StopOutlined } from '@ant-design/icons';
|
|
|
-import { DrawerForm, ProColumns, ProFormSelect, ProTable } from '@ant-design/pro-components';
|
|
|
|
|
-import { Button, message, Popconfirm, Spin, Tag } from 'antd';
|
|
|
|
|
-import { useMemo, useState } from 'react';
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ ActionType,
|
|
|
|
|
+ DrawerForm,
|
|
|
|
|
+ ProColumns,
|
|
|
|
|
+ ProFormSelect,
|
|
|
|
|
+ ProTable,
|
|
|
|
|
+} from '@ant-design/pro-components';
|
|
|
|
|
+import { Button, message, Popconfirm, Tag } from 'antd';
|
|
|
|
|
+import { useMemo, useRef, useState } from 'react';
|
|
|
|
|
|
|
|
interface DeptUserTableProps {
|
|
interface DeptUserTableProps {
|
|
|
- users: API.UserItem[];
|
|
|
|
|
productRolesBase: ProductRolesBase;
|
|
productRolesBase: ProductRolesBase;
|
|
|
deptId: number;
|
|
deptId: number;
|
|
|
|
|
+ deptIds: number[];
|
|
|
deptName: string;
|
|
deptName: string;
|
|
|
- noDeptUsers: API.UserItem[];
|
|
|
|
|
onMemberChange: () => void;
|
|
onMemberChange: () => void;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export const DeptUserTable = ({
|
|
export const DeptUserTable = ({
|
|
|
- users,
|
|
|
|
|
productRolesBase,
|
|
productRolesBase,
|
|
|
deptId,
|
|
deptId,
|
|
|
|
|
+ deptIds,
|
|
|
deptName,
|
|
deptName,
|
|
|
- noDeptUsers,
|
|
|
|
|
onMemberChange,
|
|
onMemberChange,
|
|
|
}: DeptUserTableProps) => {
|
|
}: DeptUserTableProps) => {
|
|
|
|
|
+ const actionRef = useRef<ActionType>();
|
|
|
|
|
+ const [pageUsers, setPageUsers] = useState<API.UserItem[]>([]);
|
|
|
const [rolesDrawer, setRolesDrawer] = useState<{ open: boolean; userId: number }>({
|
|
const [rolesDrawer, setRolesDrawer] = useState<{ open: boolean; userId: number }>({
|
|
|
open: false,
|
|
open: false,
|
|
|
userId: 0,
|
|
userId: 0,
|
|
@@ -35,14 +41,9 @@ export const DeptUserTable = ({
|
|
|
});
|
|
});
|
|
|
const [refreshKey, setRefreshKey] = useState(0);
|
|
const [refreshKey, setRefreshKey] = useState(0);
|
|
|
|
|
|
|
|
- const userIds = useMemo(() => users.map((u) => u.id), [users]);
|
|
|
|
|
|
|
+ const userIds = useMemo(() => pageUsers.map((u) => u.id), [pageUsers]);
|
|
|
const { userProductInfo } = useUserProductRoles(userIds, productRolesBase, refreshKey);
|
|
const { userProductInfo } = useUserProductRoles(userIds, productRolesBase, refreshKey);
|
|
|
|
|
|
|
|
- const userOptions = useMemo(
|
|
|
|
|
- () => noDeptUsers.map((u) => ({ label: `${u.username}(${u.nickname})`, value: u.id })),
|
|
|
|
|
- [noDeptUsers],
|
|
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
const columns: ProColumns<API.UserItem>[] = [
|
|
const columns: ProColumns<API.UserItem>[] = [
|
|
|
{ title: '用户名', dataIndex: 'username', width: 200 },
|
|
{ title: '用户名', dataIndex: 'username', width: 200 },
|
|
|
{ title: '昵称', dataIndex: 'nickname', width: 200 },
|
|
{ title: '昵称', dataIndex: 'nickname', width: 200 },
|
|
@@ -105,6 +106,7 @@ export const DeptUserTable = ({
|
|
|
const res = await fetchUpdateUser({ id: r.id, deptId: 0 });
|
|
const res = await fetchUpdateUser({ id: r.id, deptId: 0 });
|
|
|
if (!res.success) return;
|
|
if (!res.success) return;
|
|
|
message.success('已移出');
|
|
message.success('已移出');
|
|
|
|
|
+ actionRef.current?.reload();
|
|
|
onMemberChange();
|
|
onMemberChange();
|
|
|
}}
|
|
}}
|
|
|
>
|
|
>
|
|
@@ -115,14 +117,26 @@ export const DeptUserTable = ({
|
|
|
},
|
|
},
|
|
|
];
|
|
];
|
|
|
|
|
|
|
|
|
|
+ const noDeptUserOptions = async ({ keyWords }: { keyWords?: string }) => {
|
|
|
|
|
+ const res = await fetchUserList({ deptIds: [0], username: keyWords ?? '', pageSize: 50 });
|
|
|
|
|
+ return (res.data ?? []).map((u: API.UserItem) => ({
|
|
|
|
|
+ label: `${u.username}(${u.nickname})`,
|
|
|
|
|
+ value: u.id,
|
|
|
|
|
+ }));
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
- <Spin spinning={productRolesBase.loading}>
|
|
|
|
|
|
|
+ <>
|
|
|
<ProTable<API.UserItem>
|
|
<ProTable<API.UserItem>
|
|
|
|
|
+ actionRef={actionRef}
|
|
|
columns={columns}
|
|
columns={columns}
|
|
|
- dataSource={users}
|
|
|
|
|
rowKey="id"
|
|
rowKey="id"
|
|
|
search={false}
|
|
search={false}
|
|
|
options={false}
|
|
options={false}
|
|
|
|
|
+ request={async (params, sorter, filter) =>
|
|
|
|
|
+ fetchUserList({ ...params, deptIds }, sorter, filter)
|
|
|
|
|
+ }
|
|
|
|
|
+ onDataSourceChange={setPageUsers}
|
|
|
pagination={{
|
|
pagination={{
|
|
|
defaultPageSize: 20,
|
|
defaultPageSize: 20,
|
|
|
pageSizeOptions: [10, 20, 50, 100],
|
|
pageSizeOptions: [10, 20, 50, 100],
|
|
@@ -140,6 +154,7 @@ export const DeptUserTable = ({
|
|
|
const res = await fetchUpdateUser({ id: values.userId, deptId });
|
|
const res = await fetchUpdateUser({ id: values.userId, deptId });
|
|
|
if (!res.success) return false;
|
|
if (!res.success) return false;
|
|
|
message.success('添加成功');
|
|
message.success('添加成功');
|
|
|
|
|
+ actionRef.current?.reload();
|
|
|
onMemberChange();
|
|
onMemberChange();
|
|
|
return true;
|
|
return true;
|
|
|
}}
|
|
}}
|
|
@@ -148,8 +163,9 @@ export const DeptUserTable = ({
|
|
|
<ProFormSelect
|
|
<ProFormSelect
|
|
|
name="userId"
|
|
name="userId"
|
|
|
label="选择用户"
|
|
label="选择用户"
|
|
|
- options={userOptions}
|
|
|
|
|
showSearch
|
|
showSearch
|
|
|
|
|
+ debounceTime={300}
|
|
|
|
|
+ request={noDeptUserOptions}
|
|
|
rules={[{ required: true, message: '请选择用户' }]}
|
|
rules={[{ required: true, message: '请选择用户' }]}
|
|
|
placeholder="仅显示未分配部门的用户"
|
|
placeholder="仅显示未分配部门的用户"
|
|
|
fieldProps={{ id: 'dept-member-select' }}
|
|
fieldProps={{ id: 'dept-member-select' }}
|
|
@@ -166,6 +182,6 @@ export const DeptUserTable = ({
|
|
|
{...permDrawer}
|
|
{...permDrawer}
|
|
|
onClose={() => setPermDrawer((p) => ({ ...p, open: false }))}
|
|
onClose={() => setPermDrawer((p) => ({ ...p, open: false }))}
|
|
|
/>
|
|
/>
|
|
|
- </Spin>
|
|
|
|
|
|
|
+ </>
|
|
|
);
|
|
);
|
|
|
};
|
|
};
|