AddMember.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { useIntl } from "react-intl";
  2. import { ProForm, ProFormSelect } from "@ant-design/pro-components";
  3. import { Button, message, Popover } from "antd";
  4. import { UserAddOutlined } from "@ant-design/icons";
  5. import { get, post } from "../../request";
  6. import type { IUserListResponse } from "../../api/Auth";
  7. import { useState } from "react";
  8. import type {
  9. ICourseMemberData,
  10. ICourseMemberResponse,
  11. TCourseRole,
  12. } from "../../api/Course";
  13. interface IFormData {
  14. userId: string;
  15. role: TCourseRole;
  16. }
  17. interface IWidget {
  18. courseId?: string;
  19. onCreated?: Function;
  20. }
  21. const AddMemeberWidget = ({ courseId, onCreated }: IWidget) => {
  22. const intl = useIntl();
  23. const [open, setOpen] = useState(false);
  24. const form = (
  25. <ProForm<IFormData>
  26. onFinish={async (values: IFormData) => {
  27. console.log(values);
  28. if (typeof courseId !== "undefined") {
  29. const url = "/v2/course-member";
  30. const data: ICourseMemberData = {
  31. user_id: values.userId,
  32. role: values.role,
  33. course_id: courseId,
  34. status: "invited",
  35. };
  36. console.info("api request", url, data);
  37. post<ICourseMemberData, ICourseMemberResponse>(url, data).then(
  38. (json) => {
  39. console.log("add member", json);
  40. if (json.ok) {
  41. message.success(intl.formatMessage({ id: "flashes.success" }));
  42. setOpen(false);
  43. if (typeof onCreated !== "undefined") {
  44. onCreated();
  45. }
  46. }
  47. }
  48. );
  49. }
  50. }}
  51. >
  52. <ProForm.Group>
  53. <ProFormSelect
  54. width="sm"
  55. name="userId"
  56. label={intl.formatMessage({ id: "forms.fields.user.label" })}
  57. showSearch
  58. debounceTime={300}
  59. request={async ({ keyWords }) => {
  60. console.log("keyWord", keyWords);
  61. const json = await get<IUserListResponse>(
  62. `/v2/user?view=key&key=${keyWords}`
  63. );
  64. const userList = json.data.rows.map((item) => {
  65. return {
  66. value: item.id,
  67. label: `${item.userName}-${item.nickName}`,
  68. };
  69. });
  70. console.log("json", userList);
  71. return userList;
  72. }}
  73. placeholder={intl.formatMessage({
  74. id: "forms.message.user.required",
  75. })}
  76. rules={[
  77. {
  78. required: true,
  79. message: intl.formatMessage({
  80. id: "forms.message.user.required",
  81. }),
  82. },
  83. ]}
  84. />
  85. </ProForm.Group>
  86. <ProForm.Group>
  87. <ProFormSelect
  88. width="sm"
  89. name="role"
  90. label={intl.formatMessage({ id: "forms.fields.type.label" })}
  91. valueEnum={{
  92. student: intl.formatMessage({ id: "forms.fields.student.label" }),
  93. assistant: intl.formatMessage({
  94. id: "forms.fields.assistant.label",
  95. }),
  96. manager: intl.formatMessage({
  97. id: "auth.role.manager",
  98. }),
  99. }}
  100. />
  101. </ProForm.Group>
  102. </ProForm>
  103. );
  104. const handleClickChange = (open: boolean) => {
  105. setOpen(open);
  106. };
  107. return (
  108. <Popover
  109. placement="bottomLeft"
  110. arrowPointAtCenter
  111. content={form}
  112. trigger="click"
  113. open={open}
  114. onOpenChange={handleClickChange}
  115. >
  116. <Button icon={<UserAddOutlined />} key="add" type="primary">
  117. {intl.formatMessage({ id: "buttons.group.add.member" })}
  118. </Button>
  119. </Popover>
  120. );
  121. };
  122. export default AddMemeberWidget;