dev_aliyun2
harry 5 years ago
parent b6954f9308
commit fc2aff16e4

@ -1,7 +1,7 @@
import React, { Component } from 'react';
import { notification, Alert } from 'antd'
export function SnackbarHOC(options = {}) {
export default function SnackbarHOC(options = {}) {
return function wrap(WrappedComponent) {
return class Wrapper extends Component {
constructor(props) {

@ -2,21 +2,21 @@ import React, { Component } from 'react';
import { Modal } from 'antd';
export function ModalHOC(options = {}) {
export default function ModalHOC(options = {}) {
return function wrap(WrappedComponent) {
return class Wrapper extends Component {
constructor(props) {
super(props);
this.state = {
titlemessage: '',
Modallist: false,
Modallisttype: false,
singleButton: false
}
}
// 全局的modal this.props.showModal 调用即可
return class Wrapper extends Component {
constructor(props) {
super(props);
this.state = {
titlemessage: '',
Modallist: false,
Modallisttype: false,
singleButton: false
}
}
// 全局的modal this.props.showModal 调用即可
showModal = (title, content, okCallback) => {
this.okCallback = okCallback;
this.setState({
@ -39,55 +39,55 @@ export function ModalHOC(options = {}) {
onCancel = () => {
this.setState({
Modallisttype:false
})
Modallisttype: false
})
}
hidemodeldelete = () => {
hidemodeldelete = () => {
if (this.okCallback) {
this.okCallback()
}
this.onCancel()
}
render() {
const { titlemessage, Modallisttype, Modallist, singleButton } = this.state;
return (
<React.Fragment>
<Modal
keyboard={false}
title={titlemessage}
// visible={modeldelet===true&&listid===list.id?true:false}
visible={Modallisttype}
className={"ecmodeldelet"}
closable={false}
footer={null}
>
<div className="task-popup-content" >
<div className="task-popup-text-center font-14">{Modallist}</div>
</div>
{ singleButton ? <div className="task-popup-submit clearfix"
style={{ textAlign: 'center' }}>
<a className="task-btn task-btn-orange"
onClick={this.onCancel}
>知道啦</a>
</div> : <div className="task-popup-submit clearfix">
<a onClick={this.onCancel} className="task-btn fl">取消</a>
<a className="task-btn task-btn-orange fr"
onClick={this.hidemodeldelete}
>确定</a>
</div> }
</Modal>
<WrappedComponent {...this.props}
showModal={ this.showModal }
showSingleButtonModal={ this.showSingleButtonModal }
>
</WrappedComponent>
</React.Fragment>
)
}
}
}
render() {
const { titlemessage, Modallisttype, Modallist, singleButton } = this.state;
return (
<React.Fragment>
<Modal
keyboard={false}
title={titlemessage}
// visible={modeldelet===true&&listid===list.id?true:false}
visible={Modallisttype}
className={"ecmodeldelet"}
closable={false}
footer={null}
>
<div className="task-popup-content" >
<div className="task-popup-text-center font-14">{Modallist}</div>
</div>
{singleButton ? <div className="task-popup-submit clearfix"
style={{ textAlign: 'center' }}>
<a className="task-btn task-btn-orange"
onClick={this.onCancel}
>知道啦</a>
</div> : <div className="task-popup-submit clearfix">
<a onClick={this.onCancel} className="task-btn fl">取消</a>
<a className="task-btn task-btn-orange fr"
onClick={this.hidemodeldelete}
>确定</a>
</div>}
</Modal>
<WrappedComponent {...this.props}
showModal={this.showModal}
showSingleButtonModal={this.showSingleButtonModal}
>
</WrappedComponent>
</React.Fragment>
)
}
}
}
}

@ -0,0 +1,125 @@
import React, { Fragment } from 'react';
import { getUploadActionUrl, getUrl } from 'educoder';
import TPMMDEditor from '../modules/tpm/challengesnew/TPMMDEditor';
import moment from 'moment'
moment.defineLocale('zh-cn', {
months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
longDateFormat: {
LT: 'Ah点mm分',
LTS: 'Ah点m分s秒',
L: 'YYYY-MM-DD',
LL: 'YYYY年MMMD日',
LLL: 'YYYY年MMMD日Ah点mm分',
LLLL: 'YYYY年MMMD日ddddAh点mm分',
l: 'YYYY-MM-DD',
ll: 'YYYY年MMMD日',
lll: 'YYYY年MMMD日Ah点mm分',
llll: 'YYYY年MMMD日ddddAh点mm分'
},
meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
meridiemHour: function (hour, meridiem) {
if (hour === 12) {
hour = 0;
}
if (meridiem === '凌晨' || meridiem === '早上' ||
meridiem === '上午') {
return hour;
} else if (meridiem === '下午' || meridiem === '晚上') {
return hour + 12;
} else {
// ''
return hour >= 11 ? hour : hour + 12;
}
},
meridiem: function (hour, minute, isLower) {
var hm = hour * 100 + minute;
if (hm < 600) {
return '凌晨';
} else if (hm < 900) {
return '早上';
} else if (hm < 1130) {
return '上午';
} else if (hm < 1230) {
return '中午';
} else if (hm < 1800) {
return '下午';
} else {
return '晚上';
}
},
calendar: {
sameDay: function () {
return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';
},
nextDay: function () {
return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';
},
lastDay: function () {
return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';
},
nextWeek: function () {
var startOfWeek, prefix;
startOfWeek = moment().startOf('week');
prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
},
lastWeek: function () {
var startOfWeek, prefix;
startOfWeek = moment().startOf('week');
prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';
},
sameElse: 'LL'
},
ordinalParse: /\d{1,2}(日|月|周)/,
ordinal: function (number, period) {
switch (period) {
case 'd':
case 'D':
case 'DDD':
return number + '日';
case 'M':
return number + '月';
case 'w':
case 'W':
return number + '周';
default:
return number;
}
},
relativeTime: {
future: '%s内',
past: '%s前',
s: '几秒',
m: '1分钟',
mm: '%d分钟',
h: '1小时',
hh: '%d小时',
d: '1天',
dd: '%d天',
M: '1个月',
MM: '%d个月',
y: '1年',
yy: '%d年'
},
week: {
// GB/T 7408-1994··ISO 8601:1988
dow: 1, // Monday is the first day of the week.
doy: 4 // The week that contains Jan 4th is the first week of the year.
}
});
export default () => {
return (
<Fragment >
<p>{getUrl()}</p>
<p>{getUploadActionUrl()}</p>
<TPMMDEditor />
</Fragment>
)
}

@ -4,14 +4,7 @@ import './index.css'
import App from './App'
import * as serviceWorker from './serviceWorker'
import { configureUrlQuery } from 'react-url-query'
import history from './history'
// link the history used in our app to url-query so it can update the URL with it.
configureUrlQuery({ history })
window.__useKindEditor = false;
ReactDOM.render(<App />, document.getElementById('root'))
// If you want your app to work offline and load faster, you can change

@ -23,7 +23,7 @@ const $ = window.$
这里提供props给WrappedComponent用于封装特定的state和功能评论列表
不要直接使用this.xxx调用WrappedComponent内的方法尽量避免互相依赖封装好后供不同场景使用tpitpm
*/
export function commentHOC(WrappedComponent) {
export default function commentHOC(WrappedComponent) {
// 这里如果extends WrappedComponent 会出现 WrappedComponent mount twice的问题
return class II extends React.Component {
constructor(props) {
@ -604,21 +604,4 @@ export function commentHOC(WrappedComponent) {
)
}
}
}
/*
<div>
<h2>
HOC Debugger Component
</h2>
<p>
Props
</p>
<pre>{stringify(this.props)}</pre>
<p>
State
</p>
<pre>{stringify(this.state)}</pre>
{super.render()}
</div>
*/
}

@ -2,23 +2,23 @@ import React, { Component } from 'react';
import { notification } from 'antd'
import Modals from '../../modals/Modals'
export function CNotificationHOC(options = {}) {
return function wrap(WrappedComponent) {
export default function CNotificationHOC(options = {}) {
return function wrap(WrappedComponent) {
return class Wrapper extends Component {
constructor(props) {
super(props);
notification.config({
duration: 3,
});
this.state = {
dialogOpen: false,
defineOpen:false
defineOpen: false
}
}
showNotification = (description, message = "提示", icon) => {
showNotification = (description, message = "提示", icon) => {
// const data = {
// message,
// description
@ -28,22 +28,22 @@ export function CNotificationHOC(options = {}) {
// }
// notification.open(data);
notification.open({
message:message,
description: description,
style: {
zIndex: 99999999
},
});
notification.open({
message: message,
description: description,
style: {
zIndex: 99999999
},
});
}
bytesToSize = (bytes) => {
if (bytes === 0) return '0 B';
let k = 1024,
sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)). toFixed(2) + ' ' + sizes[i];
}
bytesToSize = (bytes) => {
if (bytes === 0) return '0 B';
let k = 1024,
sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toFixed(2) + ' ' + sizes[i];
}
configNotification = (placement) => {
placement && notification.config({
@ -51,19 +51,19 @@ export function CNotificationHOC(options = {}) {
});
}
getNowFormatDates=(val,type)=>{
getNowFormatDates = (val, type) => {
var date = new Date();
var seperator1 = "-";
var seperator2 = ":";
var month ;
var setnum=0;
if(val===1){
month= date.getMonth() + 1;
}else if(val===2){
month= date.getMonth() + 2;
}else{
month= date.getMonth() + 3;
var month;
var setnum = 0;
if (val === 1) {
month = date.getMonth() + 1;
} else if (val === 2) {
month = date.getMonth() + 2;
} else {
month = date.getMonth() + 3;
}
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
@ -73,29 +73,29 @@ export function CNotificationHOC(options = {}) {
strDate = "0" + strDate;
}
var min=date.getMinutes();
if(val===1){
var min = date.getMinutes();
if (val === 1) {
if (min >= 0 && min <= 9) {
min = "0" + min;
}
}else{
} else {
if (min >= 0) {
min = "00";
setnum=1;
setnum = 1;
}
}
let hour=date.getHours()+ setnum;
let hour = date.getHours() + setnum;
var currentdate;
if(type===1){
currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate+ " " + "00" + seperator2 + "00";
}else{
if(val===1){
currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate+ " " + date.getHours() + seperator2 + min;
}else{
currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate+ " " + hour + seperator2 + min;
if (type === 1) {
currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + "00" + seperator2 + "00";
} else {
if (val === 1) {
currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + date.getHours() + seperator2 + min;
} else {
currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + hour + seperator2 + min;
}
}
@ -106,11 +106,11 @@ export function CNotificationHOC(options = {}) {
confirm = (object) => {
const { title, content,subContent, onOk, onCancel, okText } = object;
const { title, content, subContent, onOk, onCancel, okText } = object;
this.onCancel = onCancel
this.onOk = onOk
this.okText = okText || '确定'
this.setState({ title, content , subContent , dialogOpen: true })
this.setState({ title, content, subContent, dialogOpen: true })
}
onDialogOkBtnClick = () => {
this.onOk && this.onOk();
@ -129,11 +129,11 @@ export function CNotificationHOC(options = {}) {
}
// 附件太大提示框
define = (object) =>{
define = (object) => {
const { title, content } = object;
this.setState({ title, content, defineOpen: true })
this.setState({ title, content, defineOpen: true })
}
onDialogdefineOkBtnClick = () =>{
onDialogdefineOkBtnClick = () => {
this.onCancel && this.onCancel();
this.setState({ defineOpen: false })
@ -141,9 +141,9 @@ export function CNotificationHOC(options = {}) {
this.onOk = null
}
render() {
const { snackbarOpen, snackbarText, snackbarHorizontal, snackbarVertical, dialogOpen, content ,subContent ,defineOpen } = this.state;
const { snackbarOpen, snackbarText, snackbarHorizontal, snackbarVertical, dialogOpen, content, subContent, defineOpen } = this.state;
return (
<React.Fragment>
<style>
@ -153,41 +153,41 @@ export function CNotificationHOC(options = {}) {
}
`}
</style>
<Modals
className="confirmModal"
modalsType={dialogOpen}
modalsTopval={
content
}
modalsBottomval={ subContent || "" }
modalCancel={this.handleDialogClose}
modalSave={this.onDialogOkBtnClick}
okText={this.okText}
>
</Modals>
<Modals
modalsType={defineOpen}
modalsTopval={
content
}
loadtype={true}
modalsBottomval={""}
modalCancel={undefined}
modalSave={this.onDialogdefineOkBtnClick}
>
</Modals>
<WrappedComponent {...this.props}
showNotification= { this.showNotification }
bytesToSize={this.bytesToSize}
getNowFormatDates={(value,type)=>this.getNowFormatDates(value,type)}
configNotification={ this.configNotification }
confirm={ this.confirm }
define={ this.define }
className="confirmModal"
modalsType={dialogOpen}
modalsTopval={
content
}
modalsBottomval={subContent || ""}
modalCancel={this.handleDialogClose}
modalSave={this.onDialogOkBtnClick}
okText={this.okText}
>
</Modals>
<Modals
modalsType={defineOpen}
modalsTopval={
content
}
loadtype={true}
modalsBottomval={""}
modalCancel={undefined}
modalSave={this.onDialogdefineOkBtnClick}
>
</Modals>
<WrappedComponent {...this.props}
showNotification={this.showNotification}
bytesToSize={this.bytesToSize}
getNowFormatDates={(value, type) => this.getNowFormatDates(value, type)}
configNotification={this.configNotification}
confirm={this.confirm}
define={this.define}
>
</WrappedComponent>
</React.Fragment>
)
}
}
}
}
}

@ -2,21 +2,21 @@ import React, { Component } from 'react';
import { Modal } from 'antd';
export function ECModalHOC(options = {}) {
export default function ECModalHOC(options = {}) {
return function wrap(WrappedComponent) {
return class Wrapper extends Component {
constructor(props) {
super(props);
this.state = {
titlemessage: '',
Modallist: false,
Modallisttype: false,
singleButton: false
}
}
return class Wrapper extends Component {
constructor(props) {
super(props);
// 全局的modal this.props.showModal 调用即可
this.state = {
titlemessage: '',
Modallist: false,
Modallisttype: false,
singleButton: false
}
}
// 全局的modal this.props.showModal 调用即可
showModal = (title, content, okCallback) => {
this.okCallback = okCallback;
this.setState({
@ -39,53 +39,53 @@ export function ECModalHOC(options = {}) {
onCancel = () => {
this.setState({
Modallisttype:false
})
Modallisttype: false
})
}
hidemodeldelete = () => {
hidemodeldelete = () => {
if (this.okCallback) {
this.okCallback()
}
this.onCancel()
}
render() {
const { titlemessage, Modallisttype, Modallist, singleButton } = this.state;
return (
<React.Fragment>
<Modal
title={titlemessage}
// visible={modeldelet===true&&listid===list.id?true:false}
visible={Modallisttype}
className={"ecmodeldelet"}
closable={false}
footer={null}
>
<div className="task-popup-content" >
<div className="task-popup-text-center font-14">{Modallist}</div>
</div>
{ singleButton ? <div className="task-popup-submit clearfix"
style={{ textAlign: 'center' }}>
<a className="task-btn task-btn-orange"
onClick={this.onCancel}
>知道啦</a>
</div> : <div className="task-popup-submit clearfix">
<a onClick={this.onCancel} className="task-btn fl">取消</a>
<a className="task-btn task-btn-orange fr"
onClick={this.hidemodeldelete}
>确定</a>
</div> }
</Modal>
<WrappedComponent {...this.props}
showModal={ this.showModal }
showSingleButtonModal={ this.showSingleButtonModal }
>
</WrappedComponent>
</React.Fragment>
)
}
}
}
render() {
const { titlemessage, Modallisttype, Modallist, singleButton } = this.state;
return (
<React.Fragment>
<Modal
title={titlemessage}
// visible={modeldelet===true&&listid===list.id?true:false}
visible={Modallisttype}
className={"ecmodeldelet"}
closable={false}
footer={null}
>
<div className="task-popup-content" >
<div className="task-popup-text-center font-14">{Modallist}</div>
</div>
{singleButton ? <div className="task-popup-submit clearfix"
style={{ textAlign: 'center' }}>
<a className="task-btn task-btn-orange"
onClick={this.onCancel}
>知道啦</a>
</div> : <div className="task-popup-submit clearfix">
<a onClick={this.onCancel} className="task-btn fl">取消</a>
<a className="task-btn task-btn-orange fr"
onClick={this.hidemodeldelete}
>确定</a>
</div>}
</Modal>
<WrappedComponent {...this.props}
showModal={this.showModal}
showSingleButtonModal={this.showSingleButtonModal}
>
</WrappedComponent>
</React.Fragment>
)
}
}
}
}

@ -1,33 +1,14 @@
import React, { Component } from 'react';
import moment from 'moment'
import EditableCourseSupportSetting from './EditableCourseSupportSetting'
import ShowTableCourseSupportSetting from './ShowTableCourseSupportSetting'
import { Form, Input, Icon, Button, Select } from 'antd';
// import EcTitleCourseEvaluations from '../ecTitle/ecTitle'
import { SnackbarHOC, getUrl } from 'educoder'
import { SnackbarHOC } from 'educoder'
import axios from 'axios'
import 'antd/dist/antd.css';
// import '../css/ecCourseEvaluations.css'
import './style.less'
import { ECModalHOC } from '../../common/ECModalHOC'
const { Option } = Select;
// TODO 公共方法 或 抽取到顶层组件
let _url_origin = getUrl()
const $ = window.$
// https://www.educoder.net/stylesheets/educoder/edu-all.css?1546618720
// if (!window['EcCourseSupportSettingLoaded']) {
// $('head').append( $('<link rel="stylesheet" type="text/css" />')
// .attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?1525440977`) );
// window['EcCourseSupportSettingLoaded'] = true
// }
class EcCourseSupportSetting extends Component {
constructor(props) {
@ -152,10 +133,6 @@ class EcCourseSupportSetting extends Component {
console.log(error);
});
// test data
// this.setState({ ...fake_data })
}
getNavigationData = (ec_course_id) => {
return;

@ -22,7 +22,7 @@ function urlStringify(params) {
paramsUrl = paramsUrl.substring(0, paramsUrl.length - 1);
return paramsUrl;
}
export function postPaginationHOC(options = {}) {
export default function postPaginationHOC(options = {}) {
// options.isMyPublish
return function wrap(WrappedComponent) {

@ -2,13 +2,13 @@ import React, { Component } from 'react';
import ImageLayer from './ImageLayer'
import { isImageExtension } from 'educoder'
const $ = window.$;
export function ImageLayerOfCommentHOC(options = {}) {
return function wrap(WrappedComponent) {
export default function ImageLayerOfCommentHOC(options = {}) {
return function wrap(WrappedComponent) {
return class Wrapper extends Component {
constructor(props) {
super(props);
this.state = {
showImage: false,
imageSrc: ''
@ -21,8 +21,8 @@ export function ImageLayerOfCommentHOC(options = {}) {
const fileName = event.target.innerHTML.trim()
if (isImageExtension(imageSrc.trim()) || isImageExtension(fileName) || event.target.tagName == 'IMG') {
// 非回复里的头像图片; 非emoticons
if (imageSrc.indexOf('/images/avatars/User') === -1 &&
imageSrc.indexOf('kindeditor/plugins/emoticons') === -1 ) {
if (imageSrc.indexOf('/images/avatars/User') === -1 &&
imageSrc.indexOf('kindeditor/plugins/emoticons') === -1) {
this.setState({
showImage: true,
imageSrc,
@ -38,20 +38,20 @@ export function ImageLayerOfCommentHOC(options = {}) {
}
// jQuery._data( $('.newMain')[0], "events" )
componentDidMount() {
componentDidMount() {
this.props.wrappedComponentRef && this.props.wrappedComponentRef(this.refs['wrappedComponentRef'])
// commentsDelegateParent #game_left_contents #tab_con_4
setTimeout(() => {
$(options.parentSelector || ".commentsDelegateParent")
.delegate(options.imgSelector || ".J_Comment_Reply .comment_content img, .J_Comment_Reply .childrenCommentsView img","click", this.onDelegateClick);
.delegate(options.imgSelector || ".J_Comment_Reply .comment_content img, .J_Comment_Reply .childrenCommentsView img", "click", this.onDelegateClick);
}, 1200)
}
componentWillUnmount() {
$(options.parentSelector || ".commentsDelegateParent", 'click', this.onDelegateClick)
}
onImageLayerClose = () => {
this.setState({
showImage: false,
@ -59,23 +59,23 @@ export function ImageLayerOfCommentHOC(options = {}) {
})
}
MdifHasAnchorJustScorll=()=>{
//mdhash滚动
let anchor = decodeURI(this.props.location.hash).replace('#', '');
// 对应id的话, 滚动到相应位置
if (!!anchor) {
let anchorElement = document.getElementsByName(anchor);
if (anchorElement) {
if (anchorElement.length!=0) {
anchorElement[anchorElement.length-1].scrollIntoView();
}
}
}
}
MdifHasAnchorJustScorll = () => {
//mdhash滚动
let anchor = decodeURI(this.props.location.hash).replace('#', '');
// 对应id的话, 滚动到相应位置
if (!!anchor) {
let anchorElement = document.getElementsByName(anchor);
if (anchorElement) {
if (anchorElement.length != 0) {
anchorElement[anchorElement.length - 1].scrollIntoView();
}
}
}
}
render() {
this.MdifHasAnchorJustScorll();
this.MdifHasAnchorJustScorll();
return (
<React.Fragment>
<ImageLayer {...this.state} onImageLayerClose={this.onImageLayerClose}></ImageLayer>
@ -86,5 +86,5 @@ export function ImageLayerOfCommentHOC(options = {}) {
)
}
}
}
}
}

@ -11,8 +11,6 @@ import LoginDialog from '../login/LoginDialog';
import AccountProfile from '../user/AccountProfile';
import AccountPhoneemail from '../user/AccountPhoneemail';
import { broadcastChannelOnmessage } from 'educoder';
const $ = window.$;
let _url_origin = '';
@ -37,7 +35,7 @@ if (!window['indexHOCLoaded']) {
}
// TODO css加载完成后再打开页面行为和tpm其他页面一致
export function TPMIndexHOC(WrappedComponent) {
export default function TPMIndexHOC(WrappedComponent) {
// 这里如果extends WrappedComponent 会出现 WrappedComponent mount twice的问题
return class II extends React.Component {
constructor(props) {

Loading…
Cancel
Save