<template> <div :class="classes"> <div class="elem-title" v-if="isFirstSpin"> {{ data.parent.topicName }} </div> <div class="elem-body"> <ul class="group-item" v-for="(group, gindex) in questions" :key="gindex" :style="gindex !== questions.length - 1 ? groupGapStyles : null" > <li class="question-item" v-for="(question, qindex) in group" :key="qindex" :style="getQuestionGapStyles(group, qindex)" > <span class="option-item" v-for="(option, oindex) in question" :key="oindex" :style="optionGapStyles" > <i>{{ option }}</i> </span> </li> </ul> </div> </div> </template> <script> export default { name: "elem-fill-question", props: { data: { type: Object, }, }, computed: { isFirstSpin() { return ( this.data.parent && this.data.startNumber === this.data.parent.startNumber ); }, classes() { return [ "elem-fill-question", `elem-fill-question-${this.data.optionDirection}`, { "elem-fill-question-simple": !this.data.isMultiply && !this.data.isBoolean, "elem-fill-question-multiply": this.data.isMultiply, "elem-fill-question-boolean": this.data.isBoolean, "elem-fill-question-first": this.isFirstSpin, }, ]; }, groupGapStyles() { return { marginRight: this.data.groupGap + "px", }; }, optionGapStyles() { const styles = this.data.optionDirection === "vertical" ? { marginBottom: this.data.optionGap + "px" } : { marginRight: this.data.optionGap + "px" }; return styles; }, }, data() { return { questions: [], }; }, methods: { parseQuestion(data) { let questionNo = data.startNumber; let questions = []; const choiceList = this.getChoiceList(data); if (data.questionDirection === "vertical") { const groupNum = Math.ceil( data.questionsCount / data.questionCountPerGroup ); for (let i = 0; i < groupNum; i++) { questions[i] = []; const questionCountPerGroup = i === groupNum - 1 ? data.questionsCount - data.questionCountPerGroup * i : data.questionCountPerGroup; for (let j = 0; j < questionCountPerGroup; j++) { questions[i][j] = [questionNo++, ...choiceList]; } } } else { for (let i = 0; i < data.questionsCount; i++) { const groupIndex = i % data.groupPerLine; if (!questions[groupIndex]) questions[groupIndex] = []; questions[groupIndex].push([questionNo++, ...choiceList]); } } this.questions = questions; }, getChoiceList(data) { if (data.isBoolean) { return ["", ""]; } else { return "abcdefghijklmnopqrstuv" .toUpperCase() .slice(0, data.optionCount) .split(""); } }, getQuestionGapStyles(group, qindex) { const size = group.length - 1 === qindex ? 0 : this.data.optionDirection === "vertical" ? this.data.optionGap : this.data.questionGap; return this.data.optionDirection === "vertical" ? { marginRight: size + "px" } : { marginBottom: size + "px" }; }, }, watch: { data: { immediate: true, handler(val) { this.parseQuestion(val); }, }, }, }; </script>