|
@@ -8,16 +8,23 @@
|
|
|
<div v-if="isEnable(data.property.is_enable_description)" class="description">{{ data.description }}</div>
|
|
|
<div class="dialogue-wrapper">
|
|
|
<ul>
|
|
|
- <li v-for="(item, i) in dialogue" :key="i" :style="{ flexDirection: item.dir }" class="dialogue-item">
|
|
|
- <span class="name" :style="{ backgroundColor: item.dir === 'row' ? '#4F73F4' : '#3ABD38' }">
|
|
|
+ <li
|
|
|
+ v-for="(item, i) in data.option_list"
|
|
|
+ :key="i"
|
|
|
+ :style="{ flexDirection: item.direction }"
|
|
|
+ class="dialogue-item"
|
|
|
+ >
|
|
|
+ <span class="name" :style="{ backgroundColor: item.direction === 'row' ? '#4F73F4' : '#3ABD38' }">
|
|
|
{{ item.name }}
|
|
|
</span>
|
|
|
- <div class="content" :style="{ backgroundColor: item.dir === 'row' ? '#fff' : '#d0f3de' }">
|
|
|
+ <div class="content" :style="{ backgroundColor: item.direction === 'row' ? '#fff' : '#d0f3de' }">
|
|
|
<template v-if="item.type === 'text'">
|
|
|
{{ item.content }}
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
- <el-input v-model="item.content" :class="[item.dir === 'row' ? 'is_left' : 'is_right']" /><span>。</span>
|
|
|
+ <el-input v-model="item.content" :class="[item.direction === 'row' ? 'is_left' : 'is_right']" /><span
|
|
|
+ >。</span
|
|
|
+ >
|
|
|
</template>
|
|
|
</div>
|
|
|
<SoundRecordPreview v-if="item.type === 'input'" :wav-blob.sync="item.audio_file_id" type="small" />
|
|
@@ -28,8 +35,6 @@
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { getRandomNumber } from '@/utils';
|
|
|
-
|
|
|
import PreviewMixin from './components/PreviewMixin';
|
|
|
import SoundRecordPreview from './components/common/SoundRecordPreview.vue';
|
|
|
|
|
@@ -40,50 +45,13 @@ export default {
|
|
|
},
|
|
|
mixins: [PreviewMixin],
|
|
|
data() {
|
|
|
- return {
|
|
|
- dialogue: [], // 对话列表
|
|
|
- };
|
|
|
+ return {};
|
|
|
},
|
|
|
watch: {
|
|
|
- 'data.dialogue': {
|
|
|
- handler() {
|
|
|
- let dir = 'row';
|
|
|
- let preName = '';
|
|
|
- this.dialogue = this.data.dialogue
|
|
|
- // 用换行分割 this.data.dialogue
|
|
|
- .split('\n')
|
|
|
- // 过滤掉空行
|
|
|
- .filter((item) => item.trim() !== '')
|
|
|
- .map((item) => {
|
|
|
- // 分割对话中的人物和对话内容
|
|
|
- const match = item.match(/(\S+)[::](.+)/);
|
|
|
- if (match) {
|
|
|
- let name = match[1];
|
|
|
- if (preName.length === 0 || preName !== name) {
|
|
|
- dir = preName.length === 0 ? 'row' : dir === 'row' ? 'row-reverse' : 'row';
|
|
|
- }
|
|
|
- preName = name;
|
|
|
- let content = match[2];
|
|
|
- let isFill = /_{3,}/.test(content);
|
|
|
-
|
|
|
- return {
|
|
|
- name,
|
|
|
- content: isFill ? '' : content,
|
|
|
- dir,
|
|
|
- audio_file_id: '',
|
|
|
- mark: isFill ? getRandomNumber() : '',
|
|
|
- type: isFill ? 'input' : 'text',
|
|
|
- };
|
|
|
- }
|
|
|
- })
|
|
|
- .filter((item) => item);
|
|
|
- },
|
|
|
- deep: true,
|
|
|
- immediate: true,
|
|
|
- },
|
|
|
- dialogue: {
|
|
|
- handler() {
|
|
|
- this.answer.answer_list = this.dialogue
|
|
|
+ 'data.option_list': {
|
|
|
+ handler(val) {
|
|
|
+ if (!val) return;
|
|
|
+ this.answer.answer_list = val
|
|
|
.map(({ type, mark, content, audio_file_id }) => {
|
|
|
if (type === 'text') return;
|
|
|
return {
|