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
9 changes: 9 additions & 0 deletions ui/src/api/admin/system/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,16 @@ const getAllUsers = (query?: RequestParams) => {
return get<SystemUserOption[]>('/user/list', query)
}

/** 系统中选择空间下的成员用户
* @param workspaceId 工作空间ID
* 资源授权 和用户组的 用户下拉列表使用
*/
const getWorkspaceMembers = (workspaceId: string, query?: RequestParams) => {
return get<SystemUserOption[]>(`/workspace/${workspaceId}/user_member`, query)
}

export default {
getDefaultPassword,
getAllUsers,
getWorkspaceMembers,
}
8 changes: 0 additions & 8 deletions ui/src/api/admin/system/user-manage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,6 @@ const postBatchSetUserWorkspaceRoles = (request: BatchSetUserWorkspaceRolesReque
return post<BatchSetUserWorkspaceRolesRequest, boolean>(`${prefix}/batch/add_role_ee`, request)
}

/** 获取空间下的成员用户
* @param workspaceId 工作空间ID
* 资源授权 和用户组的 用户下拉列表使用
*/
const getWorkspaceMembers = (workspaceId: string, query?: RequestParams) => {
return get<SystemUserOption[]>(`/workspace/${workspaceId}/user_member`, query)
}

export default {
deleteUser,
Expand All @@ -69,5 +62,4 @@ export default {
postBatchSetUserWorkspaceRoles,
putUser,
putUserPassword,
getWorkspaceMembers,
}
4 changes: 3 additions & 1 deletion ui/src/api/admin/workspace/common.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { get } from '../core/request'
import type { RequestParams, WorkspaceUserOption } from '@/api/types'
import { getWorkspaceId } from '@/utils/workspace-context'

/** 获取当前工作空间下的用户选项。 */
const getAllUsers = (workspaceId: string, query?: RequestParams) => {
const getAllUsers = (query?: RequestParams) => {
const workspaceId = getWorkspaceId()
return get<WorkspaceUserOption[]>(`/workspace/${workspaceId}/user_list`, query)
}

Expand Down
27 changes: 12 additions & 15 deletions ui/src/api/admin/workspace/folder.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
import { del, get, post, put } from '../core/request'
import type { FolderSource, FolderItem, RequestParams, FolderRequest } from '@/api/types'
import { getWorkspaceId } from '@/utils/workspace-context'

const getPrefix = (workspaceId: string, source: FolderSource) =>
`/workspace/${workspaceId}/${source}/folder`

/** 获取指定资源模块的 Workspace 文件夹树。 */
const getFolderTree = (workspaceId: string, source: FolderSource, query?: RequestParams) => {
return get<FolderItem[]>(getPrefix(workspaceId, source), query)
const getPrefix = (source: FolderSource) => {
const workspaceId = getWorkspaceId()
return `/workspace/${workspaceId}/${source}/folder`
}

/** 获取指定 Workspace 文件夹详情。 */
const getFolderDetail = (workspaceId: string, source: FolderSource, folderId: string) => {
return get<FolderItem>(`${getPrefix(workspaceId, source)}/${folderId}`)
/** 获取指定资源模块的 Workspace 文件夹树。 */
const getFolderTree = (source: FolderSource, query?: RequestParams) => {
return get<FolderItem[]>(getPrefix(source), query)
}

/** 在指定资源模块中创建 Workspace 文件夹。 */
const postFolder = (workspaceId: string, source: FolderSource, payload: FolderRequest) => {
return post<FolderRequest, FolderItem>(getPrefix(workspaceId, source), payload)
const postFolder = (source: FolderSource, payload: FolderRequest) => {
return post<FolderRequest, FolderItem>(getPrefix(source), payload)
}

/** 更新指定 Workspace 文件夹。 */
Expand All @@ -26,17 +24,16 @@ const putFolder = (
folderId: string,
payload: FolderRequest,
) => {
return put<FolderRequest, FolderItem>(`${getPrefix(workspaceId, source)}/${folderId}`, payload)
return put<FolderRequest, FolderItem>(`${getPrefix(source)}/${folderId}`, payload)
}

/** 删除指定 Workspace 文件夹及其中的资源。 */
const deleteFolder = (workspaceId: string, source: FolderSource, folderId: string) => {
return del<boolean>(`${getPrefix(workspaceId, source)}/${folderId}`)
const deleteFolder = (source: FolderSource, folderId: string) => {
return del<boolean>(`${getPrefix(source)}/${folderId}`)
}

export default {
deleteFolder,
getFolderDetail,
getFolderTree,
postFolder,
putFolder,
Expand Down
12 changes: 8 additions & 4 deletions ui/src/api/admin/workspace/model/model-shared.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { del, get, post, put } from '../../core/request'
import { get } from '../../core/request'
import type { RequestParams, WorkspaceModel } from '@/api/types'
import { getWorkspaceId } from '@/utils/workspace-context'

const getPrefix = (workspaceId: string) => `/system/shared/workspace/${workspaceId}`
const getPrefix = () => {
const workspaceId = getWorkspaceId()
return `/system/shared/workspace/${workspaceId}`
}

/** 获取工作空间共享的模型列表。 */
const getModelList = (workspaceId: string, query?: RequestParams) => {
return get<WorkspaceModel[]>(`${getPrefix(workspaceId)}/model`, query)
const getModelList = (query?: RequestParams) => {
return get<WorkspaceModel[]>(`${getPrefix()}/model`, query)
}

export default {
Expand Down
34 changes: 19 additions & 15 deletions ui/src/api/admin/workspace/model/model.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,45 @@
import { del, get, post, put } from '../../core/request'
import type { RequestParams, ModelPayload, WorkspaceModel } from '@/api/types'
import { getWorkspaceId } from '@/utils/workspace-context'

const getPrefix = (workspaceId: string) => `/workspace/${workspaceId}/model`
const getPrefix = () => {
const workspaceId = getWorkspaceId()
return `/workspace/${workspaceId}/model`
}

/** 获取工作空间模型列表。 */
const getModelList = (workspaceId: string, query?: RequestParams) => {
return get<WorkspaceModel[]>(getPrefix(workspaceId), query)
const getModelList = (query?: RequestParams) => {
return get<WorkspaceModel[]>(getPrefix(), query)
}

/** 创建工作空间模型。 */
const postModel = (workspaceId: string, payload: ModelPayload) => {
return post<ModelPayload, WorkspaceModel>(getPrefix(workspaceId), payload)
const postModel = (payload: ModelPayload) => {
return post<ModelPayload, WorkspaceModel>(getPrefix(), payload)
}

/** 更新工作空间模型。 */
const putModel = (workspaceId: string, modelId: string, payload: Partial<ModelPayload>) => {
return put<Partial<ModelPayload>, WorkspaceModel>(`${getPrefix(workspaceId)}/${modelId}`, payload)
const putModel = (modelId: string, payload: Partial<ModelPayload>) => {
return put<Partial<ModelPayload>, WorkspaceModel>(`${getPrefix()}/${modelId}`, payload)
}

/** 获取包含认证信息的模型详情。 */
const getModelDetail = (workspaceId: string, modelId: string) => {
return get<WorkspaceModel>(`${getPrefix(workspaceId)}/${modelId}`)
const getModelDetail = (modelId: string) => {
return get<WorkspaceModel>(`${getPrefix()}/${modelId}`)
}

/** 获取不包含认证信息的模型元数据。 */
const getModelMeta = (workspaceId: string, modelId: string) => {
return get<WorkspaceModel>(`${getPrefix(workspaceId)}/${modelId}/meta`)
const getModelMeta = (modelId: string) => {
return get<WorkspaceModel>(`${getPrefix()}/${modelId}/meta`)
}

/** 删除工作空间模型。 */
const deleteModel = (workspaceId: string, modelId: string) => {
return del<undefined, boolean>(`${getPrefix(workspaceId)}/${modelId}`)
const deleteModel = (modelId: string) => {
return del<undefined, boolean>(`${getPrefix()}/${modelId}`)
}

/** 暂停本地模型下载。 */
const putPauseModelDownload = (workspaceId: string, modelId: string) => {
return put<undefined, boolean>(`${getPrefix(workspaceId)}/${modelId}/pause_download`)
const putPauseModelDownload = (modelId: string) => {
return put<undefined, boolean>(`${getPrefix()}/${modelId}/pause_download`)
}

export default {
Expand Down
52 changes: 28 additions & 24 deletions ui/src/api/admin/workspace/tool/tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,65 +7,69 @@ import type {
ToolTreeResponse,
WorkspaceTool,
} from '@/api/types'
import { getWorkspaceId } from '@/utils/workspace-context'

const getPrefix = (workspaceId: string) => `/workspace/${workspaceId}/tool`
const getPrefix = () => {
const workspaceId = getWorkspaceId()
return `/workspace/${workspaceId}/tool`
}

/** 获取工具分页列表。 */
const getToolPage = (workspaceId: string, page: ParamsPage, query?: ToolListQuery) => {
const getToolPage = (page: ParamsPage, query?: ToolListQuery) => {
return get<ResponsePage<WorkspaceTool>>(
`${getPrefix(workspaceId)}/${page.currentPage}/${page.pageSize}`,
`${getPrefix()}/${page.currentPage}/${page.pageSize}`,
query,
)
}

/** 获取当前目录下的工具和子文件夹。 */
const getToolTree = (workspaceId: string, query?: ToolListQuery) => {
return get<ToolTreeResponse>(getPrefix(workspaceId), query)
const getToolTree = (query?: ToolListQuery) => {
return get<ToolTreeResponse>(getPrefix(), query)
}

/** 获取工作空间全部工具以及已授权的共享工具。 */
const getToolCatalog = (workspaceId: string, query?: ToolListQuery) => {
return get<ToolCatalogResponse>(`${getPrefix(workspaceId)}/tool_list`, query)
const getToolCatalog = (query?: ToolListQuery) => {
return get<ToolCatalogResponse>(`${getPrefix()}/tool_list`, query)
}

/** 创建工作空间工具。 */
const postTool = (workspaceId: string, payload: ToolPayload) => {
return post<ToolPayload, WorkspaceTool>(getPrefix(workspaceId), payload)
const postTool = (payload: ToolPayload) => {
return post<ToolPayload, WorkspaceTool>(getPrefix(), payload)
}

/** 更新工作空间工具。 */
const putTool = (workspaceId: string, toolId: string, payload: ToolPayload) => {
return put<ToolPayload, WorkspaceTool>(`${getPrefix(workspaceId)}/${toolId}`, payload)
const putTool = (toolId: string, payload: ToolPayload) => {
return put<ToolPayload, WorkspaceTool>(`${getPrefix()}/${toolId}`, payload)
}

/** 获取工具详情。 */
const getToolDetail = (workspaceId: string, toolId: string) => {
return get<WorkspaceTool>(`${getPrefix(workspaceId)}/${toolId}`)
const getToolDetail = (toolId: string) => {
return get<WorkspaceTool>(`${getPrefix()}/${toolId}`)
}

/** 删除工作空间工具。 */
const deleteTool = (workspaceId: string, toolId: string) => {
return del<undefined, boolean>(`${getPrefix(workspaceId)}/${toolId}`)
const deleteTool = (toolId: string) => {
return del<undefined, boolean>(`${getPrefix()}/${toolId}`)
}

/** 测试工具配置是否可连接。 */
const postToolTestConnection = (workspaceId: string, payload: ToolPayload) => {
return post<ToolPayload, boolean>(`${getPrefix(workspaceId)}/test_connection`, payload)
const postToolTestConnection = (payload: ToolPayload) => {
return post<ToolPayload, boolean>(`${getPrefix()}/test_connection`, payload)
}

/** 批量删除工作空间工具。 */
const putBatchDeleteTools = (workspaceId: string, toolIds: string[]) => {
return put<{ id_list: string[] }, boolean>(`${getPrefix(workspaceId)}/batch_delete`, {
const putBatchDeleteTools = (toolIds: string[]) => {
return put<{ id_list: string[] }, boolean>(`${getPrefix()}/batch_delete`, {
id_list: toolIds,
})
}

/** 批量移动工作空间工具。 */
const putBatchMoveTools = (workspaceId: string, toolIds: string[], folderId: string) => {
return put<{ folder_id: string; id_list: string[] }, boolean>(
`${getPrefix(workspaceId)}/batch_move`,
{ folder_id: folderId, id_list: toolIds },
)
const putBatchMoveTools = (toolIds: string[], folderId: string) => {
return put<{ folder_id: string; id_list: string[] }, boolean>(`${getPrefix()}/batch_move`, {
folder_id: folderId,
id_list: toolIds,
})
}

export default {
Expand Down
30 changes: 29 additions & 1 deletion ui/src/components/business/folder-tree/VirtualizedTree.vue
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,35 @@ function handleAfterDrop() {

<style lang="scss">
.mk-virtualized-tree {
overflow: auto !important;
scrollbar-color: transparent transparent;
scrollbar-width: thin;

&::-webkit-scrollbar {
background-color: transparent;
height: 6px;
width: 6px;
}

&::-webkit-scrollbar-thumb {
background-color: transparent;
border-radius: var(--el-border-radius-small);
transition: background-color var(--el-transition-duration);
}

&:hover::-webkit-scrollbar-thumb {
background-color: var(--el-scrollbar-bg-color);
opacity: var(--el-scrollbar-opacity);
}

&:hover {
scrollbar-color: color-mix(in srgb, var(--el-scrollbar-bg-color) 30%, transparent) transparent;
}

&::-webkit-scrollbar-thumb:hover {
background-color: var(--el-scrollbar-bg-color);
opacity: var(--el-scrollbar-hover-opacity);
}

.mk-tree-node {
&:hover {
background: none;
Expand Down
4 changes: 2 additions & 2 deletions ui/src/components/business/folder-tree/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ function containsFolder(folder: FolderItem, folderId: string): boolean {
/* 文件夹树 */
function loadFolders() {
loading.value = true
return FolderApi.getFolderTree(workspaceId, props.source)
return FolderApi.getFolderTree(props.source)
.then((folders) => {
folderTree.value = folders
emit('loaded', folders)
Expand Down Expand Up @@ -284,7 +284,7 @@ defineExpose({ openCreate: handleOpenCreateFolder, refresh: loadFolders })
</MkListItem>
</div>

<div class="min-h-0 flex-1 px-4 pb-4">
<div class="min-h-0 flex-1">
<VirtualizedTree
:canEdit="canEdit"
:data="visibleFolders"
Expand Down
8 changes: 4 additions & 4 deletions ui/src/views/model/ModelView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const DEFAULT_MODEL_PROVIDER: ModelProviderItem = {

const route = useRoute()
const {
params: { workspaceId},
params: { workspaceId },
} = route

const loading = ref(false)
Expand Down Expand Up @@ -60,7 +60,7 @@ const searchFields = computed(() => [
function loadCreatorOptions(keyword: string) {
const request = isShared.value
? CommonSystemApi.getAllUsers(keyword ? { nick_name: keyword } : undefined)
: CommonApi.getAllUsers(workspaceId, keyword ? { nick_name: keyword } : undefined)
: CommonApi.getAllUsers(keyword ? { nick_name: keyword } : undefined)

return request.then((users) => {
creatorOptions.value = users.map(({ id, nick_name }) => ({ label: nick_name, value: id }))
Expand All @@ -83,8 +83,8 @@ function loadModels() {
}

const request = isShared.value
? ModelSharedApi.getModelList(workspaceId, modelQuery.value)
: ModelApi.getModelList(workspaceId, query)
? ModelSharedApi.getModelList(modelQuery.value)
: ModelApi.getModelList(query)

return request
.then((models) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import UserGroupsApi from '@/api/admin/system/user-groups'
import UserManageApi from '@/api/admin/system/user-manage'
import CommonSystemApi from '@/api/admin/system/common'
import type { SystemUserOption } from '@/api/types'
import { MsgSuccess } from '@/utils/message'

Expand All @@ -26,7 +26,7 @@ const userOptions = ref<SystemUserOption[]>([])
let searchTimer: ReturnType<typeof setTimeout> | null = null
function loadUserOptions(query?: string) {
optionsLoading.value = true
UserManageApi.getWorkspaceMembers(props.workspaceId, query ? { nick_name: query } : undefined)
CommonSystemApi.getWorkspaceMembers(props.workspaceId, query ? { nick_name: query } : undefined)
.then((users) => {
userOptions.value = users
})
Expand Down
Loading
Loading