Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ui/src/views/knowledge-detail/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ export function provideKnowledgeDetailContext(state: KnowledgeDetailState) {
return context
}

/** 根据消费方声明的范围,从现有完整 API 对象推导类型,不补造方法。 */
/** 根据声明的范围,从现有完整 API 对象推导类型,不补造方法。 */
type ScopedResourceApi<Scope extends ResourceScope> = {
readonly [Module in keyof KnowledgeResourceApi]: Scope extends ResourceScope
? Module extends keyof (typeof resourceConfigs)[Scope]['resourceApi']
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ const userInputTitle = computed(() => knowledgeBaseNode.value?.properties?.user_
const showNext = computed(() => hasKnowledgeBaseInput.value && active.value === 'data_source')
const showPrev = computed(() => hasKnowledgeBaseInput.value && active.value === 'knowledge_base')
const showImport = computed(() => (hasKnowledgeBaseInput.value ? active.value === 'knowledge_base' : active.value === 'data_source'))
const busy = computed(() => loading.value || uploadingCount.value > 0)
function open(workflow?: LogicFlow.GraphConfigData) {
currentWorkflow.value = workflow ?? null
visible.value = true
Expand All @@ -80,7 +79,7 @@ function getActionData() {
return data
}
function handleNext() {
if (busy.value) return
if (loading.value || uploadingCount.value > 0) return
return actionRef.value
?.validate()
.then(() => {
Expand All @@ -94,12 +93,12 @@ function handleNext() {
})
}
function handlePrevious() {
if (busy.value) return
if (loading.value || uploadingCount.value > 0) return
formPayload.value.knowledge_base = actionRef.value?.getData() ?? {}
active.value = 'data_source'
}
function handleSubmit() {
if (busy.value || active.value === 'result' || !actionRef.value) return
if (loading.value || uploadingCount.value > 0 || active.value === 'result' || !actionRef.value) return
const step = active.value
loading.value = true
return actionRef.value
Expand All @@ -122,7 +121,7 @@ function handleSubmit() {
})
}
function handleContinueImport() {
if (busy.value) return
if (loading.value || uploadingCount.value > 0) return
formPayload.value = { data_source: {}, knowledge_base: {} }
actionId.value = undefined
actionKey.value += 1
Expand Down Expand Up @@ -160,13 +159,13 @@ defineExpose({ open })
</div>
<template #footer>
<!-- 取消导入 -->
<el-button v-if="active !== 'result'" plain :disabled="busy" @click="visible = false">取消</el-button>
<el-button v-if="active !== 'result'" plain :disabled="loading || uploadingCount > 0" @click="visible = false">取消</el-button>
<!-- 继续导入 -->
<el-button v-if="active === 'result'" plain @click="handleContinueImport">继续导入</el-button>
<!-- 返回数据源 -->
<el-button v-if="showPrev" plain :disabled="busy" @click="handlePrevious">上一步</el-button>
<el-button v-if="showPrev" plain :disabled="loading || uploadingCount > 0" @click="handlePrevious">上一步</el-button>
<!-- 进入用户输入 -->
<el-button v-if="showNext" type="primary" :disabled="busy" @click="handleNext">下一步</el-button>
<el-button v-if="showNext" type="primary" :disabled="loading || uploadingCount > 0" @click="handleNext">下一步</el-button>
<!-- 执行工作流导入 -->
<el-button v-if="showImport" type="primary" :loading="loading" :disabled="uploadingCount > 0" @click="handleSubmit">开始导入</el-button>
<!-- 完成导入 -->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<script setup lang="ts">
import { computed, nextTick, ref, watch } from 'vue'
import { nextTick, ref, watch } from 'vue'
import type { ProblemItem, ProblemParagraph } from '@/api/types'
import MkEditName from '@/components/mk-edit-name/index.vue'
import { MsgSuccess } from '@/utils/message'
import { useKnowledgeDetailContext } from '@/views/knowledge-detail/context'
import { useDocumentDetailContext } from '@/views/document-detail/context'
import ParagraphDialog from '@/views/document-detail/paragraph-dialog/ParagraphDialog.vue'
import ProblemParagraphCard from './ProblemParagraphCard.vue'
import { getFileIconUrl } from '@/utils/icon'

defineOptions({ name: 'ProblemDetailDrawer' })
const problem = defineModel<ProblemItem>({ required: true })
const props = defineProps<{ hasPrevious: boolean; hasNext: boolean; listLoading: boolean }>()
defineProps<{ hasPrevious: boolean; hasNext: boolean }>()
const emit = defineEmits<{ previous: []; next: []; refresh: []; closed: [] }>()
const { knowledgeId, resourceApi } = useKnowledgeDetailContext()
const { resourceApi: documentResourceApi } = useDocumentDetailContext()
Expand All @@ -20,7 +20,6 @@ const loadFailed = ref(false)
const paragraphs = ref<ProblemParagraph[]>([])
const selectedParagraph = ref<ProblemParagraph>()
const paragraphDialogRef = ref<InstanceType<typeof ParagraphDialog>>()
const busy = computed(() => loading.value || props.listLoading)

function loadParagraphs() {
loadFailed.value = false
Expand Down Expand Up @@ -55,7 +54,7 @@ function handleSaveProblem(content: string): Promise<string> {
}

function handleUnlinkParagraph(paragraph: ProblemParagraph) {
if (busy.value) return
if (loading.value) return
loading.value = true
return (
documentResourceApi.paragraph
Expand All @@ -75,7 +74,7 @@ function handleUnlinkParagraph(paragraph: ProblemParagraph) {
}

async function handleOpenParagraph(paragraph: ProblemParagraph) {
if (busy.value) return
if (loading.value) return
selectedParagraph.value = paragraph
// 先挂载带有当前文档 ID 的详情弹窗,再调用其已有打开方法。
await nextTick()
Expand All @@ -90,7 +89,7 @@ function handleParagraphClosed() {
}

function handleBeforeClose(done: () => void) {
if (!busy.value) done()
if (!loading.value) done()
}

watch(
Expand All @@ -113,7 +112,28 @@ watch(
<div class="mb-2">关联分段数({{ problem.paragraph_count }})</div>
<div v-if="paragraphs.length" class="flex-column gap-3">
<template v-for="paragraph in paragraphs" :key="paragraph.id">
<ProblemParagraphCard :paragraph="paragraph" :disabled="busy" @open="handleOpenParagraph" @unlink="handleUnlinkParagraph" />
<!-- 查看关联分段详情 -->
<el-card class="mk-paragraph-card group relative cursor-pointer" shadow="never" @click="handleOpenParagraph(paragraph)">
<h4 class="mb-2 truncate pr-8" :title="paragraph.title || '-'">{{ paragraph.title || '-' }}</h4>
<p class="mb-3 line-clamp-2 break-words" :title="paragraph.content">{{ paragraph.content }}</p>
<div class="flex-align-center gap-2 text-sm text-N500">
<span class="shrink-0">{{ paragraph.content.length }} 字符</span>
<el-divider direction="vertical" />
<img :src="getFileIconUrl(paragraph.document_name)" class="size-4 shrink-0" alt="" />
<span class="truncate" :title="paragraph.document_name">{{ paragraph.document_name }}</span>
</div>
<!-- 取消当前问题与分段的关联,不删除分段 -->
<MkTooltip content="取消关联" placement="top">
<el-button
circle
class="group-hover-visible absolute top-3 right-3 shadow-md"
:disabled="loading"
@click.stop="handleUnlinkParagraph(paragraph)"
>
<MkIcon name="icon_unlink_outlined" />
</el-button>
</MkTooltip>
</el-card>
</template>
</div>
<MkEmpty v-else-if="!loading" description="暂无关联分段" />
Expand All @@ -122,9 +142,9 @@ watch(
<!-- 关联分段:TODO -->
<el-button plain>关联分段</el-button>
<!-- 查看上一个问题 -->
<el-button plain :disabled="busy || !hasPrevious" @click="emit('previous')">上一个</el-button>
<el-button plain :disabled="loading || !hasPrevious" @click="emit('previous')">上一个</el-button>
<!-- 查看下一个问题 -->
<el-button plain :disabled="busy || !hasNext" @click="emit('next')">下一个</el-button>
<el-button plain :disabled="loading || !hasNext" @click="emit('next')">下一个</el-button>
</template>
</MkDrawer>
<ParagraphDialog
Expand Down

This file was deleted.

11 changes: 5 additions & 6 deletions ui/src/views/knowledge-detail/question/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -150,17 +150,17 @@ function handleOpenProblem(problem: ProblemItem, column: TableColumnCtx<ProblemI
detailProblem.value = { ...problem }
}

async function handleNavigateProblem(offset: -1 | 1) {
async function handleNavigateProblem(direction: -1 | 1) {
if (loading.value || currentIndex.value < 0) return
const nextProblem = problems.value[currentIndex.value + offset]
const nextProblem = problems.value[currentIndex.value + direction]
if (nextProblem) {
detailProblem.value = { ...nextProblem }
return
}
if (!(offset === -1 ? hasPrevious.value : hasNext.value)) return
if (!(direction === -1 ? hasPrevious.value : hasNext.value)) return
clearSelection()
const records = await loadProblems(paginationConfig.value.currentPage + offset)
const adjacentProblem = offset === 1 ? records?.[0] : records?.at(-1)
const records = await loadProblems(paginationConfig.value.currentPage + direction)
const adjacentProblem = direction === 1 ? records?.[0] : records?.at(-1)
if (detailProblem.value && adjacentProblem) detailProblem.value = { ...adjacentProblem }
}

Expand Down Expand Up @@ -249,7 +249,6 @@ onMounted(() => loadProblems())
<ProblemDetailDrawer
v-if="detailProblem"
v-model="detailProblem"
:list-loading="loading"
:has-previous="hasPrevious"
:has-next="hasNext"
@previous="handleNavigateProblem(-1)"
Expand Down
Loading