diff --git a/web2/src/pages/admin/AdminDailyTopics.tsx b/web2/src/pages/admin/AdminDailyTopics.tsx index 879f04b..4a7f7f8 100644 --- a/web2/src/pages/admin/AdminDailyTopics.tsx +++ b/web2/src/pages/admin/AdminDailyTopics.tsx @@ -1,6 +1,6 @@ import { useEffect, useState, useCallback } from 'react' import { toast } from 'sonner' -import { Sparkles, Loader2, RefreshCw, Pencil, Calendar } from 'lucide-react' +import { Sparkles, Loader2, RefreshCw, Pencil, Calendar, Plus, X } from 'lucide-react' import { PageLayout } from '@/components/common/PageLayout' import { EmptyState } from '@/components/common/EmptyState' import { LoadingState } from '@/components/common/LoadingState' @@ -8,7 +8,7 @@ import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Label } from '@/components/ui/label' -import { Textarea } from '@/components/ui/textarea' +import { Input } from '@/components/ui/input' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' @@ -160,7 +160,7 @@ export function AdminDailyTopics() { ) } -/** 编辑/创建热点问题弹窗 */ +/** 编辑/创建热点问题弹窗:列表式编辑,每条可单独修改/删除 */ function EditTopicsDialog({ topic, onClose, @@ -172,23 +172,43 @@ function EditTopicsDialog({ }) { const isCreate = !topic const [scene, setScene] = useState(topic?.scene || 'legal') - const [questionsText, setQuestionsText] = useState( - topic?.questions.join('\n') || '', - ) + const [questions, setQuestions] = useState(topic?.questions || ['']) const [saving, setSaving] = useState(false) + /** 更新某行问题 */ + const handleUpdate = (index: number, value: string) => { + setQuestions(prev => prev.map((q, i) => i === index ? value : q)) + } + + /** 删除某行问题 */ + const handleDelete = (index: number) => { + setQuestions(prev => prev.filter((_, i) => i !== index)) + } + + /** 添加空行 */ + const handleAdd = () => { + setQuestions(prev => [...prev, '']) + } + + /** 批量粘贴:从剪贴板按行解析 */ + const handlePaste = (e: React.ClipboardEvent) => { + const text = e.clipboardData.getData('text') + if (text.includes('\n') && text.trim().length > 50) { + e.preventDefault() + const lines = text.split('\n').map(s => s.trim()).filter(Boolean) + setQuestions(prev => [...prev.filter(s => s.trim()), ...lines]) + } + } + const handleSave = async () => { - const questions = questionsText - .split('\n') - .map((s) => s.trim()) - .filter(Boolean) - if (questions.length === 0) { + const valid = questions.map(s => s.trim()).filter(Boolean) + if (valid.length === 0) { toast.error('至少输入一个问题') return } setSaving(true) try { - await api.adminUpdateDailyTopics({ scene, questions }) + await api.adminUpdateDailyTopics({ scene, questions: valid }) toast.success(isCreate ? '热点问题已添加' : '热点问题已更新') onSuccess() } catch (e) { @@ -200,17 +220,17 @@ function EditTopicsDialog({ return ( !o && onClose()}> - + {isCreate ? '添加热点问题' : `编辑 - ${SCENE_LABELS[topic!.scene]}`} - 每行一个问题,保存后用户端实时生效 + 保存后用户端实时生效。可逐条编辑,支持批量粘贴。
{isCreate && (
-
+
{Object.entries(SCENE_LABELS).map(([value, label]) => (