chore: ts lint fix

This commit is contained in:
engigu
2026-04-01 18:05:52 +08:00
parent 643828f07a
commit bb50e25f0e
3 changed files with 39 additions and 39 deletions
+16 -16
View File
@@ -92,13 +92,13 @@ const versionSearch = ref('')
const filteredPlugins = computed(() => {
if (!pluginSearch.value) return availablePlugins.value
const s = pluginSearch.value.toLowerCase()
return availablePlugins.value.filter(p => p.toLowerCase().includes(s))
return availablePlugins.value.filter((p: string) => p.toLowerCase().includes(s))
})
function getFilteredVersions(versions: string[]) {
if (!versionSearch.value) return versions
const s = versionSearch.value.toLowerCase()
return versions.filter(v => v.toLowerCase().includes(s))
return versions.filter((v: string) => v.toLowerCase().includes(s))
}
async function fetchInstalledLangs() {
@@ -106,7 +106,7 @@ async function fetchInstalledLangs() {
try {
installedLangs.value = await api.mise.list()
const plugins = new Set<string>()
installedLangs.value.forEach(l => plugins.add(l.plugin))
installedLangs.value.forEach((l: MiseLanguage) => plugins.add(l.plugin))
availablePlugins.value = Array.from(plugins).sort()
} catch (e) {
console.error('Fetch installed langs failed', e)
@@ -158,9 +158,9 @@ function getLangIcon(plugin: string) {
function updateAvailableVersions(lang: { name: string; version: string; availableVersions: string[] }) {
if (lang.name) {
lang.availableVersions = installedLangs.value
.filter(l => l.plugin === lang.name)
.map(l => l.version)
.sort((a, b) => b.localeCompare(a, undefined, { numeric: true }))
.filter((l: MiseLanguage) => l.plugin === lang.name)
.map((l: MiseLanguage) => l.version)
.sort((a: string, b: string) => b.localeCompare(a, undefined, { numeric: true }))
} else {
lang.availableVersions = []
}
@@ -257,7 +257,7 @@ function addTag() {
function removeTag(tagToRemove: string) {
const currentTags = form.value.tags ? form.value.tags.split(',').filter(Boolean) : []
form.value.tags = currentTags.filter(t => t !== tagToRemove).join(',')
form.value.tags = currentTags.filter((t: string) => t !== tagToRemove).join(',')
}
@@ -284,7 +284,7 @@ const cleanConfig = computed(() => {
return JSON.stringify({ type: cleanType.value, keep: cleanKeep.value })
})
watch(() => props.open, async (val) => {
watch(() => props.open, async (val: boolean) => {
if (val) {
form.value = {
retry_count: props.task?.retry_count ?? 0,
@@ -360,7 +360,7 @@ watch(() => props.open, async (val) => {
await loadAgents()
if (selectedAgentId.value === 'local') {
await fetchInstalledLangs()
selectedLangs.value.forEach(lang => {
selectedLangs.value.forEach((lang: { name: string; version: string; availableVersions: string[] }) => {
updateAvailableVersions(lang)
})
}
@@ -395,7 +395,7 @@ async function save() {
}
// 保存语言环境
form.value.languages = selectedLangs.value.map(l => ({
form.value.languages = selectedLangs.value.map((l: { name: string; version: string }) => ({
name: l.name,
version: l.version
}))
@@ -485,7 +485,7 @@ async function save() {
<div class="grid grid-cols-1 sm:grid-cols-4 items-center gap-3">
<Label class="sm:text-right text-xs text-foreground/70 uppercase tracking-wider font-bold">源类型</Label>
<div class="sm:col-span-3">
<Select :model-value="repoConfig.source_type" @update:model-value="(v) => repoConfig.source_type = String(v || 'git')">
<Select :model-value="repoConfig.source_type" @update:model-value="(v: any) => repoConfig.source_type = String(v || 'git')">
<SelectTrigger class="h-9 bg-muted/30 border-muted-foreground/20">
<SelectValue />
</SelectTrigger>
@@ -559,7 +559,7 @@ async function save() {
<div class="grid grid-cols-1 sm:grid-cols-4 items-center gap-3">
<Label class="sm:text-right text-xs text-foreground/70 uppercase tracking-wider font-medium">代理配置</Label>
<div class="sm:col-span-3">
<Select :model-value="repoConfig.proxy" @update:model-value="(v) => repoConfig.proxy = String(v || 'none')">
<Select :model-value="repoConfig.proxy" @update:model-value="(v: any) => repoConfig.proxy = String(v || 'none')">
<SelectTrigger class="h-9 bg-muted/30 border-muted-foreground/20">
<SelectValue />
</SelectTrigger>
@@ -764,7 +764,7 @@ async function save() {
<Label class="sm:text-right text-xs text-foreground/70 uppercase tracking-wider font-bold">随机延迟</Label>
<div class="sm:col-span-3 flex items-center gap-4">
<div class="flex items-center gap-2">
<Input :model-value="form.random_range" @update:model-value="v => form.random_range = Number(v || 0)" type="number" :min="0" class="w-20 h-9 bg-muted/30 text-center" />
<Input :model-value="form.random_range" @update:model-value="(v: string | number) => form.random_range = Number(v || 0)" type="number" :min="0" class="w-20 h-9 bg-muted/30 text-center" />
<span class="text-xs font-semibold text-muted-foreground">秒</span>
</div>
<div class="flex-1 text-[11px] text-muted-foreground leading-snug p-2 rounded-lg bg-blue-500/5 border border-blue-500/10 italic">
@@ -783,7 +783,7 @@ async function save() {
<Zap :class="cn('h-3.5 w-3.5', autoAddCron ? 'text-primary' : 'text-muted-foreground')" />
自动添加任务
</div>
<Switch :model-value="autoAddCron" @update:model-value="v => autoAddCron = v" />
<Switch :model-value="autoAddCron" @update:model-value="(v: boolean) => autoAddCron = v" />
</div>
<p class="text-[11px] text-muted-foreground leading-relaxed">
{{ autoAddCron ? '同步完成后将尝试自动分析脚本并注册定时任务。' : '仅拉取脚本,不自动注册成面板任务。' }}
@@ -792,11 +792,11 @@ async function save() {
<div class="flex items-center gap-4">
<div class="flex items-center gap-2">
<Input :model-value="form.timeout" @update:model-value="v => form.timeout = Number(v || 0)" type="number" :min="0" class="w-20 h-9 bg-muted/30 text-center" />
<Input :model-value="form.timeout" @update:model-value="(v: string | number) => form.timeout = Number(v || 0)" type="number" :min="0" class="w-20 h-9 bg-muted/30 text-center" />
<span class="text-[11px] font-semibold text-muted-foreground">分钟超时</span>
</div>
<div class="flex items-center gap-2 pl-4 border-l">
<Select :model-value="cleanType" @update:model-value="(v) => cleanType = String(v || 'none')">
<Select :model-value="cleanType" @update:model-value="(v: any) => cleanType = String(v || 'none')">
<SelectTrigger class="w-28 h-9 text-xs bg-muted/10">
<SelectValue />
</SelectTrigger>
+19 -19
View File
@@ -66,7 +66,7 @@ const cronDescription = computed(() => {
// 监听 concurrencyEnabled 的变化,同步到 concurrency
watch(concurrencyEnabled, (val) => {
watch(concurrencyEnabled, (val: boolean) => {
concurrency.value = val ? 1 : 0
})
@@ -89,13 +89,13 @@ function addTag() {
function removeTag(tagToRemove: string) {
const currentTags = form.value.tags ? form.value.tags.split(',').filter(Boolean) : []
form.value.tags = currentTags.filter(t => t !== tagToRemove).join(',')
form.value.tags = currentTags.filter((t: string) => t !== tagToRemove).join(',')
}
// 当前显示的工作目录(根据选择的执行位置)
const currentWorkDir = computed({
get: () => workDirCache.value[selectedAgentId.value] || '',
set: (val) => {
set: (val: string) => {
workDirCache.value[selectedAgentId.value] = val
}
})
@@ -106,7 +106,7 @@ const cleanConfig = computed(() => {
})
const filteredEnvVars = computed(() => {
return allEnvVars.value.filter(env => {
return allEnvVars.value.filter((env: EnvVar) => {
const matchSearch = !envSearchQuery.value || env.name.toLowerCase().includes(envSearchQuery.value.toLowerCase())
const notSelected = !selectedEnvIds.value.includes(env.id)
return matchSearch && notSelected
@@ -115,12 +115,12 @@ const filteredEnvVars = computed(() => {
const selectedEnvs = computed(() => {
return selectedEnvIds.value
.map(id => allEnvVars.value.find(e => e.id === id))
.map((id: string) => allEnvVars.value.find((e: EnvVar) => e.id === id))
.filter((e): e is EnvVar => e !== undefined)
})
const onlineAgents = computed(() => {
return allAgents.value.filter(a => a.enabled)
return allAgents.value.filter((a: Agent) => a.enabled)
})
// 语言环境相关
@@ -137,13 +137,13 @@ const notificationConfigRef = ref<InstanceType<typeof TaskNotificationConfig> |
const filteredPlugins = computed(() => {
if (!pluginSearch.value) return availablePlugins.value
const s = pluginSearch.value.toLowerCase()
return availablePlugins.value.filter(p => p.toLowerCase().includes(s))
return availablePlugins.value.filter((p: string) => p.toLowerCase().includes(s))
})
function getFilteredVersions(versions: string[]) {
if (!versionSearch.value) return versions
const s = versionSearch.value.toLowerCase()
return versions.filter(v => v.toLowerCase().includes(s))
return versions.filter((v: string) => v.toLowerCase().includes(s))
}
async function fetchInstalledLangs() {
@@ -151,7 +151,7 @@ async function fetchInstalledLangs() {
try {
installedLangs.value = await api.mise.list()
const plugins = new Set<string>()
installedLangs.value.forEach(l => plugins.add(l.plugin))
installedLangs.value.forEach((l: MiseLanguage) => plugins.add(l.plugin))
availablePlugins.value = Array.from(plugins).sort()
} catch (e) {
console.error('Fetch installed langs failed', e)
@@ -203,9 +203,9 @@ function getLangIcon(plugin: string) {
function updateAvailableVersions(lang: { name: string; version: string; availableVersions: string[] }) {
if (lang.name) {
lang.availableVersions = installedLangs.value
.filter(l => l.plugin === lang.name)
.map(l => l.version)
.sort((a, b) => b.localeCompare(a, undefined, { numeric: true }))
.filter((l: MiseLanguage) => l.plugin === lang.name)
.map((l: MiseLanguage) => l.version)
.sort((a: string, b: string) => b.localeCompare(a, undefined, { numeric: true }))
} else {
lang.availableVersions = []
}
@@ -227,7 +227,7 @@ function updateLangName(index: number, name: string) {
updateAvailableVersions(lang)
}
watch(() => props.open, async (val) => {
watch(() => props.open, async (val: boolean) => {
if (val) {
form.value = {
retry_count: props.task?.retry_count ?? 0,
@@ -286,7 +286,7 @@ watch(() => props.open, async (val) => {
}
// 解析环境变量
if (props.task?.envs) {
selectedEnvIds.value = props.task.envs.split(',').map(s => s.trim()).filter(Boolean)
selectedEnvIds.value = props.task.envs.split(',').map((s: string) => s.trim()).filter(Boolean)
} else {
selectedEnvIds.value = []
}
@@ -320,7 +320,7 @@ watch(() => props.open, async (val) => {
if (selectedAgentId.value === 'local') {
await fetchInstalledLangs()
// 更新所有语言的可用版本
selectedLangs.value.forEach(lang => {
selectedLangs.value.forEach((lang: { name: string; version: string; availableVersions: string[] }) => {
updateAvailableVersions(lang)
})
}
@@ -349,7 +349,7 @@ function addEnv(id: string) {
}
function removeEnv(id: string) {
selectedEnvIds.value = selectedEnvIds.value.filter(envId => envId !== id)
selectedEnvIds.value = selectedEnvIds.value.filter((envId: string) => envId !== id)
}
function normalizeLocalWorkDirForDisplay(workDir?: string | null): string {
@@ -389,7 +389,7 @@ async function save() {
form.value.agent_id = selectedAgentId.value === 'local' ? null : selectedAgentId.value
// 保存语言环境配置
form.value.languages = selectedLangs.value.map(l => ({
form.value.languages = selectedLangs.value.map((l: { name: string; version: string }) => ({
name: l.name,
version: l.version
}))
@@ -596,14 +596,14 @@ async function save() {
<Label class="sm:text-right text-xs text-foreground/70 uppercase tracking-wider font-bold">失败策略</Label>
<div class="sm:col-span-3 flex items-center gap-3">
<span class="text-[11px] text-muted-foreground">重试</span>
<Input :model-value="form.retry_count" @update:model-value="v => form.retry_count = Number(v)" type="number" :min="0" class="w-20 h-9 bg-muted/20 border-muted-foreground/15 text-center font-bold" />
<Input :model-value="form.retry_count" @update:model-value="(v: string | number) => form.retry_count = Number(v)" type="number" :min="0" class="w-20 h-9 bg-muted/20 border-muted-foreground/15 text-center font-bold" />
<span class="text-[11px] text-muted-foreground">次</span>
</div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-4 items-center gap-3">
<Label class="sm:text-right text-xs text-foreground/70 uppercase tracking-wider font-bold">运行策略</Label>
<div class="sm:col-span-3 flex items-center gap-3">
<Input :model-value="form.timeout" @update:model-value="v => form.timeout = Number(v)" type="number" :min="0" class="w-20 h-9 bg-muted/20 border-muted-foreground/15 text-center font-bold" />
<Input :model-value="form.timeout" @update:model-value="(v: string | number) => form.timeout = Number(v)" type="number" :min="0" class="w-20 h-9 bg-muted/20 border-muted-foreground/15 text-center font-bold" />
<span class="text-[11px] text-muted-foreground">分钟超时</span>
</div>
</div>
+4 -4
View File
@@ -42,7 +42,7 @@ let searchTimer: ReturnType<typeof setTimeout> | null = null
// 创建 agent 映射表
const agentMap = computed(() => {
const map: Record<string, Agent> = {}
agents.value.forEach(a => { map[a.id] = a })
agents.value.forEach((a: Agent) => { map[a.id] = a })
return map
})
@@ -314,7 +314,7 @@ onMounted(async () => {
})
// 监听路由参数变化
watch(() => route.query.agent_id, (newVal) => {
watch(() => route.query.agent_id, (newVal: any) => {
filterAgentId.value = newVal ? String(newVal) : null
currentPage.value = 1
loadTasks()
@@ -346,7 +346,7 @@ watch(() => route.query.agent_id, (newVal) => {
<div class="flex items-center gap-3 w-full sm:w-auto">
<!-- 移动端类型切换 -->
<div class="md:hidden flex-1 shrink-0">
<Select v-model="filterType" @update:model-value="handleTypeChange">
<Select v-model="filterType" @update:model-value="(_v: any) => handleTypeChange()">
<SelectTrigger class="h-9 w-full text-sm">
<SelectValue />
</SelectTrigger>
@@ -382,7 +382,7 @@ watch(() => route.query.agent_id, (newVal) => {
</div>
<!-- 桌面端类型切换移到后面 -->
<Tabs :model-value="filterType" @update:model-value="v => { filterType = String(v); handleTypeChange() }" class="shrink-0 hidden md:block">
<Tabs :model-value="filterType" @update:model-value="(v: string | number) => { filterType = String(v); handleTypeChange() }" class="shrink-0 hidden md:block">
<TabsList class="h-9 p-1 bg-muted/30 border">
<TabsTrigger :value="TASK_TYPE.NORMAL" class="px-4 h-7 text-[13px]">定时任务</TabsTrigger>
<TabsTrigger :value="TASK_TYPE.REPO" class="px-4 h-7 text-[13px]">仓库同步</TabsTrigger>