| | |
| | | <div class="playInput hl_input rounded-[22px] input-border input-shadow"> |
| | | <!-- 应用场景 --> |
| | | <div class="application-scenarios absolute bottom-[114%] left-4"> |
| | | <div class="flex-items-center space-x-2"> |
| | | <div class="flex-items-center space-x-2" :class="isHome ? 'set-next-group-type' : ''"> |
| | | <div |
| | | class="border border-gray-400 border-solid h-8 flex-items-center px-3 py-2 rounded-2xl cursor-pointer space-x-1 hover:bg-[#cae3ff]" |
| | | :class="{ 'bg-[#c5e0ff]': activeGroupType === item, '!text-[#1c86ff]': activeGroupType === item }" |
| | |
| | | class="absolute rounded-md bg-white border border-solid border-gray-400 py-2 z-10" |
| | | :style="{ left: popUpPosition.left + 'px', bottom: popUpPosition.bottom + 'px' }" |
| | | > |
| | | <div class="font-bold text-sm text-nowrap overflow-hidden text-ellipsis max-w-80 mb-1 px-2">Ctrl+数字快捷输入</div> |
| | | <div class="text-gray-400 text-sm text-nowrap overflow-hidden text-ellipsis max-w-80 mb-1 px-2">{{ inputValue }}</div> |
| | | <div class="font-bold text-nowrap overflow-hidden text-ellipsis max-w-80 mb-1 px-2">Ctrl+数字快捷输入</div> |
| | | <div class="text-gray-400 text-nowrap overflow-hidden text-ellipsis max-w-80 mb-1 px-2">{{ inputValue }}</div> |
| | | <div class="max-w-96 flex flex-col"> |
| | | <div |
| | | class="hover:bg-gray-300 py-2 cursor-pointer px-5 text-nowrap overflow-hidden text-ellipsis" |
| | |
| | | :key="index" |
| | | @click="similarClick(item)" |
| | | > |
| | | <span class="text-sm text-gray-500 pr-1.5">{{ index + 1 }}</span> |
| | | <span class="text-gray-500 pr-1.5">{{ index + 1 }}</span> |
| | | <template v-if="sentenceSplitMap?.[item.question]"> |
| | | <template v-for="part in sentenceSplitMap[item.question]"> |
| | | <span v-if="part.isKeyword" class="text-blue-400 font-bold cursor-pointer">{{ part.partStr }}</span> |
| | |
| | | <!-- <el-button title="AI语音对话" class="cursor-pointer" link style="margin-left: unset" @click="audioChangeWord"> |
| | | <img src="/static/images/wave/HeadImg.png" class="set-img-icon box-border" /> |
| | | </el-button> --> |
| | | <el-button |
| | | title="清除" |
| | | class="cursor-pointer" |
| | | link |
| | | style="margin-left: unset" |
| | | @click="clearTextarea" |
| | | icon="ele-Close" |
| | | v-if="inputValue" |
| | | > |
| | | </el-button> |
| | | <el-button class="cursor-pointer" link > |
| | | <el-tooltip v-if="isTalking" placement="top" content="停止生成"> |
| | | <div class="size-[36px] rounded-full flex-center border-2 border-solid border-black text-black" @click="emits('stopGenClick')"> |
| | | <span class="ywifont ywicon-jieshu"></span> |
| | | </div> |
| | | </el-tooltip> |
| | | |
| | | <el-button title="发送" class="cursor-pointer" link @click="emits('sendClick')"> |
| | | <div class="send"> |
| | | <img src="/static/images/wave/QueryImg.png" /> |
| | | </div> |
| | | <el-tooltip v-else placement="top" content="发送"> |
| | | <div class="size-[36px] rounded-full bg-black flex-center" @click="emits('sendClick')"> |
| | | <img src="/static/images/wave/QueryImg.png" /> |
| | | </div> |
| | | </el-tooltip> |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | |
| | | :isHome="isHome" |
| | | ref="commonPhrasesRef" |
| | | @updateCommonChatInput="updateCommonChatInput" |
| | | |
| | | /> |
| | | </div> |
| | | </template> |
| | |
| | | import { onClickOutside } from '@vueuse/core'; |
| | | import type { InputInstance } from 'element-plus'; |
| | | import { ElMessage } from 'element-plus'; |
| | | import _ from 'lodash'; |
| | | import { sortBy } from 'lodash-es'; |
| | | import getCaretCoordinates from 'textarea-caret'; |
| | | import { computed, nextTick, ref, toRefs, watch } from 'vue'; |
| | | import InfoDetail from './InfoDetail.vue'; |
| | |
| | | import VoicePage from './voicePage/VoicePage.vue'; |
| | | import { getMetricsNames, querySimilarityHistory } from '/@/api/ai/chat'; |
| | | import { activeGroupType, groupTypeList, groupTypeMapIcon } from '/@/stores/chatRoom'; |
| | | const emits = defineEmits(['sendClick', 'showUpChatClick', 'showDownChatClick']); |
| | | const emits = defineEmits(['sendClick', 'showUpChatClick', 'showDownChatClick','stopGenClick']); |
| | | const props = defineProps({ |
| | | isTalking: Boolean, |
| | | isHome: Boolean, |
| | |
| | | onClickOutside(tipEleRef, () => { |
| | | triggerShow.value = false; |
| | | }); |
| | | |
| | | const clearTextarea = () => { |
| | | inputValue.value = ''; |
| | | }; |
| | | const inputText = (text) => { |
| | | nextTick(() => { |
| | | setTimeout(() => { |
| | |
| | | }; |
| | | |
| | | // 按 startIndex 排序,消除彼此之间重合元素 |
| | | sentenceMatchList = _.sortBy(sentenceMatchList, (item) => item.startIndex).filter((value, index, array) => { |
| | | sentenceMatchList = sortBy(sentenceMatchList, (item) => item.startIndex).filter((value, index, array) => { |
| | | if (nextIsMerge) { |
| | | checkNextIsMerge(value, index, array); |
| | | return false; |
| | |
| | | |
| | | //#region ====================== 常用语功能 ====================== |
| | | const commonPhrasesRef = ref(null); |
| | | const isMessageBoxVisible = ref(false); |
| | | // 常用语功能点击 |
| | | const commonPhrasesClick = () => { |
| | | isShowPhrase.value = true; |
| | | }; |
| | | // 区域关闭常用语功能面板 |
| | | onClickOutside(commonPhrasesRef, () => { |
| | | const messageBoxElement = document.querySelector('.el-message-box'); |
| | | if (messageBoxElement) { |
| | | isMessageBoxVisible.value = true; |
| | | return; |
| | | onClickOutside( |
| | | commonPhrasesRef, |
| | | () => { |
| | | isShowPhrase.value = false; |
| | | }, |
| | | { |
| | | ignore: ['.el-message-box'], |
| | | } |
| | | isShowPhrase.value = false; |
| | | }); |
| | | ); |
| | | // 常用语功能输入框更新 |
| | | const updateCommonChatInput = (val) => { |
| | | inputValue.value = val; |