Browse Source

1. bookEep 增加分组选择功能 2.填空题问题修正

dsy 1 tuần trước cách đây
mục cha
commit
bae2ca13ea

+ 26 - 2
packages/BookEep.vue

@@ -10,9 +10,10 @@
           ></div>
           <CoursewarePreview
             ref="courseware"
-            :is-show-group="false"
-            :group-show-all="true"
+            :is-show-group="isShowGroup"
+            :group-show-all="groupShowAll"
             :group-row-list="groupRowList"
+            :row-checked-list="rowCheckedList"
             :data="data"
             :courseware-id="curSelectId"
             :component-list="cList"
@@ -137,6 +138,14 @@ export default {
       type: String,
       default: '',
     },
+    isShowGroup: {
+      type: Boolean,
+      default: false,
+    },
+    rowChecked: {
+      type: String,
+      default: '{}',
+    },
   },
   data() {
     const isMobile = /android|iphone|ipad|ipod/i.test(navigator.userAgent || navigator.vendor || window.opera);
@@ -180,6 +189,7 @@ export default {
       allFeedbackList: [],
       drawerType: 1,
       isMobile,
+      groupShowAll: false, // 是否显示全部分组内容
     };
   },
   computed: {
@@ -190,6 +200,10 @@ export default {
       if (this.dialogType === 2) return '反馈';
       return '笔记';
     },
+    rowCheckedList() {
+      const _rowChecked = this.rowChecked === '[]' ? '{}' : this.rowChecked;
+      return _rowChecked ? JSON.parse(_rowChecked) : {};
+    },
   },
   watch: {
     componentList: {
@@ -247,6 +261,13 @@ export default {
       deep: true,
       immediate: true,
     },
+    rowCheckedList: {
+      handler(val) {
+        this.groupShowAll = Object.keys(val).length === 0;
+      },
+      deep: true,
+      immediate: true,
+    },
   },
   created() {
     const origin = window.location.origin;
@@ -660,6 +681,9 @@ export default {
         }
       });
     },
+    submitPreviewGroupId() {
+      return JSON.stringify(this.$refs.courseware.rowCheckList);
+    },
   },
 };
 </script>

+ 1 - 1
packages/package.json

@@ -1,6 +1,6 @@
 {
   "name": "eep-ui",
-  "version": "0.0.38",
+  "version": "0.0.41",
   "main": "eep/eep-ui.umd.js",
   "style": "eep/eep-ui.css",
   "exports": {

+ 22 - 9
src/views/book/courseware/create/components/question/fill/Fill.vue

@@ -101,7 +101,7 @@
             :key="item.mark"
             v-model="item.value"
             placeholder="多个答案可用‘/’分割"
-            @blur="handleTone(item.value, i)"
+            @blur="handleTone(item.value, item)"
           >
             <span slot="prefix">{{ i + 1 }}.</span>
           </el-input>
@@ -313,6 +313,19 @@ export default {
      */
     appendTextBlock(blocks, content, richTextList = []) {
       if (!this.hasVisibleText(content) && blocks.length > 0) {
+        // 填空(input)属于当前段落的一部分:若段落以填空结尾,紧随其后的闭合标签和
+        // 段间换行 \n 不能合并到填空前面的文本块中,否则 PinyinText 会把 \n 渲染成
+        // <br> 出现在填空之前,导致填空换到下一行显示。此时将换行保留为填空后的独立文本块。
+        const lastBlock = blocks[blocks.length - 1];
+        if (lastBlock && lastBlock.type === 'input' && String(content).includes('\n')) {
+          blocks.push({
+            content,
+            type: 'text',
+            rich_text_list: richTextList,
+          });
+          return;
+        }
+
         for (let i = blocks.length - 1; i >= 0; i--) {
           if (blocks[i] && blocks[i].type === 'text') {
             blocks[i].content = `${blocks[i].content || ''}${content}`;
@@ -720,18 +733,18 @@ export default {
       return slicedWord;
     },
 
-    handleTone(value, i) {
-      if (!/^[a-zA-Z0-9\s]+$/.test(value)) return;
-      this.data.answer.answer_list[i].value = value
+    handleTone(value, item) {
+      if (!item || !/^[a-zA-Z0-9\s]+$/.test(value)) return;
+      item.value = value
         .trim()
         .split(/\s+/)
-        .map((item) => {
-          return handleToneValue(item);
+        .map((valItem) => {
+          return handleToneValue(valItem);
         })
-        .map((item) =>
-          item.map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || '')),
+        .map((valItem) =>
+          valItem.map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || '')),
         )
-        .filter((item) => item.length > 0)
+        .filter((valItem) => valItem.length > 0)
         .join(' ');
     },
     uploads(file_id) {

+ 11 - 0
src/views/book/courseware/preview/CoursewarePreview.vue

@@ -242,6 +242,10 @@ export default {
       type: Boolean,
       default: false,
     },
+    rowCheckedList: {
+      type: Object,
+      default: () => ({}),
+    },
   },
   data() {
     return {
@@ -298,6 +302,13 @@ export default {
         this.courseware_id = val;
       },
     },
+    rowCheckedList: {
+      handler(val) {
+        this.rowCheckList = val;
+      },
+      immediate: true,
+      deep: true,
+    },
   },
   mounted() {
     const element = this.$refs.courseware;

+ 1 - 0
src/views/book/courseware/preview/components/fill/FillPreview.vue

@@ -509,6 +509,7 @@ export default {
         if (li.type === 'input') {
           li.input = '';
           li.write_base64 = '';
+          li.audio_answer_list = [];
         }
       });
       this.selectedWordList = [];