From dbcc7bbb9b7bc3353ce082e659da25ef359aeaf0 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Wed, 19 Feb 2020 17:19:17 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E6=9C=AA=E5=88=86=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/members/CourseGroupList.js | 11 +++-- .../courses/members/CourseGroupListTable.js | 33 +++++++------- .../modules/courses/members/studentsList.css | 43 +++++++++++++++++++ .../modules/courses/members/studentsList.js | 22 +++++++--- 4 files changed, 85 insertions(+), 24 deletions(-) diff --git a/public/react/src/modules/courses/members/CourseGroupList.js b/public/react/src/modules/courses/members/CourseGroupList.js index afec12fa9..597357a9f 100644 --- a/public/react/src/modules/courses/members/CourseGroupList.js +++ b/public/react/src/modules/courses/members/CourseGroupList.js @@ -133,7 +133,12 @@ function CourseGroupList(props) { modalsType={DownloadType} /> +
  • 分班列表
  • +
  • {props.history.push(`/courses/${courseId}/course_groups/0`)}}>未分班
  • + + } searchValue={ searchValue } onInputSearchChange={onInputSearchChange} allowClearonChange={onInputSearchChange} @@ -211,12 +216,12 @@ function CourseGroupList(props) { onPressEnter={onPressEnter} >
    - {!!none_group_member_count &&
    {props.history.push(`/courses/${courseId}/course_groups/0`)}}> + {/* {!!none_group_member_count &&
    {props.history.push(`/courses/${courseId}/course_groups/0`)}}> 未分班: {none_group_member_count}个学生 查看 -
    } +
    } */} {course_groups && !!course_groups.length ? diff --git a/public/react/src/modules/courses/members/CourseGroupListTable.js b/public/react/src/modules/courses/members/CourseGroupListTable.js index 5551faee3..2b02afcd7 100644 --- a/public/react/src/modules/courses/members/CourseGroupListTable.js +++ b/public/react/src/modules/courses/members/CourseGroupListTable.js @@ -5,7 +5,7 @@ import axios from 'axios' import { WordsBtn, trigger, on, off, getUrl, downloadFile , sortDirections } from 'educoder' import ClipboardJS from 'clipboard' - +import './studentsList.css'; /** 角色数组, CREATOR: 创建者, PROFESSOR: 教师, ASSISTANT_PROFESSOR: 助教, STUDENT: 学生 course_members_count: 0 @@ -103,10 +103,23 @@ function CourseGroupListTable(props) { dataIndex: 'invite_code', key: 'invite_code', align:'center', - width:"10%", + width:"21%", className:"color-grey-6", render: (invite_code, record, index) => { - return invite_code + return + {invite_code} + {isAdmin && + +
    成员可以通过邀请码主动加入分班
    +
    点击复制邀请码
    + + }> + 复制 +
    + } +
    } } : { title: '你当前所在分班', @@ -127,22 +140,12 @@ function CourseGroupListTable(props) { dataIndex: 'setting', key: 'setting', align:'center', - width:"25%", + width:"14%", className:"color-grey-6", render: (none, record, index) => { return {!isCourseEnd && isAdmin && onDelete(record)} style={'grey'}>删除分班} - {isAdmin && - -
    成员可以通过邀请码主动加入分班
    -
    点击复制邀请码
    - - }> - 复制邀请码 -
    - } + {isStudent && addToDir(record)} style={''}>加入分班} onGoDetail(record)} style={''}>查看
    diff --git a/public/react/src/modules/courses/members/studentsList.css b/public/react/src/modules/courses/members/studentsList.css index b2a41c7e6..bd7b88ed1 100644 --- a/public/react/src/modules/courses/members/studentsList.css +++ b/public/react/src/modules/courses/members/studentsList.css @@ -5,4 +5,47 @@ .E9F8FF{ background-color: #E9F8FF; +} + +.codeBtnStyle{ + height: 18px; + line-height: 18px; + padding:0px 5px; + cursor: pointer; + font-size: 12px; + border-radius: 2px; +} +.codeBtn_yellow{ + border:1px solid #FF6B06; + color: #FF6B06!important; +} +.codeBtn_green{ + border:1px solid #00BA38; + color: #00BA38!important; +} + +.codeBtn_blue{ + border:1px solid #4CACFF; + color: #4CACFF!important; +} + +.course_publicNav{ + display: flex; +} +.course_publicNav li{ + position: relative; + margin-right: 30px; + cursor: pointer; +} +.course_publicNav li.active{ + color: #4CACFF +} +.course_publicNav li.active::after{ + position: absolute; + width: 100%; + height: 2px; + content: ''; + left: 0px; + bottom: -33px; + background: #4CACFF; } \ No newline at end of file diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index aff19d041..af83d0a49 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -741,12 +741,22 @@ class studentsList extends Component{ - - - { this.props.history.push(`/courses/${courseId}/course_groups`)}} - style={{color: '#212121', verticalAlign: 'initial', marginRight: '14px' }} - > - {course_group_name || '未分班'} + { + course_group_name ? + + + { this.props.history.push(`/courses/${courseId}/course_groups`)}} + style={{color: '#212121', verticalAlign: 'initial', marginRight: '14px' }} + > + {course_group_name} + + : + + } + {isAdmin && invite_code && 邀请码: From bf2d7bc60a3cb5b4ad5b16007bdfd4725c2a4e30 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Wed, 19 Feb 2020 18:08:29 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E5=81=9C=E7=94=A8=E3=80=81=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E9=82=80=E8=AF=B7=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/members/CourseGroupListTable.js | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/CourseGroupListTable.js b/public/react/src/modules/courses/members/CourseGroupListTable.js index 2b02afcd7..42e64adeb 100644 --- a/public/react/src/modules/courses/members/CourseGroupListTable.js +++ b/public/react/src/modules/courses/members/CourseGroupListTable.js @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react' -import { Input,Checkbox,Table, Pagination, Modal,Menu ,Spin, Tooltip , Badge, Popconfirm } from "antd"; +import { Input,Checkbox,Table, Pagination, Modal,Menu ,Spin, Tooltip , Badge, Popconfirm, Result } from "antd"; import axios from 'axios' import { WordsBtn, trigger, on, off, getUrl, downloadFile , sortDirections } from 'educoder' @@ -108,6 +108,13 @@ function CourseGroupListTable(props) { render: (invite_code, record, index) => { return {invite_code} + { + record.edit_auth ? + changeInviteCode(record.id,record.invite_code_halt)} className={record.invite_code_halt ?"codeBtnStyle codeBtn_green ml10":"codeBtnStyle codeBtn_blue ml10"}> + {record.invite_code_halt ?"启用":"停用"} + + :"" + } {isAdmin && @@ -212,6 +219,18 @@ function CourseGroupListTable(props) { function onGoDetail(record) { props.history.push(`/courses/${courseId}/course_groups/${record.id}`) } + // 停用和启用邀请码 + function changeInviteCode(id,flag){ + const url= `/course_groups/${id}/set_invite_code_halt.json`; + axios.post(url).then(result=>{ + if(result){ + props.showNotification(`邀请码${flag?"启用":"停用"}成功!`); + props.onOperationSuccess && props.onOperationSuccess(); + } + }).catch(error=>{ + console.log(error); + }) + } const isAdmin = props.isAdmin(); const isSuperAdmin = props.isSuperAdmin(); const isStudent = props.isStudent() From f16334aa4687ec0009ae22a1c1c1a9f4d0461727 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Thu, 20 Feb 2020 13:54:53 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E9=82=80=E8=AF=B7=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/members/CourseGroupListTable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/CourseGroupListTable.js b/public/react/src/modules/courses/members/CourseGroupListTable.js index 42e64adeb..e146d3432 100644 --- a/public/react/src/modules/courses/members/CourseGroupListTable.js +++ b/public/react/src/modules/courses/members/CourseGroupListTable.js @@ -115,7 +115,7 @@ function CourseGroupListTable(props) { :"" } - {isAdmin && + {isAdmin && !record.invite_code_halt &&
    成员可以通过邀请码主动加入分班
    From c5dbfcc67644bc9a69b8e9702ffe08150f834fc8 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Thu, 20 Feb 2020 14:18:49 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E5=BC=B9=E6=A1=86=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/coursesDetail/CoursesBanner.js | 2 +- .../courses/members/CourseGroupListTable.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js index c8715e1b8..99d5f7606 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js @@ -246,7 +246,7 @@ class CoursesBanner extends Component { }) }else{ - s = "邀请码停用后,用户不能主动加入该课堂了"; + s = "课堂邀请码停用后,用户不能主动加入该课堂了"; ss = "您是否确认停用?"; this.showActionPoll(i,s,ss) } diff --git a/public/react/src/modules/courses/members/CourseGroupListTable.js b/public/react/src/modules/courses/members/CourseGroupListTable.js index e146d3432..d0ccbd73a 100644 --- a/public/react/src/modules/courses/members/CourseGroupListTable.js +++ b/public/react/src/modules/courses/members/CourseGroupListTable.js @@ -221,6 +221,20 @@ function CourseGroupListTable(props) { } // 停用和启用邀请码 function changeInviteCode(id,flag){ + if(flag){ + changeInviteCodeFunc(id,flag); + }else{ + props.confirm({ + content:"分班邀请码停用后,用户不能主动加入该分班了", + subContent:'您是否确认停用?', + onOk:() => { + changeInviteCodeFunc(id,flag) + } + }) + } + } + + function changeInviteCodeFunc(id,flag){ const url= `/course_groups/${id}/set_invite_code_halt.json`; axios.post(url).then(result=>{ if(result){ From 6b03a56c2377c0a7aac42f5690199d6e47086a41 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 20 Feb 2020 15:37:24 +0800 Subject: [PATCH 05/16] 1 --- app/helpers/subjects_helper.rb | 15 +++++++++++++-- app/views/subjects/show.json.jbuilder | 3 ++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/helpers/subjects_helper.rb b/app/helpers/subjects_helper.rb index 72154b0a8..fb2246a50 100644 --- a/app/helpers/subjects_helper.rb +++ b/app/helpers/subjects_helper.rb @@ -1,12 +1,23 @@ module SubjectsHelper # 实训路径的发布状态 - def publish_status subject, is_manager, user + def publish_status subject, is_manager status = -1 if is_manager status = 0 if subject.status == 0 status = 1 if subject.status == 1 - status = 2 if subject.status == 2 && user.admin? + status = 2 if subject.status == 2 + end + status + end + + # 实训路径的公开状态 + def public_status subject, is_manager, user + status = -1 + if is_manager + status = 0 if subject.public == 0 + status = 1 if subject.public == 1 + status = 2 if subject.public == 2 && user.admin? end status end diff --git a/app/views/subjects/show.json.jbuilder b/app/views/subjects/show.json.jbuilder index 49ad55517..d25437f0a 100644 --- a/app/views/subjects/show.json.jbuilder +++ b/app/views/subjects/show.json.jbuilder @@ -6,7 +6,8 @@ json.subject_score @subject.all_score json.member_count @subject.member_count json.allow_delete (@subject.status != 2 && @is_creator) || @user.admin? -json.publish_status publish_status(@subject, @is_manager, @user) +json.publish_status publish_status(@subject, @is_manager) +json.public_status public_status(@subject, @is_manager, @user) json.allow_statistics @is_manager json.allow_send @user.logged? json.allow_visit @subject.status > 1 || @is_manager From e5253f8c8be9479c638276919ca28eb88792aca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 20 Feb 2020 16:38:46 +0800 Subject: [PATCH 06/16] =?UTF-8?q?=E5=AE=9E=E8=B7=B5=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8D=E5=90=8C=E7=8A=B6=E6=80=81=E5=8F=91?= =?UTF-8?q?=E5=B8=83=EF=BC=8C=E5=85=AC=E5=BC=80=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/paths/PathDetail/DetailTop.js | 230 +++++++++++++----- .../src/modules/paths/PathDetail/sendPanel.js | 16 +- 2 files changed, 179 insertions(+), 67 deletions(-) diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index a246fecb9..5d115f174 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -30,6 +30,9 @@ class DetailTop extends Component{ OpenCourseTypes:false, putappointmenttype:false, getappointmenttype:false, + openpathss:false, + cancel_publics:false, + cancel_has_publics:false } } componentDidMount(){ @@ -104,61 +107,60 @@ class DetailTop extends Component{ }) } + + applyissuePath=()=>{ - this.setState({ - Modalstype:true, - Modalstopval:"发布申请已提交,请等待管理员的审核", - Modalsbottomval:"• 我们将在1-2个工作日内完成审核", - loadtype:true - }) + let pathid=this.props.match.params.pathId; + let url ="/paths/"+pathid+"/publish.json"; + axios.post(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + this.props.showNotification(result.data.message) + this.props.getlistdatas(); + }else if(result.data.status===1){ + // window.location.reload(); + } + } + }).catch((error)=>{ + console.log(error); + }) + + } + postcancelissuePath=()=>{ + let pathId=this.props.match.params.pathId; + let url ="/paths/"+pathId+"/cancel_publish.json"; + axios.post(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + + }else if(result.data.status===1){ + this.cardsModalcancel() + this.props.showNotification("撤销发布成功") + this.props.getlistdatas() + // window.location.href = "/paths/" + result.data.subject_id + } + } + }).catch((error)=>{ + console.log(error); + }) + } cancelissuePath=()=>{ - let pathId=this.props.match.params.pathId; - let url ="/paths/"+pathId+"/cancel_publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - - }else if(result.data.status===1){ - window.location.href = "/paths/" + result.data.subject_id - } - } - }).catch((error)=>{ - console.log(error); - }) - } - reovkissuePath=()=>{ + this.setState({ + Modalstype: true, + Modalstopval: "是否确认撤销发布?", + modalsMidval:"撤销发布后,学员将无法进行练习,若您新增关", + Modalsbottomval:"卡,学员需要重新体验实训", + cardsModalsavetype: true, + modalstyles:"848282" + }) - this.setState({ - Modalstype:true, - Modalstopval:"是否确认撤销发布", - Modalsbottomval:"确认后,回退到编辑状态", - cardsModalsavetype:true, - }) } - reovkissuePaths=()=>{ - let pathId=this.props.match.params.pathId; - let url ="/paths/"+pathId+"/cancel_has_publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - - }else if(result.data.status===1){ - this.setState({ - cardsModalsavetype:false, - loadtype:false, - deletepathtype:false - }) - window.location.href = "/paths/" + result.data.subject_id - } - } - }).catch((error)=>{ - console.log(error); - }) - } + + cardsModalcancel=()=>{ this.setState({ @@ -166,7 +168,14 @@ class DetailTop extends Component{ Modalsbottomval:'', loadtype:false, deletepathtype:false, - putappointmenttype:false + putappointmenttype:false, + modalsMidval:'', + modalstyles:'', + cardsModalsavetype:false, + applyissuePath:false, + openpathss:false, + cancel_publics:false, + cancel_has_publics:false }) } @@ -317,6 +326,7 @@ class DetailTop extends Component{ // this.props.getlistdatas() this.props.showNotification(response.data.message) }else{ + this.cardsModalcancel() this.props.showNotification(response.data.message) } @@ -327,10 +337,93 @@ class DetailTop extends Component{ }) } + postopenpaths=()=>{ + let pathid=this.props.match.params.pathId; + + let url ="/paths/"+pathid+"/apply_public.json"; + axios.post(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + this.props.showNotification(result.data.message) + this.props.getlistdatas(); + this.cardsModalcancel() + }else if(result.data.status===1){ + this.props.showNotification(result.data.message) + this.props.getlistdatas(); + this.cardsModalcancel() + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + openpaths=()=>{ + this.setState({ + Modalstype: true, + openpathss:true, + Modalstopval: "公开申请已提交,请等待管理员的审核", + modalsMidval:"• 我们将在1-2个工作日内完成审核", + Loadtype:true, + modalstyles:"848282" + }) + } + + postcancel_public=()=>{ + let pathid=this.props.match.params.pathId; + let url ="/paths/"+pathid+"/cancel_public.json"; + axios.post(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + this.cardsModalcancel() + this.props.showNotification("撤销申请公开成功") + this.props.getlistdatas(); + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + cancel_public=()=>{ + this.setState({ + cancel_publics:true, + Modalstype: true, + Modalstopval: "是否确认撤销申请公开?", + modalsMidval:" ", + ModalsBottomval:" ", + }) + } + + postcancel_has_public=()=>{ + let pathid=this.props.match.params.pathId; + let url ="/paths/"+pathid+"/cancel_has_public.json"; + axios.post(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + this.cardsModalcancel() + this.props.showNotification("撤消公开成功") + this.props.getlistdatas(); + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + cancel_has_public=()=>{ + this.setState({ + cancel_has_publics:true, + Modalstype: true, + Modalstopval: "是否确认撤销公开?", + modalsMidval:" ", + ModalsBottomval:" ", + }) + } render(){ let{detailInfoList}=this.props; - let{Modalstype,Modalstopval,cardsModalcancel,putappointmenttype,Modalsbottomval,cardsModalsavetype,loadtype,getappointmenttype}=this.state; + let{Modalstype,Modalstopval,cardsModalcancel,putappointmenttype,Modalsbottomval,cardsModalsavetype,loadtype,getappointmenttype,openpathss,cancel_publics,cancel_has_publics}=this.state; const radioStyle = { display: 'block', height: '30px', @@ -367,8 +460,10 @@ class DetailTop extends Component{ modalsTopval={Modalstopval} modalsBottomval={Modalsbottomval} modalCancel={cardsModalcancel} - modalSave={cardsModalsavetype===true?()=>this.reovkissuePaths():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()} + modalSave={cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()} loadtype={loadtype} + modalsMidval={this.state.modalsMidval} + modalstyles={this.state.modalstyles} > {this.state.yslJointhe===true?this.ysljoinmodalCancel()} ysljoinmodalCanceltwo={()=>this.ysljoinmodalCanceltwo(this.state.MenuItemskey)}>:""} @@ -436,7 +531,7 @@ class DetailTop extends Component{ border:1px solid rgba(255,255,255,1); } .maxwinth600{ - width:740px; + width:730px; } ` } @@ -473,33 +568,48 @@ class DetailTop extends Component{ } { detailInfoList.allow_send === true? - :"" + + :"" } - {this.props.courses===undefined?"":detailInfoList.is_creator===true?this.OpenCoursefun()}>开课:""} + {this.props.courses===undefined?"":detailInfoList.is_creator===true?this.OpenCoursefun()}>开课:""} - { - detailInfoList.publish_status===2 && detailInfoList.allow_statistics===true? - 撤销发布:"" + { detailInfoList.allow_statistics===true&& detailInfoList.public_status===2? + 撤销公开:"" + } + + {detailInfoList.allow_statistics===true&& detailInfoList.public_status===1? + 撤销申请公开:"" + } + + { detailInfoList.publish_status===2&& detailInfoList.allow_statistics===true&& detailInfoList.public_status===0? + 申请公开:"" } { - detailInfoList.publish_status===1 && detailInfoList.allow_statistics===true? - 撤销申请:"" + detailInfoList.publish_status===2 && detailInfoList.allow_statistics===true&&detailInfoList.public_status===0? + 撤销发布:"" } + { detailInfoList.publish_status===0&&detailInfoList.allow_add_member===true? - 申请发布:"" + 发布:"" } + {detailInfoList===undefined?"":detailInfoList.allow_delete===true?删除:""} {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? - + 编辑 :"" diff --git a/public/react/src/modules/paths/PathDetail/sendPanel.js b/public/react/src/modules/paths/PathDetail/sendPanel.js index 450afc75e..c43fc4851 100644 --- a/public/react/src/modules/paths/PathDetail/sendPanel.js +++ b/public/react/src/modules/paths/PathDetail/sendPanel.js @@ -69,7 +69,7 @@ class sendPanel extends Component{ openSearch:false }) } - + // 选择课堂获取选中的Id selectCloseList=(e)=>{ this.setState({ @@ -85,7 +85,7 @@ class sendPanel extends Component{ // shixunNum:list.length }) } - + //确认提交 submitInfo=()=>{ let {sendToCourseId,sendToShixunArray}=this.state; @@ -180,7 +180,9 @@ class sendPanel extends Component{ { this.props.detailInfoList===undefined?"":this.props.detailInfoList.allow_send===true? - + 发送至 :'' @@ -199,8 +201,8 @@ class sendPanel extends Component{ // onMouseLeave={this.closeList} >