Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

PCqiandao
daiao 5 years ago
commit 751a3e70e5

@ -560,6 +560,8 @@ class CoursesController < ApplicationController
member = CourseMember.create(course_id: @course.id, graduation_group_id: @graduation_group_id, user_id: user_id, role: role, is_active: is_active)
member.teacher_course_groups << TeacherCourseGroup.new(course_group_id: @course_group_id, user_id: user_id, course_id: @course.id) if @course_group_id != 0
@course.course_messages.join_course_requests.unhandled.where(course_message_id: user_id).update_all(status: :PASSED)
end
end
TeacherInviteJoinCourseNotifyJob.perform_later(current_user.id, @course.id, role, teacher_ids) if teacher_ids.present?

@ -42,6 +42,10 @@ class FilesController < ApplicationController
@unpublish_count = @total_count - @publish_count
@attachments = @attachments.by_keywords(params[:search])
if params[:no_link]
@attachments = @attachments.no_link
end
@attachments = @attachments.page(@page).per(@page_size)
end
@ -138,7 +142,7 @@ class FilesController < ApplicationController
end
def public_with_course_and_project
@attachments = Attachment.publiced.simple_columns
@attachments = Attachment.publiced.no_link.simple_columns
.contains_course_and_project
.includes(:container, author: :user_extension)
.by_filename_or_user_name(params[:search])
@ -151,7 +155,7 @@ class FilesController < ApplicationController
def mine_with_course_and_project
@current_user = current_user
@attachments = Attachment.mine(current_user)
@attachments = Attachment.mine(current_user).no_link
.simple_columns
.contains_course_and_project
.by_keywords(params[:search])

@ -25,6 +25,7 @@ class Attachment < ApplicationRecord
scope :search_by_container, -> (ids) {where(container_id: ids)}
scope :unified_setting, -> {where("unified_setting = ? ", 1)}
scope :published, -> {where(is_publish: 1)}
scope :no_link, -> {where(link: nil)}
validates_length_of :description, maximum: 100, message: "不能超过100个字符"

@ -38,9 +38,9 @@ class CreateWatchVideoService < ApplicationService
end
else
# 开始播放时记录一次
if params[:course_video_id].present?
if params[:course_id].present?
# 课堂视频
course_video = CourseVideo.find(params[:course_video_id])
course_video = CourseVideo.find_by(video_id: params[:video_id], course_id: params[:course_id])
watch_course_video = WatchCourseVideo.find_or_initialize_by(course_video_id: course_video.id, user_id: user.id) do |d|
d.start_at = current_time
d.duration = params[:duration]
@ -52,7 +52,7 @@ class CreateWatchVideoService < ApplicationService
watch_course_video.save! unless watch_course_video.persisted?
else
# 非课堂视频
video = Video.find_by(params[:video_id])
video = Video.find(params[:video_id])
watch_video_history = build_video_log(current_time, video.id)
watch_video_history.save!
end

@ -1,7 +1,7 @@
/*
* @Description: quill delta -> html
* @Author: tangjiang
* @Github:
* @Github:
* @Date: 2019-12-24 08:51:25
* @LastEditors : tangjiang
* @LastEditTime : 2019-12-26 09:30:11
@ -55,7 +55,7 @@ export const formatDelta = (deltas) => {
*/
export const operate = (text, key, value) => {
let operatedText = null;
debugger;
switch (key) {
case 'bold':
operatedText = `<strong>${text}</strong>`;
@ -72,7 +72,7 @@ export const operate = (text, key, value) => {
case 'link':
operatedText = `<a href="${value}" style="color: #5091ff; text-decoration: underline;" target="bland">${text}</a>`;
break;
default:
default:
operatedText = text;
}

@ -34,7 +34,7 @@ class CompetitionContentsMd extends Component{
}else{
chart_rules.rule_contents.map((items,keys)=>{
debugger
if(parseInt(this.props.tabkey)===items.competition_stage_id){
console.log(items)
this.contentMdRef.current.setValue(items.content);

@ -684,12 +684,24 @@ class CoursesIndex extends Component{
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 子目录普通作业 */}
<Route path="/classrooms/:coursesId/common_homework/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分组作业 */}
<Route path="/classrooms/:coursesId/group_homeworks/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分组作业 */}
<Route path="/classrooms/:coursesId/group_homework/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 普通作业 */}
<Route path="/classrooms/:coursesId/common_homeworks/" strict
@ -697,6 +709,12 @@ class CoursesIndex extends Component{
(props) => (<CommonWork {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 子普通作业 */}
<Route path="/classrooms/:coursesId/common_homework/" strict
render={
(props) => (<CommonWork {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分组作业 */}
<Route path="/classrooms/:coursesId/group_homeworks/" strict
@ -705,7 +723,15 @@ class CoursesIndex extends Component{
}
></Route>
{/* 问卷答题 */}
{/* 分组作业 */}
<Route path="/classrooms/:coursesId/group_homework/" strict
render={
(props) => (<GroupWork {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 问卷答题 */}
<Route path="/classrooms/:coursesId/polls/:pollId/users/:login"
render={
(props) => (<PollInfo {...this.props} {...props} {...this.state} {...common}/>)

@ -230,6 +230,12 @@ class ListPageIndex extends Component{
(props) => (<CommonWork {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 普通作业 */}
<Route path="/classrooms/:coursesId/common_homework/:category_id"
render={
(props) => (<CommonWork {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作品列表 */}
<Route path="/classrooms/:coursesId/group_homeworks/:category_id"
@ -237,6 +243,12 @@ class ListPageIndex extends Component{
(props) => (<CommonWork {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作品列表 */}
<Route path="/classrooms/:coursesId/group_homework/:category_id"
render={
(props) => (<CommonWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/boards/:boardId"
render={

@ -13,6 +13,7 @@ import VideoPanel from './video-play'
import './video.css';
import '../../user/usersInfo/video/InfosVideo.css'
import axios from 'axios';
import { logWatchHistory } from "../../../services/video-service";
const DEFAULT_VIDEO_WIDTH_IN_MD = "90%" // 400
const DEFAULT_VIDEO_HEIGHT_IN_MD = "55%" // 400
@ -31,8 +32,8 @@ class Video extends Component {
videoVisible: false,
visible: false,
moveVisible:false,
moveVideoId:undefined
moveVisible: false,
moveVideoId: undefined
}
}
@ -70,7 +71,6 @@ class Video extends Component {
}
}
// 编辑成功后回调的方法
editSuccess = () => {
this.props.showNotification("视频信息修改成功!");
@ -82,7 +82,7 @@ class Video extends Component {
let videoId = {
videoId: item.id,
title: item.title,
link:item.link
link: item.link
}
this.setState({
videoId,
@ -118,8 +118,6 @@ class Video extends Component {
_clipboard = null;
}
} else {
// videoEl.current && videoEl.current.play()
setTimeout(() => {
if (!_clipboard) {
_clipboard = new ClipboardJS('.copybtn');
@ -148,7 +146,7 @@ class Video extends Component {
axios.delete(url, {
params: {
video_id: item.id,
is_link:item.link ? true : undefined
is_link: item.link ? true : undefined
}
}).then(result => {
if (result) {
@ -168,30 +166,30 @@ class Video extends Component {
}
// 移动到
moveVideo=(id,flag)=>{
if(!flag){
moveVideo = (id, flag) => {
if (!flag) {
this.setState({
moveVisible:true,
moveVideoId:id
moveVisible: true,
moveVideoId: id
})
}else{
} else {
this.props.define({
title:'提示',
content:"您不是课堂管理员或者视频发布者,暂不能移动视频。",
title: '提示',
content: "您不是课堂管理员或者视频发布者,暂不能移动视频。",
})
}
}
setMoveVisible=(flag)=>{
setMoveVisible = (flag) => {
this.setState({
moveVisible:flag,
moveVideoId:undefined
moveVisible: flag,
moveVideoId: undefined
})
}
render() {
const { visible, videoVisible, videoId , moveVisible , moveVideoId } = this.state;
const { visible, videoVisible, videoId, moveVisible, moveVideoId } = this.state;
const CourseId = this.props.match.params.coursesId;
const VID=this.props.match.params.videoId;
const VID = this.props.match.params.videoId;
const login = this.props.user && this.props.user.login;
const _inputValue = videoId && this.getCopyText(videoId.file_url, videoId.cover_url);
@ -201,7 +199,7 @@ class Video extends Component {
const { videos, upload, uploadVideo, videoData, changePage, pageSize, page } = this.props;
const operation = admin || business;
const {course_identity} = this.props.coursedata;
const { course_identity } = this.props.coursedata;
const flagMove = parseInt(course_identity) < 5;
return (
@ -214,8 +212,8 @@ class Video extends Component {
{...this.props}
visible={moveVisible}
mainId={videoData && videoData.course_module_id}
setMoveVisible={(flag)=>this.setMoveVisible(flag)}
successFunc={()=>uploadVideo()}
setMoveVisible={(flag) => this.setMoveVisible(flag)}
successFunc={() => uploadVideo()}
id={moveVideoId}
></MoveBox>
<HeadlessModal
@ -224,7 +222,7 @@ class Video extends Component {
className="showVideoModal"
width={800 - 1}
>
{videoId && <VideoPanel src={videoId.file_url} />}
{videoId && <VideoPanel src={videoId.file_url} videoId={videoId.videoId} courseId={CourseId} logWatchHistory={logWatchHistory} />}
<div className="df copyLine">
<Input value={_inputValue}
@ -242,7 +240,7 @@ class Video extends Component {
{
videos && videos.length > 0 ?
<React.Fragment>
<p className="font-grey-9 mt20 mb20 pl5"> <span className="color-orange">{videoData && videoData.count}</span> </p>
<div className="videoContent">
{
@ -259,7 +257,7 @@ class Video extends Component {
getCopyText={this.getCopyText}
operation={operation || item.user_id === user_id}
deleteVideo={(admin || item.user_id === user_id) ? this.deleteVideo : undefined}
moveVideo={videoData && videoData.has_category && flagMove ? ()=>this.moveVideo(item.id,(course_identity > 2 && item.user_id !== user_id)):undefined}
moveVideo={videoData && videoData.has_category && flagMove ? () => this.moveVideo(item.id, (course_identity > 2 && item.user_id !== user_id)) : undefined}
>
</VideoInReviewItem>
)

@ -1,37 +0,0 @@
import React, { useEffect, useRef } from 'react'
export default ({ url }) => {
const ref = useRef()
useEffect(() => {
let player = null
if (window.flvjs.isSupported) {
player = window.flvjs.createPlayer({
type: 'flv',
volume: 0.8,
cors: true,
url,
muted: false
})
if (ref.current) {
player.attachMediaElement(ref.current)
player.load()
player.play()
}
}
return () => {
if (player) {
player.unload()
player.pause()
player.destroy()
player = null
}
}
}, [url, ref.current])
return (
<video ref={ref} controls autoPlay={true} muted={false} className="flv-player"></video>
)
}

@ -1,18 +1,165 @@
import React, { Fragment } from 'react'
import ReactFlvPlayer from './flv-player'
import React, { useRef, useEffect, useCallback } from 'react'
const regex = /(android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini)/i
// https://www.showdoc.cc/educoder?page_id=4029884447803706
export default ({ src, videoId, logWatchHistory, courseId = null }) => {
export default ({ src }) => {
const suf = src.split('.').pop()
const isFlv = suf === 'flv'
return (
<Fragment>
{
isFlv ? <ReactFlvPlayer url={src} isMuted={true} /> : <video src={src} controls autoPlay={true} controlsList="nodownload">
<source type={`video/${suf}`} src={src} />
您的浏览器不支持 video 标签
</video>
const el = useRef()
const deviceMatch = navigator.userAgent.toLowerCase().match(regex)
const device = deviceMatch ? deviceMatch[0] : 'pc'
let totalDuration = 0
let totalTimePlayed = 0
let sumTimePlayed = 0
let lastUpdatedTime = 0
let lastEffectUpdatedTime = 0
let logId = null
let initLog = false
let timeTick = 20 // 20s
let logCount = 1
let isLoging = false
let isSeeking = false
const log = useCallback((callback) => {
let params = {}
if (logId) {
params['log_id'] = logId
params['watch_duration'] = totalTimePlayed //
params['total_duration'] = sumTimePlayed //
} else {
if (courseId) {
params['video_id'] = parseInt(videoId, 10)
params['course_id'] = parseInt(courseId, 10)
} else {
params['video_id'] = videoId
}
params['duration'] = totalDuration
params['device'] = device
}
async function getLogId() {
isLoging = true
let id = await logWatchHistory(params)
logId = id
isLoging = false
if (callback) {
callback()
}
}
getLogId()
}, [videoId, courseId])
useEffect(() => {
let player = null
if (window.flvjs.isSupported && isFlv) {
player = window.flvjs.createPlayer({
type: 'flv',
volume: 0.8,
cors: true,
url: src,
muted: false
})
if (el.current) {
player.attachMediaElement(el.current)
player.load()
}
} else {
el.current.setAttribute('src', src)
}
return () => {
if (player) {
player.unload()
player.pause()
player.destroy()
player = null
}
}
}, [el, isFlv, src])
useEffect(() => {
function onPlay() {
if (!initLog) {
initLog = true
log()
}
</Fragment>
}
async function onEnded() {
log(() => {
logId = null
logCount = 1
totalTimePlayed = 0
lastUpdatedTime = 0
sumTimePlayed = 0
initLog = false
isLoging = false
lastEffectUpdatedTime = 0
isSeeking = false
})
}
function onTimeupdate() {
if (!isSeeking) {
let newTime = el.current.currentTime
let timeDiff = newTime - lastUpdatedTime
let effectTimeDiff = newTime - lastEffectUpdatedTime
if (effectTimeDiff > 0) {
totalTimePlayed += effectTimeDiff
lastEffectUpdatedTime = newTime
}
sumTimePlayed += Math.abs(timeDiff)
lastUpdatedTime = newTime
if (!isLoging) {
if (sumTimePlayed - logCount * timeTick >= 0) {
logCount++
log()
}
}
}
}
function onSeeking() {
isSeeking = true
lastUpdatedTime = el.current.currentTime
lastEffectUpdatedTime = el.current.currentTime
}
function onSeeked() {
isSeeking = false
}
function onCanPlay() {
totalDuration = el.current.duration
if (totalDuration <= 20) {
timeTick = totalDuration / 3
}
el.current.addEventListener('play', onPlay)
}
el.current.addEventListener('canplay', onCanPlay)
el.current.addEventListener('ended', onEnded)
el.current.addEventListener('seeking', onSeeking)
el.current.addEventListener('seeked', onSeeked)
el.current.addEventListener('timeupdate', onTimeupdate)
return () => {
el.current.removeEventListener('canplay', onCanPlay)
el.current.removeEventListener('play', onPlay)
el.current.removeEventListener('ended', onEnded)
el.current.removeEventListener('seeking', onSeeking)
el.current.removeEventListener('seeked', onSeeked)
el.current.removeEventListener('timeupdate', onTimeupdate)
}
}, [el, src])
return (
<video ref={el} controls autoPlay={false} controlsList="nodownload" muted={false} />
)
}

@ -222,6 +222,8 @@ class CommonWorkDetailIndex extends Component{
let exportUrl = `/homework_commons/${workId}/works_list.zip?${queryString.stringify(params)}`
let exportResultUrl = `/homework_commons/${workId}/works_list.xlsx?${queryString.stringify(params)}`
document.title=course_name === undefined ? "" : course_name;
console.log(category_id)
return (
<div>
<PublishRightnow ref={this.publishModal} showActionButton={false} {...this.props} checkBoxValues={[workId]}
@ -426,6 +428,12 @@ class CommonWorkDetailIndex extends Component{
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/setting"
render={
(props) => (<CommonWorkSetting {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
{/* 作品列表 */}
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/list"
render={
@ -433,17 +441,35 @@ class CommonWorkDetailIndex extends Component{
}
></Route>
{/* 作品列表 */}
<Route exact path="/classrooms/:coursesId/common_homework/:workId/list"
render={
(props) => (<CommonWorkList ref="commonWorkList" triggerRef={this.bindRef} {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
{/* 作业问答 */}
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/question"
render={
(props) => (<CommonWorkQuestion {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/question"
render={
(props) => (<CommonWorkQuestion {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/answer"
render={
(props) => (<CommonWorkAnswer {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/answer"
render={
(props) => (<CommonWorkAnswer {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/setting"
@ -451,25 +477,43 @@ class CommonWorkDetailIndex extends Component{
(props) => (<CommonWorkSetting {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/setting"
render={
(props) => (<CommonWorkSetting {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
{/* 作品列表 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/list"
render={
(props) => (<CommonWorkList triggerRef={this.bindRef} {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/list"
render={
(props) => (<CommonWorkList triggerRef={this.bindRef} {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
{/* 作业问答 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/question"
render={
(props) => (<CommonWorkQuestion {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/question"
render={
(props) => (<CommonWorkQuestion {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/answer"
render={
(props) => (<CommonWorkAnswer {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/answer"
render={
(props) => (<CommonWorkAnswer {...this.props} {...props} {...this.state} {...commonHandler}/>)
}
></Route>
</Switch>
</div>
</div>

@ -163,7 +163,7 @@ class CommonWorkItem extends Component{
}
<div className="flex1" onClick={() => this.props.onItemClick(Object.assign({}, item, {id: item.homework_id})) }>
<p className="clearfix mb20">
<p className="clearfix">
{canNotLink?<span className={"fl font-16 font-bd mt2 comnonwidth580 pointer color-grey-name"}
title={ canNotLink ? "私有属性,非课堂成员不能访问" : item.name}
>
@ -199,7 +199,13 @@ class CommonWorkItem extends Component{
</li>
} */}
</p>
<p className="color-grey-9 clearfix">
{
item && item.upper_category_name &&
// <ConditionToolTip title={discussMessage.upper_category_name} condition={ discussMessage.upper_category_name.length > 22 }>
<div className="color-grey9 task-hide mt5" title={item.upper_category_name}>所属目录{item.upper_category_name}</div>
// </ConditionToolTip>
}
<p className="color-grey-9 clearfix mt10">
{ item.author && <span className="mr20 fl">{item.author}</span> }
{item.commit_count===undefined?"":<span className="mr20 fl">{item.commit_count} 已交</span>}
{item.uncommit_count===undefined?"":<span className="mr20 fl">{item.uncommit_count} 未交</span>}

@ -68,6 +68,12 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/setting"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作品列表 */}
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/list"
@ -75,17 +81,36 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作品列表 */}
<Route exact path="/classrooms/:coursesId/common_homework/:workId/list"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作业问答 */}
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/question"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/question"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/answer"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/answer"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 评阅 */}
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/:studentWorkId/appraise"
@ -93,6 +118,12 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkAppraise {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/:studentWorkId/appraise"
render={
(props) => (<CommonWorkAppraise {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 提交作品 */}
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/post"
@ -100,11 +131,22 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/post"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homeworks/:workId/:studentWorkId/post_edit"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/:studentWorkId/post_edit"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 新建 */}
@ -114,12 +156,23 @@ class CoursesWorkIndex extends Component{
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:workId/:pageType"
render={
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homeworks/:categroy_id/new"
render={
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/common_homework/:categroy_id/new"
render={
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作业列表 */}
@ -128,6 +181,11 @@ class CoursesWorkIndex extends Component{
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route path="/classrooms/:coursesId/common_homework"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* --------------------------------------------------------------------- */}

@ -71,6 +71,11 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/setting"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作品列表 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/list"
@ -78,6 +83,11 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/list"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作业问答 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/question"
@ -85,31 +95,56 @@ class CoursesWorkIndex extends Component{
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/question"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 参考答案 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/answer"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/answer"
render={
(props) => (<CommonWorkDetailIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 评阅 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/:studentWorkId/appraise"
render={
(props) => (<CommonWorkAppraise {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/:studentWorkId/appraise"
render={
(props) => (<CommonWorkAppraise {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/post"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/post"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/:studentWorkId/post_edit"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/:studentWorkId/post_edit"
render={
(props) => (<CommonWorkPost {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 新建 */}
{/* http://localhost:3007/classrooms/1309/group_homeworks/9299/edit/1 */}
<Route exact path="/classrooms/:coursesId/group_homeworks/:workId/:pageType"
@ -117,11 +152,21 @@ class CoursesWorkIndex extends Component{
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:workId/:pageType"
render={
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homeworks/:categroy_id/new"
render={
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
<Route exact path="/classrooms/:coursesId/group_homework/:categroy_id/new"
render={
(props) => (<NewWork {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作业列表 */}
<Route path="/classrooms/:coursesId/group_homeworks"
@ -129,6 +174,12 @@ class CoursesWorkIndex extends Component{
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 作业列表 */}
<Route path="/classrooms/:coursesId/group_homework"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
}
></Route>
</Switch>

@ -34,8 +34,17 @@ class NewWork extends Component{
}
}
fetchCourseData = (courseId) => {
let newcategory=undefined;
if(this.props.match.path==="/classrooms/:coursesId/common_homework/:workId/:pageType"||this.props.match.path==="/classrooms/:coursesId/group_homework/:workId/:pageType"){
newcategory=this.props.match.params.workId
}
const isGroup = this.props.isGroup()
const url = `/courses/${courseId}/homework_commons/new.json?type=${isGroup ? 3 : 1}`
let url=""
if(newcategory){
url = `/courses/${courseId}/homework_commons/new.json?type=${isGroup ? 3 : 1}&category=${newcategory}`;
}else{
url = `/courses/${courseId}/homework_commons/new.json?type=${isGroup ? 3 : 1}`
}
axios.get(url, {
})
.then((response) => {
@ -54,7 +63,17 @@ class NewWork extends Component{
});
}
fetchWork = (workId) => {
const url = `/homework_commons/${workId}/edit.json`
let newcategory=undefined;
if(this.props.match.path==="/classrooms/:coursesId/common_homework/:workId/:pageType"||this.props.match.path==="/classrooms/:coursesId/group_homework/:workId/:pageType"){
newcategory=this.props.match.params.workId
}
let url=""
if(newcategory){
url = `/homework_commons/${workId}/edit.json?category=${newcategory}`;
}else{
url = `/homework_commons/${workId}/edit.json`
}
axios.get(url, {
})
.then((response) => {
@ -96,6 +115,9 @@ class NewWork extends Component{
doNew = (params) => {
const coursesId = this.props.match.params.coursesId
const newUrl = `/courses/${coursesId}/homework_commons.json`
if(this.props.match.path==="/classrooms/:coursesId/common_homework/:workId/:pageType"||this.props.match.path==="/classrooms/:coursesId/group_homework/:workId/:pageType"){
params.category=this.props.match.params.workId
}
axios.post(newUrl, params)
.then((response) => {

@ -41,10 +41,10 @@ class PublishRightnow extends Component{
this.props.showNotification(`请先选择要立即${showdatatypes? "发布" : "截止"}的作业`)
return;
}
this.fetchCourseGroups();
}
showDialog = (course_groups) => {
const isPublish = this.props.isPublish;
@ -96,7 +96,7 @@ class PublishRightnow extends Component{
}
homeworkstartend=(arg_group_ids,endtime)=>{
debugger
if (this.usingCheckBeforePost && this.props.checkBeforePost) {
const goOn = this.props.checkBeforePost();
if (!goOn) {
@ -104,7 +104,7 @@ class PublishRightnow extends Component{
return;
}
}
debugger
const isPublish = this.props.isPublish;
let group_ids = arg_group_ids
if (this.usingCheckBeforePost) {
@ -112,7 +112,7 @@ class PublishRightnow extends Component{
return item.id
})
}
debugger
if(this.state.course_groups.length>0){
if (this.state.course_groups.length && (!group_ids || group_ids&&group_ids.length == 0)) {
this.props.showNotification('请至少选择一个分班');

@ -130,9 +130,9 @@ class UseBank extends Component{
})
}
onSave = () => {
debugger
const { checkBoxValues } = this.state;
const { object_type } = this.props
const { object_type,category_id } = this.props
if(checkBoxValues.length==0){
this.setState({
isChecked:"请先选择"+engNameMap[object_type]
@ -149,7 +149,8 @@ class UseBank extends Component{
, {
"object_type": object_type,
"bank_id": checkBoxValues,
"course_id": courseId
"course_id": courseId,
"category":category_id
}
)
.then((response) => {

@ -31,7 +31,7 @@ export function RouteHOC(options = {}) {
// common_homework group_homework
// 是否是分组作业
isGroup = () => {
return window.location.pathname.indexOf('group_homeworks') != -1
return window.location.pathname.indexOf('group_homeworks') != -1||window.location.pathname.indexOf('group_homework') != -1
}
getModuleName = (isChinese) => {
const isGroup = this.isGroup()
@ -39,8 +39,29 @@ export function RouteHOC(options = {}) {
let chName = isGroup ? '分组作业' : '普通作业'
return chName;
}
const secondName = isGroup ? 'group_homeworks' : 'common_homeworks'
return secondName;
if(window.location.pathname.indexOf('group_homeworks') != -1){
const secondName ='group_homeworks';
return secondName;
}
if(window.location.pathname.indexOf('group_homework') != -1){
const secondName ='group_homework';
return secondName;
}
if(window.location.pathname.indexOf('common_homeworks') != -1){
const secondName ='common_homeworks';
return secondName;
}
if(window.location.pathname.indexOf('common_homework') != -1){
const secondName ='common_homework';
return secondName;
}
}
getModuleType = () => {
const isGroup = this.isGroup()

@ -6,7 +6,7 @@ import '../css/busyWork.css'
import CommonWorkItem from './CommonWorkItem'
import PublishRightnow from './PublishRightnow'
import ConnectProject from './ConnectProject'
import { WordsBtn, on, off } from 'educoder'
import { WordsBtn, on, off ,trigger} from 'educoder'
import Modals from '../../modals/Modals'
import NoneData from "../coursesPublic/NoneData"
import Titlesearchsection from '../common/titleSearch/TitleSearchSection';
@ -34,7 +34,9 @@ class commonWork extends Component{
totalCount:0,
checkAll:false,
checkBoxValues:[],
isSpin:false
isSpin:false,
category_id:undefined,
course_module:[]
}
}
//输入搜索条件
@ -45,8 +47,8 @@ class commonWork extends Component{
}
//搜索查询
searchStudent=()=>{
let {page,search,order}=this.state;
this.getList(1,search,order);
let {category_id,search,order}=this.state;
this.getList(1,search,order,category_id);
}
openConnectionProject = (work) => {
this.refs['connectProject'].openConnectionProject(work)
@ -54,7 +56,7 @@ class commonWork extends Component{
// 新建
createCommonWork=(type)=>{
this.props.toNewPage(this.props.match.params)
this.props.toNewPage(this.props.match.params)
}
cancelDelClasses=()=>{
@ -69,23 +71,53 @@ class commonWork extends Component{
}
componentDidUpdate(prevProps, prevState) {
if (prevProps.match.path != this.props.match.path) {
this.clearSelection()
this.setState({ selectedKeys: 'all', order: '' }, () => {
this._getList()
})
if (prevProps.coursesidtype != this.props.coursesidtype||prevProps.match.params.category_id!=this.props.match.params.category_id) {
if (this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id" || this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"||
this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id" || this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id"
) {
if (this.props.coursesidtype === "node" && this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id"||
this.props.coursesidtype === "node" && this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id"
) {
this.clearSelection()
this.setState({selectedKeys: 'all', order: ''}, () => {
this._getList()
})
}
if (this.props.coursesidtype === "child" && this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"||
this.props.coursesidtype === "child" && this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id"
) {
this.clearSelection()
this.setState({selectedKeys: 'all', order: ''}, () => {
this._getList(this.props.match.params.category_id)
})
}
}
}
}
_getList = () => {
_getList = (id) => {
this.setState({
isSpin:true
isSpin:true,
category_id:id
})
let {page,search,order}=this.state;
this.getList(page,search,order);
this.getList(page,search,order,id);
}
componentDidMount(){
this._getList()
if(this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id"){
this._getList()
}
if(this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id") {
this._getList(this.props.match.params.category_id)
}
on('updateNavSuccess', this.updateNavSuccess)
}
@ -93,9 +125,14 @@ class commonWork extends Component{
off('updateNavSuccess', this.updateNavSuccess)
}
updateNavSuccess = () => {
this._getList()
if(this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id"){
this._getList()
}
if(this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id") {
this._getList(this.props.match.params.category_id)
}
}
useBankSuccess = (checkBoxValues, newWorkIdArray) => {
this.setState({
page:1,
@ -103,12 +140,13 @@ class commonWork extends Component{
}, () => {
this.refs['publishModalRef'].open()
})
let {search, order}=this.state;
this.getList(1, search, order);
let {search, order,category_id}=this.state;
this.getList(1, search, order,category_id);
}
getList=(page,search,order)=>{
getList=(page,search,order,category_id)=>{
this.setState({
isSpin:true
})
@ -121,6 +159,9 @@ class commonWork extends Component{
if(search!=""){
url+="&search="+search;
}
if(category_id){
url+="&category="+category_id;
}
axios.get(encodeURI(url)).then((result)=>{
if(result.status==200){
this.setState({
@ -130,6 +171,32 @@ class commonWork extends Component{
page:page,
...result.data
})
this.getdatas(result.data.main_category_id)
}
}).catch((error)=>{
this.setState({
isSpin:false
})
})
}
getdatas=(main_category_id)=>{
let newcourse_module=[]
let urls=`/course_modules/${main_category_id}.json`
axios.get(encodeURI(urls)).then((result)=>{
if(result.status==200){
newcourse_module.push({name:result.data.course_module.module_name,id:result.data.course_module.id})
if(result.data.course_module.course_second_categories.length>0){
result.data.course_module.course_second_categories.map((item,key)=>{
newcourse_module.push(item)
})
}
this.setState({
course_module:newcourse_module
})
}
}).catch((error)=>{
this.setState({
@ -148,8 +215,8 @@ class commonWork extends Component{
checkBoxValues:[],
checkAll:false
})
let {search}=this.state;
this.getList(1,search,e.key==="all"?"":e.key);
let {search,category_id}=this.state;
this.getList(1,search,e.key==="all"?"":e.key,category_id);
}
onPageChange=(pageNumber)=>{
@ -157,8 +224,8 @@ class commonWork extends Component{
page:pageNumber,
checkBoxValues:[]
})
let {search,order}=this.state;
this.getList(pageNumber,search,order);
let {search,order,category_id}=this.state;
this.getList(pageNumber,search,order,category_id);
}
// 全选和反选
@ -191,7 +258,7 @@ class commonWork extends Component{
}
onWorkDelete = () => {
const { checkBoxValues } = this.state;
const { checkBoxValues,category_id} = this.state;
const len = checkBoxValues.length;
if (len == 0) {
this.props.showNotification('请先选择要删除的作业')
@ -209,13 +276,14 @@ class commonWork extends Component{
axios.post(url, {
homework_ids: checkBoxValues,
all_check: 0,
// category:category_id
// group_ids
}).then((response) => {
if (response.data.status == 0) {
if (response.data.status == 0) {
this.props.showNotification('删除成功')
this.clearSelection()
let {search,order}=this.state;
this.getList(1,search,order);
this.getList(1,search,order,category_id);
this.props.updataleftNavfun()
}
@ -224,14 +292,14 @@ class commonWork extends Component{
})
}
})
}
clearSelection = () => {
this.setState({ checkBoxValues: [], checkAll: false })
}
//
//
onSetPublic = () => {
const { checkBoxValues } = this.state;
const { checkBoxValues,category_id } = this.state;
const len = checkBoxValues.length;
if (len == 0) {
this.props.showNotification('请先选择要公开的作业')
@ -249,10 +317,10 @@ class commonWork extends Component{
homework_ids: checkBoxValues,
all_check: 0
}).then((response) => {
if (response.data.status == 0) {
if (response.data.status == 0) {
this.props.showNotification('设为公开操作成功')
let {search,order, page}=this.state;
this.getList(page,search,order);
this.getList(page,search,order,category_id);
}
}).catch((error) => {
@ -262,8 +330,8 @@ class commonWork extends Component{
})
}
doWhenSuccess = () => {
let {search,order, page}=this.state;
this.getList(page,search,order);
let {search,order, page,category_id}=this.state;
this.getList(page,search,order,category_id);
this.setState({
checkBoxValues:[]
})
@ -279,7 +347,7 @@ class commonWork extends Component{
this.onChangeSelect(checkBoxValues)
}
addToBank = () => {
const { checkBoxValues } = this.state;
const { checkBoxValues,category_id } = this.state;
const len = checkBoxValues.length;
if (len == 0) {
this.props.showNotification('请先选择要加入题库的作业')
@ -291,10 +359,10 @@ class commonWork extends Component{
homework_ids: checkBoxValues,
all_check: 0
}).then((response) => {
if (response.data.status == 0) {
if (response.data.status == 0) {
this.props.showNotification('加入成功')
let {search,order}=this.state;
this.getList(1,search,order);
this.getList(1,search,order,category_id);
}
}).catch((error) => {
@ -302,27 +370,70 @@ class commonWork extends Component{
})
}
connectSuccess = () => {
let {page,search,order}=this.state;
this.getList(page,search,order);
let {page,search,order,category_id}=this.state;
this.getList(page,search,order,category_id);
}
cancelConnectionProject = (work) => {
let workId=this.props.match.params.workId;
let courseId=this.props.match.params.coursesId;
let {page,search,order,category_id}=this.state;
const url = `/homework_commons/${work.homework_id}/student_works/cancel_relate_project.json`
axios.get(url).then((response)=> {
if (response.data.status == 0) {
let {page,search,order}=this.state;
this.getList(page,search,order);
this.getList(page,search,order,category_id);
this.props.showNotification('取消关联成功')
}
}).catch((error)=>{
console.log(error)
})
}
addDir = (id) => {
if(!id){
trigger('addcommon_homeworks', parseInt(this.props.match.params.category_id))
}else{
let data={id:parseInt(id),name:this.state.category_name}
trigger('editcommon_homeworks', data)
}
}
newaddDir = () => {
trigger('addcommon_homeworks', parseInt(this.state.main_category_id))
}
moveTo = (item) => {
const len = this.state.checkBoxValues.length
if (len == 0) {
this.props.showNotification('请先在列表中选择要移动的作业')
return;
}
const checkBoxValues = this.state.checkBoxValues;
const coursesId= this.props.match.params.coursesId;
const category_id=this.state.category_id;
const url = `/courses/${coursesId}/homework_commons/move_to_category.json`
axios.post(url, {
homework_ids: checkBoxValues,
new_category_id: item.id,
category_id:!category_id?undefined:category_id
})
.then((response) => {
if (response.data.status == 0) {
console.log('--- 成功')
this.props.showNotification('作业移动成功')
this.props.updataleftNavfun()
this.setState({
checkBoxValues:[]
})
this.updateNavSuccess()
}
})
.catch(function (error) {
console.log(error);
});
}
render(){
let {
search,
@ -334,11 +445,13 @@ class commonWork extends Component{
totalCount,
checkAll,
checkBoxValues,
course_module,
task_count,
published_count,
unpublished_count,
main_category_name,
category_name,
category_id
}=this.state;
const { coursedata } = this.props;
if (!coursedata) {
@ -350,16 +463,15 @@ class commonWork extends Component{
const isGroup = this.props.isGroup()
const isAdmin = this.props.isAdmin()
const bid = this.props.match.params.category_id
// <CourseLayoutcomponent {...this.props}>
// </CourseLayoutcomponent>
return(
<div>
{/* <div className="edu-back-white">
<p className="clearfix padding30 bor-bottom-greyE">
<span className="font-18 fl color-dark-21">{moduleChineseName}</span>
</p>
<div className="clearfix pl30 pr30">
<div className="fl mt6 task_menu_ul">
@ -374,7 +486,7 @@ class commonWork extends Component{
</Menu>
</div>
<div className="fr mt16 mb16 searchView">
<Search
<Search
value={search}
placeholder="请输入姓名进行搜索"
onInput={this.inputStudent}
@ -387,7 +499,7 @@ class commonWork extends Component{
<Titlesearchsection
title={main_category_name}
title={!category_id?main_category_name:category_name}
searchValue={ search }
// searchtype={this.props.isAdmin||this.props.isStudent ?true:false}
onInputSearchChange={this.inputStudent}
@ -399,6 +511,9 @@ class commonWork extends Component{
{ isAdmin && <li className="fr">
<UseBank {...this.props} {...this.state} object_type={isGroup ? "group" : "normal"} useBankSuccess={this.useBankSuccess}></UseBank>
</li> }
{ isAdmin && <li className="fr mr30">
<WordsBtn style="blue" className="fr" onClick={()=>this.addDir(category_id)}>{!category_id?"新建目录":"目录重命名"}</WordsBtn>
</li> }
</React.Fragment>
}
secondRowBotton={
@ -425,7 +540,7 @@ class commonWork extends Component{
searchPlaceholder={"请输入名称进行搜索"}
showSearchInput={true}
></Titlesearchsection>
<PublishRightnow ref="publishModalRef" showActionButton={true} {...this.props} checkBoxValues={checkBoxValues}
<PublishRightnow ref="publishModalRef" showActionButton={true} {...this.props} checkBoxValues={checkBoxValues}
showActionButton={false}
isPublish={true}
islist={true}
@ -445,14 +560,38 @@ class commonWork extends Component{
<a href="javascript:void(0)" className="color-grey-9" onClick={() => this.refs['publishModalRef'].homeworkstart()}>{ "立即发布" }</a>
</li>
<li className="li_line">
<PublishRightnow showActionButton={true} {...this.props} checkBoxValues={checkBoxValues}
<PublishRightnow showActionButton={true} {...this.props} checkBoxValues={checkBoxValues}
isPublish={false} doWhenSuccess={this.doWhenSuccess} fromListPage={true}></PublishRightnow>
</li>
{ !!course_public && <li className="li_line"><a href="javascript:void(0)" onClick={this.onSetPublic} className="color-grey-9">设为公开</a></li>}
{this.props.user&&this.props.user.main_site===true?<li><a href="javascript:void(0)" className="color-grey-9"
{this.props.user&&this.props.user.main_site===true?<li class="li_line"><a href="javascript:void(0)" className="color-grey-9"
onClick={this.addToBank}
>加入题库</a></li>:""}
<li className="li_line drop_down">
移动到...<i className="iconfont icon-xiajiantou font-12 ml2"></i>
<ul className="drop_down_menu"
style={{"right":"0px","left":"unset", maxHeight: '318px', overflowY: 'auto', minWidth: '200px'}}>
{ course_module && course_module.length > 10 && <p className="drop_down_search">
<Input placeholder="搜索" value={this.state.dirSearchValue} onChange={(e) => {this.setState({dirSearchValue: e.target.value})}}/>
</p> }
{
course_module && course_module.filter((item)=> {
return item.id != bid && (!this.state.dirSearchValue || item.name.indexOf(this.state.dirSearchValue) != -1)
}).map( (item, index) => {
return <li key={`i_${index}`} onClick={() => this.moveTo(item)} title={item.name}>{item.name}</li>
})
}
{ isAdmin &&
<p className="drop_down_btn">
<a href="javascript:void(0)" className="color-grey-6"
onClick={()=>this.newaddDir()}
>新建目录...</a>
</p>
}
{/* <p className="drop_down_btn"><a href="javascript:void(0)" className="color-grey-6">添加分班...</a></p> */}
</ul>
</li>
</div>
{/* 设为公开 */}
<Modals
@ -483,7 +622,7 @@ class commonWork extends Component{
{
!!totalCount && totalCount > 15 &&
<div className="edu-txt-center pt30 pb10 clearfix">
<div className="edu-txt-center pt30 pb10 clearfix">
<Pagination current={page} showQuickJumper pageSize={15} total={totalCount} onChange={this.onPageChange}></Pagination>
</div>
}

@ -34,7 +34,7 @@ class CompetitionContentsMd extends Component{
}else{
chart_rules.rule_contents.map((items,keys)=>{
debugger
if(parseInt(this.props.tabkey)===items.competition_stage_id){
console.log(items)
this.contentMdRef.current.setValue(items.content);

@ -142,6 +142,8 @@ class Coursesleftnav extends Component{
off('editshixunmainname',this.editshixunmainname)
off('videoAdd',this.addVideo)
off('editVideo',this.editVideo)
off('addcommon_homeworks',this.addcommon_homeworks)
off('editcommon_homeworks',this.editcommon_homeworks)
}
addshixunchild=(e, data)=>{
this.Navmodalnames(e,1,"shixun_homework",data);
@ -149,6 +151,12 @@ class Coursesleftnav extends Component{
editshixunchild=(e, data)=>{
this.Navmodalnames(e,4,"editSecondname",data.id,data.name);
}
addcommon_homeworks=(e, data)=>{
this.Navmodalnames(e,1,"common_homework",data);
}
editcommon_homeworks=(e, data)=>{
this.Navmodalnames(e,4,"editSecondname",data.id,data.name);
}
editshixunmainname=(e, data)=>{
this.Navmodalnames(e,3,"editname",data.id,data.name);
}
@ -196,7 +204,8 @@ class Coursesleftnav extends Component{
on('editshixunmainname',this.editshixunmainname);
on('videoAdd',this.addVideo);
on('editVideo',this.editVideo)
on('addcommon_homeworks',this.addcommon_homeworks)
on('editcommon_homeworks',this.editcommon_homeworks)
let courstype=this.props.match.url;
@ -537,7 +546,7 @@ class Coursesleftnav extends Component{
}
saveNavmodapost=(url,value,positiontype,coursesId,type)=>{
console.log(positiontype)
axios.post(url,
{name:value}).then((result)=>{
if(result!=undefined){
@ -548,6 +557,23 @@ class Coursesleftnav extends Component{
description:result.data.message
});
if(positiontype==="common_homeworks"||positiontype==="common_homework"||positiontype==="group_homeworks"||positiontype==="group_homework"){
if(type===true){
this.updasaveNavmoda()
trigger('updateNavSuccess')
}else{
this.updasaveNavmoda()
if(positiontype==="common_homeworks"){
this.props.history.push(`/classrooms/${coursesId}/common_homework/${result.data.category_id}`);
}
if(positiontype==="group_homeworks"){
this.props.history.push(`/classrooms/${coursesId}/group_homework/${result.data.category_id}`);
}
}
return
}
if(positiontype==="shixun_homeworks"||positiontype==="shixun_homework"){
if(type===true){
this.updasaveNavmoda()
@ -557,6 +583,7 @@ class Coursesleftnav extends Component{
this.props.history.push(`/classrooms/${coursesId}/shixun_homework/${result.data.category_id}`);
}
return
}
if(positiontype==="files"||positiontype==="file"){
@ -569,22 +596,25 @@ class Coursesleftnav extends Component{
this.updasaveNavmoda()
this.props.history.push(`/classrooms/${coursesId}/file/${result.data.category_id}`);
}
return
}
if(positiontype==="boards"){
this.updasaveNavmoda()
trigger('updateNavSuccess')
this.props.history.push(`/classrooms/${coursesId}/boards/${result.data.category_id}`);
return
}
if(positiontype!="course_groups"&&positiontype!="shixun_homeworks"&&positiontype!="shixun_homework"){
this.updasaveNavmoda()
return
}
if(positiontype==="course_groups"){
this.props.updataleftNavfun();
this.props.history.push(`/classrooms/${coursesId}/course_groups/${result.data.group_id}`);
return
}
}
@ -864,6 +894,10 @@ class Coursesleftnav extends Component{
{/*公告栏*/}
{/*作业*/}
{item.type==="shixun_homework"?<div onClick={e=>this.Navmodalnames(e,1,"shixun_homework",item.id)}>新建目录</div>:""}
{/* 普通作业 */}
{item.type==="common_homework"?<div onClick={e=>this.Navmodalnames(e,1,"common_homeworks",item.id)}>新建目录</div>:""}
{/*/!* 分组作业 *!/*/}
{item.type==="group_homework"?<div onClick={e=>this.Navmodalnames(e,1,"group_homeworks",item.id)}>新建目录</div>:""}
{/*资源*/}
{item.type==="attachment"?<div onClick={e=>this.Navmodalnames(e,1,"attachment",item.id)}>新建目录</div>:""}
{/* 视频 */}
@ -894,8 +928,8 @@ class Coursesleftnav extends Component{
let {twosandiantypes,twosandiantypenum}=this.state;
return (item.type==="graduation"?"": <div className={item.type===twosandiantypes&&twosandiantypenum===index?"sandianboxs":"sandianboxs"} >
{/*作业/资源*/}
{item.type==="shixun_homework"||item.type==="attachment"||item.type==="graduation"?<div onClick={e=>this.Navmodalnames(e,4,"editSecondname",iem.category_id,iem.category_name)}>重命名</div>:""}
{item.type==="shixun_homework"||item.type==="attachment"?<div onClick={e=>this.deleteSecondary(e,1,iem.category_id)}>删除</div>:""}
{item.type==="shixun_homework"||item.type==="attachment"||item.type==="graduation"||item.type==="common_homework"||item.type==="group_homework"?<div onClick={e=>this.Navmodalnames(e,4,"editSecondname",iem.category_id,iem.category_name)}>重命名</div>:""}
{item.type==="shixun_homework"||item.type==="attachment"||item.type==="common_homework"||item.type==="group_homework"?<div onClick={e=>this.deleteSecondary(e,1,iem.category_id)}>删除</div>:""}
{/*分班*/}
{item.type==="course_group"?<div onClick={e=>this.Navmodalnames(e,5,"editSecondname",iem.category_id,iem.category_name)}>重命名</div>:""}
{item.type==="course_group"?<div onClick={e=>this.deleteSecondary(e,2,iem.category_id)}>删除</div>:""}

@ -156,7 +156,7 @@ class Bullsubdirectory extends Component{
handleSubmit=(e) => {
e.preventDefault();
this.props.form.validateFields((err, values) => {
debugger
if (!err) {
console.log(values.description);
if(values.eduintits === undefined|| values.eduintits === "" || values.eduintits ===null){

@ -20,7 +20,7 @@ let id = 0;
/**
target_id
position
position
target_weight
target_contents
@ -29,7 +29,7 @@ let id = 0;
subitem_contents
*/
const data =
const data =
[{"position":0,"target_weight":0.02,"target_contents":"12","standard_grade":2,"subitem_id":"65"},{"position":3,"target_id":"0","target_weight":0.1,"target_contents":"理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。","standard_grade":60,"subitem_id":"66"},{"position":4,"target_weight":1,"target_contents":"22","standard_grade":33,"subitem_id":"66"},{"position":11,"target_id":"1","target_weight":0.1,"target_contents":"理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。","standard_grade":61,"subitem_id":"65"}]
;
let _data = [
@ -70,10 +70,10 @@ class EditableCourseSupportSetting extends Component {
let fValues = this.props.form.getFieldsValue();
if (
// fValues.standard_grade[k] && fValues.standard_grade[k] != 75
// || fValues.subitem_id[k]
// ||
fValues.target_contents[k]
// || fValues.target_weight[k]
// || fValues.subitem_id[k]
// ||
fValues.target_contents[k]
// || fValues.target_weight[k]
) {
this.props.showModal('提示', '确定要删除吗?', () => {
this.remove(k)
@ -129,7 +129,7 @@ class EditableCourseSupportSetting extends Component {
const subitem_id = form.getFieldValue('subitem_id');
keys.splice(index_arg, 0, newKey);
// position2Target_idMap
// position2Target_idMap
// {1:2, 2:3, 3:4, 4:6 } --> {1:2, 2:3, 3:7, 4:4, 5:6 }
// 更新key/position 映射到target_id的map
// 两次revers用这个结构达到给position加1的效果
@ -142,13 +142,13 @@ class EditableCourseSupportSetting extends Component {
reverseMap[target_id] = parseInt(reverseMap[target_id]) + 1;
keys[i] = keys[i] + 1;
}
for (let i = 0 ; i < keys.length - 1; i++) {
for (let i = 0 ; i < keys.length - 1; i++) {
if (keys[i] == keys[i + 1]) {
debugger;
}
}
this.position2Target_idMap = this._reverseMap(reverseMap);
target_weight.splice(newKey, 0, undefined);
target_contents.splice(newKey, 0, undefined);
@ -179,7 +179,7 @@ class EditableCourseSupportSetting extends Component {
const keys = form.getFieldValue('keys');
let nextKeys ;
let newKey = k + 1;
const newKeyIndex = keys.indexOf(newKey)
if (newKeyIndex != -1) {
// 新key存在将新key位置及以后的row后移直到找到一个之后的空位置
@ -213,7 +213,7 @@ class EditableCourseSupportSetting extends Component {
data.push({})
}
for (var valKey in values) {
let dataIndex = 0
values[valKey].forEach( (item,index) => {
let _val = values[valKey][index];
@ -228,7 +228,7 @@ class EditableCourseSupportSetting extends Component {
}
console.log('Received values of form: ', values, data);
let totalWeight = 0;
values.target_weight.forEach(item => {
if (item) {
@ -264,8 +264,8 @@ class EditableCourseSupportSetting extends Component {
}
}
}
});
}
@ -292,7 +292,7 @@ class EditableCourseSupportSetting extends Component {
subitem_id[item.position] = item.subitem_id ? (item.subitem_id).toString() : item.subitem_id;
this.position2Target_idMap[item.position] = item.target_id
})
})
form.setFieldsValue({
keys
});
@ -308,9 +308,9 @@ class EditableCourseSupportSetting extends Component {
// this.forceUpdate()
}, 3000)
}
render() {
const { getFieldDecorator, getFieldValue } = this.props.form;
@ -397,7 +397,7 @@ class EditableCourseSupportSetting extends Component {
message: "请先选择毕业要求指标点",
}],
})(
<Select
<Select
// mode="multiple"
// dropdownMatchSelectWidth={ false }
style={{ width: '100%', marginRight: 8 }}
@ -407,32 +407,32 @@ class EditableCourseSupportSetting extends Component {
{item.index} : {item.subitem_contents}
</Option> )
}) }
</Select>
)}
</span>
<span className="column-1 edu-txt-right">
{ !addOrDeleting && <a href="javascript:void(0)"
{ !addOrDeleting && <a href="javascript:void(0)"
onClick={() => { this.onRemove(k) }}
className="color-grey-c mr15" data-tip-down="删除">
<i className="iconfont icon-shanchu font-15"></i>
</a> }
{ !addOrDeleting && <a href="javascript:void(0)"
{ !addOrDeleting && <a href="javascript:void(0)"
onClick={() => { this.add(k, index + 1) }}
className="color-green show-FillTable"
className="color-green show-FillTable"
data-tip-down="添加">
<i className="iconfont icon-tianjiafangda"
></i>
</a> }
</span>
</Form.Item>
</li>
));
return (
<Form onSubmit={this.handleSubmit}>
<div className="ListTableLine" id="show-Target-table">
<p className="clearfix">
@ -443,15 +443,15 @@ class EditableCourseSupportSetting extends Component {
<span className="column-3">对应毕业要求指标点</span>
{ !addOrDeleting && <span className="column-1 edu-txt-right"
>
<a href="javascript:void(0)" className="color-green show-FillTable"
<a href="javascript:void(0)" className="color-green show-FillTable"
onClick={ () => { this.add(-1, 0) }} data-tip-down="添加">
<i className="iconfont icon-tianjiafangda"></i></a>
</span> }
</p>
</p>
{formItems}
</div>
{/* <Form.Item {...formItemLayoutWithOutLabel}>
<Button type="dashed" onClick={ () => { this.add(keys.length === 0 ? -1 : keys[keys.length - 1], keys.length - 1) }}
<Button type="dashed" onClick={ () => { this.add(keys.length === 0 ? -1 : keys[keys.length - 1], keys.length - 1) }}
style={{ width: '60%' }}>
<Icon type="plus" /> Add field
</Button>

@ -123,7 +123,7 @@ class EcStudentList extends Component {
console.log(error);
});
}
windowsgoblack=()=>{
window.history.go(-1)
@ -267,17 +267,17 @@ class EcStudentList extends Component {
Modallist: '确定删除这些学生吗?',
Modallisttype:true,
Modallisttypess:1
})
})
}else{
this.setState({
Modallist: '请选择学生!',
Modallisttype:true
})
})
}
};
//删除学生
deletelistbthenters=()=>{
debugger
let {Myschoolstudents,studentall} =this.state;
let major_id=this.props.match.params.majorId;
let year_id=this.props.match.params.yearId;

@ -668,7 +668,7 @@ class MemoDetail extends Component {
// --------------------------------------------------------------------------------------------帖子獎勵 END
showCommentInput = () => {
debugger
if (window.__useKindEditor === true) {
this.refs.editor.showEditor();
} else {

@ -469,7 +469,7 @@ class LoginDialog extends Component {
autologin:isGoingValue
}
).then((response) => {
debugger;
if(response===undefined){
return
}

@ -95,7 +95,7 @@ class SendTopics extends Component{
}catch (e) {
}
debugger
if(this.props.mysendall===true){
//详情页面跳过来的
try {
@ -119,7 +119,7 @@ debugger
}
}else{
//外部多个列表页跳过来的
debugger
try {
var rurls="";
if(this.props.category==="normal"){

@ -16,7 +16,7 @@ class PackageIndexNEIBanner extends Component {
}
onChange=(current)=>{
debugger
console.log('onChange:', current);
this.setState({ current });
};

@ -63,7 +63,7 @@ class PaperDeletModel extends Component {
}
NewknTypedeltyoedels=()=>{
debugger
if(this.state.newkntypeinput.length===0){
this.setState({
errorestit:'请输入知识点',

@ -475,7 +475,7 @@ class Comthetestpaperst extends Component {
//////console.log('Clicked! But prevent default.');
}
deletesobject = (item, index) => {
debugger
var tmp = this.state.Knowpoints;
for (var i = 0; i < tmp.length; i++) {
if (i ===index) {

@ -123,7 +123,7 @@ class Paperreview_item extends Component {
}
axios.post(url, data)
.then((result) => {
debugger
if (result.data.status == 0) {
// this.props.showNotification(`拖动成功`);
this.props.getdata();

@ -106,7 +106,7 @@ class Audit_situationComponent extends Component {
}
showModal = (id,status) => {
debugger
this.setState({
visible: true,
editid:id,

@ -97,7 +97,7 @@ class Newshixuns extends Component {
})
const mdContnet = this.contentMdRef.current.getValue().trim();
this.props.form.validateFieldsAndScroll((err, values) => {
debugger
if (!err) {
console.log('Received values of form: ', values);

@ -94,7 +94,7 @@ class LoginRegisterComponent extends Component {
}
//倒计时
getverificationcode = () => {
debugger
if(this.state.login === undefined || this.state.login.length===0){
this.openNotification("请输入手机号或邮箱");
return;

@ -352,7 +352,7 @@ class LoginRegisterComponent extends Component {
login: this.state.login,
password: this.state.password,
}).then((response) => {
debugger
if (response === undefined) {
return
}

@ -110,7 +110,7 @@ class NewGtaskForms extends Component{
}
handleSubmit = () => {
console.log(this.props)
let {contentFileList,min_num,max_num,base_on_project}=this.state;
let {data}=this.props;
let task_type=data.task_type

@ -1,22 +1,14 @@
import React, { useState, useEffect, useContext, useRef, memo } from 'react';
import {Link} from 'react-router-dom';
import React, { useContext } from 'react';
import { getUrl2, isDev, ThemeContext } from 'educoder'
import { ThemeContext } from 'educoder'
import { Modal } from 'antd'
function HeadlessModal (props) {
// const [ visible, setVisible ] = useState(false)
function HeadlessModal(props) {
const theme = useContext(ThemeContext);
const { category, visible, setVisible, className, width } = props;
useEffect(() => {
}, [])
const { visible, setVisible, className, width } = props;
return (
<Modal
<Modal
visible={visible}
className={`headless ${className}`}
title={null}
@ -48,7 +40,7 @@ function HeadlessModal (props) {
top: -13px;
}
`}</style>
<i className="iconfont icon-htmal5icon19 closeBtn" onClick={ () => setVisible(false) }></i>
<i className="iconfont icon-htmal5icon19 closeBtn" onClick={() => setVisible(false)}></i>
{props.children}
</Modal>
)

@ -10,6 +10,7 @@ import HeadlessModal from '../common/HeadlessModal'
import ClipboardJS from 'clipboard'
import VideoPlay from '../../../courses/Video/video-play';
import { logWatchHistory } from '../../../../services/video-service';
function useModal(initValue) {
const [visible, setVisible] = useState(initValue)
@ -219,32 +220,32 @@ function InfoVideo(props) {
}
function deleteVideo(item){
function deleteVideo(item) {
props.confirm({
content: '该视频将被删除,不可恢复',
subContent: '是否确认删除?',
onOk: () => {
const url = `/users/${user && user.login}/videos/${item.id}.json`;
axios.delete(url).then(result => {
if (result) {
props.showNotification(`视频删除成功!`);
if (pageObj.current === 1) {
if (categoryObj.category === 'all') {
fetchvideos()
} else {
fetchReviewvideos()
}
} else {
pageObj.onChange(1)
const url = `/users/${user && user.login}/videos/${item.id}.json`;
axios.delete(url).then(result => {
if (result) {
props.showNotification(`视频删除成功!`);
if (pageObj.current === 1) {
if (categoryObj.category === 'all') {
fetchvideos()
} else {
fetchReviewvideos()
}
} else {
pageObj.onChange(1)
}
}
}
}).catch(error => {
console.log(error);
})
}).catch(error => {
console.log(error);
})
},
onCancel() {
console.log('Cancel');
console.log('Cancel');
},
});
}
@ -267,7 +268,7 @@ function InfoVideo(props) {
className="showVideoModal"
width={800 - 1}
>
{videoModalObj.visible && <VideoPlay src={videoId.file_url} />}
{videoModalObj.visible && <VideoPlay src={videoId.file_url} videoId={videoId.videoId} logWatchHistory={logWatchHistory} />}
<div className="df copyLine">
<Input value={_inputValue}
className="dark"

@ -0,0 +1,11 @@
import axios from 'axios'
export async function logWatchHistory(params) {
try {
const response = await axios.post('/watch_video_histories.json', params)
return response.data.log_id
} catch (error) {
console.log(error)
}
return 0
}
Loading…
Cancel
Save