diff --git a/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeFieldDetail.vue b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeFieldDetail.vue new file mode 100644 index 00000000..28762548 --- /dev/null +++ b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeFieldDetail.vue @@ -0,0 +1,270 @@ + + + + + \ No newline at end of file diff --git a/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeFieldRule.vue b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeFieldRule.vue new file mode 100644 index 00000000..abbedd6f --- /dev/null +++ b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeFieldRule.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeListDetail.vue b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeListDetail.vue new file mode 100644 index 00000000..8f1cadca --- /dev/null +++ b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbeListDetail.vue @@ -0,0 +1,359 @@ + + + + + \ No newline at end of file diff --git a/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePagePatternDetail.vue b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePagePatternDetail.vue new file mode 100644 index 00000000..83eba773 --- /dev/null +++ b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePagePatternDetail.vue @@ -0,0 +1,323 @@ + + + + + \ No newline at end of file diff --git a/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePaginationDetail.vue b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePaginationDetail.vue new file mode 100644 index 00000000..2a62ac04 --- /dev/null +++ b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePaginationDetail.vue @@ -0,0 +1,138 @@ + + + + + \ No newline at end of file diff --git a/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePatternStats.vue b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePatternStats.vue new file mode 100644 index 00000000..f82094bf --- /dev/null +++ b/frontend/crawlab-ui/src/components/core/autoprobe/AutoProbePatternStats.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/frontend/crawlab-ui/src/components/index.ts b/frontend/crawlab-ui/src/components/index.ts index 2d584449..edab6953 100644 --- a/frontend/crawlab-ui/src/components/index.ts +++ b/frontend/crawlab-ui/src/components/index.ts @@ -19,7 +19,13 @@ import * as theme from './ui/lexical/utils/theme'; import * as VariableNode from './ui/lexical/nodes/VariableNode'; import AssistantConsole from './core/ai/AssistantConsole.vue'; import AtomMaterialIcon from './ui/icon/AtomMaterialIcon.vue'; +import AutoProbeFieldDetail from './core/autoprobe/AutoProbeFieldDetail.vue'; +import AutoProbeFieldRule from './core/autoprobe/AutoProbeFieldRule.vue'; import AutoProbeForm from './core/autoprobe/AutoProbeForm.vue'; +import AutoProbeListDetail from './core/autoprobe/AutoProbeListDetail.vue'; +import AutoProbePagePatternDetail from './core/autoprobe/AutoProbePagePatternDetail.vue'; +import AutoProbePaginationDetail from './core/autoprobe/AutoProbePaginationDetail.vue'; +import AutoProbePatternStats from './core/autoprobe/AutoProbePatternStats.vue'; import AutoProbeTaskStatus from './core/autoprobe/AutoProbeTaskStatus.vue'; import BlockOptionsDropdownList from './ui/lexical/components/BlockOptionsDropdownList.vue'; import Box from './ui/box/Box.vue'; @@ -269,7 +275,13 @@ export { VariableNode as VariableNode, AssistantConsole as ClAssistantConsole, AtomMaterialIcon as ClAtomMaterialIcon, + AutoProbeFieldDetail as ClAutoProbeFieldDetail, + AutoProbeFieldRule as ClAutoProbeFieldRule, AutoProbeForm as ClAutoProbeForm, + AutoProbeListDetail as ClAutoProbeListDetail, + AutoProbePagePatternDetail as ClAutoProbePagePatternDetail, + AutoProbePaginationDetail as ClAutoProbePaginationDetail, + AutoProbePatternStats as ClAutoProbePatternStats, AutoProbeTaskStatus as ClAutoProbeTaskStatus, BlockOptionsDropdownList as ClBlockOptionsDropdownList, Box as ClBox, diff --git a/frontend/crawlab-ui/src/constants/tab.ts b/frontend/crawlab-ui/src/constants/tab.ts index d72ea38a..ea21acca 100644 --- a/frontend/crawlab-ui/src/constants/tab.ts +++ b/frontend/crawlab-ui/src/constants/tab.ts @@ -25,3 +25,4 @@ export const TAB_NAME_USERS = 'users'; export const TAB_NAME_ROLES = 'roles'; export const TAB_NAME_PERMISSIONS = 'permissions'; export const TAB_NAME_PAGES = 'pages'; +export const TAB_NAME_PATTERNS = 'patterns'; diff --git a/frontend/crawlab-ui/src/i18n/lang/en/common.ts b/frontend/crawlab-ui/src/i18n/lang/en/common.ts index ab1ff87c..5b25f5c6 100644 --- a/frontend/crawlab-ui/src/i18n/lang/en/common.ts +++ b/frontend/crawlab-ui/src/i18n/lang/en/common.ts @@ -144,6 +144,7 @@ const common: LCommon = { indexes: 'Indexes', results: 'Results', output: 'Output', + patterns: 'Patterns', }, status: { unassigned: 'Unassigned', diff --git a/frontend/crawlab-ui/src/i18n/lang/en/components/autoprobe.ts b/frontend/crawlab-ui/src/i18n/lang/en/components/autoprobe.ts index 007bedc9..f5d4a0ee 100644 --- a/frontend/crawlab-ui/src/i18n/lang/en/components/autoprobe.ts +++ b/frontend/crawlab-ui/src/i18n/lang/en/components/autoprobe.ts @@ -24,6 +24,63 @@ const autoprobe: LComponentsAutoProbe = { }, }, }, + stats: { + totalFields: 'Total Fields', + totalLists: 'Total Lists', + paginationType: 'Pagination Type', + noPagination: 'No Pagination', + }, + navItems: { + lists: 'Lists', + fields: 'Fields', + pagination: 'Pagination', + list: 'List', + field: 'Field', + }, + patterns: { + selectItem: 'Select an item to view details', + }, + field: { + title: 'Field', + name: 'Name', + selector: 'Selector', + type: 'Selector Type', + extractionType: 'Extraction Type', + attributeName: 'Attribute Name', + defaultValue: 'Default Value', + notFound: 'Field details not found', + self: 'self (points to itself)', + }, + list: { + title: 'List', + name: 'Name', + listSelector: 'List Selector', + listSelectorType: 'List Selector Type', + itemSelector: 'Item Selector', + itemSelectorType: 'Item Selector Type', + fields: 'Fields', + nestedLists: 'Nested Lists', + notFound: 'List details not found', + self: 'self (points to itself)', + }, + pagination: { + title: 'Pagination', + type: 'Type', + selectorType: 'Selector Type', + selector: 'Selector', + maxPages: 'Max Pages', + startPage: 'Start Page', + notFound: 'Pagination details not found', + }, + pagePattern: { + title: 'Page Pattern', + name: 'Name', + stats: 'Statistics', + fields: 'Fields', + lists: 'Lists', + hasPagination: 'Has Pagination', + notFound: 'Page pattern details not found', + }, }; export default autoprobe; diff --git a/frontend/crawlab-ui/src/i18n/lang/en/layouts.ts b/frontend/crawlab-ui/src/i18n/lang/en/layouts.ts index 9332c5dc..afa04e70 100644 --- a/frontend/crawlab-ui/src/i18n/lang/en/layouts.ts +++ b/frontend/crawlab-ui/src/i18n/lang/en/layouts.ts @@ -236,6 +236,7 @@ const layouts: LLayouts = { tabs: { overview: 'Overview', tasks: 'Task', + patterns: 'Patterns', }, }, } diff --git a/frontend/crawlab-ui/src/i18n/lang/en/views/autoprobe.ts b/frontend/crawlab-ui/src/i18n/lang/en/views/autoprobe.ts index a876dbad..1b36931a 100644 --- a/frontend/crawlab-ui/src/i18n/lang/en/views/autoprobe.ts +++ b/frontend/crawlab-ui/src/i18n/lang/en/views/autoprobe.ts @@ -5,6 +5,8 @@ const autoprobe: LViewsAutoProbe = { url: 'URL', query: 'Query', status: 'Status', + lastTask: 'Last Task', + patterns: 'Patterns', }, }, navActions: { diff --git a/frontend/crawlab-ui/src/i18n/lang/zh/common.ts b/frontend/crawlab-ui/src/i18n/lang/zh/common.ts index 03885bbe..4f92fa10 100644 --- a/frontend/crawlab-ui/src/i18n/lang/zh/common.ts +++ b/frontend/crawlab-ui/src/i18n/lang/zh/common.ts @@ -144,6 +144,7 @@ const common: LCommon = { indexes: '索引', results: '结果', output: '输出', + patterns: '模式', }, status: { unassigned: '未指定', diff --git a/frontend/crawlab-ui/src/i18n/lang/zh/components/autoprobe.ts b/frontend/crawlab-ui/src/i18n/lang/zh/components/autoprobe.ts index 5e46cc9e..4b35d9ec 100644 --- a/frontend/crawlab-ui/src/i18n/lang/zh/components/autoprobe.ts +++ b/frontend/crawlab-ui/src/i18n/lang/zh/components/autoprobe.ts @@ -24,6 +24,63 @@ const autoprobe: LComponentsAutoProbe = { }, }, }, + stats: { + totalFields: '字段总数', + totalLists: '列表总数', + paginationType: '分页类型', + noPagination: '无分页', + }, + navItems: { + lists: '列表', + fields: '字段', + pagination: '分页', + list: '列表', + field: '字段', + }, + patterns: { + selectItem: '选择一个项目查看详情', + }, + field: { + title: '字段', + name: '名称', + selector: '选择器', + type: '选择器类型', + extractionType: '提取类型', + attributeName: '属性名称', + defaultValue: '默认值', + notFound: '未找到字段详情', + self: '自身(指向自己)', + }, + list: { + title: '列表', + name: '名称', + listSelector: '列表选择器', + listSelectorType: '列表选择器类型', + itemSelector: '项目选择器', + itemSelectorType: '项目选择器类型', + fields: '字段', + nestedLists: '嵌套列表', + notFound: '未找到列表详情', + self: '自身(指向自己)', + }, + pagination: { + title: '分页', + type: '类型', + selectorType: '选择器类型', + selector: '选择器', + maxPages: '最大页数', + startPage: '起始页', + notFound: '未找到分页详情', + }, + pagePattern: { + title: '页面模式', + name: '名称', + stats: '统计', + fields: '字段', + lists: '列表', + hasPagination: '有分页', + notFound: '未找到页面模式详情', + }, }; export default autoprobe; diff --git a/frontend/crawlab-ui/src/i18n/lang/zh/layouts.ts b/frontend/crawlab-ui/src/i18n/lang/zh/layouts.ts index 364c4882..7ff27a83 100644 --- a/frontend/crawlab-ui/src/i18n/lang/zh/layouts.ts +++ b/frontend/crawlab-ui/src/i18n/lang/zh/layouts.ts @@ -236,6 +236,7 @@ const layouts: LLayouts = { tabs: { overview: '概览', tasks: '任务', + patterns: '模式', }, }, }, diff --git a/frontend/crawlab-ui/src/i18n/lang/zh/views/autoprobe.ts b/frontend/crawlab-ui/src/i18n/lang/zh/views/autoprobe.ts index aa3f8f4c..386451a1 100644 --- a/frontend/crawlab-ui/src/i18n/lang/zh/views/autoprobe.ts +++ b/frontend/crawlab-ui/src/i18n/lang/zh/views/autoprobe.ts @@ -5,6 +5,8 @@ const autoprobe: LViewsAutoProbe = { url: 'URL', query: '查询', status: '状态', + lastTask: '最近任务', + patterns: '模式', }, }, navActions: { diff --git a/frontend/crawlab-ui/src/interfaces/i18n/common.d.ts b/frontend/crawlab-ui/src/interfaces/i18n/common.d.ts index 6ab92fe3..7998d1af 100644 --- a/frontend/crawlab-ui/src/interfaces/i18n/common.d.ts +++ b/frontend/crawlab-ui/src/interfaces/i18n/common.d.ts @@ -157,6 +157,7 @@ export declare global { indexes: string; results: string; output: string; + patterns: string; }; status: { unassigned: string; diff --git a/frontend/crawlab-ui/src/interfaces/i18n/components/autoprobe.d.ts b/frontend/crawlab-ui/src/interfaces/i18n/components/autoprobe.d.ts index 42a68562..39469c6f 100644 --- a/frontend/crawlab-ui/src/interfaces/i18n/components/autoprobe.d.ts +++ b/frontend/crawlab-ui/src/interfaces/i18n/components/autoprobe.d.ts @@ -24,4 +24,61 @@ interface LComponentsAutoProbe { }; }; }; + stats: { + totalFields: string; + totalLists: string; + paginationType: string; + noPagination: string; + }; + navItems: { + lists: string; + fields: string; + pagination: string; + list: string; + field: string; + }; + patterns: { + selectItem: string; + }; + field: { + title: string; + name: string; + selector: string; + type: string; + extractionType: string; + attributeName: string; + defaultValue: string; + notFound: string; + self: string; + }; + list: { + title: string; + name: string; + listSelector: string; + listSelectorType: string; + itemSelector: string; + itemSelectorType: string; + fields: string; + nestedLists: string; + notFound: string; + self: string; + }; + pagination: { + title: string; + type: string; + selectorType: string; + selector: string; + maxPages: string; + startPage: string; + notFound: string; + }; + pagePattern: { + title: string; + name: string; + stats: string; + fields: string; + lists: string; + hasPagination: string; + notFound: string; + }; } diff --git a/frontend/crawlab-ui/src/interfaces/i18n/layouts.d.ts b/frontend/crawlab-ui/src/interfaces/i18n/layouts.d.ts index d81675d1..1d7dd983 100644 --- a/frontend/crawlab-ui/src/interfaces/i18n/layouts.d.ts +++ b/frontend/crawlab-ui/src/interfaces/i18n/layouts.d.ts @@ -125,6 +125,7 @@ export declare global { autoprobe: LListLayoutPage<{ overview: string; tasks: string; + patterns: string; }>; }; } diff --git a/frontend/crawlab-ui/src/interfaces/i18n/views/autoprobe.d.ts b/frontend/crawlab-ui/src/interfaces/i18n/views/autoprobe.d.ts index 183b58ed..99b6d103 100644 --- a/frontend/crawlab-ui/src/interfaces/i18n/views/autoprobe.d.ts +++ b/frontend/crawlab-ui/src/interfaces/i18n/views/autoprobe.d.ts @@ -5,6 +5,8 @@ interface LViewsAutoProbe { url: string; query: string; status: string; + lastTask: string; + patterns: string; }; }; navActions: LNavActions & { diff --git a/frontend/crawlab-ui/src/interfaces/models/autoprobe.d.ts b/frontend/crawlab-ui/src/interfaces/models/autoprobe.d.ts index dfce697f..67ba68be 100644 --- a/frontend/crawlab-ui/src/interfaces/models/autoprobe.d.ts +++ b/frontend/crawlab-ui/src/interfaces/models/autoprobe.d.ts @@ -3,9 +3,19 @@ export declare global { name?: string; url?: string; query?: string; + last_task_id?: string; + last_task?: AutoProbeTask; + default_task_id?: string; + page_pattern?: PagePattern; + page_data?: PageData; } - type AutoProbeTaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled'; + type AutoProbeTaskStatus = + | 'pending' + | 'running' + | 'completed' + | 'failed' + | 'cancelled'; type SelectorType = 'css' | 'xpath' | 'regex'; type ExtractType = 'text' | 'attribute' | 'html'; @@ -72,4 +82,9 @@ export declare global { url: string; html?: string; } + + interface AutoProbeNavItem extends NavItem { + type?: 'page_pattern' | 'fields' | 'lists' | 'pagination' | 'list' | 'item' | 'field'; + children?: AutoProbeNavItem[]; + } } diff --git a/frontend/crawlab-ui/src/layouts/content/list/ListLayout.vue b/frontend/crawlab-ui/src/layouts/content/list/ListLayout.vue index dd503d46..20ab500b 100644 --- a/frontend/crawlab-ui/src/layouts/content/list/ListLayout.vue +++ b/frontend/crawlab-ui/src/layouts/content/list/ListLayout.vue @@ -293,10 +293,6 @@ defineOptions({ name: 'ClListLayout' }); } } - &:deep(.tag) { - margin-right: 10px; - } - .nav-actions { max-height: 52px; background-color: var(--cl-container-white-bg); diff --git a/frontend/crawlab-ui/src/router/autoprobe.ts b/frontend/crawlab-ui/src/router/autoprobe.ts index c0b31a5b..9f3a6e0b 100644 --- a/frontend/crawlab-ui/src/router/autoprobe.ts +++ b/frontend/crawlab-ui/src/router/autoprobe.ts @@ -1,9 +1,14 @@ -import { TAB_NAME_OVERVIEW, TAB_NAME_TASKS } from '@/constants/tab'; +import { + TAB_NAME_OVERVIEW, + TAB_NAME_PATTERNS, + TAB_NAME_TASKS, +} from '@/constants/tab'; import { ClAutoProbeList, ClAutoProbeDetail, ClAutoProbeDetailTabOverview, ClAutoProbeDetailTabTasks, + ClAutoProbeDetailTabPatterns, } from '@/views'; import { getIconByTabName, translate } from '@/utils'; import { RouteLocation } from 'vue-router'; @@ -42,6 +47,12 @@ export default [ icon: getIconByTabName(TAB_NAME_TASKS), component: async () => ClAutoProbeDetailTabTasks, }, + { + path: TAB_NAME_PATTERNS, + title: t('layouts.routes.autoprobe.detail.tabs.patterns'), + icon: getIconByTabName(TAB_NAME_PATTERNS), + component: async () => ClAutoProbeDetailTabPatterns, + }, ], }, ] as Array; diff --git a/frontend/crawlab-ui/src/store/modules/autoprobe.ts b/frontend/crawlab-ui/src/store/modules/autoprobe.ts index 04f50915..96be8ca5 100644 --- a/frontend/crawlab-ui/src/store/modules/autoprobe.ts +++ b/frontend/crawlab-ui/src/store/modules/autoprobe.ts @@ -4,7 +4,11 @@ import { getDefaultStoreMutations, getDefaultStoreState, } from '@/utils/store'; -import { TAB_NAME_OVERVIEW, TAB_NAME_TASKS } from '@/constants/tab'; +import { + TAB_NAME_OVERVIEW, + TAB_NAME_PATTERNS, + TAB_NAME_TASKS, +} from '@/constants/tab'; import { translate } from '@/utils/i18n'; import useRequest from '@/services/request'; @@ -18,6 +22,7 @@ const state = { tabs: [ { id: TAB_NAME_OVERVIEW, title: t('common.tabs.overview') }, { id: TAB_NAME_TASKS, title: t('common.tabs.tasks') }, + { id: TAB_NAME_PATTERNS, title: t('common.tabs.patterns') }, ], } as AutoProbeStoreState; diff --git a/frontend/crawlab-ui/src/utils/icon.ts b/frontend/crawlab-ui/src/utils/icon.ts index 041c015e..46dfc643 100644 --- a/frontend/crawlab-ui/src/utils/icon.ts +++ b/frontend/crawlab-ui/src/utils/icon.ts @@ -58,6 +58,7 @@ import { TAB_NAME_OUTPUT, TAB_NAME_OVERVIEW, TAB_NAME_PAGES, + TAB_NAME_PATTERNS, TAB_NAME_PERMISSIONS, TAB_NAME_RESULTS, TAB_NAME_ROLES, @@ -127,6 +128,8 @@ export const getIconByTabName = (tabName: string): Icon => { return ['fa', 'user-check']; case TAB_NAME_PAGES: return ['fa', 'file-alt']; + case TAB_NAME_PATTERNS: + return ['fa', 'network-wired']; default: return ['fa', 'circle']; } diff --git a/frontend/crawlab-ui/src/views/autoprobe/detail/tabs/AutoProbeDetailTabPatterns.vue b/frontend/crawlab-ui/src/views/autoprobe/detail/tabs/AutoProbeDetailTabPatterns.vue new file mode 100644 index 00000000..77f9cae6 --- /dev/null +++ b/frontend/crawlab-ui/src/views/autoprobe/detail/tabs/AutoProbeDetailTabPatterns.vue @@ -0,0 +1,486 @@ + + + + + diff --git a/frontend/crawlab-ui/src/views/autoprobe/list/useAutoProbeList.tsx b/frontend/crawlab-ui/src/views/autoprobe/list/useAutoProbeList.tsx index ec1ee845..cb558725 100644 --- a/frontend/crawlab-ui/src/views/autoprobe/list/useAutoProbeList.tsx +++ b/frontend/crawlab-ui/src/views/autoprobe/list/useAutoProbeList.tsx @@ -8,12 +8,15 @@ import { ACTION_FILTER_SEARCH, ACTION_RUN, ACTION_VIEW, - ACTION_VIEW_SPIDERS, FILTER_OP_CONTAINS, TABLE_COLUMN_NAME_ACTIONS, } from '@/constants'; import { getIconByAction, onListFilterChangeByKey, translate } from '@/utils'; -import { ClNavLink } from '@/components'; +import { + ClNavLink, + ClAutoProbeTaskStatus, + ClAutoProbePatternStats, +} from '@/components'; import { useRouter } from 'vue-router'; import { ElMessage, ElMessageBox } from 'element-plus'; @@ -92,12 +95,50 @@ const useAutoProbeList = () => { label: t('views.autoprobe.table.columns.url'), icon: ['fa', 'at'], width: 'auto', + minWidth: '200', value: (row: AutoProbe) => ( ), hasFilter: true, allowFilterSearch: true, }, + { + key: 'last_task', + label: t('views.autoprobe.table.columns.lastTask'), + icon: ['fa', 'heartbeat'], + width: '120', + value: (row: AutoProbe) => { + const { status, error } = row.last_task || {}; + if (!status) return; + return ( + router.push(`/autoprobes/${row._id}/tasks`)} + /> + ); + }, + hasFilter: true, + allowFilterSearch: true, + }, + { + key: 'patterns', + label: t('views.autoprobe.table.columns.patterns'), + icon: ['fa', 'network-wired'], + width: '200', + value: (row: AutoProbe) => { + return ( + router.push(`/autoprobes/${row._id}/patterns`)} + /> + ); + }, + hasFilter: true, + allowFilterSearch: true, + }, { key: TABLE_COLUMN_NAME_ACTIONS, label: t('components.table.columns.actions'), diff --git a/frontend/crawlab-ui/src/views/index.ts b/frontend/crawlab-ui/src/views/index.ts index d2bba75a..e0e8fdc2 100644 --- a/frontend/crawlab-ui/src/views/index.ts +++ b/frontend/crawlab-ui/src/views/index.ts @@ -1,5 +1,6 @@ import AutoProbeDetail from './autoprobe/detail/AutoProbeDetail.vue'; import AutoProbeDetailTabOverview from './autoprobe/detail/tabs/AutoProbeDetailTabOverview.vue'; +import AutoProbeDetailTabPatterns from './autoprobe/detail/tabs/AutoProbeDetailTabPatterns.vue'; import AutoProbeDetailTabTasks from './autoprobe/detail/tabs/AutoProbeDetailTabTasks.vue'; import AutoProbeList from './autoprobe/list/AutoProbeList.vue'; import DatabaseDetail from './database/detail/DatabaseDetail.vue'; @@ -125,6 +126,7 @@ import useUserList from './user/list/useUserList'; export { AutoProbeDetail as ClAutoProbeDetail, AutoProbeDetailTabOverview as ClAutoProbeDetailTabOverview, + AutoProbeDetailTabPatterns as ClAutoProbeDetailTabPatterns, AutoProbeDetailTabTasks as ClAutoProbeDetailTabTasks, AutoProbeList as ClAutoProbeList, DatabaseDetail as ClDatabaseDetail,