import React, { Component } from 'react';
// import { Link } from 'react-router-dom';
import './index.less';
import { Icon, Checkbox } from 'antd';
import Page from '@src/containers/Page';
import Assets from '@src/components/Assets';
import { timeRange, getMap, formatMonth, formatDate, formatSeconds } from '@src/services/Tools';
import UserLayout from '../../../layouts/User';
import UserTable from '../../../components/UserTable';
import UserAction from '../../../components/UserAction';
import { RealAuth, QuestionNoteModal } from '../../../components/OtherModal';
import Examination from '../../../components/Examination';
import VipRenew from '../../../components/VipRenew';
import menu, { refreshQuestionType } from '../index';
import Tabs from '../../../components/Tabs';
import Modal from '../../../components/Modal';
import Select from '../../../components/Select';
import GIcon from '../../../components/Icon';
import { TimeRange, QuestionType, PrepareStatus, ExperiencePercent } from '../../../../Constant';
import { My } from '../../../stores/my';
import { Question } from '../../../stores/question';
const QuestionTypeMap = getMap(QuestionType, 'value', 'label');
const PrepareStatusMap = getMap(PrepareStatus, 'value', 'short');
const ExperiencePercentMap = getMap(ExperiencePercent, 'value', 'label');
const exportType = [
{ key: 'question', title: '题目' },
{ key: 'official', title: '官方解析' },
{ key: 'note', title: '我的笔记' },
// { key: 'qx', title: '千行解析', auth: true },
// { key: 'association', title: '题源联想', auth: true },
// { key: 'qa', title: '相关问答', auth: true },
];
export default class extends Page {
constructor(props) {
props.size = 10;
super(props);
}
initState() {
return {
tab: 'question',
module: 'exercise',
timerange: 'all',
filterMap: {},
sortMap: {},
list: [],
selectList: [],
allChecked: false,
showDetail: false,
defaultSortMap: { collect_time: 'desc' },
};
}
init() {
this.columns = [
{
key: 'question_type',
title: '题型',
width: 115,
render: (text, record) => {
return QuestionTypeMap[record.questionType];
},
fixSort: true,
},
{
key: 'title',
title: '题目ID',
width: 100,
fixSort: true,
render: (text, record) => {
return {text};
},
},
{
key: 'description',
title: '内容',
width: 180,
render: (text) => {
return
{text}
;
},
},
{
key: 'time',
title: '耗时',
width: 100,
sort: true,
render: (text, record) => {
const user = record.stat ? record.stat.userTime / record.stat.userNumber : 0;
const all = record.questionNo.totalNumber ? record.questionNo.totalTime / record.questionNo.totalNumber : 0;
return
{user > 0 ? formatSeconds(user) : '-'}{user > 0 &&
all ? 'up' : 'down'} />}
全站{all > 0 ? formatSeconds(all) : '-'}
;
},
},
{
key: 'update_time',
title: '更新时间',
width: 105,
sort: true,
render: (text) => {
return
{text.split(' ')[0]}
{text.split(' ')[1]}
;
},
},
{
key: 'collect_time',
title: '收藏时间',
width: 105,
sort: true,
render: (text) => {
return
{text.split(' ')[0]}
{text.split(' ')[1]}
;
},
},
{
key: '',
title: '',
render: (text, record, index) => {
return this.note(index)} />
;
},
},
];
}
initData() {
const data = Object.assign(this.state, this.state.search);
data.filterMap = this.state.search;
if (data.order) {
data.sortMap = { [data.order]: data.direction };
} else if (data.order !== null && data.order !== '') {
data.sortMap = Object.assign({}, this.state.defaultSortMap);
}
if (data.timerange) {
data.filterMap.timerange = data.timerange;
}
switch (data.tab) {
case 'question':
return this.refreshQuestion(data);
case 'article':
return this.refreshArticle(data);
default:
return null;
}
}
refreshQuestion(data) {
const [startTime, endTime] = timeRange(data.timerange);
refreshQuestionType(this, data.subject, data.questionType, {
all: true,
needSentence: data.module !== 'examination',
allSubject: true,
}).then(({ questionTypes, selectSentence }) => {
const moduleSelect = [{ title: '练习', key: 'exercise' }];
if (!selectSentence) {
moduleSelect.push({ title: '模考', key: 'examination' });
}
this.setState({ moduleSelect });
My.listQuestionCollect(
Object.assign(
{ module: data.module, questionTypes, startTime, endTime },
this.state.search,
{
order: Object.keys(data.sortMap)
.map(key => {
if (key === 'title') return 'pid asc, no asc';
return `${key} ${data.sortMap[key]}`;
})
.join(','),
},
),
).then(result => {
result.list = result.list.map(row => {
row.questionNo = row.questionNo || {};
row.key = row.questionNoId;
row.questionType = row.question.questionType;
row.title = row.questionNo.title;
row.description = row.question.description;
row.latest_time = row.latestTime ? formatDate(row.latestTime, 'YYYY-MM-DD HH:mm:ss') : '';
row.collect_time = row.createTime ? formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss') : '';
row.update_time = row.question.updateTime ? formatDate(row.question.updateTime, 'YYYY-MM-DD HH:mm:ss') : '';
return row;
});
const { selectList, allChecked, selectPage } = this.updateSelectInfo(data.page, result.list);
this.setState({ list: result.list, total: result.total, selectList, allChecked, selectPage });
});
});
}
updateSelectInfo(page, list, selectList = null) {
const { selectPage = {} } = this.state;
let allChecked = false;
if (selectList == null) {
selectList = [];
if (selectPage[Number(page)]) {
selectList = selectPage[Number(page)];
}
} else {
selectPage[Number(page)] = selectList;
}
allChecked = list.filter(row => selectList.indexOf(row.key) >= 0).length === list.length && list.length > 0;
return { selectList, allChecked, selectPage };
}
refreshArticle(data) {
const [startTime, endTime] = timeRange(data.timerange);
My.listExperienceCollect(Object.assign({ startTime, endTime }, this.state.search)).then(result => {
this.setState({ list: result.list, total: result.total });
});
}
note(index) {
const { list } = this.state;
const userQuestion = list[index];
const { questionNo } = userQuestion;
My.getQuestionNote(questionNo.id)
.then(result => {
this.setState({ questionNo, note: result || {}, showNote: true, index });
});
}
onTabChange(tab) {
const data = { tab };
this.refreshQuery(data);
}
onFilter(value) {
this.search(value, false);
this.initData();
}
onSearch(value) {
this.search({ page: 1, keyword: value }, false);
this.initData();
}
onSort(value) {
const keys = Object.keys(value);
const { sortMap, defaultSortMap } = this.state;
const index = keys.length > 1 && sortMap[keys[0]] ? 1 : 0;
let order = keys.length && value[keys[index]] ? keys[index] : null;
let direction = keys.length ? value[keys[index]] : null;
if (order == null) {
const [prevOrder] = Object.keys(sortMap);
console.log(prevOrder, defaultSortMap[prevOrder]);
if (!defaultSortMap[prevOrder]) {
[order] = Object.keys(defaultSortMap);
direction = defaultSortMap[order];
}
}
this.search({ order, direction }, false);
this.initData();
}
onChangePage(page) {
this.search({ page }, false);
this.initData();
}
onAll(checked) {
const { selectPage = {}, search = {} } = this.state;
let { selectList } = this.state;
const { page } = search;
const { list = [] } = this.state;
if (checked) {
list.forEach(item => {
if (selectList.indexOf(item.key) >= 0) return;
selectList.push(item.key);
});
selectPage[Number(page)] = selectList;
} else {
selectList = [];
delete selectPage[Number(page)];
}
this.setState({ selectList, selectPage, allChecked: checked });
}
onSelect(slist) {
const { search = {}, list } = this.state;
const { selectList, allChecked, selectPage } = this.updateSelectInfo(search.page, list, slist);
this.setState({ selectList, allChecked, selectPage });
}
onAction(key) {
const { info } = this.props.user;
const { selectPage = {} } = this.state;
const selectList = [].concat(...Object.values(selectPage).concat());
switch (key) {
case 'help':
this.setState({ showTips: true });
return;
case 'clear':
if (selectList.length === 0) {
this.setState({ showWarn: true, warn: { title: '移除', content: '不可少于1题,请重新选择' } });
return;
}
this.setState({ showClearConfirm: true, clearInfo: { questionNoIds: selectList } });
break;
case 'group':
if (!info.vip) {
this.setState({ showVip: true });
return;
}
if (selectList.length < 10) {
this.setState({ showWarn: true, warn: { title: '组卷练习', content: '不可小于10题,请重新选择' } });
return;
}
if (selectList.length > 50) {
this.setState({ showWarn: true, warn: { title: '组卷练习', content: '不可多余50题,请重新选择' } });
return;
}
if (selectList.length === 0) {
this.setState({ showWarn: true, warn: { title: '组卷练习', content: '不可同时选中语文题和数学题,请重新选择。' } });
return;
}
this.setState({ showGroupConfirm: true, groupInfo: { questionNoIds: selectList, filterTimes: 2, checked: true } });
break;
case 'export':
if (!info.vip) {
this.setState({ showVip: true });
return;
}
if (selectList.length < 1) {
this.setState({ showWarn: true, warn: { title: '导出', content: '不可小于1题,请重新选择' } });
return;
}
if (selectList.length > 100) {
this.setState({ showWarn: true, warn: { title: '导出', content: '不可多余100题,请重新选择' } });
return;
}
// if (info.bindReal) {
this.setState({ showExportConfirm: true, exportInfo: { include: exportType.map(row => row.key), questionNoIds: selectList } });
// } else {
// this.setState({ showExportAuthConfirm: true, exportInfo: { include: exportType.filter(row => !row.auth).map(row => row.key), questionNoIds: selectList } });
// }
break;
default:
}
}
clearCollectQuestion() {
const { clearInfo } = this.state;
My.clearQuestionCollect(clearInfo.questionNoIds)
.then(() => {
this.refresh();
})
.catch(e => {
this.setState({ showWarn: true, warn: { title: '移除', content: e.message }, showClearConfirm: false });
});
}
group() {
const { groupInfo } = this.state;
My.groupQuestionCollect(groupInfo)
.then((result) => {
Question.startLink('collect', result);
this.setState({ showGroupConfirm: false });
})
.catch(e => {
this.setState({ showWarn: true, warn: { title: '组卷练习', content: e.message }, showGroupConfirm: false });
});
}
export() {
const { exportInfo } = this.state;
this.setState({ showExportWait: true, showExportConfirm: false, showExportAuthConfirm: false });
My.exportQuestionCollect(exportInfo)
.then((result) => {
openLink(`/export/${result}`);
this.setState({ showExportWait: false });
})
.catch(e => {
this.setState({ showWarn: true, warn: { title: '导出', content: e.message }, showExportWait: false });
});
}
collectArticle(row, checked) {
if (checked) {
My.addExperienceCollect(row.id).then(() => {
this.refresh();
});
} else {
My.delExperienceCollect(row.id).then(() => {
this.refresh();
});
}
}
prevArticle() {
const { list, article } = this.state;
let index = -1;
list.forEach((row, i) => {
if (row.id === article.id) {
index = i;
}
});
if (index === 0) return;
this.setState({ article: list[index - 1] });
}
nextArticle() {
const { list, article } = this.state;
let index = -1;
list.forEach((row, i) => {
if (row.id === article.id) {
index = i;
}
});
if (index === list.length - 1) return;
this.setState({ article: list[index + 1] });
}
renderView() {
const { config } = this.props;
return ;
}
renderTable() {
const { tab } = this.state;
return (
this.onTabChange(key)}
/>
{this[`renderTab${tab}`]()}
{this.renderModal()}
);
}
renderTabquestion() {
const { info } = this.props.user;
const {
questionSubjectSelect,
questionSubjectMap = {},
moduleSelect,
filterMap = {},
sortMap = {},
list = [],
} = this.state;
const { selectList = [], allChecked, page, total } = this.state;
return (
this.onFilter(value)}
onSearch={value => this.onSearch(value)}
/>
this.onAll(checked)}
onAction={key => this.onAction(key)}
/>
this.onSelect(l)}
onSort={v => this.onSort(v)}
onChange={p => this.onChangePage(p)}
/>
);
}
renderTabarticle() {
const { filterMap = {}, sortMap = {}, list = [] } = this.state;
return (
this.onFilter(value)}
onSort={value => this.onSort(value)}
/>
{list.map(item => {
return this.setState({ showDetail: true, article: item })} onUnCollect={() => this.collectArticle(item, false)} />;
})}
);
}
renderModal() {
const { article = {}, showTips, showWarn, warn = {}, showClearConfirm, clearInfo = {}, showGroupConfirm, groupInfo = {}, showExportConfirm, showExportAuthConfirm, exportInfo = {}, showExportWait, showExamination, showVip, showReal, showNote, note = {}, questionNo = {}, list } = this.state;
const { info } = this.props.user;
return [
this.setState({ showDetail: false })} onPrev={() => this.prevArticle()} onNext={() => this.nextArticle()} />,
this.setState({ showTips: false })}>
组卷功能
操作数量:10-50;
注意事项:可跨题型、不可跨学科。
导出功能
操作数量:1-100;
注意事项:“综合推理IR”暂时无法导出。
*您可点击
查阅以上信息。
,
this.setState({ showWarn: false })}>
{warn.content}
,
this.group()} onCancel={() => this.setState({ showGroupConfirm: false })}>
您共选择了 {groupInfo.questionNoIds ? groupInfo.questionNoIds.length : 0} 道题目,是否开始练习?
{
groupInfo.checked = !groupInfo.checked;
this.setState({ groupInfo });
}} />
剔除已组卷练习
,
this.clearCollectQuestion()} onCancel={() => this.setState({ showClearConfirm: false })}>
当前选中的 {clearInfo.questionNoIds ? clearInfo.questionNoIds.length : 0} 道题即将被移出收藏,移出后无法恢复,是否继续?
,
this.setState({ showExportWait: false })}>
正在导出中,请不要关闭当前页面!
,
this.export()} onCancel={() => this.setState({ showExportConfirm: false })}>
当前共选中 {exportInfo.questionNoIds ? exportInfo.questionNoIds.length : 0} 道题,请确认需要导出的内容:
{exportType.map(item => {
return (
= 0 : false} className="m-r-5" onChange={() => {
const index = exportInfo.include.indexOf(item.key);
if (index >= 0) {
exportInfo.include.splice(index, 1);
} else {
exportInfo.include.push(item.key);
}
this.setState({ exportInfo });
}} />
{item.title}
);
})}
,
this.export()} onCancel={() => this.setState({ showExportAuthConfirm: false })}>
当前共选中 {exportInfo.questionNoIds ? exportInfo.questionNoIds.length : 0} 道题,请确认需要导出的内容:
{exportType
.filter(item => !item.auth)
.map(item => {
return (
= 0 : false} className="m-r-5" onChange={() => {
const index = exportInfo.include.indexOf(item.key);
if (index >= 0) {
exportInfo.include.splice(index, 1);
} else {
exportInfo.include.push(item.key);
}
this.setState({ exportInfo });
}} />
{item.title}
);
})}
{exportType
.filter(item => item.auth)
.map(item => {
return (
{item.title}
);
})}
,
this.setState({ showExamination: false })}
onCancel={() => this.setState({ showExamination: false })}
onClose={() => this.setState({ showExamination: false })}
/>,
this.setState({ showReal: false })} />,
this.setState({ showVip: false, showReal: true })}
onPrepare={() => this.setState({ showVip: false, showExamination: true })}
onClose={(result) => {
if (result) {
this.refresh();
} else {
this.setState({ showVip: false });
}
}}
/>,
{
list[this.state.index].note = true;
this.setState({ showNote: false, list });
}} onCancel={() => this.setState({ showNote: false })} />,
];
}
}
class ArticleDetail extends Component {
render() {
const { show, data, onClose, onPrev, onNext } = this.props;
return (
onPrev && onPrev()} />
onNext && onNext()} />
{data.title}
{data.user ? data.user.nickname : data.nickname}
{PrepareStatusMap[data.prepareStatus]}
备考:{!!data.experienceDay && formatMonth(data.experienceDay, false)}
{data.experienceScore}分 /提分 {ExperiencePercentMap[data.experiencePercent]}
{data.link &&
更多信息}
);
}
}
class Article extends Component {
render() {
const { data, onClick, onUnCollect } = this.props;
return (
onClick && onClick()}>
{data.title}
{formatDate(data.updateTime, 'YYYY-MM-DD HH:mm:ss')}
阅读 {data.viewNumber}
{
e.stopPropagation();
onUnCollect();
}}>取消收藏
{data.user ? data.user.nickname : data.nickname}
{PrepareStatusMap[data.prepareStatus]}
备考:{formatMonth(data.experienceDay, false)}
{data.experienceScore}分 /提分 {ExperiencePercentMap[data.experiencePercent]}
);
}
}