fix: clean up cron job edit payloads (#364)

x找我下,跟你聊聊
This commit is contained in:
Zhicheng Han
2026-05-01 02:12:53 +02:00
committed by GitHub
parent 571687459f
commit 7f01fdf56e
6 changed files with 330 additions and 38 deletions
@@ -2,6 +2,7 @@
import { computed } from 'vue'
import { NButton, NTooltip, useMessage } from 'naive-ui'
import type { Job } from '@/api/hermes/jobs'
import { scheduleToDisplayText } from '@/api/hermes/jobs'
import { useJobsStore } from '@/stores/hermes/jobs'
import { useI18n } from 'vue-i18n'
@@ -35,11 +36,7 @@ const statusType = computed(() => {
return 'success' as const
})
const scheduleExpr = computed(() => {
const s = props.job.schedule
if (typeof s === 'string') return s
return s?.expr || props.job.schedule_display || '—'
})
const scheduleExpr = computed(() => scheduleToDisplayText(props.job.schedule, props.job.schedule_display || '—'))
const formatTime = (t?: string | null) => {
if (!t) return '—'
@@ -2,7 +2,13 @@
import { ref, onMounted, computed } from 'vue'
import { NModal, NForm, NFormItem, NInput, NButton, NSelect, NInputNumber, useMessage } from 'naive-ui'
import { useJobsStore } from '@/stores/hermes/jobs'
import type { CreateJobRequest, UpdateJobRequest } from '@/api/hermes/jobs'
import {
buildJobUpdateRequest,
getJob,
jobRepeatToEditValue,
scheduleToEditableInput,
} from '@/api/hermes/jobs'
import type { CreateJobRequest, Job } from '@/api/hermes/jobs'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
@@ -49,22 +55,19 @@ const targetOptions = computed(() => [
{ label: t('jobs.local'), value: 'local' },
])
const originalSchedule = ref<{ kind: string; expr: string; display: string } | null>(null)
const originalJob = ref<Job | null>(null)
onMounted(async () => {
if (props.jobId) {
try {
const { getJob } = await import('@/api/hermes/jobs')
const job = await getJob(props.jobId)
originalJob.value = job
formData.value = {
name: job.name,
schedule: typeof job.schedule === 'string' ? job.schedule : (job.schedule?.expr || job.schedule_display || ''),
schedule: scheduleToEditableInput(job.schedule, job.schedule_display || ''),
prompt: job.prompt,
deliver: job.deliver || 'origin',
repeat_times: typeof job.repeat === 'number' ? job.repeat : (typeof job.repeat === 'object' ? job.repeat.times : null),
}
if (typeof job.schedule === 'object' && job.schedule) {
originalSchedule.value = job.schedule
repeat_times: jobRepeatToEditValue(job.repeat),
}
} catch (e: any) {
message.error(t('jobs.loadFailed') + ': ' + e.message)
@@ -85,20 +88,15 @@ async function handleSave() {
loading.value = true
try {
if (isEdit.value) {
const payload: UpdateJobRequest = {
name: formData.value.name,
prompt: formData.value.prompt,
deliver: formData.value.deliver,
repeat: formData.value.repeat_times ?? undefined,
if (!originalJob.value) {
message.error(t('jobs.loadFailed'))
return
}
if (originalSchedule.value) {
payload.schedule = {
kind: originalSchedule.value.kind,
expr: formData.value.schedule,
display: formData.value.schedule,
}
} else {
payload.schedule = formData.value.schedule
const payload = buildJobUpdateRequest(originalJob.value, formData.value)
if (Object.keys(payload).length === 0) {
message.success(t('jobs.jobUpdated'))
emit('saved')
return
}
await jobsStore.updateJob(props.jobId!, payload)
message.success(t('jobs.jobUpdated'))