|
|
@@ -51,16 +51,30 @@
|
|
|
@click.native="handleViewPinyin(true)"
|
|
|
/>
|
|
|
</el-divider>
|
|
|
- <PinyinText
|
|
|
- v-for="(item, i) in data.option_list"
|
|
|
- v-show="isEnable(data.property.view_pinyin)"
|
|
|
- :key="i"
|
|
|
- ref="PinyinText"
|
|
|
- :paragraph-list="item.paragraph_list"
|
|
|
- :rich-text-list="item.rich_text_list"
|
|
|
- :pinyin-position="data.property.pinyin_position"
|
|
|
- @fillCorrectPinyin="fillCorrectPinyin($event, i)"
|
|
|
- />
|
|
|
+ <div v-show="isEnable(data.property.view_pinyin)" class="proofread-table-wrapper">
|
|
|
+ <table class="proofread-table">
|
|
|
+ <tbody>
|
|
|
+ <tr v-for="(item, i) in data.option_list" :key="item.mark">
|
|
|
+ <td class="pinyin-cell">
|
|
|
+ <PinyinText
|
|
|
+ ref="PinyinText"
|
|
|
+ :paragraph-list="item.paragraph_list"
|
|
|
+ :rich-text-list="item.rich_text_list"
|
|
|
+ :pinyin-position="data.property.pinyin_position"
|
|
|
+ @fillCorrectPinyin="fillCorrectPinyin($event, i)"
|
|
|
+ />
|
|
|
+ </td>
|
|
|
+ <td class="proofread-cell">
|
|
|
+ <WordProofread
|
|
|
+ button-text="分词校对"
|
|
|
+ :word-data="getOptionWordData(item)"
|
|
|
+ @save="saveOptionWord($event, i)"
|
|
|
+ />
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
<MultilingualFill
|
|
|
@@ -86,6 +100,8 @@
|
|
|
<script>
|
|
|
import ModuleMixin from '../../common/ModuleMixin';
|
|
|
import PinyinText from '@/components/PinyinText.vue';
|
|
|
+import WordProofread from '@/views/book/courseware/create/components/common/WordProofread.vue';
|
|
|
+import { buildWordProofreadData } from '@/views/book/courseware/create/components/common/wordProofread';
|
|
|
|
|
|
import { getSelectData, getOption, arrangeTypeList, selectTypeList } from '@/views/book/courseware/data/select';
|
|
|
import { serialNumberTypeList, computeOptionMethods } from '@/views/book/courseware/data/common';
|
|
|
@@ -94,12 +110,16 @@ export default {
|
|
|
name: 'SelectPage',
|
|
|
components: {
|
|
|
PinyinText,
|
|
|
+ WordProofread,
|
|
|
},
|
|
|
mixins: [ModuleMixin],
|
|
|
data() {
|
|
|
return {
|
|
|
data: getSelectData(),
|
|
|
curSelectIndex: -1,
|
|
|
+ optionWordDataMap: {},
|
|
|
+ optionWordDataSourceMap: {},
|
|
|
+ inited: false,
|
|
|
loading: false,
|
|
|
};
|
|
|
},
|
|
|
@@ -111,11 +131,24 @@ export default {
|
|
|
watch: {
|
|
|
'data.property.arrange_type': 'handlerMindMap',
|
|
|
'data.answer.answer_list': 'handlerMindMap',
|
|
|
+ 'data.option_list': {
|
|
|
+ handler(newVal) {
|
|
|
+ if (this.loading) return;
|
|
|
+ if (this.inited || !Array.isArray(newVal) || newVal.length <= 0) return;
|
|
|
+ if (!this.isEnable(this.data.property.view_pinyin)) return;
|
|
|
+ this.handleViewPinyin().finally(() => {
|
|
|
+ this.inited = true;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ deep: true,
|
|
|
+ },
|
|
|
'data.property': {
|
|
|
handler(val) {
|
|
|
if (this.property.isSilentPropertyWatch) return;
|
|
|
if (val.view_pinyin === 'true') {
|
|
|
- this.handleViewPinyin();
|
|
|
+ this.handleViewPinyin().finally(() => {
|
|
|
+ this.inited = true;
|
|
|
+ });
|
|
|
}
|
|
|
},
|
|
|
deep: true,
|
|
|
@@ -150,18 +183,40 @@ export default {
|
|
|
pinyin_proofread_word_list: [],
|
|
|
};
|
|
|
});
|
|
|
+ this.optionWordDataMap = {};
|
|
|
+ this.optionWordDataSourceMap = {};
|
|
|
this.loading = false;
|
|
|
return;
|
|
|
}
|
|
|
- if (this.data.option_list.length > 0 && this.data.option_list[0].paragraph_list.length > 0) return;
|
|
|
- this.data.option_list.forEach((item, i) => {
|
|
|
+ const tasks = this.data.option_list.map((item, i) => {
|
|
|
const text = item.content;
|
|
|
- if (!text) return;
|
|
|
+ if (!text) return Promise.resolve();
|
|
|
item.paragraph_list_parameter.text = text;
|
|
|
- this.createParsedTextInfoPinyin(text, i);
|
|
|
+ return this.createParsedTextInfoPinyin(text, i).then(({ parsed_text }) => {
|
|
|
+ this.$set(this.optionWordDataMap, item.mark, buildWordProofreadData(parsed_text?.paragraph_list || []));
|
|
|
+ this.$set(this.optionWordDataSourceMap, item.mark, text);
|
|
|
+ });
|
|
|
});
|
|
|
+ await Promise.all(tasks);
|
|
|
this.loading = false;
|
|
|
},
|
|
|
+ getOptionWordData(option) {
|
|
|
+ if (!option || !option.mark) return { detail: [] };
|
|
|
+ return this.optionWordDataMap[option.mark] || { detail: [] };
|
|
|
+ },
|
|
|
+ async saveOptionWord(saveArr, optionIndex) {
|
|
|
+ const option = this.data.option_list[optionIndex];
|
|
|
+ if (!option) return;
|
|
|
+ const { parsed_text } = await this.createParsedTextInfoPinyin(
|
|
|
+ option.content,
|
|
|
+ optionIndex,
|
|
|
+ -1,
|
|
|
+ 'option_list',
|
|
|
+ saveArr,
|
|
|
+ );
|
|
|
+ this.$set(this.optionWordDataMap, option.mark, buildWordProofreadData(parsed_text?.paragraph_list || []));
|
|
|
+ this.$set(this.optionWordDataSourceMap, option.mark, option.content || '');
|
|
|
+ },
|
|
|
computedOptionNumber(number) {
|
|
|
let type = serialNumberTypeList.find((item) => item.value === this.data.property.option_serial_type)?.value;
|
|
|
if (!type) return number + 1;
|
|
|
@@ -199,7 +254,10 @@ export default {
|
|
|
* @description 添加选项
|
|
|
*/
|
|
|
addOption() {
|
|
|
- this.data.option_list.push(getOption());
|
|
|
+ const newOption = getOption();
|
|
|
+ this.data.option_list.push(newOption);
|
|
|
+ this.$set(this.optionWordDataMap, newOption.mark, { detail: [] });
|
|
|
+ this.$set(this.optionWordDataSourceMap, newOption.mark, '');
|
|
|
},
|
|
|
/**
|
|
|
* @description 删除选项
|
|
|
@@ -210,7 +268,12 @@ export default {
|
|
|
this.$message.warning('请至少保留两个选项');
|
|
|
return;
|
|
|
}
|
|
|
+ const option = this.data.option_list[index];
|
|
|
this.data.option_list.splice(index, 1);
|
|
|
+ if (option?.mark) {
|
|
|
+ this.$delete(this.optionWordDataMap, option.mark);
|
|
|
+ this.$delete(this.optionWordDataSourceMap, option.mark);
|
|
|
+ }
|
|
|
},
|
|
|
handlerMindMap() {
|
|
|
const direction = this.data.property.arrange_type === arrangeTypeList[0].value ? '横排' : '竖排';
|
|
|
@@ -320,4 +383,29 @@ export default {
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.proofread-table-wrapper {
|
|
|
+ margin-top: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.proofread-table {
|
|
|
+ width: 100%;
|
|
|
+ border-collapse: collapse;
|
|
|
+
|
|
|
+ td {
|
|
|
+ padding: 8px;
|
|
|
+ vertical-align: top;
|
|
|
+ border: 1px solid #ebeef5;
|
|
|
+ }
|
|
|
+
|
|
|
+ .pinyin-cell {
|
|
|
+ width: calc(100% - 140px);
|
|
|
+ }
|
|
|
+
|
|
|
+ .proofread-cell {
|
|
|
+ width: 140px;
|
|
|
+ text-align: center;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|