|
@@ -1,50 +1,28 @@
|
|
|
import { useIntl } from "react-intl";
|
|
import { useIntl } from "react-intl";
|
|
|
-import { Dropdown, Modal, Tag } from "antd";
|
|
|
|
|
|
|
+import { Dropdown, Modal, Tag, message } from "antd";
|
|
|
import { ActionType, ProList } from "@ant-design/pro-components";
|
|
import { ActionType, ProList } from "@ant-design/pro-components";
|
|
|
import { ExclamationCircleFilled } from "@ant-design/icons";
|
|
import { ExclamationCircleFilled } from "@ant-design/icons";
|
|
|
|
|
|
|
|
-import { delete_, get, put } from "../../request";
|
|
|
|
|
|
|
+import { get, put } from "../../request";
|
|
|
import { ICourseMember } from "./CourseMember";
|
|
import { ICourseMember } from "./CourseMember";
|
|
|
import AddMember from "./AddMember";
|
|
import AddMember from "./AddMember";
|
|
|
import { useEffect, useRef, useState } from "react";
|
|
import { useEffect, useRef, useState } from "react";
|
|
|
import {
|
|
import {
|
|
|
ICourseDataResponse,
|
|
ICourseDataResponse,
|
|
|
ICourseMemberData,
|
|
ICourseMemberData,
|
|
|
- ICourseMemberDeleteResponse,
|
|
|
|
|
ICourseMemberListResponse,
|
|
ICourseMemberListResponse,
|
|
|
ICourseMemberResponse,
|
|
ICourseMemberResponse,
|
|
|
ICourseResponse,
|
|
ICourseResponse,
|
|
|
TCourseMemberAction,
|
|
TCourseMemberAction,
|
|
|
TCourseMemberStatus,
|
|
TCourseMemberStatus,
|
|
|
|
|
+ actionMap,
|
|
|
} from "../api/Course";
|
|
} from "../api/Course";
|
|
|
import { ItemType } from "antd/lib/menu/hooks/useItems";
|
|
import { ItemType } from "antd/lib/menu/hooks/useItems";
|
|
|
import User from "../auth/User";
|
|
import User from "../auth/User";
|
|
|
-import { managerCanDo } from "./RolePower";
|
|
|
|
|
|
|
+import { getStatusColor, managerCanDo } from "./RolePower";
|
|
|
|
|
+import { ISetStatus, setStatus } from "./UserAction";
|
|
|
const { confirm } = Modal;
|
|
const { confirm } = Modal;
|
|
|
|
|
|
|
|
-interface IStatusColor {
|
|
|
|
|
- status: TCourseMemberStatus;
|
|
|
|
|
- color: string;
|
|
|
|
|
-}
|
|
|
|
|
-export const getStatusColor = (status?: TCourseMemberStatus): string => {
|
|
|
|
|
- let color = "unset";
|
|
|
|
|
- const setting: IStatusColor[] = [
|
|
|
|
|
- { status: "applied", color: "blue" },
|
|
|
|
|
- { status: "invited", color: "blue" },
|
|
|
|
|
- { status: "accepted", color: "green" },
|
|
|
|
|
- { status: "rejected", color: "orange" },
|
|
|
|
|
- { status: "disagreed", color: "red" },
|
|
|
|
|
- { status: "left", color: "red" },
|
|
|
|
|
- { status: "blocked", color: "orange" },
|
|
|
|
|
- ];
|
|
|
|
|
- const CourseStatusColor = setting.find((value) => value.status === status);
|
|
|
|
|
-
|
|
|
|
|
- if (CourseStatusColor) {
|
|
|
|
|
- color = CourseStatusColor.color;
|
|
|
|
|
- }
|
|
|
|
|
- return color;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
interface IWidget {
|
|
interface IWidget {
|
|
|
courseId?: string;
|
|
courseId?: string;
|
|
|
onSelect?: Function;
|
|
onSelect?: Function;
|
|
@@ -52,7 +30,7 @@ interface IWidget {
|
|
|
|
|
|
|
|
const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
|
const intl = useIntl(); //i18n
|
|
const intl = useIntl(); //i18n
|
|
|
- const [canDelete, setCanDelete] = useState(false);
|
|
|
|
|
|
|
+ const [canManage, setCanManage] = useState(false);
|
|
|
const [course, setCourse] = useState<ICourseDataResponse>();
|
|
const [course, setCourse] = useState<ICourseDataResponse>();
|
|
|
const ref = useRef<ActionType>();
|
|
const ref = useRef<ActionType>();
|
|
|
|
|
|
|
@@ -71,42 +49,6 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
|
}
|
|
}
|
|
|
}, [courseId]);
|
|
}, [courseId]);
|
|
|
|
|
|
|
|
- const ChangeStatus = (
|
|
|
|
|
- id: string,
|
|
|
|
|
- name: string,
|
|
|
|
|
- status: TCourseMemberStatus
|
|
|
|
|
- ) => {
|
|
|
|
|
- confirm({
|
|
|
|
|
- title: (
|
|
|
|
|
- <div>
|
|
|
|
|
- <div>
|
|
|
|
|
- {intl.formatMessage({
|
|
|
|
|
- id: `course.member.status.${status}.message`,
|
|
|
|
|
- })}
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>{name}</div>
|
|
|
|
|
- </div>
|
|
|
|
|
- ),
|
|
|
|
|
- icon: <ExclamationCircleFilled />,
|
|
|
|
|
- onOk() {
|
|
|
|
|
- return put<ICourseMemberData, ICourseMemberResponse>(
|
|
|
|
|
- "/v2/course-member/" + id,
|
|
|
|
|
- {
|
|
|
|
|
- course_id: "",
|
|
|
|
|
- user_id: "",
|
|
|
|
|
- status: status,
|
|
|
|
|
- }
|
|
|
|
|
- )
|
|
|
|
|
- .then((json) => {
|
|
|
|
|
- if (json.ok) {
|
|
|
|
|
- console.log("delete ok");
|
|
|
|
|
- ref.current?.reload();
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- .catch(() => console.log("Oops errors!"));
|
|
|
|
|
- },
|
|
|
|
|
- });
|
|
|
|
|
- };
|
|
|
|
|
return (
|
|
return (
|
|
|
<>
|
|
<>
|
|
|
<ProList<ICourseMember>
|
|
<ProList<ICourseMember>
|
|
@@ -158,7 +100,6 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
|
actions: {
|
|
actions: {
|
|
|
search: false,
|
|
search: false,
|
|
|
render: (text, row, index, action) => {
|
|
render: (text, row, index, action) => {
|
|
|
- let canUndo = false;
|
|
|
|
|
const statusColor = getStatusColor(row.status);
|
|
const statusColor = getStatusColor(row.status);
|
|
|
const actions: TCourseMemberAction[] = [
|
|
const actions: TCourseMemberAction[] = [
|
|
|
"invite",
|
|
"invite",
|
|
@@ -167,11 +108,14 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
|
"reject",
|
|
"reject",
|
|
|
"block",
|
|
"block",
|
|
|
];
|
|
];
|
|
|
|
|
+ /*
|
|
|
|
|
+
|
|
|
const undo = {
|
|
const undo = {
|
|
|
key: "undo",
|
|
key: "undo",
|
|
|
label: "撤销上次操作",
|
|
label: "撤销上次操作",
|
|
|
disabled: !canUndo,
|
|
disabled: !canUndo,
|
|
|
};
|
|
};
|
|
|
|
|
+ */
|
|
|
const items: ItemType[] = actions.map((item) => {
|
|
const items: ItemType[] = actions.map((item) => {
|
|
|
return {
|
|
return {
|
|
|
key: item,
|
|
key: item,
|
|
@@ -194,49 +138,36 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
|
id: `course.member.status.${row.status}.label`,
|
|
id: `course.member.status.${row.status}.label`,
|
|
|
})}
|
|
})}
|
|
|
</span>,
|
|
</span>,
|
|
|
- canDelete ? (
|
|
|
|
|
|
|
+ canManage ? (
|
|
|
<Dropdown.Button
|
|
<Dropdown.Button
|
|
|
key={index}
|
|
key={index}
|
|
|
type="link"
|
|
type="link"
|
|
|
menu={{
|
|
menu={{
|
|
|
items,
|
|
items,
|
|
|
onClick: (e) => {
|
|
onClick: (e) => {
|
|
|
- console.log("click", e);
|
|
|
|
|
- switch (e.key) {
|
|
|
|
|
- case "exp":
|
|
|
|
|
- break;
|
|
|
|
|
- case "delete":
|
|
|
|
|
- confirm({
|
|
|
|
|
- title: `删除此成员吗?`,
|
|
|
|
|
- icon: <ExclamationCircleFilled />,
|
|
|
|
|
- content: "此操作不能恢复",
|
|
|
|
|
- okType: "danger",
|
|
|
|
|
- onOk() {
|
|
|
|
|
- return delete_<ICourseMemberDeleteResponse>(
|
|
|
|
|
- "/v2/course-member/" + row.id
|
|
|
|
|
- )
|
|
|
|
|
- .then((json) => {
|
|
|
|
|
- if (json.ok) {
|
|
|
|
|
- console.log("delete ok");
|
|
|
|
|
- ref.current?.reload();
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- .catch(() => console.log("Oops errors!"));
|
|
|
|
|
|
|
+ console.debug("click", e);
|
|
|
|
|
+ const currAction = e.key as TCourseMemberAction;
|
|
|
|
|
+ if (actions.includes(currAction)) {
|
|
|
|
|
+ const newStatus = actionMap(currAction);
|
|
|
|
|
+ if (newStatus) {
|
|
|
|
|
+ const actionParam: ISetStatus = {
|
|
|
|
|
+ courseMemberId: row.id,
|
|
|
|
|
+ message: intl.formatMessage(
|
|
|
|
|
+ {
|
|
|
|
|
+ id: `course.member.status.${currAction}.message`,
|
|
|
|
|
+ },
|
|
|
|
|
+ { user: row.user?.nickName }
|
|
|
|
|
+ ),
|
|
|
|
|
+ status: newStatus,
|
|
|
|
|
+ onSuccess: (data: ICourseMemberData) => {
|
|
|
|
|
+ message.success(
|
|
|
|
|
+ intl.formatMessage({ id: "flashes.success" })
|
|
|
|
|
+ );
|
|
|
|
|
+ ref.current?.reload();
|
|
|
},
|
|
},
|
|
|
- });
|
|
|
|
|
- break;
|
|
|
|
|
- case "accept":
|
|
|
|
|
- if (row.id && row.name) {
|
|
|
|
|
- ChangeStatus(row.id, row.name, "accepted");
|
|
|
|
|
- }
|
|
|
|
|
- break;
|
|
|
|
|
- case "reject":
|
|
|
|
|
- if (row.id && row.name) {
|
|
|
|
|
- ChangeStatus(row.id, row.name, "rejected");
|
|
|
|
|
- }
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ };
|
|
|
|
|
+ setStatus(actionParam);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
}}
|
|
}}
|
|
@@ -291,7 +222,7 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
|
|
|
if (res.ok) {
|
|
if (res.ok) {
|
|
|
console.debug("api response", res.data);
|
|
console.debug("api response", res.data);
|
|
|
if (res.data.role === "owner" || res.data.role === "manager") {
|
|
if (res.data.role === "owner" || res.data.role === "manager") {
|
|
|
- setCanDelete(true);
|
|
|
|
|
|
|
+ setCanManage(true);
|
|
|
}
|
|
}
|
|
|
const items: ICourseMember[] = res.data.rows.map((item, id) => {
|
|
const items: ICourseMember[] = res.data.rows.map((item, id) => {
|
|
|
let member: ICourseMember = {
|
|
let member: ICourseMember = {
|