| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 | 
							- import React, { Component } from 'react';
 
- import './index.less';
 
- import Assets from '@src/components/Assets';
 
- import { formatSecond, formatPercent } from '@src/services/Tools';
 
- import Icon from '../../../../components/Icon';
 
- import Button from '../../../../components/Button';
 
- import Tabs from '../../../../components/Tabs';
 
- import Progress from '../../../../components/Progress';
 
- import HardInput from '../../../../components/HardInput';
 
- import AnswerCheckbox from '../../../../components/AnswerCheckbox';
 
- import { SentenceOption } from '../../../../../Constant';
 
- import { Question } from '../../../../stores/question';
 
- export default class extends Component {
 
-   constructor(props) {
 
-     super(props);
 
-     // 确保可以自身进行答案显示,外部也可以直接显示答案
 
-     // 将props转入state
 
-     this.state = {
 
-       analysisTab: 'qx',
 
-       focusKey: 'subject',
 
-       scene: this.props.scene || 'answer',
 
-       userQuestion: this.props.userQuestion,
 
-       question: this.props.question,
 
-     };
 
-     const { question, userQuestion } = this.props;
 
-     if (this.state.scene === 'answer') {
 
-       this.state.stem = this.formatStem(question.stem, userQuestion.userAnswer, question.answer);
 
-     } else {
 
-       this.state.stem = question.stem;
 
-     }
 
-   }
 
-   showAnswer() {
 
-     const { userQuestion } = this.state;
 
-     Question.getDetailById(userQuestion.id).then(result => {
 
-       const { question } = result;
 
-       this.setState({
 
-         userQuestion: result,
 
-         question: result.question,
 
-         scene: 'answer',
 
-         stem: this.formatStem(question.stem, result.userAnswer, question.answer),
 
-       });
 
-     });
 
-   }
 
-   addTarget(target) {
 
-     const uuid = target.getAttribute('uuid');
 
-     if (!uuid) return;
 
-     const text = target.innerText;
 
-     const { focusKey, answer = {}, question } = this.state;
 
-     if (!answer[focusKey]) answer[focusKey] = [];
 
-     if (answer[focusKey].filter(row => row.uuid === uuid).length > 0) return;
 
-     answer[focusKey].push({
 
-       text,
 
-       uuid,
 
-     });
 
-     this.setState({
 
-       answer,
 
-       stem: this.formatStem(question.stem, answer),
 
-     });
 
-   }
 
-   removeTarget(key, target) {
 
-     const { answer = {}, question } = this.state;
 
-     if (!answer[key]) return;
 
-     answer[key] = answer[key].filter(row => row.uuid !== target.uuid);
 
-     this.setState({
 
-       answer,
 
-       stem: this.formatStem(question.stem, answer),
 
-     });
 
-   }
 
-   next() {
 
-     const { flow } = this.props;
 
-     const { scene } = this.state;
 
-     if (scene === 'question') {
 
-       const { answer } = this.state;
 
-       flow.submit(answer).then(() => {
 
-         this.showAnswer();
 
-       });
 
-     } else if (scene === 'answer') {
 
-       flow.next();
 
-     }
 
-   }
 
-   formatStem(stem, userAnswer, answer) {
 
-     // userAnswer 添加蓝色字, 错误的添加红色背景
 
-     // answer 添加绿色背景
 
-     const uuidMap = {};
 
-     const show = !!answer;
 
-     answer = answer || {};
 
-     userAnswer = userAnswer || {};
 
-     Object.keys(userAnswer).forEach((key) => {
 
-       if (key === 'options') return;
 
-       const u = userAnswer[key];
 
-       const a = answer[key] && answer[key].length > 0 ? answer[key][0] : [];
 
-       const map = {};
 
-       a.forEach((row) => {
 
-         if (!uuidMap[row.uuid]) uuidMap[row.uuid] = [];
 
-         uuidMap[row.uuid].push('true');
 
-         map[row.uuid] = row;
 
-       });
 
-       u.forEach((row) => {
 
-         if (!uuidMap[row.uuid]) uuidMap[row.uuid] = [];
 
-         uuidMap[row.uuid].push('user');
 
-         if (show && !map[row.uuid]) uuidMap[row.uuid].push('false');
 
-       });
 
-     });
 
-     Object.keys(uuidMap).forEach(uuid => {
 
-       stem = stem.replace(`uuid='${uuid}'`, `uuid='${uuid}' class='${uuidMap[uuid].join(' ')}'`);
 
-     });
 
-     return stem;
 
-   }
 
-   render() {
 
-     const { flow, paper, userQuestion, singleTime } = this.props;
 
-     return (
 
-       <div id='paper-process-sentence'>
 
-         <div className="layout">
 
-           <div className="layout-header">
 
-             <div className="left">
 
-               <div className="title">{paper.title}</div>
 
-             </div>
 
-             <div className="right">
 
-               <div className="text"><Assets name='timecost_icon' />Time cost {formatSecond(userQuestion.userTime || singleTime)}</div>
 
-               <Icon name="star" active={userQuestion.collect} onClick={() => flow.toggleCollect()} />
 
-             </div>
 
-           </div>
 
-           {this.renderBody()}
 
-           <div className="layout-footer">
 
-             <div className="left">
 
-               <Icon name={this.props.isFullscreenEnabled ? 'sceen-restore' : 'sceen-full'} onClick={() => flow.toggleFullscreen()} />
 
-             </div>
 
-             <div className="center">
 
-               <div className="p">
 
-                 <Progress theme="theme" progress={formatPercent(userQuestion.no, paper.questionNumber)} />
 
-               </div>
 
-               <div className="t">{userQuestion.no}/{paper.questionNumber}</div>
 
-             </div>
 
-             <div className="right">
 
-               <Button size="lager" radius onClick={() => {
 
-                 this.next();
 
-               }}>
 
-                 Next <Assets name="next_icon" />
 
-               </Button>
 
-             </div>
 
-           </div>
 
-         </div>
 
-       </div>
 
-     );
 
-   }
 
-   renderBody() {
 
-     const { scene } = this.state;
 
-     switch (scene) {
 
-       case 'question':
 
-         return this.renderQuestion();
 
-       case 'answer':
 
-         return this.renderAnswer();
 
-       default:
 
-         return null;
 
-     }
 
-   }
 
-   renderQuestion() {
 
-     const { focusKey, answer = {}, stem } = this.state;
 
-     return (
 
-       <div className="layout-body">
 
-         <div className="title"><Icon name="question" />请分别找出句子中的主语,谓语和宾语,并做出逻辑关系判断。</div>
 
-         <div className="desc" dangerouslySetInnerHTML={{ __html: stem }} onClick={(e) => {
 
-           this.addTarget(e.target);
 
-         }} />
 
-         <div className="label">主语</div>
 
-         <div className="input">
 
-           <HardInput
 
-             focus={focusKey === 'subject'}
 
-             list={answer.subject || []}
 
-             onClick={() => {
 
-               this.setState({ focusKey: 'subject' });
 
-             }}
 
-             onDelete={(item) => {
 
-               this.removeTarget('subject', item);
 
-             }}
 
-           />
 
-         </div>
 
-         <div className="label">谓语</div>
 
-         <div className="input">
 
-           <HardInput
 
-             focus={focusKey === 'predicate'}
 
-             list={answer.predicate || []}
 
-             onClick={() => {
 
-               this.setState({ focusKey: 'predicate' });
 
-             }}
 
-             onDelete={(item) => {
 
-               this.removeTarget('predicate', item);
 
-             }}
 
-           />
 
-         </div>
 
-         <div className="label">宾语</div>
 
-         <div className="input">
 
-           <HardInput
 
-             focus={focusKey === 'object'}
 
-             list={answer.object || []}
 
-             onClick={() => {
 
-               this.setState({ focusKey: 'object' });
 
-             }}
 
-             onDelete={(item) => {
 
-               this.removeTarget('object', item);
 
-             }}
 
-           />
 
-         </div>
 
-         <div className="select">
 
-           <div className="select-title">本句存在以下哪种逻辑关系?(可多选)</div>
 
-           <AnswerCheckbox list={SentenceOption} selected={answer.options} onChange={(values) => {
 
-             answer.options = values;
 
-             this.setState({ answer });
 
-           }} />
 
-         </div>
 
-       </div>
 
-     );
 
-   }
 
-   renderAnswer() {
 
-     const { analysisTab, question, userQuestion, stem } = this.state;
 
-     const { userAnswer = {} } = userQuestion;
 
-     const { answer } = question;
 
-     return <div className="layout-body">
 
-       <div className="title"><Icon name="question" />请分别找出句子中的主语,谓语和宾语,并做出逻辑关系判断。</div>
 
-       <div className="desc" dangerouslySetInnerHTML={{ __html: stem }} />
 
-       <div className="label">主语</div>
 
-       <div className="input">
 
-         <HardInput
 
-           show
 
-           list={userAnswer.subject || []}
 
-           answer={answer.subject}
 
-         />
 
-       </div>
 
-       <div className="label">谓语</div>
 
-       <div className="input">
 
-         <HardInput
 
-           show
 
-           list={userAnswer.predicate || []}
 
-           answer={answer.predicate}
 
-         />
 
-       </div>
 
-       <div className="label">宾语</div>
 
-       <div className="input">
 
-         <HardInput
 
-           show
 
-           list={userAnswer.object || []}
 
-           answer={answer.object}
 
-         />
 
-       </div>
 
-       <div className="select">
 
-         <div className="select-title">本句存在以下哪种逻辑关系?(可多选)</div>
 
-         <AnswerCheckbox show list={SentenceOption} selected={userAnswer.options} answer={answer.options} />
 
-       </div>
 
-       <div className="analysis">
 
-         <Tabs
 
-           type="division"
 
-           active={analysisTab}
 
-           tabs={[{ key: 'qx', name: '解析详情' }, { key: 'chinese', name: '中文语意' }]}
 
-           onChange={(key) => {
 
-             this.setState({ analysisTab: key });
 
-           }}
 
-         />
 
-         {this.renderText()}
 
-       </div>
 
-     </div>;
 
-   }
 
-   renderText() {
 
-     const { analysisTab, question = {}, questionNo = {} } = this.state;
 
-     let content;
 
-     switch (analysisTab) {
 
-       case 'chinese':
 
-         content = <div className="detail-block text-block" dangerouslySetInnerHTML={{ __html: questionNo.chineseContent }} />;
 
-         break;
 
-       case 'qx':
 
-         content = <div className="detail-block text-block" dangerouslySetInnerHTML={{ __html: question.qxContent }} />;
 
-         break;
 
-       default:
 
-         break;
 
-     }
 
-     return content;
 
-   }
 
- }
 
 
  |