RepeatPreview.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <!-- eslint-disable vue/no-v-html -->
  2. <template>
  3. <div class="repeat-preview">
  4. <div class="stem">
  5. <span class="question-number" :style="{ fontSize: data.property.stem_question_number_font_size }">
  6. {{ data.property.question_number }}.
  7. </span>
  8. <span v-html="sanitizeHTML(data.stem)"></span>
  9. </div>
  10. <div
  11. v-if="isEnable(data.property.is_enable_description)"
  12. class="description rich-text"
  13. v-html="sanitizeHTML(data.description)"
  14. ></div>
  15. <div class="option-list">
  16. <li v-for="(item, i) in answer.answer_list" :key="i" :class="['option-item']">
  17. <span :style="{ fontSize: data.property.option_question_number_font_size }">
  18. {{ computeOptionMethods[data.option_number_show_mode](i) }}
  19. </span>
  20. <AudioPlay
  21. v-if="data.option_list[i] && data.option_list[i].audio_file_id"
  22. :file-id="data.option_list[i].audio_file_id"
  23. :show-slider="true"
  24. />
  25. <div
  26. v-if="sanitizeHTML(data.option_list[i].content)"
  27. class="option-content rich-text"
  28. v-html="sanitizeHTML(data.option_list[i].content)"
  29. ></div>
  30. <div class="sound-box">
  31. <SoundRecordPreview :wav-blob.sync="item.audio_file_id" :disabled="disabled" :type="'small'" />
  32. </div>
  33. </li>
  34. </div>
  35. </div>
  36. </template>
  37. <script>
  38. import PreviewMixin from './components/PreviewMixin';
  39. import { computeOptionMethods } from '@/views/exercise_questions/data/common';
  40. import SoundRecordPreview from './components/common/SoundRecordPreview.vue';
  41. export default {
  42. name: 'RepeatPreview',
  43. components: {
  44. SoundRecordPreview,
  45. },
  46. mixins: [PreviewMixin],
  47. data() {
  48. return {
  49. computeOptionMethods,
  50. };
  51. },
  52. watch: {
  53. data: {
  54. handler(val) {
  55. if (!val || this.data.type !== 'repeat') return;
  56. this.handleData();
  57. },
  58. deep: true,
  59. immediate: true,
  60. },
  61. },
  62. created() {
  63. // this.handleData();
  64. },
  65. methods: {
  66. // 初始化数据
  67. handleData() {
  68. if (!this.isJudgingRightWrong) {
  69. this.answer.answer_list = [];
  70. this.data.option_list.forEach((item) => {
  71. let obj = {
  72. mark: item.mark,
  73. audio_file_id: '',
  74. };
  75. this.answer.answer_list.push(obj);
  76. });
  77. }
  78. },
  79. },
  80. };
  81. </script>
  82. <style lang="scss" scoped>
  83. @use '@/styles/mixin.scss' as *;
  84. .repeat-preview {
  85. @include preview;
  86. .option-list {
  87. // display: flex;
  88. // flex-wrap: wrap;
  89. // row-gap: 16px;
  90. .option-item {
  91. display: flex;
  92. column-gap: 16px;
  93. align-items: center;
  94. width: 90%;
  95. margin-bottom: 16px;
  96. .option-content {
  97. width: 480px;
  98. padding: 8px 16px;
  99. color: #706f78;
  100. background-color: $content-color;
  101. border-radius: 40px;
  102. }
  103. .sound-box {
  104. padding: 4px;
  105. background: $content-color;
  106. border-radius: 40px;
  107. }
  108. }
  109. }
  110. }
  111. </style>