Skip to content
Closed
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
17 changes: 10 additions & 7 deletions ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1465,7 +1465,7 @@ chat 装配函数通过 `disabled` 禁用输入框与附件。
`provideKnowledgeDetailContext` 在详情入口装配并提供上下文,`useKnowledgeDetailContext` 供子页读取。
基础设置和文档策略通过 `useKnowledgeSettingContext` 获取可管理范围的完整 Knowledge API 类型,
该设置上下文的 `resourceApi` 仅提供 `knowledge`;定时同步通过 `useKnowledgeSyncContext` 读取当前
`resourceApi.sync` 及可保存范围的 `requestSettingApi`。Workspace 共享只查询设置和日志,表单只读且不显示保存。
`resourceApi.sync`。Workspace 共享只查询设置和日志,表单只读且不显示保存。
不在页面用方法是否存在判断可写能力;上下文边界排除 Workspace 共享只读范围,
共享设置路由已注册,API 上下文仍保留原有只读边界,写接口接入暂缓。
上下文按响应式 `resourceScope` 选择各范围现有完整 Knowledge、Sync API 对象,
Expand All @@ -1476,8 +1476,8 @@ chat 装配函数通过 `disabled` 禁用输入框与附件。
目前仅详情入口及 setting 下的基础设置、文档策略、定时同步页面采用上下文 API;
library 下的文档、标签与迁移入口通过 `useKnowledgeLibraryContext` 读取现有 API,
`resourceApi.document / tags` 是可选的查询模块;System 两种来源未提供时不发送请求。
与 sync 一致,维护接口只通过 `requestSettingApi` 提供,内部使用完整的 `document / tags / workflow / knowledge` API;
仅 Workspace 普通范围提供该维护入口,分别传给已有操作组件;不为共享或 System 补造写接口。共享标签页按现有无查询参数接口读取,
查询和维护均通过 `resourceApi.document / tags / workflow / knowledge` 的现有完整 API 对象进行;
维护操作沿用 Workspace 普通范围边界,分别传给已有操作组件;不为共享或 System 补造写接口。共享标签页按现有无查询参数接口读取,
在本地按标签名称筛选,不展示维护入口;关联文档数量仅作文本展示。
同步日志通过完整 Sync API props 请求。展示组件不接收上下文 API。
System 飞书专用保存方法尚未提供,基础设置沿该范围现有 `putKnowledge` 协议;Workspace 飞书保留专用方法。
Expand All @@ -1495,7 +1495,10 @@ Workspace 共享文档保留查询和标签展示,标签页保留标签组查
创建标签弹窗必须由入口传入完整 Tags API,不再默认使用普通 Workspace;文档标签添加及迁移的
候选查询同样通过资料库上下文选择。图片页保持占位,不配置不存在的接口。

资料库所有消费方沿用 Sync 的双入口结构,包括文档页、标签页、文档标签添加弹窗、标签创建入口、
文档迁移弹窗以及传入 Action / Drawer 的 API:查询模块通过响应式 `resourceApi` getter 读取,
维护模块通过单个 `requestSettingApi` 读取,不再为各模块暴露独立 computed 入口。
方法内部选定完整业务 API 时继续使用局部变量 `requestApi`,它不属于新的上下文入口。
资料库和 Sync 所有消费方统一通过 `resourceApi.xx` 的响应式 getter 访问完整 API,
不增加查询/维护双入口或模块别名。只读范围和缺失模块保留现有业务边界;
接口对象联合类型在调用处按真实方法集合收窄,不补造方法或跨范围回退。
未约定的 API 方法、上下文入口或返回结构必须先与用户商议并确认后再实现。

资料库模板不使用“API 对象存在且包含某方法”的组合判断来控制操作显隐;
只保留原有业务资源范围条件,接口联合类型的收窄不增加可见性规则。
19 changes: 4 additions & 15 deletions ui/src/views/knowledge-detail/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,25 +111,14 @@ export function useKnowledgeDetailContext() {
return context
}

/** 资料库保留现有查询差异,维护接口仅来自已支持写入的 Workspace 普通范围。 */
/** 资料库直接复用统一资源接口入口,不增加模块别名或维护接口入口。 */
export function useKnowledgeLibraryContext() {
const context = useKnowledgeDetailContext()
const requestSettingApi = computed(() => {
if (context.resourceScope.value !== 'workspace') return undefined
return resourceConfigs.workspace.resourceApi
})
return { ...context, requestSettingApi }
return useKnowledgeDetailContext()
}

/** 同步查询使用当前范围,保存仅提供给现有 API 支持写入的三个范围。 */
/** 定时同步直接复用当前范围的完整 Sync API。 */
export function useKnowledgeSyncContext() {
const context = useKnowledgeDetailContext()
const requestSettingApi = computed(() => {
const scope = context.resourceScope.value
if (!scope || scope === 'workspace-shared') return undefined
return resourceConfigs[scope].resourceApi.sync
})
return { ...context, requestSettingApi }
return useKnowledgeDetailContext()
}

/** 设置页只属于可管理范围,在上下文边界排除 Workspace 共享只读资源。 */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { useRoute } from 'vue-router'
import type DocumentApi from '@/api/admin/workspace/knowledge/document'
import { useKnowledgeDetailContext } from '../../../../context'
import { useKnowledgeDetailContext } from '@/views/knowledge-detail/context'

defineOptions({ name: 'BatchExportDocumentAction' })

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
import { computed, reactive, ref, useTemplateRef } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import type { KnowledgeItem } from '@/api/types'
import { useKnowledgeLibraryContext } from '../../../../context'
import { useKnowledgeLibraryContext } from '@/views/knowledge-detail/context'
import type DocumentApi from '@/api/admin/workspace/knowledge/document'
import { MsgSuccess } from '@/utils/message'

defineOptions({ name: 'DocumentMigrateDialog' })
const props = defineProps<{ api: typeof DocumentApi; knowledgeId: string }>()
const emit = defineEmits<{ refresh: []; closed: [] }>()
const { requestSettingApi } = useKnowledgeLibraryContext()
const { resourceApi, resourceScope } = useKnowledgeLibraryContext()
const visible = ref(false)
const loading = defineModel<boolean>('loading', { default: false })
const optionLoading = ref(false)
Expand All @@ -24,8 +24,8 @@ const targetDocumentIds = ref<string[]>([])

// 打开迁移弹窗,固定本次文档并查询目标知识库。
function open(documentIds: string[]) {
const requestApi = requestSettingApi.value?.knowledge
if (!requestApi || loading.value || optionLoading.value || !documentIds.length) return
const requestApi = resourceApi.knowledge
if (resourceScope.value !== 'workspace' || !('getAllKnowledge' in requestApi) || loading.value || optionLoading.value || !documentIds.length) return
targetDocumentIds.value = [...documentIds]
visible.value = true
optionLoading.value = true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
<script setup lang="ts">
import type TagsApi from '@/api/admin/workspace/knowledge/tags'
import { nextTick, reactive, ref } from 'vue'
import type { FormInstance } from 'element-plus'
import type DocumentApi from '@/api/admin/workspace/knowledge/document'
import { useKnowledgeLibraryContext } from '../../../../context'
import { useKnowledgeLibraryContext } from '@/views/knowledge-detail/context'
import type { KnowledgeTagGroup } from '@/api/types'
import { MsgError, MsgSuccess } from '@/utils/message'
import CreateTagDialog from '../../../tags/components/CreateTagDialog.vue'
import CreateTagDialog from '@/views/knowledge-detail/library/tags/components/CreateTagDialog.vue'

type WorkspaceTagsApi = typeof TagsApi

defineOptions({ name: 'AddTagDialog' })
const props = defineProps<{
Expand All @@ -20,7 +23,7 @@ interface TagSelection {
tagId: string
}

const { requestSettingApi } = useKnowledgeLibraryContext()
const { resourceApi, resourceScope } = useKnowledgeLibraryContext()
const visible = ref(false)
const queryLoading = ref(false)
const targetKnowledgeId = ref('')
Expand All @@ -33,8 +36,8 @@ const createTagMounted = ref(false)

// 候选项只保留接口返回的前 100 个标签组,搜索交给 el-select 的 filterable。
function loadTagOptions() {
const requestApi = requestSettingApi.value?.tags
if (!requestApi) return
const requestApi = resourceApi.tags
if (resourceScope.value !== 'workspace' || !requestApi) return
queryLoading.value = true
return requestApi
.getKnowledgeTags(targetKnowledgeId.value)
Expand All @@ -51,7 +54,7 @@ function loadTagOptions() {
}

function open(documentIds: string[]) {
if (!requestSettingApi.value?.tags || visible.value || loading.value || !documentIds.length) return
if (resourceScope.value !== 'workspace' || !resourceApi.tags || visible.value || loading.value || !documentIds.length) return
targetKnowledgeId.value = props.knowledgeId
targetDocumentIds.value = [...documentIds]
visible.value = true
Expand Down Expand Up @@ -156,10 +159,10 @@ defineExpose({ open })
</template>
</MkDialog>
<CreateTagDialog
v-if="createTagMounted && requestSettingApi"
v-if="createTagMounted && resourceScope === 'workspace'"
ref="createTagRef"
:knowledge-id="targetKnowledgeId"
:api="requestSettingApi.tags"
:api="resourceApi.tags as WorkspaceTagsApi"
@refresh="loadTagOptions"
@closed="createTagMounted = false"
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
import { TOOLTIP_SHOW_DELAY } from '@/components/global/mk-tooltip/constants'
import { computed, nextTick, ref, useTemplateRef } from 'vue'
import type DocumentApi from '@/api/admin/workspace/knowledge/document'
import type SharedDocumentApi from '@/api/admin/workspace/shared/knowledge/document'
import type { DocumentItem } from '@/api/types'
import AddTagDialog from '../action-dropdown/setting-tags/AddTagDialog.vue'

type WorkspaceDocumentApi = typeof DocumentApi

defineOptions({ name: 'DocumentTags' })
const props = defineProps<{ api?: typeof DocumentApi; knowledgeId: string; document: DocumentItem; disabled?: boolean }>()
const props = defineProps<{ api?: typeof DocumentApi | typeof SharedDocumentApi; knowledgeId: string; document: DocumentItem; disabled?: boolean }>()
const loading = defineModel<boolean>('loading', { default: false })
const emit = defineEmits<{ refresh: [] }>()

Expand All @@ -18,7 +21,7 @@ const addTagRef = useTemplateRef<InstanceType<typeof AddTagDialog>>('addTagRef')
const targetKnowledgeId = ref('')

function handleOpenDialog() {
if (!props.api || props.disabled || loading.value || dialogMounted.value) return
if (!props.api || !('putDocument' in props.api) || props.disabled || loading.value || dialogMounted.value) return
targetKnowledgeId.value = props.knowledgeId
const documentId = props.document.id
dialogMounted.value = true
Expand Down Expand Up @@ -57,10 +60,10 @@ function handleDialogClosed() {
</el-button>
</div>
<AddTagDialog
v-if="dialogMounted && api"
v-if="dialogMounted"
ref="addTagRef"
v-model:loading="loading"
:api="api"
:api="api as WorkspaceDocumentApi"
:knowledge-id="targetKnowledgeId"
@refresh="emit('refresh')"
@closed="handleDialogClosed"
Expand Down
Loading
Loading