Merge branches 'dev_Ysl' and 'topic_bank' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl
commit
0d7367064b
@ -0,0 +1,10 @@
|
|||||||
|
json.shixun_counts @shixuns_count
|
||||||
|
|
||||||
|
json.shixuns do
|
||||||
|
json.array! @shixuns do |s|
|
||||||
|
json.shixun_id s.id
|
||||||
|
json.shixun_name s.name
|
||||||
|
json.shixun_user s.user.real_name
|
||||||
|
json.shixun_user_count s.myshixuns_count
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,10 @@
|
|||||||
|
json.shixun_id @shixun.id
|
||||||
|
json.shixun_name @shixun.name
|
||||||
|
|
||||||
|
json.challenges do
|
||||||
|
json.array! @shixun_challenges do |s|
|
||||||
|
json.challenge_name s.subject
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
json.challenge_counts @shixun_challenges_count
|
@ -0,0 +1,5 @@
|
|||||||
|
class MigrateGtopicBankIsPublic < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
change_column :gtopic_banks, :is_public, :boolean, default: 0
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,11 @@
|
|||||||
|
class MigrateCourseGroupPosition < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
Course.all.each do |course|
|
||||||
|
if course.course_groups.exists?(position: 0)
|
||||||
|
course.course_groups.each_with_index do |group, index|
|
||||||
|
group.update_attributes(position: index+1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,489 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import { SnackbarHOC } from 'educoder';
|
||||||
|
import {BrowserRouter as Router,Route,Switch,Link} from 'react-router-dom';
|
||||||
|
import {Tooltip,Menu,Pagination,Spin, Dropdown,Checkbox} from 'antd';
|
||||||
|
import axios from 'axios';
|
||||||
|
import {getImageUrl,WordsBtn} from 'educoder';
|
||||||
|
import moment from 'moment';
|
||||||
|
import Modals from '../../modals/Modals';
|
||||||
|
import SendTopics from '../../modals/SendTopics'
|
||||||
|
import NoneData from '../../courses/coursesPublic/NoneData';
|
||||||
|
import "./usersInfo.css";
|
||||||
|
import Withoutpermission from './Withoutpermission.png';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class InfosTopics extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
this.state={
|
||||||
|
isSpin:false,
|
||||||
|
category:"normal",
|
||||||
|
course_list_id:undefined,
|
||||||
|
sort_by:"updated_at",
|
||||||
|
sort_direction:"desc",
|
||||||
|
page:1,
|
||||||
|
data:undefined,
|
||||||
|
checkBoxValues:[],
|
||||||
|
per_page:15,
|
||||||
|
isshowprofes:false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount(){
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
let professional_certification=this.props.current_user&&this.props.current_user.professional_certification;
|
||||||
|
|
||||||
|
console.log(professional_certification)
|
||||||
|
if(professional_certification===false&&types==="publicly"){
|
||||||
|
this.setState({
|
||||||
|
isshowprofes:true
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
this.updataslist()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updataslist=()=>{
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
let { category,course_list_id,sort_by,sort_direction,page}=this.state;
|
||||||
|
this.searchAlldata(types,category,course_list_id,sort_by,sort_direction,page)
|
||||||
|
}
|
||||||
|
searchAlldata=(type,category,course_list_id,sort_by,sort_direction,page)=>{
|
||||||
|
let user_id=this.props.current_user&&this.props.current_user.user_id;
|
||||||
|
if(user_id!=undefined){
|
||||||
|
let {per_page}=this.state;
|
||||||
|
let url=`/users/${user_id}/question_banks.json`;
|
||||||
|
axios.get(url,{params:{
|
||||||
|
type,
|
||||||
|
category,
|
||||||
|
course_list_id,
|
||||||
|
sort_by,
|
||||||
|
sort_direction,
|
||||||
|
page,
|
||||||
|
per_page
|
||||||
|
}
|
||||||
|
}).then((response) => {
|
||||||
|
this.setState({
|
||||||
|
data:response.data
|
||||||
|
})
|
||||||
|
}).catch((error) => {
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
searchCategory=(type)=>{
|
||||||
|
this.setState({
|
||||||
|
category:type
|
||||||
|
})
|
||||||
|
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
let { category,course_list_id,sort_by,sort_direction,page}=this.state;
|
||||||
|
this.searchAlldata(types,type,course_list_id,sort_by,sort_direction,page)
|
||||||
|
}
|
||||||
|
|
||||||
|
searchCourselistid=(id)=>{
|
||||||
|
this.setState({
|
||||||
|
course_list_id:id
|
||||||
|
})
|
||||||
|
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
let { category,course_list_id,sort_by,sort_direction,page}=this.state;
|
||||||
|
this.searchAlldata(types,category,id,sort_by,sort_direction,page)
|
||||||
|
}
|
||||||
|
|
||||||
|
onCheckBoxChange=(checkedValues)=>{
|
||||||
|
if(checkedValues.length>15){
|
||||||
|
this.props.showNotification("选择条数不能大于15条")
|
||||||
|
}else{
|
||||||
|
this.setState({
|
||||||
|
checkBoxValues:checkedValues
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedlist=(updatedtype)=>{
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
let { category,course_list_id,sort_by,sort_direction,page}=this.state;
|
||||||
|
if(updatedtype===sort_by){
|
||||||
|
if(sort_direction==="desc"){
|
||||||
|
this.setState({
|
||||||
|
sort_direction:"asc",
|
||||||
|
sort_by:updatedtype
|
||||||
|
})
|
||||||
|
this.searchAlldata(types,category,course_list_id,updatedtype,"asc",page)
|
||||||
|
}else{
|
||||||
|
this.setState({
|
||||||
|
sort_direction:"desc",
|
||||||
|
sort_by:updatedtype
|
||||||
|
})
|
||||||
|
this.searchAlldata(types,category,course_list_id,updatedtype,"desc",page)
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.setState({
|
||||||
|
sort_direction:"desc",
|
||||||
|
sort_by:updatedtype
|
||||||
|
})
|
||||||
|
this.searchAlldata(types,category,course_list_id,updatedtype,"desc",page)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
changePage=(pageNumber)=>{
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
let { category,course_list_id,sort_by,sort_direction,page}=this.state;
|
||||||
|
this.searchAlldata(types,category,course_list_id,sort_by,sort_direction,pageNumber)
|
||||||
|
this.setState({
|
||||||
|
page:pageNumber,
|
||||||
|
checkBoxValues:[]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
deletecheckBoxValues=()=>{
|
||||||
|
let {checkBoxValues}=this.state;
|
||||||
|
if(checkBoxValues.length===0){
|
||||||
|
this.props.showNotification("请选择题库")
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
Modalstype:true,
|
||||||
|
Modalstopval:"是否确认删除?",
|
||||||
|
ModalCancel:this.topicscancelmodel,
|
||||||
|
ModalSave:this.topicssavedelete,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
topicssavedelete=()=>{
|
||||||
|
let {checkBoxValues,category}=this.state;
|
||||||
|
const url = `/question_banks/multi_delete.json`;
|
||||||
|
axios.delete(url, { data: {
|
||||||
|
object_id: checkBoxValues,
|
||||||
|
object_type:category
|
||||||
|
}})
|
||||||
|
.then((response) => {
|
||||||
|
if(response.data.status===0){
|
||||||
|
this.updataslist()
|
||||||
|
this.props.showNotification(response.data.message)
|
||||||
|
}else{
|
||||||
|
this.props.showNotification(response.data.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function (error) {
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.topicscancelmodel()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
topicscancelmodel=()=>{
|
||||||
|
this.setState({
|
||||||
|
Modalstype:false,
|
||||||
|
Loadtype:false,
|
||||||
|
visible:false,
|
||||||
|
Modalstopval:"",
|
||||||
|
ModalCancel:"",
|
||||||
|
ModalSave:"",
|
||||||
|
checkBoxValues:[],
|
||||||
|
checkedtype:false
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
openTopics=(id)=>{
|
||||||
|
this.setState({
|
||||||
|
Modalstype:true,
|
||||||
|
Modalstopval:"公开后不能重设为私有",
|
||||||
|
ModalsBottomval:"是否确认设为公开?",
|
||||||
|
ModalCancel:this.topicscancelmodel,
|
||||||
|
ModalSave:()=>this.topicssaveonOpen(id),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
topicssaveonOpen=(id)=>{
|
||||||
|
|
||||||
|
let {category}=this.state;
|
||||||
|
const url = `/question_banks/multi_public.json`;
|
||||||
|
axios.post(url,{
|
||||||
|
object_id:[id],
|
||||||
|
object_type:category
|
||||||
|
}).then((response) => {
|
||||||
|
if(response.data.status===0){
|
||||||
|
this.updataslist()
|
||||||
|
this.props.showNotification(response.data.message)
|
||||||
|
}else{
|
||||||
|
this.props.showNotification(response.data.message)
|
||||||
|
}
|
||||||
|
}).catch(function (error) {
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.topicscancelmodel()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sendTopics=()=>{
|
||||||
|
let {checkBoxValues}=this.state;
|
||||||
|
if(checkBoxValues.length===0){
|
||||||
|
this.props.showNotification("请选择题库")
|
||||||
|
}else{
|
||||||
|
this.setState({
|
||||||
|
visible:true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
render(){
|
||||||
|
let{
|
||||||
|
category,
|
||||||
|
course_list_id,
|
||||||
|
isSpin,
|
||||||
|
data,
|
||||||
|
page,
|
||||||
|
sort_direction,
|
||||||
|
sort_by,
|
||||||
|
checkBoxValues,
|
||||||
|
Modalstype,
|
||||||
|
visible,
|
||||||
|
isshowprofes
|
||||||
|
} = this.state;
|
||||||
|
|
||||||
|
let categorylist=[
|
||||||
|
{val:"普通作业",type:"normal"},
|
||||||
|
{val:"分组作业",type:"group"},
|
||||||
|
{val:"毕设选题",type:"gtopic"},
|
||||||
|
{val:"毕设任务",type:"gtask"},
|
||||||
|
{val:"试卷",type:"exercise"},
|
||||||
|
{val:"问卷",type:"poll"},
|
||||||
|
]
|
||||||
|
|
||||||
|
let types=this.props.match.params.topicstype;
|
||||||
|
|
||||||
|
console.log(isshowprofes)
|
||||||
|
|
||||||
|
//types===publicly 公共
|
||||||
|
//types===personal 私有
|
||||||
|
let user_id=this.props.current_user&&this.props.current_user.user_id;
|
||||||
|
let user_type=this.props.current_user&&this.props.current_user.user_identity;
|
||||||
|
let targetuserid=this.props.data&&this.props.data.id;
|
||||||
|
const menu = (
|
||||||
|
<Menu>
|
||||||
|
<Menu.Item onClick={()=>this.updatedlist("updated_at")}>
|
||||||
|
最近更新
|
||||||
|
</Menu.Item>
|
||||||
|
<Menu.Item onClick={()=>this.updatedlist("name")}>
|
||||||
|
题目更新
|
||||||
|
</Menu.Item>
|
||||||
|
{types==="publicly"?<Menu.Item onClick={()=>this.updatedlist("contributor")}>
|
||||||
|
贡献者
|
||||||
|
</Menu.Item>:""}
|
||||||
|
</Menu>
|
||||||
|
);
|
||||||
|
return(
|
||||||
|
<div className="educontent mb50">
|
||||||
|
{/*提示*/}
|
||||||
|
|
||||||
|
{Modalstype&&Modalstype===true?<Modals
|
||||||
|
modalsType={this.state.Modalstype}
|
||||||
|
modalsTopval={this.state.Modalstopval}
|
||||||
|
modalCancel={this.state.ModalCancel}
|
||||||
|
modalSave={this.state.ModalSave}
|
||||||
|
modalsBottomval={this.state.ModalsBottomval}
|
||||||
|
loadtype={this.state.Loadtype}
|
||||||
|
/>:""}
|
||||||
|
|
||||||
|
{/*发送至弹窗*/}
|
||||||
|
{
|
||||||
|
visible&&visible===true?
|
||||||
|
<SendTopics
|
||||||
|
{...this.state}
|
||||||
|
{...this.props}
|
||||||
|
visible={visible}
|
||||||
|
updataslist={()=>this.updataslist()}
|
||||||
|
topicscancelmodel={()=>this.topicscancelmodel()}
|
||||||
|
/>:""
|
||||||
|
}
|
||||||
|
<style>
|
||||||
|
|
||||||
|
{
|
||||||
|
`
|
||||||
|
.shaiContent li.shaiItem {
|
||||||
|
padding: 3px 15px;
|
||||||
|
float: left;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #4C4C4C;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 20px;
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mr38{
|
||||||
|
margin-right:38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.maxwidth900{
|
||||||
|
max-width: 900px;
|
||||||
|
overflow:hidden;
|
||||||
|
text-overflow:ellipsis;
|
||||||
|
white-space:nowrap
|
||||||
|
}
|
||||||
|
|
||||||
|
.homepagePostSettingname{
|
||||||
|
width:192px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.homepagePostSettingbox{
|
||||||
|
width:139px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Spin size="large" spinning={isSpin}>
|
||||||
|
<div className="clearfix topicsbox">
|
||||||
|
{types==="publicly"?<div className={"topcschild"}>
|
||||||
|
<a className={types==="personal"?"topicstopfont fr topcsactive":"topicstopfont fr"}
|
||||||
|
href={`/users/innov/topics/personal`}>个人题库</a>
|
||||||
|
<a className={types==="publicly"?"topicstopfont fl topcsactive":"topicstopfont fl"}
|
||||||
|
href={`/users/innov/topics/publicly`}
|
||||||
|
>公共题库</a>
|
||||||
|
</div>:<div className={"topcschild"}>
|
||||||
|
<a className={types==="personal"?"topicstopfont fl topcsactive":"topicstopfont fl"}
|
||||||
|
href={`/users/innov/topics/personal`}>我的题库</a>
|
||||||
|
<a className={types==="publicly"?"topicstopfont fr topcsactive":"topicstopfont fr"}
|
||||||
|
href={`/users/innov/topics/publicly`}
|
||||||
|
>公共题库</a>
|
||||||
|
</div>}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{isshowprofes===false?
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div className={"topcsmid"}>
|
||||||
|
{categorylist.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<span key={key} className={category===item.type?"topicsmidfont fl mr38 topcsactive":"topicsmidfont fl mr38"} onClick={()=>this.searchCategory(item.type)}>{item.val}</span>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={"shaiContent"}>
|
||||||
|
<div className="fl pr topicsItem pagetype mb20">
|
||||||
|
<li className={course_list_id===undefined?"shaiItem shixun_repertoire active":"shaiItem shixun_repertoire"} onClick={()=>this.searchCourselistid(undefined)}>全部</li>
|
||||||
|
{data===undefined?"":data.course_list===undefined||data.course_list.length===0?"":data.course_list.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<li key={key} className={course_list_id===item.id?"shaiItem shixun_repertoire active":"shaiItem shixun_repertoire"} onClick={()=>this.searchCourselistid(item.id)}>{item.name}</li>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>:<div className={"professional_certificationbox"}>
|
||||||
|
<p className="clearfix ">
|
||||||
|
<div className={"stud-class-set pd115200 coursenavbox edu-back-white"}>
|
||||||
|
<div className={"sumbtongs mb10"}><img className={"topicsItemimg"} src={Withoutpermission}/></div>
|
||||||
|
<div className={"terraces mb5 topicsItemfont"}>通过职业认证的教师才能访问公共题库</div>
|
||||||
|
<div className="clearfix mt30 mb30 padding251">
|
||||||
|
<a className="defalutSubmitbtn fl ml60 defalutSubmitbtns" target="_blank" href="/account/certification">立即认证</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</p>
|
||||||
|
</div>}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{isshowprofes===false?<div className="clearfix font-12 mt20">
|
||||||
|
<p className="font-12 alltopisc ml25 fl">
|
||||||
|
<span className="fl color-grey-9">共 <span className={"color-orange"}>{data&&data.count===undefined?0:data&&data.count}</span> 个</span>
|
||||||
|
<span className="fr color-grey-9">已选择 <span className={"color-orange"}>{checkBoxValues.length}</span> 个 (不支持跨页勾选)</span>
|
||||||
|
</p>
|
||||||
|
<p className="font-12 alltopiscright ml25 fr">
|
||||||
|
<Dropdown overlay={menu}>
|
||||||
|
<span className="fr color-grey-9 mr10 pointer">
|
||||||
|
{sort_by==="updated_at"?'最近更新':sort_by==="name"?'题目更新':sort_by==="contributor"?"贡献者":""}
|
||||||
|
<sapn className="relativef ml20">
|
||||||
|
<i className={sort_direction==="asc"?
|
||||||
|
"iconfont icon-sanjiaoxing-up font-12 topsj color-blue" :"iconfont icon-sanjiaoxing-up font-12 topsj"}></i>
|
||||||
|
<i className={sort_direction==="desc"?
|
||||||
|
"iconfont icon-sanjiaoxing-down font-12 bottomsj color-blue":"iconfont icon-sanjiaoxing-down font-12 bottomsj"}></i>
|
||||||
|
</sapn>
|
||||||
|
</span>
|
||||||
|
</Dropdown>
|
||||||
|
{user_type!="学生"?<span className="fr mr30 topcsactive pointer" onClick={()=>this.sendTopics()}>发送</span>:""}
|
||||||
|
{types==="personal"?user_id===targetuserid&&user_type!="学生"?<span className="fr mr30 topcsactive pointer" onClick={()=>this.deletecheckBoxValues()}>删除</span>:"":""}
|
||||||
|
</p>
|
||||||
|
</div>:""}
|
||||||
|
|
||||||
|
|
||||||
|
{isshowprofes===true?"":data===undefined?<NoneData></NoneData>:data.question_banks===undefined||data.question_banks.length===0?<NoneData></NoneData>:
|
||||||
|
<Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}>
|
||||||
|
{data.question_banks.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<div className="mt20 edu-back-white pd1323 relativef" key={key} >
|
||||||
|
<div className="clearfix">
|
||||||
|
<div className="item-body">
|
||||||
|
|
||||||
|
<div className="clearfix ds pr pt5 contentSection" >
|
||||||
|
{user_type!="学生"?<Checkbox value={item.id} key={item.id} className={"fl mt5"}></Checkbox>:""}
|
||||||
|
<a title={item.name} className="ml10 fl mt3 font-16 color-dark maxwidth900">
|
||||||
|
{item.name}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{item.is_public===true?<span className="edu-filter-btn ml15 fl typestyle mt3 topiscfilterbtn">公开</span>:""}
|
||||||
|
|
||||||
|
{types==="personal"&&item.is_public===false?user_id===targetuserid&&user_type!="学生"?<a className="btn colorblue mr25 fr font-16" onClick={()=>this.openTopics(item.id)}>设为公开</a>:"":""}
|
||||||
|
|
||||||
|
<div className="cl"></div>
|
||||||
|
|
||||||
|
<p className="color-grey panel-lightgrey mt16 fl">
|
||||||
|
<span className={types==="personal"?"topicswidth300":"topicswidth400"}>
|
||||||
|
{types==="publicly"?<span className="topsics100 color-grey9">{item.creator_name}</span>:""}
|
||||||
|
<span className="mr50 color-grey9">{item.quotes_count} 次引用</span>
|
||||||
|
<span className="mr50 color-grey9">{item.solve_count} 次答题</span>
|
||||||
|
<span className="mr50 color-grey9">{moment(item.updated_at).fromNow()}</span>
|
||||||
|
</span>
|
||||||
|
<span className="topicsbtn">{item.course_list_name}</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="homepagePostSetting homepagePostSettingname topscisright">
|
||||||
|
{types==="personal"?user_id===targetuserid&&user_type!="学生"?
|
||||||
|
<a className="btn colorblue mr25 font-16 fr"
|
||||||
|
href={category==="normal"?`/courses/ordinarywork/${item.id}?tab=0`:
|
||||||
|
category==="group"?`/courses/groupingwork/${item.id}?tab=0`:
|
||||||
|
category==="poll"?`/courses/poll/${item.id}`:
|
||||||
|
category==="exercise"?`/courses/poll/${item.id}`:
|
||||||
|
category==="gtask"?`/courses/completetask/${item.id}`:
|
||||||
|
category==="gtopic"?`/courses/completetopic/${item.id}`:""
|
||||||
|
}
|
||||||
|
>编辑</a>
|
||||||
|
:"":""}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)})}
|
||||||
|
</Checkbox.Group>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
isshowprofes===true?"":data&&data.count >15 &&
|
||||||
|
<div className="mt30 mb50 edu-txt-center">
|
||||||
|
<Pagination showQuickJumper total={data&&data.count} onChange={this.changePage} pageSize={15} current={page}/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
</Spin>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default InfosTopics;
|
After Width: | Height: | Size: 7.9 KiB |
@ -0,0 +1,100 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import {BrowserRouter as Router,Route,Switch} from 'react-router-dom';
|
||||||
|
|
||||||
|
import { Breadcrumb } from 'antd';
|
||||||
|
import { SnackbarHOC } from 'educoder';
|
||||||
|
import { TPMIndexHOC } from '../../../tpm/TPMIndexHOC';
|
||||||
|
import { CNotificationHOC } from '../../../courses/common/CNotificationHOC'
|
||||||
|
|
||||||
|
|
||||||
|
import "../usersInfo.css"
|
||||||
|
import "../../../courses/css/members.css"
|
||||||
|
import "../../../courses/css/Courses.css"
|
||||||
|
|
||||||
|
|
||||||
|
import Loadable from 'react-loadable';
|
||||||
|
import Loading from '../../../../Loading';
|
||||||
|
|
||||||
|
// 毕设选题
|
||||||
|
const GtopicBanks = Loadable({
|
||||||
|
loader: () => import('./GtopicBanks'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
const BanksTabIndex = Loadable({
|
||||||
|
loader: () => import('./BanksTabIndex'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
const GtopicBanksEdit = Loadable({
|
||||||
|
loader: () => import('./GtopicBanksEdit'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
class BanksIndex extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
this.state={
|
||||||
|
crumbData:undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
initPublic = (crumbData) =>{
|
||||||
|
this.setState({
|
||||||
|
crumbData
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { crumbData }=this.state
|
||||||
|
const common = {
|
||||||
|
initPublic:this.initPublic
|
||||||
|
}
|
||||||
|
return(
|
||||||
|
<div className="newMain">
|
||||||
|
<div className="educontent">
|
||||||
|
{
|
||||||
|
crumbData &&
|
||||||
|
<Breadcrumb separator=">" className="breadcrumb">
|
||||||
|
<Breadcrumb.Item href="/users/innov/banks">题库</Breadcrumb.Item>
|
||||||
|
{
|
||||||
|
crumbData.crumbArray && crumbData.crumbArray.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<Breadcrumb.Item href={item.to || ""}>{item.content}</Breadcrumb.Item>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</Breadcrumb>
|
||||||
|
}
|
||||||
|
|
||||||
|
<p className="clearfix mt20 mb20">
|
||||||
|
<span className="fl font-24 color-grey-3 task-hide lineh-30" style={{maxWidth:'800px'}}>{crumbData && crumbData.title}</span>
|
||||||
|
{
|
||||||
|
crumbData && crumbData.is_public && <span className="bank_is_public">{crumbData.is_public == true ? '公开':'私有'}</span>
|
||||||
|
}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<Switch {...this.props}>
|
||||||
|
|
||||||
|
<Route path='/banks/gtopic/:bankId/edit'
|
||||||
|
render={
|
||||||
|
(props) => {
|
||||||
|
return (<GtopicBanksEdit {...this.props} {...props} {...this.state} {...common}/>)
|
||||||
|
}
|
||||||
|
}></Route>
|
||||||
|
|
||||||
|
<Route path='/banks/gtopic/:bankId'
|
||||||
|
render={
|
||||||
|
(props) => {
|
||||||
|
return (<BanksTabIndex {...this.props} {...props} {...this.state} {...common}/>)
|
||||||
|
}
|
||||||
|
}></Route>
|
||||||
|
|
||||||
|
</Switch>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default CNotificationHOC() ( SnackbarHOC() ( TPMIndexHOC(BanksIndex) ));
|
@ -0,0 +1,65 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import {BrowserRouter as Router,Route,Switch} from 'react-router-dom';
|
||||||
|
|
||||||
|
|
||||||
|
import Loadable from 'react-loadable';
|
||||||
|
import Loading from '../../../../Loading';
|
||||||
|
|
||||||
|
import BanksMenu from './banksMenu'
|
||||||
|
// 毕设选题
|
||||||
|
const GtopicBanks = Loadable({
|
||||||
|
loader: () => import('./GtopicBanks'),
|
||||||
|
loading: Loading,
|
||||||
|
})
|
||||||
|
|
||||||
|
class BanksTabIndex extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
this.state={
|
||||||
|
banksMenu:undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
initPublic = (crumbData,menuData) =>{
|
||||||
|
this.setState({
|
||||||
|
banksMenu:menuData
|
||||||
|
})
|
||||||
|
this.props.initPublic(crumbData);
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let{
|
||||||
|
banksMenu
|
||||||
|
}=this.state
|
||||||
|
|
||||||
|
const common={
|
||||||
|
initPublic:this.initPublic,
|
||||||
|
}
|
||||||
|
return(
|
||||||
|
<React.Fragment>
|
||||||
|
{
|
||||||
|
banksMenu &&
|
||||||
|
<BanksMenu
|
||||||
|
banksMenu={banksMenu}
|
||||||
|
{...this.props}
|
||||||
|
{...this.state}
|
||||||
|
{...common}
|
||||||
|
></BanksMenu>
|
||||||
|
}
|
||||||
|
<Switch {...this.props}>
|
||||||
|
|
||||||
|
|
||||||
|
<Route path='/banks/gtopic/:bankId'
|
||||||
|
render={
|
||||||
|
(props) => {
|
||||||
|
return (<GtopicBanks {...this.props} {...props} {...this.state} {...common} />)
|
||||||
|
}
|
||||||
|
}></Route>
|
||||||
|
|
||||||
|
</Switch>
|
||||||
|
</React.Fragment>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default (BanksTabIndex);
|
@ -0,0 +1,88 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
import GraduateTopicNewFrom from '../../../courses/graduation/topics/GraduateTopicNewFrom'
|
||||||
|
|
||||||
|
class GtopicBanksEdit extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
isPublic:undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
componentDidMount = () =>{
|
||||||
|
let bankId = this.props.match.params.bankId;
|
||||||
|
|
||||||
|
this.initData(bankId);
|
||||||
|
}
|
||||||
|
|
||||||
|
initData = (bankId) =>{
|
||||||
|
let url = `/gtopic_banks/${bankId}/edit.json`;
|
||||||
|
axios.get(url).then((result)=>{
|
||||||
|
if(result){
|
||||||
|
const crumbData={
|
||||||
|
title:'编辑',
|
||||||
|
is_public:result && result.selected_data && result.selected_data.is_public,
|
||||||
|
crumbArray:[
|
||||||
|
{to:`/banks/gtopic/${bankId}/edit`,content:'详情'},
|
||||||
|
{content:'编辑'}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
this.props.initPublic(crumbData);
|
||||||
|
|
||||||
|
this.GraduateTopicNewFromRef.initValue(result);
|
||||||
|
}
|
||||||
|
}).catch((error)=>{
|
||||||
|
console.log(error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 编辑保存
|
||||||
|
editSave = (param,attachments,bankId) =>{
|
||||||
|
const url = `/gtopic_banks/${bankId}.json`;
|
||||||
|
let params = {
|
||||||
|
gtopic_bank:param,
|
||||||
|
attachment_ids:attachments
|
||||||
|
}
|
||||||
|
axios.put(url,params).then((result)=>{
|
||||||
|
if(result){
|
||||||
|
this.props.showNotification('保存成功!');
|
||||||
|
this.props.history.push(`/banks/gtopic/${bankId}`);
|
||||||
|
}
|
||||||
|
}).catch((error)=>{
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取消
|
||||||
|
editCancel = () =>{
|
||||||
|
this.props.history.push(`/banks/gtopic/${this.props.match.params.bankId}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { bankId } = this.props.match.params
|
||||||
|
const common = {
|
||||||
|
editSave:this.editSave,
|
||||||
|
editCancel:this.editCancel
|
||||||
|
}
|
||||||
|
return(
|
||||||
|
<div className="courseForm">
|
||||||
|
<style>
|
||||||
|
{`
|
||||||
|
.courseForm .ant-col-sm-24{
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
<GraduateTopicNewFrom
|
||||||
|
{...this.props}
|
||||||
|
{...this.state}
|
||||||
|
{...common}
|
||||||
|
wrappedComponentRef={(ref) => this.GraduateTopicNewFromRef = ref}
|
||||||
|
topicId={bankId}
|
||||||
|
></GraduateTopicNewFrom>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default GtopicBanksEdit;
|
@ -0,0 +1,42 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import { Menu } from 'antd'
|
||||||
|
import { Link } from 'react-router-dom'
|
||||||
|
import { WordsBtn } from 'educoder'
|
||||||
|
import "../usersInfo.css"
|
||||||
|
import "../../../courses/css/Courses.css"
|
||||||
|
import "../../../courses/css/busyWork.css"
|
||||||
|
|
||||||
|
class BanksMenu extends Component{
|
||||||
|
constructor(props){
|
||||||
|
super(props);
|
||||||
|
}
|
||||||
|
render(){
|
||||||
|
let { banksMenu } = this.props;
|
||||||
|
return(
|
||||||
|
<div className="clearfix bor-bottom-greyE edu-back-white" style={{padding:"2px 30px"}}>
|
||||||
|
{
|
||||||
|
banksMenu &&
|
||||||
|
<div className="task_menu_ul fl">
|
||||||
|
<Menu mode="horizontal" selectedKeys={[`${banksMenu && banksMenu.tab}`]}>
|
||||||
|
{
|
||||||
|
banksMenu.menuArray && banksMenu.menuArray.map((item,key)=>{
|
||||||
|
return(
|
||||||
|
<Menu.Item key={key}><Link to={`${item.to}`}>{item.content}</Link></Menu.Item>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
<span className="fr mt18">
|
||||||
|
<WordsBtn to={''} style="blue" className="ml20 font-16">删除</WordsBtn>
|
||||||
|
<WordsBtn to={''} style="blue" className="ml20 font-16">编辑</WordsBtn>
|
||||||
|
<WordsBtn to={''} style="blue" className="ml20 font-16">发送</WordsBtn>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default BanksMenu;
|
Loading…
Reference in new issue