forked from Gitlink/forgeplus-react
277 lines
8.1 KiB
JavaScript
277 lines
8.1 KiB
JavaScript
|
|
import React, { PureComponent } from 'react';
|
|||
|
|
|
|||
|
|
import {appendFileSizeToUploadFileAll ,appendFileSizeToUploadFile} from 'educoder';
|
|||
|
|
import { Form , Input , Upload ,Button , Select , Icon , message } from "antd";
|
|||
|
|
import './post.css'
|
|||
|
|
import '../exchange.css'
|
|||
|
|
|
|||
|
|
import axios from 'axios';
|
|||
|
|
|
|||
|
|
import MDEditor from '../../common/MDEditor';
|
|||
|
|
|
|||
|
|
const Option = Select.Option;
|
|||
|
|
const uploadButton = (
|
|||
|
|
<div>
|
|||
|
|
<i className="iconfont icon-tianjia mb30"></i>
|
|||
|
|
<div className="font-16 mb10">点击上传封面</div>
|
|||
|
|
<p className="font-12">只支持JPG、PNG、JPEG大小不超过2M建议尺寸4:3</p>
|
|||
|
|
</div>
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
function getBase64(img, callback) {
|
|||
|
|
debugger;
|
|||
|
|
const reader = new FileReader();
|
|||
|
|
reader.addEventListener('load', () => callback(reader.result));
|
|||
|
|
reader.readAsDataURL(img);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class New extends PureComponent{
|
|||
|
|
constructor(props){
|
|||
|
|
super(props);
|
|||
|
|
this.contentMdRef = React.createRef();
|
|||
|
|
this.state={
|
|||
|
|
// 封面图
|
|||
|
|
imageUrl:undefined,
|
|||
|
|
// 大板块下拉选项
|
|||
|
|
memo_type:undefined,
|
|||
|
|
// 小板块
|
|||
|
|
smallOption:undefined,
|
|||
|
|
// 附件列表
|
|||
|
|
contentFileList:undefined,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
componentDidMount = () =>{
|
|||
|
|
this.getInfo();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取信息
|
|||
|
|
getInfo = () =>{
|
|||
|
|
let url = '/memos/new';
|
|||
|
|
axios.get((url)).then((result)=>{
|
|||
|
|
if(result){
|
|||
|
|
this.setState({
|
|||
|
|
memo_type:result.data.memo_type
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}).catch((error)=>{
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
changeUploadImage =(info)=>{
|
|||
|
|
if (info.file.status === 'done') {
|
|||
|
|
// Get this url from response in real world.
|
|||
|
|
getBase64(info.file.originFileObj, imageUrl =>
|
|||
|
|
this.setState({
|
|||
|
|
imageUrl
|
|||
|
|
}),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 切换大板块
|
|||
|
|
changeLargeOption=(value)=>{
|
|||
|
|
// console.log(value);
|
|||
|
|
const { memo_type } = this.state;
|
|||
|
|
let list = memo_type.filter((item=> item.id === value))[0].children_tags;
|
|||
|
|
// console.log(list);
|
|||
|
|
this.setState({
|
|||
|
|
smallOption:list && list.map(item=>{
|
|||
|
|
return(
|
|||
|
|
<Option value={item.id}>{item.title}</Option>
|
|||
|
|
)
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提交
|
|||
|
|
handleSubmit=()=>{
|
|||
|
|
this.props.form.validateFieldsAndScroll((err, values) => {
|
|||
|
|
console.log(values);
|
|||
|
|
if(!err){
|
|||
|
|
let url=`/memos.json`;
|
|||
|
|
axios.post((url),{
|
|||
|
|
forum_id:values.bigPlate,
|
|||
|
|
children_forum_id:values.smallPlate,
|
|||
|
|
memo:{
|
|||
|
|
subject:values.title,
|
|||
|
|
content:values.description
|
|||
|
|
}
|
|||
|
|
}).then(result=>{
|
|||
|
|
if(result){
|
|||
|
|
this.props.showNotification(result.data.message);
|
|||
|
|
this.props.history.push(`/forums/${result.data && result.data.memo_id}`);
|
|||
|
|
}
|
|||
|
|
}).catch(error=>{
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 上传附件
|
|||
|
|
handleContentUploadChange = (info) => {
|
|||
|
|
console.log("changeFIle==================>",info);
|
|||
|
|
if (info.file.status === 'done' || info.file.status === 'uploading' || info.file.status === 'removed') {
|
|||
|
|
let contentFileList = info.fileList;
|
|||
|
|
this.setState({ contentFileList: appendFileSizeToUploadFileAll(contentFileList)});
|
|||
|
|
let list = appendFileSizeToUploadFileAll(contentFileList);
|
|||
|
|
let arr = list.map(item=>{
|
|||
|
|
return ( item.response && item.response.id )
|
|||
|
|
})
|
|||
|
|
this.setState({
|
|||
|
|
filesID:arr,
|
|||
|
|
checkFile:arr.length > 0 ? false : true
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 上传附件-删除确认框
|
|||
|
|
onAttachmentRemove = (file, stateName) => {
|
|||
|
|
if(!file.percent || file.percent == 100){
|
|||
|
|
this.props.confirm({
|
|||
|
|
content: '是否确认删除?',
|
|||
|
|
onOk: () => {
|
|||
|
|
this.deleteAttachment(file, stateName)
|
|||
|
|
},
|
|||
|
|
onCancel() {
|
|||
|
|
console.log('Cancel');
|
|||
|
|
},
|
|||
|
|
});
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deleteAttachment=(file,list)=>{
|
|||
|
|
console.log("delete===============>",file)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
render(){
|
|||
|
|
const { getFieldDecorator } = this.props.form;
|
|||
|
|
|
|||
|
|
/** 上传封面图 */
|
|||
|
|
let { imageUrl , memo_type , smallOption , contentFileList } = this.state;
|
|||
|
|
|
|||
|
|
const largeOption = memo_type && memo_type.length > 0 && memo_type.map(item=>{
|
|||
|
|
return(
|
|||
|
|
<Option value={item.id}>{item.name}</Option>
|
|||
|
|
)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
let uploadImg = ( imageUrl ? <img src={imageUrl} alt="avatar" style={{ width: '100%' }} /> : uploadButton )
|
|||
|
|
|
|||
|
|
// 上传封面图
|
|||
|
|
const uploadCover = {
|
|||
|
|
listType:"picture-card",
|
|||
|
|
className:"avatar-uploader",
|
|||
|
|
showUploadList:false,
|
|||
|
|
action:`/uploads.js`,
|
|||
|
|
data: { attachment_id: 1 },
|
|||
|
|
onChange:this.changeUploadImage,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**上传附件 */
|
|||
|
|
const uploadProps = {
|
|||
|
|
width: 600,
|
|||
|
|
fileList: contentFileList,
|
|||
|
|
multiple: true,
|
|||
|
|
action: 'http://127.0.0.1:3000/uploads.js',
|
|||
|
|
onChange: this.handleContentUploadChange,
|
|||
|
|
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
|
|||
|
|
beforeUpload: (file) => {
|
|||
|
|
console.log('beforeUpload', file.name);
|
|||
|
|
const isLt150M = file.size / 1024 / 1024 < 150;
|
|||
|
|
if (!isLt150M) {
|
|||
|
|
this.props.showNotification('文件大小必须小于150MB!');
|
|||
|
|
}
|
|||
|
|
return isLt150M;
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
return(
|
|||
|
|
<div className="educontent-min">
|
|||
|
|
<p className="font-22 color-grey3 mt30 mb10">新建</p>
|
|||
|
|
<div className="bc-white padding30">
|
|||
|
|
<Form className="postNewform">
|
|||
|
|
|
|||
|
|
<Form.Item
|
|||
|
|
label="标题"
|
|||
|
|
>
|
|||
|
|
{getFieldDecorator('title', {
|
|||
|
|
rules: [{
|
|||
|
|
required: true, message: '请输入帖子标题',
|
|||
|
|
},{
|
|||
|
|
max: 5000 , message:'最大限制60个字符'
|
|||
|
|
}],
|
|||
|
|
})(
|
|||
|
|
<Input placeholder="请输入标题,最大限制60个字符" maxLength="60" style={{height:"40px"}}/>
|
|||
|
|
)}
|
|||
|
|
</Form.Item>
|
|||
|
|
<Form.Item label="内容" className="editorFromItem">
|
|||
|
|
{getFieldDecorator('description', {
|
|||
|
|
rules: [{
|
|||
|
|
required: true, message: '请输入帖子内容',
|
|||
|
|
},{
|
|||
|
|
max: 5000 , message:'最大限制5000个字符'
|
|||
|
|
}],
|
|||
|
|
})(
|
|||
|
|
<MDEditor ref={this.contentMdRef} placeholder="请输入内容,最大限制5000字符" mdID={'courseContentMD'} refreshTimeout={1000}
|
|||
|
|
initValue={""} className="courseMessageMD" ></MDEditor>
|
|||
|
|
)}
|
|||
|
|
</Form.Item>
|
|||
|
|
<Upload {...uploadProps} className="upload_1 newPostUpload">
|
|||
|
|
<Button className="uploadBtn">
|
|||
|
|
<i className="iconfont icon-fabu font-22 color-blue fl mr10"></i> 上传附件
|
|||
|
|
</Button>
|
|||
|
|
</Upload>
|
|||
|
|
<div className="df mt10">
|
|||
|
|
<Form.Item label="主题板块">
|
|||
|
|
{
|
|||
|
|
getFieldDecorator('bigPlate',{
|
|||
|
|
rules:[{
|
|||
|
|
required:true,message:'请选择大板块'
|
|||
|
|
}]
|
|||
|
|
})(
|
|||
|
|
<Select className="selectItem" onChange={this.changeLargeOption}>
|
|||
|
|
{ largeOption }
|
|||
|
|
</Select>
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
</Form.Item>
|
|||
|
|
<Form.Item label="">
|
|||
|
|
{
|
|||
|
|
getFieldDecorator('smallPlate',{
|
|||
|
|
rules:[{
|
|||
|
|
required:true,message:'请选择小板块'
|
|||
|
|
}]
|
|||
|
|
})(
|
|||
|
|
<Select className="selectItem">
|
|||
|
|
{ smallOption }
|
|||
|
|
</Select>
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
</Form.Item>
|
|||
|
|
</div>
|
|||
|
|
<div className="df uploadImageBox">
|
|||
|
|
<label className="new_label">上传封面:</label>
|
|||
|
|
<Upload {...uploadCover}>
|
|||
|
|
{uploadImg}
|
|||
|
|
</Upload>
|
|||
|
|
</div>
|
|||
|
|
</Form>
|
|||
|
|
</div>
|
|||
|
|
<p className="clearfix mt20 mb50 edu-txt-center">
|
|||
|
|
<span className="inline">
|
|||
|
|
<a className="defalutCancelbtn fl mr20">取消</a>
|
|||
|
|
<Button type="primary" onClick={this.handleSubmit} className="defalutSubmitbtn fl mr20">提交</Button>
|
|||
|
|
</span>
|
|||
|
|
</p>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const WrappedNewPostForm = Form.create({ name: 'New' })(New);
|
|||
|
|
export default WrappedNewPostForm;
|