Răsfoiți Sursa

Merge pull request #2102 from visuddhinanda/agile

添加 角色,状态过滤
visuddhinanda 1 an în urmă
părinte
comite
e8898c4749

+ 91 - 13
dashboard/src/components/course/CourseMemberList.tsx

@@ -22,6 +22,11 @@ import { ISetStatus, setStatus } from "./UserAction";
 import { IChannel } from "../channel/Channel";
 import CourseInvite from "./CourseInvite";
 
+interface IParam {
+  role?: string;
+  status?: string[];
+}
+
 interface IRoleTag {
   title: string;
   color: string;
@@ -73,7 +78,7 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
 
   return (
     <>
-      <ProList<ICourseMember>
+      <ProList<ICourseMember, IParam>
         actionRef={ref}
         search={{
           filterType: "light",
@@ -94,6 +99,7 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
             search: false,
           },
           avatar: {
+            search: false,
             render(dom, entity, index, action, schema) {
               return <User {...entity.user} showName={false} />;
             },
@@ -150,14 +156,7 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
                 "reject",
                 "block",
               ];
-              /*
 
-              const undo = {
-                key: "undo",
-                label: "撤销上次操作",
-                disabled: !canUndo,
-              };
-              */
               const items: ItemType[] = actions.map((item) => {
                 return {
                   key: item,
@@ -224,23 +223,96 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
               ];
             },
           },
-          role: {
+          status: {
             // 自己扩展的字段,主要用于筛选,不在列表中显示
-            title: "角色",
-            valueType: "select",
+            title: "状态",
+            valueType: "checkbox",
             valueEnum: {
-              all: {
+              joined: {
                 text: intl.formatMessage({
-                  id: "forms.fields.publicity.all.label",
+                  id: "course.member.status.joined.label",
                 }),
                 status: "Default",
               },
+              applied: {
+                text: intl.formatMessage({
+                  id: "course.member.status.applied.label",
+                }),
+                status: "Success",
+              },
+              invited: {
+                text: intl.formatMessage({
+                  id: "course.member.status.invited.label",
+                }),
+                status: "Success",
+              },
+              canceled: {
+                text: intl.formatMessage({
+                  id: "course.member.status.canceled.label",
+                }),
+                status: "Success",
+              },
+              revoked: {
+                text: intl.formatMessage({
+                  id: "course.member.status.revoked.label",
+                }),
+                status: "Success",
+              },
+              agreed: {
+                text: intl.formatMessage({
+                  id: "course.member.status.agreed.label",
+                }),
+                status: "Success",
+              },
+              accepted: {
+                text: intl.formatMessage({
+                  id: "course.member.status.accepted.label",
+                }),
+                status: "Success",
+              },
+              disagreed: {
+                text: intl.formatMessage({
+                  id: "course.member.status.disagreed.label",
+                }),
+                status: "Success",
+              },
+              rejected: {
+                text: intl.formatMessage({
+                  id: "course.member.status.rejected.label",
+                }),
+                status: "Success",
+              },
+              left: {
+                text: intl.formatMessage({
+                  id: "course.member.status.left.label",
+                }),
+                status: "Success",
+              },
+              blocked: {
+                text: intl.formatMessage({
+                  id: "course.member.status.blocked.label",
+                }),
+                status: "Success",
+              },
+            },
+          },
+          role: {
+            // 自己扩展的字段,主要用于筛选,不在列表中显示
+            title: "角色",
+            valueType: "select",
+            valueEnum: {
               student: {
                 text: intl.formatMessage({
                   id: "auth.role.student",
                 }),
                 status: "Default",
               },
+              manager: {
+                text: intl.formatMessage({
+                  id: "auth.role.manager",
+                }),
+                status: "Success",
+              },
               assistant: {
                 text: intl.formatMessage({
                   id: "auth.role.assistant",
@@ -264,6 +336,12 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
           ) {
             url += "&search=" + params.keyword;
           }
+          if (params.role) {
+            url += `&role=${params.role}`;
+          }
+          if (params.status) {
+            url += `&status=${params.status}`;
+          }
           console.info("api request", url);
           const res = await get<ICourseMemberListResponse>(url);
           if (res.ok) {

+ 0 - 7
dashboard/src/components/course/RolePower.ts

@@ -53,13 +53,6 @@ const getActionsByStatus = (
   );
   const actions = data.find((value) => {
     if (value.mode.includes(mode) && value.status === status) {
-      console.debug(
-        "getActionsByStatus value",
-        value,
-        signUpStartAt,
-        signUpEndAt,
-        inSignUp
-      );
       if (inSignUp) {
         if (value.signUp && value.signUp.length > 0) {
           console.debug("getActionsByStatus got it", value.signUp);

+ 2 - 1
dashboard/src/components/template/Wbw/WbwCase.tsx

@@ -183,7 +183,8 @@ const WbwCaseWidget = ({
     return (
       <div
         className={
-          "wbw_word_item" + errorClass(data.case?.value, answer?.case?.value)
+          "wbw_word_item" +
+          errorClass("case", data.case?.value, answer?.case?.value)
         }
         style={{ display: "flex" }}
       >

+ 5 - 1
dashboard/src/components/template/Wbw/WbwFactorMeaning.tsx

@@ -101,7 +101,11 @@ const WbwFactorMeaningWidget = ({
       <div
         className={
           "wbw_word_item" +
-          errorClass(data.factorMeaning?.value, answer?.factorMeaning?.value)
+          errorClass(
+            "factorMeaning",
+            data.factorMeaning?.value,
+            answer?.factorMeaning?.value
+          )
         }
       >
         <Text type="secondary">

+ 1 - 1
dashboard/src/components/template/Wbw/WbwFactors.tsx

@@ -129,7 +129,7 @@ const WbwFactorsWidget = ({ data, answer, display, onChange }: IWidget) => {
       <div
         className={
           "wbw_word_item" +
-          errorClass(data.factors?.value, answer?.factors?.value)
+          errorClass("factors", data.factors?.value, answer?.factors?.value)
         }
       >
         <Text type="secondary">

+ 18 - 3
dashboard/src/components/template/Wbw/WbwMeaning.tsx

@@ -2,7 +2,7 @@ import { useState } from "react";
 import { useIntl } from "react-intl";
 import { Input, Popover, Typography } from "antd";
 
-import { IWbw, TWbwDisplayMode } from "./WbwWord";
+import { IWbw, TFieldName, TWbwDisplayMode } from "./WbwWord";
 import WbwMeaningSelect from "./WbwMeaningSelect";
 import { ArticleMode } from "../../article/Article";
 import CaseFormula from "./CaseFormula";
@@ -11,13 +11,28 @@ import EditableLabel from "../../general/EditableLabel";
 const { Text } = Typography;
 
 export const errorClass = (
+  field: TFieldName,
   data?: string | null,
   answer?: string | null
 ): string => {
   let classError = "";
   if (data && answer) {
     if (answer !== data) {
-      classError = " wbw_error";
+      classError = " wbw_check";
+      switch (field) {
+        case "case":
+          classError += " wbw_error";
+          break;
+        case "factors":
+          classError += " wbw_warning";
+          break;
+        case "factorMeaning":
+          classError += " wbw_info";
+          break;
+        case "meaning":
+          classError += " wbw_info";
+          break;
+      }
     }
   }
   return classError;
@@ -165,7 +180,7 @@ const WbwMeaningWidget = ({
       <div
         className={
           "wbw_word_item" +
-          errorClass(data.meaning?.value, answer?.meaning?.value)
+          errorClass("meaning", data.meaning?.value, answer?.meaning?.value)
         }
       >
         {editable || display === "list" ? (

+ 13 - 2
dashboard/src/components/template/Wbw/wbw.css

@@ -81,11 +81,22 @@
   padding: 0;
   cursor: pointer;
 }
-.wbw_error {
+
+.wbw_check {
   text-decoration: underline wavy;
-  text-decoration-color: red;
   text-underline-offset: 2px;
 }
+.wbw_error {
+  text-decoration-color: red;
+}
+
+.wbw_warning {
+  text-decoration-color: orange;
+}
+
+.wbw_info {
+  text-decoration-color: blue;
+}
 
 .layout-v .wbw_word_item {
   margin-right: 8px;