import { unreachable } from '.'; import { getTeam } from '../../data/team'; import { icon } from '../../utils/components'; import { isMobile } from '../../utils/device'; import { duration } from '../../utils/format'; import { ColumnField, Tab } from './types'; type JobDocTypes = 'Site' | 'Bench' | 'Server' | 'Release Group'; export function getJobsTab(pagetype: JobDocTypes) { const jobRoute = getJobRoute(pagetype); return { label: '任务', icon: icon('truck'), childrenRoutes: [jobRoute], route: 'jobs', type: 'list', list: { pagetype: 'Agent Job', filters: res => { if (pagetype === 'Site') return { site: res.name }; else if (pagetype === 'Bench') return { bench: res.name }; else if (pagetype === 'Server') return { server: res.name }; else if (pagetype === 'Release Group') return { group: res.name }; throw unreachable; }, route(row) { return { name: jobRoute, params: { id: row.name } }; }, orderBy: 'creation desc', searchField: 'job_type', fields: ['end', 'job_id'], filterControls() { return [ { type: 'select', label: '状态', fieldname: 'status', class: !isMobile() ? 'w-24' : '', options: ['', 'Pending', 'Running', 'Success', 'Failure'] }, { type: 'link', label: '类型', fieldname: 'job_type', options: { pagetype: 'Agent Job Type', orderBy: 'name asc', pageLength: 100 } } ]; }, rowActions: ({ row }) => [ { label: '在桌面查看', condition: () => getTeam()?.pg?.is_desk_user, onClick() { window.open( `${window.location.protocol}//${window.location.host}/app/agent-job/${row.name}`, '_blank' ); } } ], columns: getJobTabColumns(pagetype) } } satisfies Tab as Tab; } function getJobRoute(pagetype: JobDocTypes) { if (pagetype === 'Site') return 'Site Job'; else if (pagetype === 'Bench') return 'Bench Job'; else if (pagetype === 'Server') return 'Server Job'; else if (pagetype === 'Release Group') return 'Release Group Job'; throw unreachable; } function getJobTabColumns(pagetype: JobDocTypes) { const columns: ColumnField[] = [ { label: '任务类型', fieldname: 'job_type', class: 'font-medium' }, { label: '状态', fieldname: 'status', type: 'Badge', width: 0.5 }, { label: '站点', fieldname: 'site', width: 1.2 }, { label: '持续时间', fieldname: 'duration', width: 0.35, format: (value, row) => { if (row.job_id === 0 || !row.end) return; return duration(value); } }, { label: '创建者', fieldname: 'owner' }, { label: '', fieldname: 'creation', type: 'Timestamp', width: 0.75, align: 'right' } ]; if (pagetype !== 'Site') return columns; return columns.filter(c => c.fieldname !== 'site'); }