diff --git a/ui/web/src/i18n/locales/en/cron.json b/ui/web/src/i18n/locales/en/cron.json index 4f349405..44ee6d30 100644 --- a/ui/web/src/i18n/locales/en/cron.json +++ b/ui/web/src/i18n/locales/en/cron.json @@ -79,6 +79,9 @@ "deliverDirect": "Deliver: direct", "channel": "Channel: {{name}}", "to": "To: {{name}}", + "edit": "Edit", + "preview": "Preview", + "noMessage": "No message configured", "lastError": "Last Error", "runHistory": "Run History", "refresh": "Refresh", diff --git a/ui/web/src/i18n/locales/vi/cron.json b/ui/web/src/i18n/locales/vi/cron.json index 1f910eb7..9b642eb6 100644 --- a/ui/web/src/i18n/locales/vi/cron.json +++ b/ui/web/src/i18n/locales/vi/cron.json @@ -79,6 +79,9 @@ "deliverDirect": "Gửi: trực tiếp", "channel": "Channel: {{name}}", "to": "Đến: {{name}}", + "edit": "Sửa", + "preview": "Xem trước", + "noMessage": "Chưa có tin nhắn", "lastError": "Lỗi gần nhất", "runHistory": "Lịch sử chạy", "refresh": "Làm mới", diff --git a/ui/web/src/i18n/locales/zh/cron.json b/ui/web/src/i18n/locales/zh/cron.json index 34a1ddea..7fb61d23 100644 --- a/ui/web/src/i18n/locales/zh/cron.json +++ b/ui/web/src/i18n/locales/zh/cron.json @@ -79,6 +79,9 @@ "deliverDirect": "投递:直接", "channel": "Channel:{{name}}", "to": "至:{{name}}", + "edit": "编辑", + "preview": "预览", + "noMessage": "未配置消息", "lastError": "最后错误", "runHistory": "运行历史", "refresh": "刷新", diff --git a/ui/web/src/pages/cron/cron-detail/cron-detail-page.tsx b/ui/web/src/pages/cron/cron-detail/cron-detail-page.tsx index 63a47268..1db0450f 100644 --- a/ui/web/src/pages/cron/cron-detail/cron-detail-page.tsx +++ b/ui/web/src/pages/cron/cron-detail/cron-detail-page.tsx @@ -69,8 +69,8 @@ export function CronDetailPage({ onDelete={() => setConfirmDelete(true)} /> -
-
+
+
{t("detail.tabs.overview")} diff --git a/ui/web/src/pages/cron/cron-detail/cron-header.tsx b/ui/web/src/pages/cron/cron-detail/cron-header.tsx index 83f7fa6b..993103c0 100644 --- a/ui/web/src/pages/cron/cron-detail/cron-header.tsx +++ b/ui/web/src/pages/cron/cron-detail/cron-header.tsx @@ -6,6 +6,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp import { cn } from "@/lib/utils"; import type { CronJob } from "../hooks/use-cron"; import { formatSchedule } from "../cron-utils"; +import { useAgents } from "@/pages/agents/hooks/use-agents"; interface CronHeaderProps { job: CronJob; @@ -20,6 +21,9 @@ interface CronHeaderProps { export function CronHeader({ job, isRunning, onBack, onRun, onAdvanced, onToggle, onDelete }: CronHeaderProps) { const { t } = useTranslation("cron"); + const { agents } = useAgents(); + const agent = job.agentId ? agents.find((a) => a.id === job.agentId) : null; + const agentLabel = agent?.display_name || agent?.agent_key || job.agentId; return ( @@ -61,7 +65,7 @@ export function CronHeader({ job, isRunning, onBack, onRun, onAdvanced, onToggle {job.agentId && ( <> · - {job.agentId} + {agentLabel} )}
diff --git a/ui/web/src/pages/cron/cron-detail/cron-overview-tab.tsx b/ui/web/src/pages/cron/cron-detail/cron-overview-tab.tsx index 00a53cd3..7d8b214a 100644 --- a/ui/web/src/pages/cron/cron-detail/cron-overview-tab.tsx +++ b/ui/web/src/pages/cron/cron-detail/cron-overview-tab.tsx @@ -1,13 +1,18 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; +import { Calendar, Clock, AlertTriangle, Globe, Pencil } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Switch } from "@/components/ui/switch"; import { Button } from "@/components/ui/button"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { StickySaveBar } from "@/components/shared/sticky-save-bar"; +import { MarkdownRenderer } from "@/components/shared/markdown-renderer"; import { formatDate } from "@/lib/format"; import type { CronJob } from "../hooks/use-cron"; +import { CronStatusBadge } from "../cron-utils"; +import { useAgents } from "@/pages/agents/hooks/use-agents"; interface CronOverviewTabProps { job: CronJob; @@ -23,17 +28,9 @@ function getEverySeconds(job: CronJob): string { return "60"; } -function InfoRow({ label, value }: { label: string; value: string }) { - return ( -
- {label} -
{value}
-
- ); -} - export function CronOverviewTab({ job, onUpdate }: CronOverviewTabProps) { const { t } = useTranslation("cron"); + const { agents } = useAgents(); const readonly = !onUpdate; const [scheduleKind, setScheduleKind] = useState(job.schedule.kind as ScheduleKind); @@ -42,7 +39,7 @@ export function CronOverviewTab({ job, onUpdate }: CronOverviewTabProps) { const [message, setMessage] = useState(job.payload?.message ?? ""); const [agentId, setAgentId] = useState(job.agentId ?? ""); const [enabled, setEnabled] = useState(job.enabled); - + const [editingMessage, setEditingMessage] = useState(false); const [saving, setSaving] = useState(false); const handleSave = async () => { @@ -63,6 +60,7 @@ export function CronOverviewTab({ job, onUpdate }: CronOverviewTabProps) { agentId: agentId.trim() || undefined, enabled, }); + setEditingMessage(false); } catch { // toast shown by hook } finally { @@ -136,20 +134,40 @@ export function CronOverviewTab({ job, onUpdate }: CronOverviewTabProps) { )} - {/* Message section */} + {/* Message section — markdown preview or textarea */}
-

{t("detail.messageSection")}

-
- +
+

{t("detail.messageSection")}

+ {!readonly && ( + + )} +
+ + {editingMessage ? (