RepeatPreview.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <!-- eslint-disable vue/no-v-html -->
  2. <template>
  3. <div class="repeat-preview">
  4. <div class="stem">
  5. <span class="question-number">{{ data.property.question_number }}.</span>
  6. <span v-html="sanitizeHTML(data.stem)"></span>
  7. </div>
  8. <div v-if="isEnable(data.property.is_enable_description)" class="description">{{ data.description }}</div>
  9. <div class="option-list">
  10. <li v-for="(item, i) in answer_list" :key="i" :class="['option-item']">
  11. <span>{{ computeOptionMethods[data.option_number_show_mode](i) }}. </span>
  12. <AudioPlay v-if="data.option_list[i].audio_file_id" :file-id="data.option_list[i].audio_file_id" />
  13. <div class="option-content" v-html="sanitizeHTML(data.option_list[i].content)"></div>
  14. <div class="sound-box">
  15. <SoundRecordPreview :wav-blob.sync="item.audio_file_id" :type="'small'" />
  16. </div>
  17. </li>
  18. </div>
  19. </div>
  20. </template>
  21. <script>
  22. import PreviewMixin from './components/PreviewMixin';
  23. import { computeOptionMethods } from '@/views/exercise_questions/data/common';
  24. import SoundRecordPreview from './components/common/SoundRecordPreview.vue';
  25. export default {
  26. name: 'RepeatPreview',
  27. components: {
  28. SoundRecordPreview,
  29. },
  30. mixins: [PreviewMixin],
  31. data() {
  32. return {
  33. computeOptionMethods,
  34. answer_list: [],
  35. };
  36. },
  37. created() {
  38. this.handleData();
  39. },
  40. methods: {
  41. // 初始化数据
  42. handleData() {
  43. this.answer_list = [];
  44. this.data.option_list.forEach((item) => {
  45. let obj = {
  46. mark: item.mark,
  47. audio_file_id: '',
  48. };
  49. this.answer_list.push(obj);
  50. });
  51. },
  52. },
  53. };
  54. </script>
  55. <style lang="scss" scoped>
  56. @use '@/styles/mixin.scss' as *;
  57. .repeat-preview {
  58. @include preview;
  59. .option-list {
  60. display: flex;
  61. flex-wrap: wrap;
  62. row-gap: 16px;
  63. .option-item {
  64. display: flex;
  65. column-gap: 16px;
  66. align-items: center;
  67. min-width: 40%;
  68. max-width: 50%;
  69. padding-right: 24px;
  70. .option-content {
  71. flex: 1;
  72. max-width: 306px;
  73. padding: 8px 16px;
  74. color: #706f78;
  75. background-color: #f9f8f9;
  76. border-radius: 40px;
  77. }
  78. .sound-box {
  79. padding: 4px;
  80. background: #f9f8f9;
  81. border-radius: 40px;
  82. }
  83. }
  84. }
  85. }
  86. </style>