135 lines
2.8 KiB
TypeScript
135 lines
2.8 KiB
TypeScript
import { defineAsyncComponent, h } from 'vue';
|
|
import { renderDialog } from '../../utils/components';
|
|
import type {
|
|
BannerConfig,
|
|
ColumnField,
|
|
DocumentResource,
|
|
Route,
|
|
Row,
|
|
} from './types';
|
|
import { trialDays } from '../../utils/site';
|
|
import { planTitle } from '../../utils/format';
|
|
|
|
export const unreachable = Error('unreachable'); // used to indicate that a codepath is unreachable
|
|
|
|
export const clusterOptions = [
|
|
'',
|
|
'中国大陆',
|
|
'中国香港',
|
|
'美国-洛杉矶',
|
|
'新加坡',
|
|
'英国-伦敦',
|
|
'德国-法兰克福',
|
|
'阿联酋-迪拜',
|
|
];
|
|
|
|
export function getUpsellBanner(site: DocumentResource, title: string) {
|
|
if (
|
|
!site.pg.current_plan ||
|
|
site.pg.current_plan?.private_benches ||
|
|
site.pg.current_plan?.is_trial_plan ||
|
|
!site.pg.group_public
|
|
)
|
|
return;
|
|
|
|
return {
|
|
title: title,
|
|
dismissable: true,
|
|
id: site.name,
|
|
type: 'gray',
|
|
button: {
|
|
label: '升级计划',
|
|
variant: 'outline',
|
|
onClick() {
|
|
let SitePlansDialog = defineAsyncComponent(
|
|
() => import('../../components/ManageSitePlansDialog.vue')
|
|
);
|
|
renderDialog(h(SitePlansDialog, { site: site.name }));
|
|
},
|
|
},
|
|
} satisfies BannerConfig as BannerConfig;
|
|
}
|
|
|
|
export function getSitesTabColumns(forBenchTab: boolean) {
|
|
return [
|
|
{
|
|
label: '站点',
|
|
fieldname: 'host_name',
|
|
format(value, row) {
|
|
return value || row.name;
|
|
},
|
|
prefix: () => {
|
|
if (forBenchTab) return;
|
|
return h('div', { class: 'ml-2 w-3.5 h-3.5' });
|
|
},
|
|
},
|
|
{
|
|
label: '状态',
|
|
fieldname: 'status',
|
|
type: 'Badge',
|
|
width: 0.5,
|
|
},
|
|
{
|
|
label: '区域',
|
|
fieldname: 'cluster_title',
|
|
width: 0.5,
|
|
prefix(row) {
|
|
if (row.cluster_title)
|
|
return h('img', {
|
|
src: row.cluster_image,
|
|
class: 'w-4 h-4',
|
|
alt: row.cluster_title,
|
|
});
|
|
},
|
|
},
|
|
{
|
|
label: '计划',
|
|
width: 0.5,
|
|
format(value, row) {
|
|
if (row.trial_end_date) {
|
|
return trialDays(row.trial_end_date);
|
|
}
|
|
return planTitle(row);
|
|
},
|
|
},
|
|
] satisfies ColumnField[] as ColumnField[];
|
|
}
|
|
|
|
export function siteTabFilterControls() {
|
|
return [
|
|
{
|
|
type: 'select',
|
|
label: '状态',
|
|
fieldname: 'status',
|
|
options: [
|
|
{ label: '', value: '' },
|
|
{ label: '激活', value: 'Active' },
|
|
{ label: '未激活', value: 'Inactive' },
|
|
{ label: '已暂停', value: 'Suspended' },
|
|
{ label: '已损坏', value: 'Broken' }
|
|
],
|
|
},
|
|
{
|
|
type: 'select',
|
|
label: '区域',
|
|
fieldname: 'cluster',
|
|
options: [
|
|
'',
|
|
'中国大陆',
|
|
'中国香港',
|
|
'美国-洛杉矶',
|
|
'新加坡',
|
|
'英国-伦敦',
|
|
'德国-法兰克福',
|
|
'阿联酋-迪拜',
|
|
],
|
|
},
|
|
];
|
|
}
|
|
|
|
export function sitesTabRoute(r: Row) {
|
|
return {
|
|
name: '站点详情',
|
|
params: { name: r.name },
|
|
} satisfies Route as Route;
|
|
} |