|
@@ -0,0 +1,144 @@
|
|
|
|
|
+import { MEMBER_TYPE_LABELS, MEMBER_TYPE_OPTIONS, STATUS_OPTIONS } from '@/defines';
|
|
|
|
|
+import {
|
|
|
|
|
+ fetchAddMember,
|
|
|
|
|
+ fetchMemberList,
|
|
|
|
|
+ fetchRemoveMember,
|
|
|
|
|
+ fetchUpdateMember,
|
|
|
|
|
+} from '@/services/member';
|
|
|
|
|
+import { fetchUserList } from '@/services/user';
|
|
|
|
|
+import {
|
|
|
|
|
+ ActionType,
|
|
|
|
|
+ DrawerForm,
|
|
|
|
|
+ ProColumns,
|
|
|
|
|
+ ProFormSelect,
|
|
|
|
|
+ ProTable,
|
|
|
|
|
+} from '@ant-design/pro-components';
|
|
|
|
|
+import { Button, Popconfirm, Tag, message } from 'antd';
|
|
|
|
|
+import { useEffect, useRef, useState } from 'react';
|
|
|
|
|
+
|
|
|
|
|
+interface MemberTabProps {
|
|
|
|
|
+ productCode: string;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export const MemberTab = ({ productCode }: MemberTabProps) => {
|
|
|
|
|
+ const actionRef = useRef<ActionType>();
|
|
|
|
|
+ const [userOptions, setUserOptions] = useState<{ label: string; value: number }[]>([]);
|
|
|
|
|
+
|
|
|
|
|
+ const loadUsers = async () => {
|
|
|
|
|
+ const res = await fetchUserList({ pageSize: 50 });
|
|
|
|
|
+ setUserOptions(
|
|
|
|
|
+ (res.data?.list ?? []).map((u) => ({ label: `${u.username}(${u.nickname})`, value: u.id })),
|
|
|
|
|
+ );
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ loadUsers();
|
|
|
|
|
+ }, []);
|
|
|
|
|
+
|
|
|
|
|
+ const columns: ProColumns<API.MemberItem>[] = [
|
|
|
|
|
+ { title: '用户名', dataIndex: 'username' },
|
|
|
|
|
+ { title: '昵称', dataIndex: 'nickname' },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '成员类型',
|
|
|
|
|
+ dataIndex: 'memberType',
|
|
|
|
|
+ render: (_, r) => <Tag>{MEMBER_TYPE_LABELS[r.memberType] ?? r.memberType}</Tag>,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '状态',
|
|
|
|
|
+ dataIndex: 'status',
|
|
|
|
|
+ render: (_, r) => (
|
|
|
|
|
+ <Tag color={r.status === 1 ? 'success' : 'default'}>{r.status === 1 ? '启用' : '禁用'}</Tag>
|
|
|
|
|
+ ),
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ title: '操作',
|
|
|
|
|
+ valueType: 'option',
|
|
|
|
|
+ render: (_, r) => [
|
|
|
|
|
+ <DrawerForm
|
|
|
|
|
+ key="edit"
|
|
|
|
|
+ title="编辑成员"
|
|
|
|
|
+ trigger={<a>编辑</a>}
|
|
|
|
|
+ initialValues={{ memberType: r.memberType, status: r.status }}
|
|
|
|
|
+ onFinish={async (values) => {
|
|
|
|
|
+ await fetchUpdateMember({
|
|
|
|
|
+ id: r.id,
|
|
|
|
|
+ memberType: values.memberType,
|
|
|
|
|
+ status: values.status,
|
|
|
|
|
+ });
|
|
|
|
|
+ actionRef.current?.reload();
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }}
|
|
|
|
|
+ drawerProps={{ destroyOnClose: true }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <ProFormSelect
|
|
|
|
|
+ name="memberType"
|
|
|
|
|
+ label="成员类型"
|
|
|
|
|
+ options={MEMBER_TYPE_OPTIONS}
|
|
|
|
|
+ rules={[{ required: true }]}
|
|
|
|
|
+ />
|
|
|
|
|
+ <ProFormSelect
|
|
|
|
|
+ name="status"
|
|
|
|
|
+ label="状态"
|
|
|
|
|
+ options={STATUS_OPTIONS}
|
|
|
|
|
+ rules={[{ required: true }]}
|
|
|
|
|
+ />
|
|
|
|
|
+ </DrawerForm>,
|
|
|
|
|
+ <Popconfirm
|
|
|
|
|
+ key="remove"
|
|
|
|
|
+ title="确认移除该成员?"
|
|
|
|
|
+ onConfirm={async () => {
|
|
|
|
|
+ await fetchRemoveMember({ id: r.id });
|
|
|
|
|
+ message.success('已移除');
|
|
|
|
|
+ actionRef.current?.reload();
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <a className="text-red-500">移除</a>
|
|
|
|
|
+ </Popconfirm>,
|
|
|
|
|
+ ],
|
|
|
|
|
+ },
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ return (
|
|
|
|
|
+ <ProTable<API.MemberItem>
|
|
|
|
|
+ actionRef={actionRef}
|
|
|
|
|
+ columns={columns}
|
|
|
|
|
+ rowKey="id"
|
|
|
|
|
+ request={async ({ current, pageSize }) => {
|
|
|
|
|
+ const res = await fetchMemberList({ productCode, page: current, pageSize });
|
|
|
|
|
+ return { data: res.data?.list ?? [], total: res.data?.total ?? 0, success: true };
|
|
|
|
|
+ }}
|
|
|
|
|
+ toolBarRender={() => [
|
|
|
|
|
+ <DrawerForm
|
|
|
|
|
+ key="add"
|
|
|
|
|
+ title="添加成员"
|
|
|
|
|
+ trigger={<Button type="primary">添加成员</Button>}
|
|
|
|
|
+ onFinish={async (values) => {
|
|
|
|
|
+ await fetchAddMember({
|
|
|
|
|
+ productCode,
|
|
|
|
|
+ userId: values.userId,
|
|
|
|
|
+ memberType: values.memberType,
|
|
|
|
|
+ });
|
|
|
|
|
+ actionRef.current?.reload();
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }}
|
|
|
|
|
+ drawerProps={{ destroyOnClose: true }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <ProFormSelect
|
|
|
|
|
+ name="userId"
|
|
|
|
|
+ label="选择用户"
|
|
|
|
|
+ options={userOptions}
|
|
|
|
|
+ showSearch
|
|
|
|
|
+ fieldProps={{ onSearch: loadUsers, filterOption: false }}
|
|
|
|
|
+ rules={[{ required: true }]}
|
|
|
|
|
+ />
|
|
|
|
|
+ <ProFormSelect
|
|
|
|
|
+ name="memberType"
|
|
|
|
|
+ label="成员类型"
|
|
|
|
|
+ options={MEMBER_TYPE_OPTIONS}
|
|
|
|
|
+ rules={[{ required: true }]}
|
|
|
|
|
+ />
|
|
|
|
|
+ </DrawerForm>,
|
|
|
|
|
+ ]}
|
|
|
|
|
+ />
|
|
|
|
|
+ );
|
|
|
|
|
+};
|