Explorar el Código

支持报名时间

visuddhinanda hace 2 años
padre
commit
006f54edfb

+ 3 - 1
dashboard/src/components/course/CourseMemberList.tsx

@@ -156,7 +156,9 @@ const CourseMemberListWidget = ({ courseId, onSelect }: IWidget) => {
                     course?.start_at,
                     course?.end_at,
                     course?.join,
-                    row.status
+                    row.status,
+                    course?.sign_up_start_at,
+                    course?.sign_up_end_at
                   ),
                 };
               });

+ 86 - 20
dashboard/src/components/course/RolePower.ts

@@ -8,6 +8,7 @@ import {
 export interface IAction {
   mode: TCourseJoinMode[];
   status: TCourseMemberStatus;
+  signUp?: TCourseMemberAction[];
   before: TCourseMemberAction[];
   duration: TCourseMemberAction[];
   after: TCourseMemberAction[];
@@ -17,9 +18,20 @@ export const getStudentActionsByStatus = (
   status?: TCourseMemberStatus,
   mode?: TCourseJoinMode,
   startAt?: string,
-  endAt?: string
+  endAt?: string,
+  signUpStartAt?: string,
+  signUpEndAt?: string
 ): TCourseMemberAction[] | undefined => {
-  const output = getActionsByStatus(studentData, status, mode, startAt, endAt);
+  const output = getActionsByStatus(
+    studentData,
+    status,
+    mode,
+    startAt,
+    endAt,
+    signUpStartAt,
+    signUpEndAt
+  );
+  console.log("getStudentActionsByStatus", output);
   return output;
 };
 const getActionsByStatus = (
@@ -27,32 +39,54 @@ const getActionsByStatus = (
   status?: TCourseMemberStatus,
   mode?: TCourseJoinMode,
   startAt?: string,
-  endAt?: string
+  endAt?: string,
+  signUpStartAt?: string,
+  signUpEndAt?: string
 ): TCourseMemberAction[] | undefined => {
+  console.debug("getActionsByStatus start");
   if (!startAt || !endAt || !mode || !status) {
     return undefined;
   }
+  const inSignUp = moment().isBetween(
+    moment(signUpStartAt),
+    moment(signUpEndAt)
+  );
   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);
+          return true;
+        }
+      }
       if (moment().isBefore(moment(startAt))) {
         if (value.before && value.before.length > 0) {
           return true;
         }
-      } else if (moment().isBefore(moment(endAt))) {
+      }
+      if (moment().isBefore(moment(endAt))) {
         if (value.duration && value.duration.length > 0) {
           return true;
         }
-      } else {
-        if (value.after && value.after.length > 0) {
-          return true;
-        }
+      }
+      if (value.after && value.after.length > 0) {
+        return true;
       }
     }
-    return undefined;
+    return false;
   });
 
   if (actions) {
-    if (moment().isBefore(moment(startAt))) {
+    if (inSignUp && actions.signUp && actions.signUp.length > 0) {
+      return actions.signUp;
+    } else if (moment().isBefore(moment(startAt))) {
       return actions.before;
     } else if (moment().isBefore(moment(endAt))) {
       return actions.duration;
@@ -70,7 +104,9 @@ export const test = (
   startAt?: string,
   endAt?: string,
   mode?: TCourseJoinMode,
-  status?: TCourseMemberStatus
+  status?: TCourseMemberStatus,
+  signUpStartAt?: string,
+  signUpEndAt?: string
 ): boolean => {
   if (!startAt || !endAt || !mode || !status) {
     return false;
@@ -80,7 +116,9 @@ export const test = (
     status,
     mode,
     startAt,
-    endAt
+    endAt,
+    signUpStartAt,
+    signUpEndAt
   )?.includes(action);
 
   if (canDo) {
@@ -95,13 +133,24 @@ export const managerCanDo = (
   startAt?: string,
   endAt?: string,
   mode?: TCourseJoinMode,
-  status?: TCourseMemberStatus
+  status?: TCourseMemberStatus,
+  signUpStartAt?: string,
+  signUpEndAt?: string
 ): boolean => {
   if (!startAt || !endAt || !mode || !status) {
     return false;
   }
 
-  return test(managerData, action, startAt, endAt, mode, status);
+  return test(
+    managerData,
+    action,
+    startAt,
+    endAt,
+    mode,
+    status,
+    signUpStartAt,
+    signUpEndAt
+  );
 };
 
 export const studentCanDo = (
@@ -109,13 +158,24 @@ export const studentCanDo = (
   startAt?: string,
   endAt?: string,
   mode?: TCourseJoinMode,
-  status?: TCourseMemberStatus
+  status?: TCourseMemberStatus,
+  signUpStartAt?: string,
+  signUpEndAt?: string
 ): boolean => {
   if (!startAt || !endAt || !mode || !status) {
     return false;
   }
 
-  return test(studentData, action, startAt, endAt, mode, status);
+  return test(
+    studentData,
+    action,
+    startAt,
+    endAt,
+    mode,
+    status,
+    signUpStartAt,
+    signUpEndAt
+  );
 };
 
 interface IStatusColor {
@@ -146,8 +206,9 @@ const studentData: IAction[] = [
   {
     mode: ["open"],
     status: "none",
+    signUp: ["join"],
     before: [],
-    duration: ["join"],
+    duration: [],
     after: [],
   },
   {
@@ -167,6 +228,7 @@ const studentData: IAction[] = [
   {
     mode: ["open"],
     status: "left",
+    signUp: ["join"],
     before: [],
     duration: ["join"],
     after: [],
@@ -174,13 +236,15 @@ const studentData: IAction[] = [
   {
     mode: ["manual", "invite"],
     status: "none",
-    before: ["apply"],
+    signUp: ["apply"],
+    before: [],
     duration: [],
     after: [],
   },
   {
     mode: ["manual", "invite"],
     status: "invited",
+    signUp: ["agree", "disagree"],
     before: ["agree", "disagree"],
     duration: [],
     after: [],
@@ -188,7 +252,8 @@ const studentData: IAction[] = [
   {
     mode: ["manual", "invite"],
     status: "revoked",
-    before: ["apply"],
+    signUp: ["apply"],
+    before: [],
     duration: [],
     after: [],
   },
@@ -223,7 +288,8 @@ const studentData: IAction[] = [
   {
     mode: ["manual", "invite"],
     status: "canceled",
-    before: ["apply"],
+    signUp: ["apply"],
+    before: [],
     duration: [],
     after: [],
   },

+ 17 - 5
dashboard/src/components/course/Status.tsx

@@ -24,27 +24,35 @@ import { getStatusColor, getStudentActionsByStatus } from "./RolePower";
 const { Paragraph } = Typography;
 
 interface IWidget {
-  courseId: string;
+  courseId?: string;
   courseName?: string;
   startAt?: string;
   endAt?: string;
+  signUpStartAt?: string;
+  signUpEndAt?: string;
   joinMode?: TCourseJoinMode;
 }
 const StatusWidget = ({
   courseId,
   courseName,
-  joinMode,
   startAt,
   endAt,
+  signUpStartAt,
+  signUpEndAt,
+  joinMode,
 }: IWidget) => {
   const intl = useIntl();
   const [currMember, setCurrMember] = useState<ICourseMemberData>();
   const user = useAppSelector(currentUser);
 
+  console.debug("course status", signUpStartAt, signUpEndAt);
   useEffect(() => {
     /**
      * 获取该课程我的报名状态
      */
+    if (typeof courseId === "undefined") {
+      return;
+    }
     const url = `/v2/course-member/${courseId}`;
     console.info("api request", url);
     get<ICourseMemberResponse>(url).then((json) => {
@@ -67,9 +75,11 @@ const StatusWidget = ({
     currStatus,
     joinMode,
     startAt,
-    endAt
+    endAt,
+    signUpStartAt,
+    signUpEndAt
   );
-  console.debug("getStudentActionsByStatus", currStatus, actions);
+  console.debug("getStudentActionsByStatus", currStatus, joinMode, actions);
   if (user) {
     labelStatus = intl.formatMessage({
       id: `course.member.status.${currStatus}.label`,
@@ -107,11 +117,13 @@ const StatusWidget = ({
     );
   }
 
-  return (
+  return courseId ? (
     <Paragraph>
       <div style={{ color: getStatusColor(currStatus) }}>{labelStatus}</div>
       {operation}
     </Paragraph>
+  ) : (
+    <></>
   );
 };
 

+ 5 - 1
dashboard/src/pages/library/course/course.tsx

@@ -29,6 +29,8 @@ export interface ICourse {
   channelId?: string;
   startAt?: string; //课程开始时间
   endAt?: string; //课程结束时间
+  signUpStartAt?: string; //报名开始时间
+  signUpEndAt?: string; //报名结束时间
   intro?: string; //简介
   coverUrl?: string[]; //封面图片文件名
   join?: TCourseJoinMode;
@@ -47,7 +49,7 @@ const Widget = () => {
     get<ICourseResponse>(url)
       .then((json) => {
         if (json.ok) {
-          console.log(json.data);
+          console.log("api response", json.data);
           const course: ICourse = {
             id: json.data.id,
             title: json.data.title,
@@ -60,6 +62,8 @@ const Widget = () => {
             channelId: json.data.channel_id,
             startAt: json.data.start_at,
             endAt: json.data.end_at,
+            signUpStartAt: json.data.sign_up_start_at,
+            signUpEndAt: json.data.sign_up_end_at,
             intro: json.data.content,
             coverUrl: json.data.cover_url,
             join: json.data.join,