176 lines
7.3 KiB
TypeScript
176 lines
7.3 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { X, Upload, FileText, Calendar, Users, AlertTriangle } from 'lucide-react';
|
|
|
|
interface CreateTaskModalProps {
|
|
isOpen: boolean;
|
|
onClose: () => void;
|
|
onCreate: (taskData: any) => void;
|
|
}
|
|
|
|
const CreateTaskModal: React.FC<CreateTaskModalProps> = ({ isOpen, onClose, onCreate }) => {
|
|
const [formData, setFormData] = useState({
|
|
name: '',
|
|
description: '',
|
|
scene: '宣传策略生成',
|
|
deadline: '',
|
|
resources: '',
|
|
constraints: '',
|
|
});
|
|
|
|
const handleSubmit = () => {
|
|
if (!formData.name || !formData.scene) {
|
|
alert('请填写必填项');
|
|
return;
|
|
}
|
|
onCreate(formData);
|
|
onClose();
|
|
};
|
|
|
|
if (!isOpen) return null;
|
|
|
|
return (
|
|
<div className="fixed inset-0 z-50 flex items-center justify-center">
|
|
<div className="absolute inset-0 bg-black/60 backdrop-blur-sm" onClick={onClose} />
|
|
<div className="relative bg-slate-800/95 backdrop-blur-xl border border-blue-800/30 rounded-2xl w-full max-w-2xl max-h-[90vh] overflow-hidden shadow-2xl">
|
|
{/* Header */}
|
|
<div className="flex items-center justify-between px-6 py-4 border-b border-blue-800/30">
|
|
<div>
|
|
<h2 className="text-xl font-bold text-white">新建任务</h2>
|
|
<p className="text-slate-400 text-sm mt-1">创建一个新的宣传策略分析任务</p>
|
|
</div>
|
|
<button
|
|
onClick={onClose}
|
|
className="p-2 hover:bg-slate-700/50 rounded-lg transition-colors"
|
|
>
|
|
<X className="w-5 h-5 text-slate-400" />
|
|
</button>
|
|
</div>
|
|
|
|
{/* Content */}
|
|
<div className="p-6 space-y-5 max-h-[60vh] overflow-y-auto">
|
|
{/* Task Name */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2">
|
|
任务名称 <span className="text-red-400">*</span>
|
|
</label>
|
|
<input
|
|
type="text"
|
|
value={formData.name}
|
|
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
|
|
placeholder="例如:五四青年节宣传活动策略"
|
|
className="w-full px-4 py-3 bg-slate-900/50 border border-blue-800/30 rounded-lg text-white placeholder-slate-500 text-sm focus:outline-none focus:border-blue-500/50 transition-colors"
|
|
/>
|
|
</div>
|
|
|
|
{/* Task Description */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2">
|
|
任务描述
|
|
</label>
|
|
<textarea
|
|
rows={3}
|
|
value={formData.description}
|
|
onChange={(e) => setFormData({ ...formData, description: e.target.value })}
|
|
placeholder="详细描述任务目标和背景..."
|
|
className="w-full px-4 py-3 bg-slate-900/50 border border-blue-800/30 rounded-lg text-white placeholder-slate-500 text-sm focus:outline-none focus:border-blue-500/50 transition-colors resize-none"
|
|
/>
|
|
</div>
|
|
|
|
{/* Scene Selection */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2">
|
|
选择场景 <span className="text-red-400">*</span>
|
|
</label>
|
|
<select
|
|
value={formData.scene}
|
|
onChange={(e) => setFormData({ ...formData, scene: e.target.value })}
|
|
className="w-full px-4 py-3 bg-slate-900/50 border border-blue-800/30 rounded-lg text-white text-sm focus:outline-none focus:border-blue-500/50 transition-colors"
|
|
>
|
|
<option value="宣传策略生成">宣传策略生成</option>
|
|
<option value="宣传方案推演">宣传方案推演</option>
|
|
<option value="宣传活动复盘">宣传活动复盘</option>
|
|
<option value="舆情应对策略">舆情应对策略</option>
|
|
<option value="多版本策略比较">多版本策略比较</option>
|
|
</select>
|
|
</div>
|
|
|
|
{/* Deadline */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2 flex items-center gap-2">
|
|
<Calendar className="w-4 h-4" />
|
|
时间要求
|
|
</label>
|
|
<input
|
|
type="date"
|
|
value={formData.deadline}
|
|
onChange={(e) => setFormData({ ...formData, deadline: e.target.value })}
|
|
className="w-full px-4 py-3 bg-slate-900/50 border border-blue-800/30 rounded-lg text-white text-sm focus:outline-none focus:border-blue-500/50 transition-colors"
|
|
/>
|
|
</div>
|
|
|
|
{/* Resources */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2 flex items-center gap-2">
|
|
<Users className="w-4 h-4" />
|
|
资源条件
|
|
</label>
|
|
<input
|
|
type="text"
|
|
value={formData.resources}
|
|
onChange={(e) => setFormData({ ...formData, resources: e.target.value })}
|
|
placeholder="例如:预算10万,运营团队3人..."
|
|
className="w-full px-4 py-3 bg-slate-900/50 border border-blue-800/30 rounded-lg text-white placeholder-slate-500 text-sm focus:outline-none focus:border-blue-500/50 transition-colors"
|
|
/>
|
|
</div>
|
|
|
|
{/* Constraints */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2 flex items-center gap-2">
|
|
<AlertTriangle className="w-4 h-4" />
|
|
风险约束
|
|
</label>
|
|
<textarea
|
|
rows={2}
|
|
value={formData.constraints}
|
|
onChange={(e) => setFormData({ ...formData, constraints: e.target.value })}
|
|
placeholder="描述任务的限制条件和风险边界..."
|
|
className="w-full px-4 py-3 bg-slate-900/50 border border-blue-800/30 rounded-lg text-white placeholder-slate-500 text-sm focus:outline-none focus:border-blue-500/50 transition-colors resize-none"
|
|
/>
|
|
</div>
|
|
|
|
{/* File Upload */}
|
|
<div>
|
|
<label className="block text-slate-300 text-sm font-medium mb-2 flex items-center gap-2">
|
|
<FileText className="w-4 h-4" />
|
|
附件/参考资料
|
|
</label>
|
|
<div className="border-2 border-dashed border-blue-800/30 rounded-lg p-6 text-center hover:border-blue-500/50 transition-colors cursor-pointer">
|
|
<Upload className="w-8 h-8 text-slate-500 mx-auto mb-2" />
|
|
<p className="text-slate-400 text-sm">点击或拖拽文件到此处上传</p>
|
|
<p className="text-slate-500 text-xs mt-1">支持 PDF、Word、图片等格式</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Footer */}
|
|
<div className="flex items-center justify-end gap-3 px-6 py-4 border-t border-blue-800/30 bg-slate-900/30">
|
|
<button
|
|
onClick={onClose}
|
|
className="px-5 py-2.5 bg-slate-700/50 hover:bg-slate-600/50 border border-blue-800/30 text-slate-300 rounded-lg transition-colors"
|
|
>
|
|
取消
|
|
</button>
|
|
<button
|
|
onClick={handleSubmit}
|
|
className="px-5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white rounded-lg transition-colors font-medium"
|
|
>
|
|
开始分析
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default CreateTaskModal;
|