2025-04-12 17:39:38 +08:00

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;
}