// author: hht 22.1.17
// 代码结构来自mx-app mx-question-content,
// web可以利用slot来实现很多抽象结构,所以这边的写法稍有调整
import consts from '@/common/mx-const'
import { formatDuration } from '@/utils/index'
import eventMixin from './mx-question-event-mixin'
export default {
mixins: [eventMixin],
props: {
options: {
type: Object,
default: _ => ({
question: {},
allowAnswer: false,
allowScore: false,
examineeType: '',
paperOptions: null
})
},
deep: {
// for question display override
type: Number,
default: 0
}
},
data() {
return {
optionCodes: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'],
useMathJax: false // for override
}
},
watch: {
'question.questionId': {
immediate: true,
handler: function(newVal) {
// for math jax auto update
if (!this.useMathJax) return
// console.log('watch question changed by id - call math jax format', this)
this.$nextTick(_ => this.mxGlobal.MathQueue())
}
}
},
computed: {
question() {
return this.options.question
},
allowAnswer() {
return this.options.allowAnswer
},
allowScore() {
return this.options.allowScore
},
examineeType() {
// examineeType.evaluation as default.
return this.options.examineeType || consts.enum.paper.examineeType.evaluation
},
userWrong() {
return this.sysAnswer && this.userAnswer != this.sysAnswer
},
userAnswer() {
return this.question?.answer || ''
},
sysAnswer() {
return this.question?.answers?.first() || ''
},
userAnswerConvert() {
// 转成便于计算的数组
return this.userAnswer && this.userAnswer.split(',') || []
},
sysAnswerConvert() {
// 转成便于计算的数组
return this.sysAnswer && this.sysAnswer.split(',') || []
},
useReadonlyMode() {
return !this.allowAnswer && !this.allowScore
},
questionWithSeq() {
const {seq, type, title} = this.question
let prefix = seq ? seq + '、' : ''
if (type) prefix += '[' + type + ']'
if (title?.startsWith('
]*>(\s|( ))*/.exec(title)?.first()
if (tagBegin) {
const titleRest = title.substring(tagBegin.length)
tagBegin = tagBegin.replaceAll(' ', '').replaceAll(' ', '')
return tagBegin + prefix + titleRest
}
}
return prefix + title
},
optionsVisible() {
return this.question.options && this.question.options.length
},
optionsWithCode() {
return this.question.options.map((opt, idx) => ({
code: this.optionCodes[idx],
option: this.optionCodes[idx] + '、' + opt
}))
},
enableRememberAnswer() {
const rememberTypes = [4,5,6,7]
return rememberTypes.some(id => id == this.question.typeId)
},
useMultipleStyle() {
// 子题都算主观题, 学生手写作答
return this.deep == 0 && this.question.typeId == 3
},
useRadioStyle() {
// 子题都算主观题, 学生手写作答
const radioTypes = [1,6,7]
return this.deep == 0 && radioTypes.some(id => id == this.question.typeId)
},
useViewOfLifeValuesPair() {
// 人生价值观测评,此类题有两个选项,要求两个选项的得分之和为3
return this.deep == 0 && this.question.typeId == 4
},
useViewOfLifeValuesQuadruplet() {
// 人生价值观测评,此类题有四个选项,要求四个选项分别得3,2,1,0四种得分
return this.deep == 0 && this.question.typeId == 5
},
useAnswerStyle() {
// 主观题需要手写作答
return this.allowAnswer &&
!this.useRadioStyle && !this.useMultipleStyle &&
!this.useViewOfLifeValuesPair && !this.useViewOfLifeValuesQuadruplet
},
useParseStyle() {
// 答案/解析/评分
return !this.allowAnswer
},
useBoardTextStyle() {
return this.question._boardMode == consts.enum.paper.boardMode.text
},
useBoardImageStyle() {
return this.question._boardMode == consts.enum.paper.boardMode.image
},
durationDisplay() {
return formatDuration(this.question._duration, true)
},
useBoardParseStyle() {
return this.question._parseMode == consts.enum.paper.parseMode.parse
},
useBoardScoreStyle() {
return this.question._parseMode == consts.enum.paper.parseMode.score
}
},
methods: {
// question options display
isWrong(code) {
// 展示错误回答,标红
if (!this.userWrong) return false
return this.userAnswerConvert.includes(code) && !this.sysAnswerConvert.includes(code)
},
isHighlight(code) {
// 显示正确答案,标绿
// if (!this.userWrong) return false
return this.sysAnswerConvert.includes(code)
},
// question board style
setBoardTextStyle() {
this.question._boardMode = consts.enum.paper.boardMode.text
},
setBoardImageStyle() {
this.question._boardMode = consts.enum.paper.boardMode.image
},
setParseDefaultStyle() {
this.question._parseMode = consts.enum.paper.parseMode.parse
},
setParseScoreStyle() {
this.question._parseMode = consts.enum.paper.parseMode.score
},
setLocalDurationUp() {
this.question._duration = this.question._duration + 1
}
}
}