125 lines
3.0 KiB
TypeScript
125 lines
3.0 KiB
TypeScript
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');
|
|
} |