diff --git a/apps/daas/src/i18n/langs/en.js b/apps/daas/src/i18n/langs/en.js index 427afcda8..21d7ddb00 100644 --- a/apps/daas/src/i18n/langs/en.js +++ b/apps/daas/src/i18n/langs/en.js @@ -142,6 +142,7 @@ export default { data_import_export_git_operation_records: 'Git Operation Records', data_import_export_stack_trace: 'Stack Trace', data_import_export_load_group_failed: 'Failed to load group list', + data_import_export_load_resource_failed: 'Failed to load resource list', data_import_export_select_at_least_one: 'Please select at least one group', data_import_export_git_info_required: 'Please configure Git info first', data_import_export_branch_name: 'Branch Name', diff --git a/apps/daas/src/i18n/langs/zh-CN.js b/apps/daas/src/i18n/langs/zh-CN.js index 1cf6d5bcd..36e6a33dd 100644 --- a/apps/daas/src/i18n/langs/zh-CN.js +++ b/apps/daas/src/i18n/langs/zh-CN.js @@ -138,6 +138,7 @@ export default { data_import_export_git_operation_records: 'Git 操作记录', data_import_export_stack_trace: '堆栈信息', data_import_export_load_group_failed: '加载分组列表失败', + data_import_export_load_resource_failed: '加载资源列表失败', data_import_export_select_at_least_one: '请至少选择一个分组', data_import_export_git_info_required: '请先配置 Git 信息', data_import_export_branch_name: '分支名', diff --git a/apps/daas/src/i18n/langs/zh-TW.js b/apps/daas/src/i18n/langs/zh-TW.js index ecef8efd3..3a81b1147 100644 --- a/apps/daas/src/i18n/langs/zh-TW.js +++ b/apps/daas/src/i18n/langs/zh-TW.js @@ -138,6 +138,7 @@ export default { data_import_export_git_operation_records: 'Git 操作記錄', data_import_export_stack_trace: '堆疊信息', data_import_export_load_group_failed: '加載分組列表失敗', + data_import_export_load_resource_failed: '加載資源列表失敗', data_import_export_select_at_least_one: '請至少選擇一個分組', data_import_export_git_info_required: '請先配置 Git 信息', data_import_export_branch_name: '分支名', diff --git a/apps/daas/src/views/data-import-export/ProjectManagement.vue b/apps/daas/src/views/data-import-export/ProjectManagement.vue index c99103394..c9965803a 100644 --- a/apps/daas/src/views/data-import-export/ProjectManagement.vue +++ b/apps/daas/src/views/data-import-export/ProjectManagement.vue @@ -2,14 +2,14 @@ import { createGroupInfo, deleteGroupInfo, + fetchGroupInfoApis, fetchGroupInfoList, + fetchGroupInfoTasks, updateGroupInfo, type GroupInfoDto, type ResourceItem, type ResourceType, } from '@tap/api/core/group-info' -import { fetchApiModules } from '@tap/api/core/modules' -import { fetchTasks } from '@tap/api/core/task' import { PageContainer } from '@tap/business' import TaskStatus from '@tap/business/src/components/TaskStatus.vue' import { makeStatusAndDisabled } from '@tap/business/src/shared' @@ -215,6 +215,23 @@ const handleGroupCommand = (command: string, group: GroupInfoDto) => { } } +// 判断资源是否属于其他分组 +const isResourceInOtherGroup = (resource: any) => { + return ( + resource.groupId && + selectedGroup.value?.id && + resource.groupId !== selectedGroup.value.id + ) +} + +// 点击分组名称跳转到对应分组 +const handleNavigateToGroup = (resource: any) => { + const targetGroup = groupList.value.find((g) => g.id === resource.groupId) + if (targetGroup) { + selectedGroup.value = targetGroup + } +} + // 加载资源列表 const loadResources = async () => { resourceLoading.value = true @@ -240,23 +257,25 @@ const loadResources = async () => { name: item.name, status: item.status, type, + groupId: item.groupId || null, + groupName: item.groupName || null, } } switch (type) { case 'SYNC_TASK': filter.where.syncType = 'sync' - result = await fetchTasks(filter) + result = await fetchGroupInfoTasks(filter) resourceList.value = result.items.map(mapTask) break case 'MIGRATE_TASK': filter.where.syncType = 'migrate' - result = await fetchTasks(filter) + result = await fetchGroupInfoTasks(filter) resourceList.value = result.items.map(mapTask) break case 'MODULE': - result = await fetchApiModules(filter) - resourceList.value = result.items.map((item) => { + result = await fetchGroupInfoApis(filter) + resourceList.value = result.items.map((item: any) => { const pathJoin: string[] = [] item.apiVersion && pathJoin.push(item.apiVersion) item.prefix && pathJoin.push(item.prefix) @@ -266,14 +285,17 @@ const loadResources = async () => { name: item.name, path: `/${pathJoin.join('/')}`, type, + groupId: item.groupId || null, + groupName: item.groupName || null, } }) break } totalCount.value = result?.total || 0 - } catch { - ElMessage.error('加载资源列表失败') + } catch (error) { + ElMessage.error(t('data_import_export_load_resource_failed')) + console.error(error) } finally { resourceLoading.value = false } @@ -284,9 +306,14 @@ const isResourceAdded = (id: string) => { return addedResources.value.some((item) => item.id === id) } +// 判断资源是否不可操作(已添加或属于其他分组) +const isResourceDisabled = (resource: any) => { + return isResourceAdded(resource.id) || isResourceInOtherGroup(resource) +} + // 切换资源选中状态 const toggleResourceSelection = (resource: any) => { - if (isResourceAdded(resource.id)) { + if (isResourceDisabled(resource)) { return } const index = selectedResources.value.indexOf(resource.id) @@ -490,7 +517,7 @@ onMounted(() => { // 全选/取消全选可用资源 const isAllSelected = computed(() => { const availableResources = resourceList.value.filter( - (item) => !isResourceAdded(item.id), + (item) => !isResourceDisabled(item), ) return ( availableResources.length > 0 && @@ -503,7 +530,7 @@ const isAllSelected = computed(() => { const handleSelectAll = (checked: any) => { if (checked) { const availableResources = resourceList.value.filter( - (item) => !isResourceAdded(item.id), + (item) => !isResourceDisabled(item), ) selectedResources.value = availableResources.map((item) => item.id) } else { @@ -689,13 +716,16 @@ const handleSelectAll = (checked: any) => { v-for="resource in resourceList" :key="resource.id" class="resource-item rounded-xl" - :class="{ 'is-disabled': isResourceAdded(resource.id) }" + :class="{ + 'is-disabled': isResourceDisabled(resource), + 'is-other-group': isResourceInOtherGroup(resource), + }" @click="toggleResourceSelection(resource)" > @@ -711,8 +741,18 @@ const handleSelectAll = (checked: any) => { + + + {{ resource.groupName }} + { - - {{ + + {{ t('data_import_export_selected') }} @@ -1049,6 +1089,21 @@ const handleSelectAll = (checked: any) => { background-color: var(--el-fill-color-lighter); } + &.is-other-group { + opacity: 0.7; + border-color: var(--el-color-warning-light-5); + background-color: var(--el-color-warning-light-9); + } + + .group-tag { + cursor: pointer; + flex-shrink: 0; + + &:hover { + opacity: 0.8; + } + } + .resource-content { display: flex; align-items: center; diff --git a/packages/api/src/core/group-info.ts b/packages/api/src/core/group-info.ts index 86e24a665..6e99509fa 100644 --- a/packages/api/src/core/group-info.ts +++ b/packages/api/src/core/group-info.ts @@ -191,3 +191,25 @@ export function fetchGroupInfoRecordList(filter?: Filter) { export function fetchLastestGitTag(groupId: string) { return requestClient.get(`${BASE_URL}/lastestGitTag/${groupId}`) } + +/** + * 获取带有分组信息的任务列表 + */ +export function fetchGroupInfoTasks(filter?: any) { + return requestClient.get>(`${BASE_URL}/tasks`, { + params: { + filter: filter ? JSON.stringify(filter) : undefined, + }, + }) +} + +/** + * 获取带有分组信息的 API(模块)列表 + */ +export function fetchGroupInfoApis(filter?: any) { + return requestClient.get>(`${BASE_URL}/apis`, { + params: { + filter: filter ? JSON.stringify(filter) : undefined, + }, + }) +}